package net.jxta.socket.examples; import java.io.File; import java.io.IOException; import java.net.SocketTimeoutException; import java.util.Iterator; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import net.jxta.document.AdvertisementFactory; import net.jxta.endpoint.EndpointAddress; import net.jxta.endpoint.Message; import net.jxta.endpoint.StringMessageElement; import net.jxta.id.IDFactory; import net.jxta.pipe.PipeID; import net.jxta.pipe.PipeMsgEvent; import net.jxta.pipe.PipeMsgListener; import net.jxta.pipe.PipeService; import net.jxta.platform.NetworkManager; import net.jxta.protocol.PipeAdvertisement; import net.jxta.socket.JxtaServerSocket; import net.jxta.util.JxtaBiDiPipe; import net.jxta.util.JxtaServerPipe; import net.jxta.util.ServerPipeAcceptListener; import net.jxta.impl.endpoint.EndpointServiceImpl; public class SystemTestUtils { private static final String TEST_NAMESPACE = "SystemTest"; private static final String STRING_PAYLOAD_ELEMENT = "strPayload"; public static JxtaServerPipe createServerPipe(NetworkManager manager, ServerPipeAcceptListener listener, boolean secure) throws IOException { PipeID pipeId = IDFactory.newPipeID(manager.getNetPeerGroup().getPeerGroupID()); PipeAdvertisement pipeAd = createUnicastPipeAd(pipeId, secure); if(listener == null) { return new JxtaServerPipe(manager.getNetPeerGroup(), pipeAd); } else { return new JxtaServerPipe(manager.getNetPeerGroup(), pipeAd, listener); } } public static JxtaServerSocket createServerSocket(NetworkManager manager, boolean secure) throws IOException { PipeID pipeId = IDFactory.newPipeID(manager.getNetPeerGroup().getPeerGroupID()); PipeAdvertisement pipeAd = createUnicastPipeAd(pipeId, false); // return new JxtaServerSocket(manager.getNetPeerGroup(), pipeAd, secure); return new JxtaServerSocket(manager.getNetPeerGroup(), pipeAd, secure); } public static JxtaServerSocket createServerSocket(NetworkManager manager, boolean secure, net.jxta.pipe.PipeID pipeID) throws IOException { PipeAdvertisement pipeAd = createUnicastPipeAd(pipeID, false); // return new JxtaServerSocket(manager.getNetPeerGroup(), pipeAd, secure); return new JxtaServerSocket(manager.getNetPeerGroup(), pipeAd); } public static PipeAdvertisement createUnicastPipeAd(PipeID pipeID, boolean secure) { PipeAdvertisement advertisement = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(PipeAdvertisement.getAdvertisementType()); advertisement.setPipeID(pipeID); if (secure) advertisement.setType(PipeService.UnicastSecureType); else advertisement.setType(PipeService.UnicastType); return advertisement; } public static Message createMessage(String payload) { Message msg = new Message(); msg.addMessageElement(TEST_NAMESPACE, new StringMessageElement(STRING_PAYLOAD_ELEMENT, payload, null)); return msg; } public static void testPeerCommunication(NetworkManager aliceManager, NetworkManager bobManager, boolean secure) throws IOException, InterruptedException { final CountDownLatch pipeEstablished = new CountDownLatch(1); final CountDownLatch aliceRequestReceived = new CountDownLatch(1); final CountDownLatch bobResponseReceived = new CountDownLatch(1); final AtomicReference<JxtaBiDiPipe> aliceAcceptedPipe = new AtomicReference<JxtaBiDiPipe>(); ServerPipeAcceptListener listener = new ServerPipeAcceptListener() { public void pipeAccepted(JxtaBiDiPipe pipe) { aliceAcceptedPipe.set(pipe); pipeEstablished.countDown(); } public void serverPipeClosed() {} }; JxtaServerPipe aliceServerPipe = createServerPipe(aliceManager, listener, secure); PipeMsgListener aliceListener = new PipeMsgListener() { public void pipeMsgEvent(PipeMsgEvent event) { System.out.println("Alice received message: " + event.getMessage().getMessageElement(STRING_PAYLOAD_ELEMENT)); Message bobsMessage = event.getMessage(); Set<EndpointAddress> tempSetEA = (Set)bobsMessage.getMessageProperty(EndpointServiceImpl.VERIFIED_ADDRESS_SET); Iterator i = tempSetEA.iterator(); while(i.hasNext()) System.out.println(" -- verified address: " + i.next()); aliceRequestReceived.countDown(); } }; PipeMsgListener bobListener = new PipeMsgListener() { public void pipeMsgEvent(PipeMsgEvent event) { System.out.println("Bob received message: " + event.getMessage().getMessageElement(STRING_PAYLOAD_ELEMENT)); Message alicesMessage = event.getMessage(); Set<EndpointAddress> tempSetEA = (Set)alicesMessage.getMessageProperty(EndpointServiceImpl.VERIFIED_ADDRESS_SET); Iterator i = tempSetEA.iterator(); while(i.hasNext()) System.out.println(" -- verified address: " + i.next()); bobResponseReceived.countDown(); } }; JxtaBiDiPipe bobPipe = connectNonBlocking(bobManager, aliceServerPipe.getPipeAdv(), bobListener); pipeEstablished.await(5, TimeUnit.SECONDS); aliceAcceptedPipe.get().setMessageListener(aliceListener); System.out.println("Bob: sending message to alice - 'hello alice'"); bobPipe.sendMessage(SystemTestUtils.createMessage("hello alice")); aliceRequestReceived.await(5, TimeUnit.SECONDS); System.out.println("Alice: sending message to bob - 'hello bob'"); aliceAcceptedPipe.get().sendMessage(SystemTestUtils.createMessage("hello bob")); bobResponseReceived.await(5, TimeUnit.SECONDS); } private static JxtaBiDiPipe connectNonBlocking(NetworkManager clientManager, PipeAdvertisement pipeAdv, PipeMsgListener clientListener) throws IOException { final JxtaBiDiPipe biDiPipe = new JxtaBiDiPipe(); biDiPipe.setWindowSize(20); biDiPipe.connect(clientManager.getNetPeerGroup(),null, pipeAdv, 5000, clientListener, true); return biDiPipe; } private static JxtaBiDiPipe connectWithRetry(NetworkManager clientManager, PipeAdvertisement pipeAdv, PipeMsgListener clientListener) throws IOException { int tryCount = 0; while(true) { try { return new JxtaBiDiPipe(clientManager.getNetPeerGroup(), pipeAdv, 5000, clientListener); } catch (SocketTimeoutException e) { tryCount++; if(tryCount >= 3) { throw e; } } } } public static void rmdir(File dir) throws IOException { if (null == dir) return; if (!dir.exists()) return; File[] children = dir.listFiles(); if (children!=null) for (int i=0; i<children.length; i++) { if(children[i].isFile()) children[i].delete(); else if (children[i].isDirectory()) rmdir(children[i]); } dir.delete(); } }