FileDocCategorySizeDatePackage
HungryPeer.javaAPI DocExample17359Wed May 08 22:35:28 BST 2002None

HungryPeer

public class HungryPeer extends Object

Fields Summary
private net.jxta.peergroup.PeerGroup
netpg
private net.jxta.peergroup.PeerGroup
restoNet
private net.jxta.discovery.DiscoveryService
disco
private net.jxta.pipe.PipeService
pipes
private net.jxta.protocol.PipeAdvertisement
myAdv
private net.jxta.pipe.InputPipe
myPipe
private net.jxta.document.MimeMediaType
mimeType
private int
timeout
private int
rtimeout
private net.jxta.protocol.PeerGroupAdvertisement
adv
private Vector
restoPeerAdvs
private Vector
restoPeerPipes
private String
myIdentity
private String
friesRequest
Constructors Summary
Methods Summary
public voidHungryPeer()

 
private voidconnectToRestoPeers()


        // Enumerate all the RestoPeer pipe advertisments we have discovered
        // and attempt to connect a pipe which each of them
        for (Enumeration en = restoPeerAdvs.elements(); en.hasMoreElements();) {

            PipeAdvertisement padv = (PipeAdvertisement) en.nextElement();

            try {

                System.out.println("Attempt to connect to discovered RestoPeer");

                // Create an output Pipe connection to the RestoPeer
                OutputPipe pipeOut = pipes.createOutputPipe(padv, rtimeout);

                // Check if we have a connected Pipe
                if (pipeOut == null) { // Failed go to next RestoPeer
                    System.out.println("Failure to connect to RestoPeer Pipe:" +
                                       padv.getName());
                    continue;
                }

                // Save the output Pipe in RestoPeers connected structure
                restoPeerPipes.addElement(pipeOut);

                System.out.println("Connected pipe to " + padv.getName());

            } catch (Exception e) { // Error during connection go to next RestoPeer
                 System.out.println("RestoPeer may not be there anymore:" +
                                    padv.getName());
                 continue;
            }
        }
    
private voiddiscoverRestoServices()


        int found = 0;                  // Count of RestoPeer found
        RestoPeerService restoSrv = null;  // RestoPeer Service Advertisement

        System.out.println("Locating RestoPeers in the RestoNet Peergroup");

        try {
            // extract the RestoPeer service from the RestoNet peergroup
            // advertisement since it is now part of the RestoNet Peergroup
            ID  msrvID = null;
            PipeAdvertisement restoPipe = null;

            // get the Spec ID for the RestoPeerService to lookup the service
            // in the Peergroug handle
            try {
                msrvID = IDFactory.fromURL(new URL("urn", "",
                         RestoPeerService.Module_Spec_ID));

            } catch (java.net.MalformedURLException e) {
            } catch (java.net.UnknownServiceException e) {
                System.err.println(" Can't create restoPeer PipeID: UnknownServiceException ") ;
                System.exit(1);
            }

            // lookup for the RestoPeer peergroup service
            // we have to wait to make sure the service was completly initialized
            // before we can lookup the service
            while (restoSrv == null) {
                try {
                    Thread.sleep(2000);
                    restoSrv = (RestoPeerService) restoNet.lookupService(msrvID);

                } catch (Exception ex) { // This is ok
                }
            }

            // Extract the pipe advertisement from the RestoPeer service module
            // implementation advertisement. Get the ModuleImpl advertisement
            // associated with the service
            ModuleImplAdvertisement restoImpl = (ModuleImplAdvertisement)
                restoSrv.getImplAdvertisement();

            // extract the pipe from the param section of the Module Implementation
            restoPipe = (PipeAdvertisement)
                AdvertisementFactory.newAdvertisement((TextElement)
                      restoImpl.getParam().getChildren().nextElement());

            // save the pipe
            restoPeerAdvs.addElement(restoPipe);
            ++found;

        } catch (Exception ex) {
            System.out.println("Failure to connect to RestoPeer service pipe");
            ex.printStackTrace();
        }
        // Completed RestoPeer Discovery
        System.out.println("Found " + found + " RestoPeers Service");
    
