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

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

Fixed a few bugs that were makin unit tests fail...
Also added Greenstone search of HCI Bib tex

File size: 8.0 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.SocketException;
11import java.net.UnknownHostException;
12import java.util.Collection;
13import java.util.HashMap;
14import java.util.LinkedList;
15import java.util.Map;
16
17import org.expeditee.gui.AttributeValuePair;
18import org.expeditee.gui.Frame;
19import org.expeditee.gui.FrameIO;
20import org.expeditee.gui.MessageBay;
21import org.expeditee.io.ExpReader;
22import org.expeditee.io.ExpWriter;
23import org.expeditee.io.FrameReader;
24import org.expeditee.io.FrameWriter;
25import org.expeditee.items.Text;
26
27public class FrameShare {
28
29 public static boolean disableNetworking = false;
30
31 private static final int SOCKET_TIMEOUT = 1000;
32
33 private static Collection<DefaultServer> _servers = new LinkedList<DefaultServer>();
34
35 private static FrameShare _theSession;
36
37 private Map<String, Peer> _peers;
38
39 private int _port = Peer.DEFAULT_PORT;
40
41 public static void init(Frame settingsFrame) {
42 if (disableNetworking || settingsFrame == null)
43 return;
44
45 if (_theSession == null)
46 _theSession = new FrameShare(settingsFrame);
47 }
48
49 private FrameShare(Frame settingsFrame) {
50 _peers = new HashMap<String, Peer>();
51
52 // Set the settings
53 for (Text item : settingsFrame.getBodyTextItems(false)) {
54
55 AttributeValuePair avp = new AttributeValuePair(item.getText());
56 if (avp.isAnnotation())
57 continue;
58
59 String attribute = avp.getAttributeOrValue().toLowerCase();
60
61 if (attribute.equals("server")) {
62 try {
63 if (avp.hasPair()) {
64 _port = avp.getIntegerValue();
65 }
66 _servers.add(new FrameServer(_port));
67 _servers.add(new FrameSaver(_port));
68 _servers.add(new MessageReciever(_port));
69 _servers.add(new InfServer(_port));
70 _servers.add(new InfUpdate(_port));
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, String peerName) {
114 String result = null;
115
116 try {
117 // get a datagram socket
118 DatagramSocket socket = new DatagramSocket();
119 socket.setSoTimeout(SOCKET_TIMEOUT * 2);
120 if (peerName == null) {
121 for (Peer peer : _peers.values()) {
122 try {
123 result = getFrameContents(frameName, socket, peer);
124 if(result == null || result.length() == 0)
125 continue;
126
127 peerName = peer.getName();
128 break;
129 } catch (Exception e) {
130 e.printStackTrace();
131 }
132 }
133 } else {
134 try {
135 Peer peer = _peers.get(peerName.toLowerCase());
136 if (peer != null) {
137 result = getFrameContents(frameName, socket, peer);
138 }
139 } catch (Exception e) {
140 e.printStackTrace();
141 }
142 }
143 socket.close();
144 } catch (Exception e) {
145
146 }
147
148 if (result == null || result.length() == 0)
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 /**
175 * @param frameName
176 * @param socket
177 * @param peer
178 * @return
179 * @throws IOException
180 */
181 private String getFrameContents(String frameName, DatagramSocket socket, Peer peer) throws IOException {
182 byte[] nameBuf = frameName.getBytes();
183 byte[] buf = new byte[FrameServer.MAX_PACKET_LENGTH];
184 // send request for a frame
185 DatagramPacket packet = new DatagramPacket(nameBuf,
186 nameBuf.length, peer.getAddress(), peer
187 .getPort());
188 socket.send(packet);
189
190 // get response
191 packet = new DatagramPacket(buf, buf.length);
192 socket.receive(packet);
193
194 // store frame contents
195 return new String(packet.getData(), 0, packet
196 .getLength());
197 }
198
199 public boolean sendMessage(String message, String peerName) {
200 Peer peer = _peers.get(peerName.toLowerCase());
201
202 if (peer == null) {
203 return false;
204 }
205
206 try {
207 // get a datagram socket
208 DatagramSocket socket = new DatagramSocket(_port - 1);
209 socket.setSoTimeout(SOCKET_TIMEOUT);
210
211 // message = peerName + " says " + message;
212 byte[] contentsBuf = message.getBytes();
213
214 try {
215 // send save request
216 DatagramPacket packet = new DatagramPacket(contentsBuf,
217 contentsBuf.length, peer.getAddress(), peer.getPort()
218 + MessageReciever.OFFSET);
219 socket.send(packet);
220 } catch (Exception e) {
221 e.printStackTrace();
222 }
223 socket.close();
224
225 } catch (IOException e) {
226 e.printStackTrace();
227 }
228 return true;
229 }
230
231 public String saveFrame(Frame toSave) {
232
233 FrameIO.setSavedProperties(toSave);
234
235 Peer peer = _peers.get(toSave.getPath().toLowerCase());
236 String fileContents = "";
237 // Now read the frame from the file contents
238 FrameWriter writer = new ExpWriter();
239 try {
240 // String tempName = new Date().toString() + ".exp";
241 // writer.setOutputLocation(tempName);
242 // Write out the file to a StringBuffer
243 StringWriter sw = new StringWriter();
244 // First write out the name of the frame
245 sw.write(toSave.getName() + "\n");
246 // Then the version
247 sw.write(toSave.getVersion() + "\n");
248 // Write out the rest of the frame
249 writer.writeFrame(toSave, sw);
250 // Now send the packet
251 fileContents = sw.getBuffer().toString();
252 byte[] contentsBuf = fileContents.getBytes();
253
254 // get a datagram socket
255 DatagramSocket socket = new DatagramSocket(_port - 2);
256 socket.setSoTimeout(SOCKET_TIMEOUT);
257
258 try {
259 // send save request
260 DatagramPacket packet = new DatagramPacket(contentsBuf,
261 contentsBuf.length, peer.getAddress(), peer.getPort()
262 + FrameSaver.OFFSET);
263 socket.send(packet);
264 } catch (Exception e) {
265 e.printStackTrace();
266 }
267 socket.close();
268
269 } catch (IOException e) {
270 e.printStackTrace();
271 }
272 toSave.setSaved();
273 return fileContents;
274 }
275
276 public String getPeerName(int port, InetAddress address) {
277 for (Peer p : _peers.values()) {
278 if (p.getPort() == port && p.getAddress().equals(address))
279 return p.getName();
280 }
281 return null;
282 }
283
284 public int getInfNumber(String peerName, String frameset, boolean update)
285 throws IOException {
286 int result = -1;
287 // get a datagram socket
288 DatagramSocket socket = null;
289 try {
290 socket = new DatagramSocket(_port - 3);
291 socket.setSoTimeout(SOCKET_TIMEOUT);
292
293 byte[] contentsBuf = frameset.getBytes();
294 Peer peer = _peers.get(peerName.toLowerCase());
295 try {
296 // send inf request
297 DatagramPacket packet = new DatagramPacket(
298 contentsBuf,
299 contentsBuf.length,
300 peer.getAddress(),
301 peer.getPort()
302 + (update ? InfUpdate.OFFSET : InfServer.OFFSET));
303 socket.send(packet);
304
305 byte[] buf = new byte[100];
306 // get response
307 packet = new DatagramPacket(buf, buf.length);
308 socket.receive(packet);
309
310 // store frame contents
311 result = Integer.parseInt(new String(packet.getData(), 0,
312 packet.getLength()));
313 peerName = peer.getName();
314
315 } catch (Exception e) {
316 e.printStackTrace();
317 }
318 socket.close();
319 } catch (SocketException e1) {
320 e1.printStackTrace();
321 }
322
323 return result;
324 }
325}
Note: See TracBrowser for help on using the repository browser.