The Application Implementation

That completes our look at the RestoPeer implementation; we now have a service that can discover (and create, if necessary) the RestoNet peergroup. Now we’ll turn our attention to the HungryPeer class.

The HungryPeer class represents an individual that is looking to eat at a restaurant. The implementation in this chapter illustrates how a peer can search for and join a peergroup: the HungryPeer class discovers and joins the RestoNet peergroup created by the previous RestoPeer class:

import java.io.*;
import java.util.Enumeration;
import java.util.Vector;

import net.jxta.peergroup.PeerGroup;
import net.jxta.peergroup.PeerGroupFactory;
import net.jxta.exception.PeerGroupException;
import net.jxta.document.Advertisement;
import net.jxta.discovery.DiscoveryService;
import net.jxta.pipe.PipeService;
import net.jxta.protocol.PeerGroupAdvertisement;

// HungryPeer tries to find a restaurant to get a good meal. It finds all
// RestoPeers in the RestoNet peergroup and (in later examples) requests
// bids from them.

public class HungryPeer {

    private PeerGroup netpg = null;     // NetPeerGroup
    private PeerGroup restoNet = null;  // Resto peergroup
    private int timeout = 3000;         // Time-out; can be adjusted

    // Services within the RestoNet peergroup
    private DiscoveryService disco;     // Discovery service
    private PipeService pipes;          // Pipe service

    // Vector of discovered RestoPeers
    private Vector restaurantAdvs = new Vector(  );

    public static void main(String args[]) {
        HungryPeer myapp = new HungryPeer(  );
        myapp.startJxta(  );
        System.exit(0);
    }

    // Start the JXTA application
    private void startJxta(  ) {
        try {
            // Discover (or create) and join
            // the default JXTA NetPeerGroup
            netpg = PeerGroupFactory.newNetPeerGroup(  );
        } catch (PeerGroupException e) {
            // Couldn't initialize; can't continue
            System.out.println(
                "Fatal error : creating the net PeerGroup");
            System.exit(1);
        }

        // Discover and join the RestoNet peergroup
        // HungryPeers never create the RestoNet peergroup
        try {
            if (!joinRestoNet(  )) {
                System.out.println(
                       "Sorry could not find the RestoNet Peergroup");
                System.exit(2);
            }
        } catch (Exception e) {
            System.out.println("Can't join RestoNet group");
            System.exit(1);
        }
    }

    // This method is used to discover the RestoNet peergroup
    // If found, the peer will join the peergroup

    private boolean joinRestoNet(  ) {

        int count = 3; // Maximum number of attempts to discover

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

        // Get the discovery service handle from the NetPeerGroup
        DiscoveryService hdisco = netpg.getDiscoveryService(  );

        // All discovered RestoNet peers
        Enumeration ae = null;

        // Loop until we find the RestoNet peergroup advertisement
        // or we've exhausted the desired number of attempts
        while (count-- > 0) {
            try {
                // Check if we have the advertisement in the local
                // peer cache
                ae = hdisco.getLocalAdvertisements(
                    DiscoveryService.GROUP, "Name", "RestoNet");

                // If we found the RestoNet advertisement, we are done
                if ((ae != null) && ae.hasMoreElements(  ))
                    break;

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

                // Wait to give peers a chance to respond
                try {
                    Thread.sleep(timeout);
                } catch (InterruptedException ie) {}
            } catch (IOException e) {
                // Found nothing! Move on.
            }
        }

        // Check if we found the RestoNet advertisement
        if (ae == null || !ae.hasMoreElements(  )) {
            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
            restoNet = netpg.newGroup(adv);
        } catch (Exception e) {
          System.out.println("Could not create RestoPeerGroup");
          return false;
        }

        try {
            // Get the discovery and pipe services for the RestoNet
            // peergroup (unused in this example)
            disco = restoNet.getDiscoveryService(  );
            pipes = restoNet.getPipeService(  );
        } catch (Exception e) {
            System.out.println("Error getting services from RestoNet");
            throw e;
        }

        System.out.println(
            "The HungryPeer joined the restoNet PeerGroup");
        return true;
    }
}

Just as the RestoPeer service did, the HungryPeer starts by discovering and joining the NetPeerGroup. The basic outline of the joinRestoNet( ) method of the HungryPeer is very similar to the one in RestoPeer, except that this joinRestoNet( ) method does not create the RestoNet if one is not found. Instead, if this application does not find an existing RestoNet peergroup, it exits.

Not being able to find the RestoNet advertisement does not necessarily mean that no RestoNet peers are running in the JXTA network; it means only that we were not able to reach any RestoNet peers. This could be because we either did not wait long enough for an answer to come back, or we could not find a route to reach a running RestoNet peer. Trying for a total of 30 seconds is appropriate for this example, but you must make this decision in each application based on the demands of the application.

Note that there’s no particular reason why the HungryPeer couldn’t create the RestoNet peergroup if it didn’t find one; it could wait for a RestoPeer to come along and join that peergroup. This is one reason why the RestoPeer searched for an existing peergroup before creating one.

Get JXTA in a Nutshell now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.