private booleanjoinRestoNet()


        int count = 3; // number of tries to search for the peergroup

        System.out.println("Attempting to discover the RestoNet Peergroup");

        // get the Discovery service handle from the NetPeerGroup pointer
        DiscoveryService hdisco = netpg.getDiscoveryService();

        Enumeration ae = null;

        // loop until we found the "RestoNet" Peergroup advertisement
            while (count-->0) {
            try {

                // Check if we have the advertisement in the local
                // peer cache
                ae = hdisco.getLocalAdvertisements(DiscoveryService.GROUP
                                                   , "Name"
                                                   , "RestoNet");

                // check if we got the advertisement, if we got
                // it we can exit the loop. Not necessary to go
                // further
                if ((ae != null) && ae.hasMoreElements()) break;

                // The "RestoNet" advertisement is not in the local
                // cache send a discovery request to search for the advertisement
                hdisco.getRemoteAdvertisements(null, DiscoveryService.GROUP,
		     "Name", "RestoNet", 1, null);

                // wait to give a chance to the discovery
                try {
                    Thread.sleep(timeout);
                } catch (Exception e){
                }
            } catch (IOException e){
                // found nothing!  move on
            }
        }

        // check if we found the RestoNet advertisement
        if (ae == null || !ae.hasMoreElements()) {
            System.out.println("Sorry could not find the RestoNet Peergroup");
            return false;
        }

        System.out.println("Found the RestoNet PeerGroup Advertisement");
        // Get the advertisement
        PeerGroupAdvertisement adv =
            (PeerGroupAdvertisement) ae.nextElement();

        try {

            // Call the PeerGroup Factory to instantiate a new
            // peergroup instance on that peer
            restoNet = netpg.newGroup(adv);

            // get the Discovery and Pipe Service to
            // be used within the RestoNet Peergroup
            disco = restoNet.getDiscoveryService();
            pipes = restoNet.getPipeService();

        } catch (Exception e) {
            System.out.println("Could not create RestoPeerGroup");
            return false;
        }

        System.out.println("The HungryPeer joined the restoNet PeerGroup");
        return true;
    
public static voidmain(java.lang.String[] args)

   // Fries Auction request

    // Hungry Peer Main method to start our HungryPeer
         
        HungryPeer myapp = new HungryPeer();
        myapp.startJxta();
        System.exit(0);
    
private voidreceiveFriesBids()


        // Continue until we got all answers
        while (true) {

            Message msg = null;      // pipe message received
            String price = null;     // Fries price bid
            String brand = null;     // RestoPeer name which offers the bid
            String specials = null;  // specials offer bid
            InputStream ip = null;   // input stream to read message element
            StructuredDocument bid = null; //Bid document received

            try {

                // Wait for a bid message to arrive from a RestoPeer
                // Will block until a message arrive
                msg = myPipe.waitForMessage();

                // Check if the message is valid
                if (msg == null) {
                    if (Thread.interrupted()) {// interupted
                        // We have been asked to stop
                        System.out.println("Abort Receiving bid loop interrupted");
                        myPipe.close(); // Close the Pipe
                        return;
                    }
                }

            } catch (Exception ex) { // error in receiving message
                myPipe.close();
                System.out.println("Abort Receiving Error receiving bids");
                return;
            }

            // We got a message from a RestoPeer. Let's
            // extract and display infomation about the bid received
            try {

                // Extract the Bid document from the message
                ip = msg.getElement("Bid").getStream();
                bid = StructuredDocumentFactory.newStructuredDocument(mimeType,
                                                                        ip);

                // Parse the document to extract bid information
                Enumeration enum = bid.getChildren();
                while (enum.hasMoreElements()) {
                    Element element = (Element) enum.nextElement();
                    String attr = (String) element.getKey();
                    String value = (String) element.getValue();
                    if (attr.equals("Price")) {
                        price = value;
                        continue;
                    }
                    if (attr.equals("Brand")) {
                        brand = value;
                        continue;
                    }
                    if (attr.equals("Specials")) {
                        specials = value;
                        continue;
                    }
                }

                // We got a valid bid. Let's print it
                System.out.println("Received Fries Bid from RestoPeers (" +
                                   brand + ") at a Price ($" + price +
                                   ") \nRestoPeers Special (" + specials + ")");

            } catch (Exception e) { // Error extracting bid from the message
                System.out.println("Error extracting bid from the message");
                continue; // broken content;
            }
        }
    
