/*
* customgroupservice.java
*
* Created on July 17, 2007, 9:30 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package tutorial.customgroupservice;
import java.io.File;
import java.net.URI;
import java.util.Arrays;
import net.jxta.document.AdvertisementFactory;
import net.jxta.document.MimeMediaType;
import net.jxta.document.XMLDocument;
import net.jxta.document.XMLElement;
import net.jxta.id.IDFactory;
import net.jxta.peergroup.PeerGroup;
import net.jxta.platform.NetworkManager;
import net.jxta.protocol.ModuleImplAdvertisement;
import net.jxta.protocol.PeerGroupAdvertisement;
// Please read the @deprecation warning carefully.
import net.jxta.impl.peergroup.StdPeerGroupParamAdv;
import net.jxta.peergroup.PeerGroupID;
import net.jxta.platform.ModuleSpecID;
/**
* This sample shows how to define a Peer Group with custom services. In this
* case we add a simple demonstration service "Gossip" to the peer group.
*/
public class CustomGroupService {
/**
* The ID that our custom peer group will use. We use a hardcoded id so that all instances use the same value.
* This ID was generated using the <tt>newpgrp -s</tt> JXSE Shell command.
*/
private final static PeerGroupID CUSTOM_PEERGROUP_ID = PeerGroupID.create(URI.create("urn:jxta:uuid-425A5C703CD5454F9C03938A0D65BD5002"));
/**
* The MSID that our custom peer group will use. We use a hardcoded id so that all instances use the same value.
* This ID was generated using the <tt>newpgrp -s</tt> JXSE Shell command.
*/
private final static ModuleSpecID CUSTOM_PEERGROUP_MSID = ModuleSpecID.create(URI.create("urn:jxta:uuid-DEADBEEFDEAFBABAFEEDBABE00000001ACEFC090A5D74844A9DEF43F3003D35A06"));
/**
* Main method
*
* @param args none defined
*/
public static void main(String args[]) {
try {
// Set the main thread name for debugging.
Thread.currentThread().setName(CustomGroupService.class.getSimpleName());
// Configure JXTA
NetworkManager manager = new NetworkManager(NetworkManager.ConfigMode.ADHOC, "customgroupservice", new File(new File(".cache"), "customgroupservice").toURI());
manager.setPeerID(IDFactory.newPeerID(PeerGroupID.defaultNetPeerGroupID)); // create a random peer id.
// Start JXTA.
System.out.println("Starting JXTA");
PeerGroup npg = manager.startNetwork();
System.out.println("JXTA Started : " + npg);
// Register the Gossip Service Configuration Advertisement with the advertisement factory.
// This would normally be done by defining the GossipServiceConfigAdv in the META-INF/services/net.jxta.document.Advertisement
// file of the jar containing the gossip service.
AdvertisementFactory.registerAdvertisementInstance(GossipServiceConfigAdv.getAdvertisementType(), new GossipServiceConfigAdv.Instantiator());
// Create the Module Impl Advertisement for our custom group.
// Start with a standard peer group impl advertisement.
ModuleImplAdvertisement customGroupImplAdv = npg.getAllPurposePeerGroupImplAdvertisement();
// It's custom so we have to change the module spec ID.
customGroupImplAdv.setModuleSpecID(CUSTOM_PEERGROUP_MSID);
// StdPeerGroup uses the ModuleImplAdvertisement param section to describe what services to run.
StdPeerGroupParamAdv customGroupParamAdv = new StdPeerGroupParamAdv(customGroupImplAdv.getParam());
// Add our Gossip Service to the group
customGroupParamAdv.addService(GossipService.GOSSIP_SERVICE_MCID, GossipService.GOSSIP_SERVICE_MSID);
// update the customGroupImplAdv by updating its param
customGroupImplAdv.setParam((XMLElement) customGroupParamAdv.getDocument(MimeMediaType.XMLUTF8));
// publish the ModuleImplAdvertisement for our custom peer group.
npg.getDiscoveryService().publish(customGroupImplAdv);
// Create the module Impl Advertisement for our custom service.
// Create a new ModuleImplAdvertisement instance.
ModuleImplAdvertisement gossipImplAdv = (ModuleImplAdvertisement) AdvertisementFactory.newAdvertisement(ModuleImplAdvertisement.getAdvertisementType());
// Our implementation implements the given ModuleSpecID.
gossipImplAdv.setModuleSpecID(GossipService.GOSSIP_SERVICE_MSID);
// copy compatibility statement from the peer group impl advertisement.
gossipImplAdv.setCompat(customGroupImplAdv.getCompat());
// The code for the implementation is the "tutorial.customgroupservice.GossipService" class.
gossipImplAdv.setCode(GossipService.class.getName());
// If the code needed to be downloaded, where should it be downloaded from. This is not normally used.
gossipImplAdv.setUri("http://jxta-jxse.dev.java.net/download/jxta.jar");
// The provider of the implementation.
gossipImplAdv.setProvider("JXTA Orgainzation.");
// A description of the service. (optional)
gossipImplAdv.setDescription("Tutorial Gossip Service");
// publish the gossip service module implementation advertisement.
npg.getDiscoveryService().publish(gossipImplAdv);
// Create the Peer Group Advertisement.
// Crete a new PeerGroupAdvertisement instance.
PeerGroupAdvertisement customGroupAdv = (PeerGroupAdvertisement) AdvertisementFactory.newAdvertisement(PeerGroupAdvertisement.getAdvertisementType());
// Set our chosen peer group ID.
customGroupAdv.setPeerGroupID(CUSTOM_PEERGROUP_ID);
// Set the peer group name.
customGroupAdv.setName("Custom Gossip Peer Group");
// The custom group uses our custom Module Specification.
customGroupAdv.setModuleSpecID(customGroupImplAdv.getModuleSpecID());
// Add Gossip Service configuration parameters to the group adv.
GossipServiceConfigAdv gossipConfig = (GossipServiceConfigAdv) AdvertisementFactory.newAdvertisement(GossipServiceConfigAdv.getAdvertisementType());
if(args.length != 0) {
// Use the command line parameters as the gossip text.
StringBuilder gossipText = new StringBuilder();
for(String arg : Arrays.asList(args)) {
if(0 != gossipText.length()) {
gossipText.append(" ");
}
gossipText.append(arg);
}
gossipConfig.setGossip(gossipText.toString());
} else {
// Use default gossip text.
gossipConfig.setGossip("Custom Peer Group Services are fun!");
}
gossipConfig.setShowOwn(true);
// Save the gossip config into the peer group advertisement.
XMLDocument asDoc = (XMLDocument) gossipConfig.getDocument(MimeMediaType.XMLUTF8);
customGroupAdv.putServiceParam(GossipService.GOSSIP_SERVICE_MCID, asDoc);
// publish the peer group advertisement.
npg.getDiscoveryService().publish(customGroupAdv);
// Now we can instantiate the peer group.
PeerGroup cpg = npg.newGroup(customGroupAdv);
cpg.startApp(new String[0]);
System.out.println("Started Custom Peer Group : " + cpg);
// Sleep for a while. The Gossip Service will do it's gossiping.
try {
Thread.sleep( 2 * 60 * 1000);
} catch(InterruptedException woken) {
Thread.interrupted();
}
System.out.println("Stopping Custom Peer Group : " + cpg);
cpg.stopApp();
System.out.println("Stopping JXTA");
manager.stopNetwork();
} catch (Throwable e) {
System.err.println("Fatal error -- quitting.");
e.printStackTrace(System.err);
System.exit(-1);
}
}
}