source: trunk/src/org/expeditee/network/FrameShare.java@ 306

Last change on this file since 306 was 306, checked in by ra33, 16 years ago

Added some HELP actions
More mail stuff... and networking stuff
Can now save frames and send messages to peers
Also version control prevent versions from being lost

File size: 6.4 KB
Line 
1package org.expeditee.network;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.StringReader;
6import java.io.StringWriter;
7import java.net.DatagramPacket;
8import java.net.DatagramSocket;
9import java.net.InetAddress;
10import java.net.UnknownHostException;
11import java.util.Collection;
12import java.util.HashMap;
13import java.util.LinkedList;
14import java.util.Map;
15
16import org.expeditee.gui.AttributeValuePair;
17import org.expeditee.gui.Frame;
18import org.expeditee.gui.FrameIO;
19import org.expeditee.gui.MessageBay;
20import org.expeditee.io.ExpReader;
21import org.expeditee.io.ExpWriter;
22import org.expeditee.io.FrameReader;
23import org.expeditee.io.FrameWriter;
24import org.expeditee.items.Text;
25
26public class FrameShare {
27
28 private static final int SOCKET_TIMEOUT = 1000;
29
30 private static Collection<DefaultServer> _servers = new LinkedList<DefaultServer>();
31
32 private static FrameShare _theSession;
33
34 private Map<String, Peer> _peers;
35
36 private int _port = -1;
37
38 public static void init(Frame settingsFrame) {
39 if (settingsFrame == null)
40 return;
41
42 if (_theSession == null)
43 _theSession = new FrameShare(settingsFrame);
44 }
45
46 private FrameShare(Frame settingsFrame) {
47 _peers = new HashMap<String, Peer>();
48
49 // Set the settings
50 for (Text item : settingsFrame.getBodyTextItems(false)) {
51
52 AttributeValuePair avp = new AttributeValuePair(item.getText());
53 if (avp.isAnnotation())
54 continue;
55
56 String attribute = avp.getAttributeOrValue().toLowerCase();
57
58 if (attribute.equals("server")) {
59 try {
60 if (!avp.hasPair()) {
61 _servers.add(new FrameServer());
62 _servers.add(new FrameSaver());
63 _servers.add(new MessageReciever());
64 } else {
65 _port = avp.getIntegerValue();
66 _servers.add(new FrameServer("FrameServer", _port));
67 _servers.add(new FrameSaver("FrameSaver", _port + 1));
68 _servers
69 .add(new MessageReciever("Messages", _port + 2));
70 }
71 } catch (Exception e) {
72 e.printStackTrace();
73 MessageBay.errorMessage("Could not start servers ["
74 + avp.toString() + "]");
75 }
76 continue;
77 }
78
79 if (!avp.hasPair())
80 continue;
81
82 try {
83 _peers.put(attribute, new Peer(avp));
84 } catch (UnknownHostException e) {
85 MessageBay.errorMessage("Could not locate peer ["
86 + avp.toString() + "]");
87 }
88 }
89
90 try {
91 for (DefaultServer server : _servers)
92 server.start();
93 } catch (Exception e) {
94 MessageBay.errorMessage("Error in PeerToPeer setup");
95 }
96 }
97
98 public void finalise() {
99 for (DefaultServer server : _servers)
100 server.close();
101 }
102
103 public static FrameShare getInstance() {
104 return _theSession;
105 }
106
107 /**
108 * TODO check each peer on a different thread.
109 *
110 * @param frameName
111 * @return
112 */
113 public Frame loadFrame(String frameName) {
114 byte[] nameBuf = frameName.getBytes();
115 byte[] buf = new byte[FrameServer.MAX_PACKET_LENGTH];
116
117 String result = null;
118 String peerName = null;
119 try {
120 // get a datagram socket
121 DatagramSocket socket = new DatagramSocket();
122 socket.setSoTimeout(SOCKET_TIMEOUT);
123
124 for (Peer peer : _peers.values()) {
125 try {
126 // send request for a frame
127 DatagramPacket packet = new DatagramPacket(nameBuf,
128 nameBuf.length, peer.getAddress(), peer.getPort());
129 socket.send(packet);
130
131 // get response
132 packet = new DatagramPacket(buf, buf.length);
133 socket.receive(packet);
134
135 // store frame contents
136 result = new String(packet.getData(), 0, packet.getLength());
137 peerName = peer.getName();
138 break;
139 } catch (Exception e) {
140 e.printStackTrace();
141 }
142 }
143 socket.close();
144 } catch (Exception e) {
145
146 }
147
148 if (result == null)
149 return null;
150
151 // Now read the frame from the file contents
152 FrameReader reader = new ExpReader(frameName);
153 Frame frame = null;
154 try {
155 frame = reader.readFrame(new BufferedReader(
156 new StringReader(result)));
157 // Set the path for the frame to indicate it is NOT a local frame
158 // This allows the frame to be saved in the correct location
159 frame.setLocal(false);
160 frame.setPath(peerName);
161 } catch (IOException e) {
162 e.printStackTrace();
163 }
164
165 if (frame == null) {
166 MessageBay.errorMessage("Error: " + frameName
167 + " could not be successfully loaded.");
168 return null;
169 }
170
171 return frame;
172 }
173
174 public boolean sendMessage(String message, String peerName) {
175 Peer peer = _peers.get(peerName.toLowerCase());
176
177 if(peer == null){
178 return false;
179 }
180
181 try {
182 // get a datagram socket
183 DatagramSocket socket = new DatagramSocket(_port - 1);
184 socket.setSoTimeout(SOCKET_TIMEOUT);
185
186 // message = peerName + " says " + message;
187 byte[] contentsBuf = message.getBytes();
188
189 try {
190 // send save request
191 DatagramPacket packet = new DatagramPacket(contentsBuf,
192 contentsBuf.length, peer.getAddress(),
193 peer.getPort() + 2);
194 socket.send(packet);
195 } catch (Exception e) {
196 e.printStackTrace();
197 }
198 socket.close();
199
200 } catch (IOException e) {
201 e.printStackTrace();
202 }
203 return true;
204 }
205
206 public String saveFrame(Frame toSave) {
207
208 FrameIO.setSavedProperties(toSave);
209
210 Peer peer = _peers.get(toSave.getPath().toLowerCase());
211 String fileContents = "";
212 // Now read the frame from the file contents
213 FrameWriter writer = new ExpWriter();
214 try {
215 // String tempName = new Date().toString() + ".exp";
216 // writer.setOutputLocation(tempName);
217 // Write out the file to a StringBuffer
218 StringWriter sw = new StringWriter();
219 // First write out the name of the frame
220 sw.write(toSave.getName() + "\n");
221 //Then the version
222 sw.write(toSave.getVersion() + "\n");
223 // Write out the rest of the frame
224 writer.writeFrame(toSave, sw);
225 // Now send the packet
226 fileContents = sw.getBuffer().toString();
227 byte[] contentsBuf = fileContents.getBytes();
228
229 // get a datagram socket
230 DatagramSocket socket = new DatagramSocket(_port - 2);
231 socket.setSoTimeout(SOCKET_TIMEOUT);
232
233 try {
234 // send save request
235 DatagramPacket packet = new DatagramPacket(contentsBuf,
236 contentsBuf.length, peer.getAddress(),
237 peer.getPort() + 1);
238 socket.send(packet);
239 } catch (Exception e) {
240 e.printStackTrace();
241 }
242 socket.close();
243
244 } catch (IOException e) {
245 e.printStackTrace();
246 }
247 toSave.setSaved();
248 return fileContents;
249 }
250
251 public String getPeerName(int port, InetAddress address) {
252 for (Peer p : _peers.values()) {
253 if(p.getPort() == port && p.getAddress().equals(address))
254 return p.getName();
255 }
256 return null;
257 }
258}
Note: See TracBrowser for help on using the repository browser.