private voidsendFriesAuctionRequests()


        // Enumerate all the RestoPeer pipe connections we have successfully
        // connected with
        for (Enumeration en = restoPeerPipes.elements(); en.hasMoreElements();) {
            OutputPipe op = (OutputPipe) en.nextElement();
            try {

                // Construct the Request document
                StructuredDocument request  =
                    StructuredDocumentFactory.newStructuredDocument(mimeType,
                    "RestoNet:Request");

                // Fill up the Fries auction request argument
                Element re;
                re = request.createElement("Name", myIdentity);
                request.appendChild(re);
                re = request.createElement("Fries", friesRequest);
                request.appendChild(re);

                // create the pipe message to send
                Message msg = pipes.createMessage();

                // fill the first message element which is the HungryPeer
                // pipe advertisement return address. We need this
                // so RestoPeers can respond to us
                msg.addElement(msg.newMessageElement("HungryPeerPipe", mimeType,
                    myAdv.getDocument(mimeType).getStream()));

                // fill the second message element
                // the fries request. Insert the document
                //in the message
                msg.addElement(msg.newMessageElement("Request", mimeType,
                     request.getStream()));

                // send the auction message to the RestoPeer connected
                // pipe
                op.send(msg);

                System.out.println("Sent Fries Auction Request (" + friesRequest +
                                   ") to connected peers");

            } catch (Exception ex) { // Error sending auction request
                System.out.println("Failed to send auction request to RestoPeer");
            }
        }
    
private booleansetHungryPeerPipe()

        try {

            // get the Discovery and Pipe Service to
            // be used within the RestoNet Peergroup
            disco = restoNet.getDiscoveryService();
            pipes = restoNet.getPipeService();

            // Create a pipe advertisement for our hungry peer. This
            // pipe will be used within the RestoNet peergroup for other
            // peers to talk to our hungry peer
            myAdv = (PipeAdvertisement)
                AdvertisementFactory.newAdvertisement(
                PipeAdvertisement.getAdvertisementType() );

            // Initialize the advertisement with unique peer information
            // So we can communicate
            myAdv.setPipeID(IDFactory.newPipeID(restoNet.getPeerGroupID() ) );
            myAdv.setName("restoNet:HungryPipe:" + myIdentity);
            myAdv.setType(PipeService.UnicastType);

            // Create the input pipe
            myPipe = pipes.createInputPipe(myAdv);

        } catch (Exception e) {
            System.out.println("Could not create the HungryPeer pipe");
            return false;
        }

        return true;
    
private voidstartJxta()


        try {
            // create, and Start the default jxta NetPeerGroup
            netpg = PeerGroupFactory.newNetPeerGroup();

        } catch (PeerGroupException e) {
            // could not instanciate the NetPeerGroup
            System.out.println("Fatal error : creating the NetPeerGroup");
            System.exit(1);
        }

        // Discover and Join the RestoNet Peergroup
        joinRestoNet();

        //Set our HungryPeer communication pipe so RestoPeers
        //can talk to us
        if (!setHungryPeerPipe()) {
            System.out.println(
               "Aborting due to failure to create our HungryPeer pipe");
            return;
        }

        //Attempt to locate RestoPeers in RestoNet
        discoverRestoServices();

        // Connect to RestoPeers that have been discovered
        connectToRestoPeers();

        // I am hungry send an auction request for French Fries
        // to the RestoPeers I have connected to
        sendFriesAuctionRequests();

        //Process incoming bids from RestoPeers
        receiveFriesBids();