zoukankan      html  css  js  c++  java
  • JXTA中定义自己的成员服务

    http://blog.csdn.net/neusoftware_20063500/article/details/4302903

    ——————————————————————————————————————————————————————————————————————————

    成员服务:MemberShipService

    这个服务是点组用于管理成员的一项服务,既然是服务就可以自己装载和卸载,我们的目的就是定义自己的规则,符合自定义规则的成员可以加入组,否则不可以。所以我们需要实现三个实现类,MemberShipService的实现类、Credential的实现类,Authenticator的实现类。然后需要将成员服务装载到组中,组中的服务继承于父组,所以如果不自定义自己的服务,就继承NetPeerGroup的服务,默认情况下成员服务不做任何验证工作,平台为我们默认实现了PasswdMemberShipService,用于验证密码,那么我们新建自己的组并且装载自己服务的过程如下:

    1. 得到父组的ModuleImplAdvertisement

    2. StructuredDocument paramDoc = advertisement.getParam()获得参数

    3. StdPeerGroupParamAdv paramAdv = new StdPeerGroupParamAdv(paramDoc)封装为标准通告

    4. Map services = paramAdv.getServices()得到服务,这些服务就是父组的所有服务

    5. services.put(PeerGroup.membershipClassID, moduleAdv);将成员服务替换为自己的成员服务,替换key为membershipClassID的ModuleImplAdvertisement对象,那么如何构建自己服务的ModuleImplAdvertisement对象呢?

    6. paramAdv.setServices(services);

    7. advertisement.setParam((net.jxta.document.TextElement)paramAdv.getDocument(
                                  new net.jxta.document.MimeMediaType(DOCUMENT_MIME_TYPE,
                                                                      DOCUMENT_BASE_TYPE)));还原

    8. peerGroup = parent.newGroup(peerGroupID, advertisement, groupName, groupDescription);
    peerGroup.init(this.parent,peerGroupID, advertisement);

    创建子组然后发布子组。

    9. 下面是获得自己的成员服务ModuleImplAdvertisement 的方法

    String moduleImplAdvType = ModuleImplAdvertisement.getAdvertisementType();
            ModuleImplAdvertisement implAdvertisement = (ModuleImplAdvertisement)
                        AdvertisementFactory.newAdvertisement(moduleImplAdvType);新建一个空的

            implAdvertisement.setModuleSpecID(PeerGroup.refMembershipSpecID);
            implAdvertisement.setCompat(stdCompatStatement);
            implAdvertisement.setCode(code);code是实现MemberShipService的完整类名
            implAdvertisement.setUri(stdUri);
            implAdvertisement.setProvider(stdProvider);
            implAdvertisement.setDescription(descr); 填充信息

    那么这样就替换了自己的服务,总体过程是获得父亲组的所有服务,从父亲组的通告(ModuleImplAdvertisement)中获得所有服务,然后将其中的具体某个服务替换成自己的服务(用ModuleImplAdvertisement标示),然后将服务重新设置到通告中,然后根据这个通告创建子组。那么此子组就有自己的成员服务了。

    下面是Java P2P程序设计的实例代码:

    GroupManager:

    package com.sams.jxta.groups;
    
    import net.jxta.credential.AuthenticationCredential;
    import net.jxta.credential.Credential;
    import net.jxta.discovery.DiscoveryService;
    import net.jxta.document.Advertisement;
    import net.jxta.document.AdvertisementFactory;
    import net.jxta.document.StructuredDocument;
    import net.jxta.document.StructuredTextDocument;
    import net.jxta.exception.PeerGroupException;
    import net.jxta.exception.ProtocolNotSupportedException;
    import net.jxta.id.IDFactory;
    import net.jxta.impl.id.UUID.UUIDFactory;
    import net.jxta.impl.protocol.PeerGroupAdv;
    import net.jxta.peergroup.PeerGroupID;
    import net.jxta.peergroup.PeerGroupFactory;
    import net.jxta.impl.peergroup.StdPeerGroup;
    import net.jxta.impl.peergroup.StdPeerGroupParamAdv;
    import net.jxta.membership.Authenticator;
    import net.jxta.membership.MembershipService;
    import net.jxta.peergroup.PeerGroup;
    import net.jxta.platform.ModuleClassID;
    import net.jxta.protocol.ModuleImplAdvertisement;
    import net.jxta.protocol.PeerGroupAdvertisement;
    
    import java.util.Enumeration;
    import java.util.Hashtable;
    import java.util.Map;
    
    /**
     * This class can be used to create a new group with a pluggable 
     * Membership service.It provides simple APIs for Apply,Join and Resign
     * functionalities.
     */
    
    public class GroupManager {
    
        private static final org.apache.log4j.Category LOG = 
            org.apache.log4j.Category.getInstance(GroupManager.class.getName());
        protected DiscoveryService disco;
        // The parent group of the current peer group
        protected PeerGroup parent;
        // Net peer for creating advertisements.
        protected PeerGroup netPeerGroup;
        // The current peer group
        protected PeerGroup activeGroup;
        // Any module(like a peer group) that is loaded by the parent group,must 
        // be compatible with the parent.Compatibility is checked by comparision 
        // with the stdCompactStatement 
        public StructuredTextDocument stdCompatStatement = // ??? Taken from StdPeerGroup
                    mkCS();
        // An identifier to the implementation used // ??? Is it so ?
        public String stdUri = "http://www.jxta.org/download/jxta.jar";// ??? Taken from StdPeerGroup
        // The provider of the implementation // ??? Is it so ?
        public String stdProvider = "sun.com";// ??? Taken from StdPeerGroup
    
        // The mime type of all documents used in this example
        public static final String DOCUMENT_MIME_TYPE="text";
        // The base type of all documents
        public static final String DOCUMENT_BASE_TYPE="xml";
        // This is the root element documents created
        public static final String DOCUMENT_ROOT_ELEMENT="Comp";    
        // Key ??? What is this used for ?
        private static final String KEY="Efmt";    
        // Value ??? What is this used for ?
        private static final String VALUE="JDK1.4";
        // Key used to represent the binding
        private static final String BINDING_KEY="Bind";
        // Value of the binding key.It represents the binding 
        // of JXTA that we use.
        private static final String BINDING_VALUE="V1.0 Ref Impl";
       
        /** 
         * The constructor of the Group Manger.Initially 
         * the parent group is the also the active group.
         */
         
        public GroupManager(PeerGroup netPeerGroup, PeerGroup parent) {
       
            this.disco  = parent.getDiscoveryService();
            this.parent = parent;
            this.activeGroup = parent;
            this.netPeerGroup = netPeerGroup;
            if (netPeerGroup ==  null){
                System.out.println("netPeerGroup :"+netPeerGroup+" - aborting");
                throw new NullPointerException("netPeerGroup :"+netPeerGroup+" - aborting");
            }
       }
        
        /* 
         *   Method to add a new peer group and publish it.The 
         *   groupMemebershipClassName is the fully qualified class 
         *   name of the mermbership service class.
         *
         */
         
        public PeerGroup addGroup(String groupName,String groupMembershipClassName,
                                  String groupDescription,
                                  ModuleImplAdvertisement advertisement,
                                  boolean conditional){
    System.out.println("GroupManager.addGroup Successfully created SecurityDemoGroup");
            // The first thing we do is to see if a group already exists by this name.
            // If so we get the Group ID of the group. Then depending on the unconditional
            // flag we proceed.
            // If it is an conditional add ,we create a new group only if no other group
            // with the same name already exists otherwise we throw an exception.
            // If it is an unconditional add , we always create  a group.If the user had previously
            // created the group , we use the Old group ID . 
            PeerGroupID oldPeerGroupID = alreadyExists(groupName);
            if(oldPeerGroupID != null && conditional==true)
                throw new GroupManagerException("A Group by this name already exists with id :"
                                                 +oldPeerGroupID);
            
            // If no Advertisement is provided, we create a fresh advertisement.
            if (advertisement == null){
                LOG.debug("Creating a new Advertisement");
                // We use the existing advertisement of the standard peer group
                // and add our service along with the other standard services 
                try{
                    // This is used as a base to create the new advertisement upon    
                    System.out.println("netPeerGroup :"+netPeerGroup);
                    advertisement = netPeerGroup.getAllPurposePeerGroupImplAdvertisement();
                    //advertisement = parent.getAllPurposePeerGroupImplAdvertisement();//<< Did not work in current platform
                    StructuredDocument paramDoc = advertisement.getParam();
                    System.out.println("StructuredDocument paramDoc:"+paramDoc);
                    // The Param document used to make the StandradPeerGroup Advertisement
                    StdPeerGroupParamAdv paramAdv = new StdPeerGroupParamAdv(paramDoc);
                    // List of all the available standard services
                    Map services = paramAdv.getServices();
                    // Make a ModuleImplAdvertisemnet for the membership service
                    ModuleImplAdvertisement moduleAdv = 
                        mkImplAdvBuiltin(PeerGroup.refMembershipSpecID,groupMembershipClassName,
                                         groupDescription);
                    // Add this service along the other standard services            
                    services.put(PeerGroup.membershipClassID, moduleAdv);
                    paramAdv.setServices(services);
                    advertisement.setParam((net.jxta.document.TextElement)paramAdv.getDocument(
                                  new net.jxta.document.MimeMediaType(DOCUMENT_MIME_TYPE,
                                                                      DOCUMENT_BASE_TYPE)));
                    System.out.println("compat " + advertisement.getCompat());
                    System.out.println("compat " + StdPeerGroup.STD_COMPAT);
                }catch(PeerGroupException peerGroupException){
                    peerGroupException.printStackTrace();
                    System.exit(-1);
                    LOG.error("Error in creating Advertisement",peerGroupException);
                    throw new GroupManagerException(peerGroupException.getMessage());
                }catch(Exception genericException){
                    genericException.printStackTrace();
                    LOG.error("Error in creating Advertisement",genericException);
                    System.exit(-1);
                    throw new GroupManagerException(genericException.getMessage());
                }
            }
            LOG.debug("Successfullt created ADVERTISEMENT");  
            
            // initialize but to no start the application
            // this is done by the join command
            LOG.debug("Creating the Peer Group");        
            PeerGroup peerGroup = null;
            try {
                // create a PeerGroup ID
                PeerGroupID peerGroupID = null;
                if(oldPeerGroupID != null){
                    peerGroupID = oldPeerGroupID;
                }else{
                    peerGroupID = IDFactory.newPeerGroupID();
                }
                // create the PeerGroup
                peerGroup = parent.newGroup(peerGroupID, advertisement, groupName, groupDescription);////
                // initialize the peergroup
                peerGroup.init(this.parent,peerGroupID, advertisement);
            } catch (PeerGroupException peerGroupException) {
                peerGroupException.printStackTrace();
                LOG.error("Unable to create a peer group !",peerGroupException);
                throw new GroupManagerException(peerGroupException.getMessage());
            }
            // For debug purposes, print advertisement to console
            //com.sams.jxta.Util.printAdvertismentDoc(advertisement);
            // Try to publish the advertisement
            LOG.debug("Trying to publish the advertisement");
            publish(peerGroup, advertisement/*original advertisement???*/);
            LOG.debug("Peer Group Advertisement successfully published");
            return peerGroup;
      
       }
    
        /** 
         * Will check if a peer group with the same name exists on this peer
         */
    
        public PeerGroupID alreadyExists(String name){
        
            DiscoveryService discovery = parent.getDiscoveryService();
            Enumeration enumeration =null;
            try{
                enumeration =
                    discovery.getLocalAdvertisements(discovery.GROUP, "Name",name);
            } catch(java.io.IOException ioException) {
                LOG.debug("Error in getting local advertisements ");
                return null;
            }
            // If the group already exists either the  enumeration is null
            // or it does not contain any data 
            
            if(enumeration != null && enumeration.hasMoreElements())
                return ((PeerGroupAdv)enumeration.nextElement()).getPeerGroupID();
            else
                return null; 
        }
    
        // Tries to publish the newly created peer group  
        // ??? Why do we need the original Advertisement ?
        private void publish(PeerGroup child,Advertisement pgAdv
                                   //PeerGroupAdvertisement origAdv
                                   ) {
          System.out.println("Publishing group");
          //get the Discovery for this group
          //Publish the New Peer in its group discovery
          
          DiscoveryService discovery;
          try {
             discovery = parent.getDiscoveryService();
             discovery.publish(pgAdv);
             // let's publish the peer adv
             //if (origAdv != null){//?????? Not sure what this does
                // we could check if it is indeed ours
                // but it does not hurt to publish it any way
             //   discovery = child.getDiscoveryService();
             //   discovery.publish(origAdv, DiscoveryService.GROUP);
             //}
          } catch (java.io.IOException ioException) {
             LOG.error("Could not publish the service !",ioException);
             throw new GroupManagerException(ioException.getMessage());
          }
          LOG.debug("Published the group successfully");
        }
    
        /**
         *  This is the code that will create a credential to join the group.
         *  Each group that we are joining has a specific membership requirement.
         *  Many groups will just be the NullMembership, which is the default.
         *
         */
         
        public Credential joinGroup(PeerGroup newGroup,StructuredDocument credentials,
                                   String authenticationMethod) 
                                   throws GroupManagerAuthenticationException,
                                   ProtocolNotSupportedException{
    
            MembershipService membership = (MembershipService) newGroup.getMembershipService();
            // The first step is to apply to the membership service
            Authenticator authenticator;
            authenticator = applyToMembershipService(newGroup,credentials,authenticationMethod);
            // Next step is to allow the user to "fill up" the authenticator
            // by creating a dialog
            LOG.debug("Apply process successful");
            authenticate(authenticator);
            // third , try to join the service
            Credential authenticatedCredential =joinMembershipService(authenticator,newGroup);
            
            // All is fine ! We can switch to the new group
            activeGroup = newGroup;           
            LOG.debug("JOIN SUCCESSFUL !");
            return authenticatedCredential;
            
        }
    
        /**
         * This code demonstrates how to apply to a membership service.
         */
         
        private Authenticator applyToMembershipService(PeerGroup peerGroup,
                                                       StructuredDocument credentials,
                                                       String authenticationMethod)
                                                       throws GroupManagerAuthenticationException,
                                                       ProtocolNotSupportedException{
            Authenticator authenticator = null;
            // Here we create an authentication credential and 
            // try to apply for a Authenticator.An exception is thrown in case
            // this step fails.
            try {
                
                AuthenticationCredential authenticationCredential =
                        new AuthenticationCredential(peerGroup,authenticationMethod,credentials );
                MembershipService membership = (MembershipService) peerGroup.getMembershipService();
                authenticator = (Authenticator)membership.apply( authenticationCredential );
                
            } catch( PeerGroupException peerGroupException ) {
                // This denotes a failure in the Apply process.We
                // consider this as an Authentication exception.
                LOG.error("Apply process failed !! ",peerGroupException);
                    throw new GroupManagerAuthenticationException(peerGroupException.getMessage());
            } catch (ProtocolNotSupportedException protocolNotSupportedException){
                    LOG.error(protocolNotSupportedException);
                    throw protocolNotSupportedException;  
            }
            return authenticator;                                        
        }
    
            
        /** 
         * This method will help the user to actually "fill up" the authenticator
         * details. It will display a dialog and enable the user to visually 
         * provide details to each parameter of the Authenticator.The parameters
         * of the Authenticator are found by Introspection.
         */
         
        private void authenticate( Authenticator authenticator ){
            // The following bean looks for standard bean parameters to create the
            // contents to set the authenticator. There is no real spec so this
            // will have to do.
            AuthenticatorBean viewBean = new AuthenticatorBean(null,
                                             true,authenticator,
                                             "Please Enter Required Group Info");
            viewBean.setVisible(true);
        }
        
        /**
         * This code demonstrates how to join a membership service.
         */
         
        private Credential joinMembershipService(Authenticator authenticator,
                                                 PeerGroup peerGroup)
                                                 throws GroupManagerAuthenticationException {
                                                 
            Credential authenticatedCredential = null;                                    
            // We check if the user is authentic
            if( !authenticator.isReadyForJoin() ) {
                LOG.error( "Authenticator is not ready to join");
                throw new GroupManagerAuthenticationException("Authenticator is not ready to join !");
            }
             
            // Since the user is authentic , we allow the 
            // user to join the service.But the service may reject the
            // user as well.
             
            try{
                MembershipService membership = (MembershipService) peerGroup.getMembershipService();
                authenticatedCredential= membership.join(authenticator);
            } catch(PeerGroupException peerGroupException) {
                 LOG.error( "Error in the Join Process",peerGroupException);
                 throw new GroupManagerAuthenticationException("Error in the Join Process");
            }
            return authenticatedCredential;                                                     
        }
      
        /**
         * Method used to quit the current active group.
         */
        
        public void leaveGroup(){
        
            MembershipService memberShipService = activeGroup.getMembershipService();
            try{
                memberShipService.resign();    
            } catch(PeerGroupException peerGroupException){
                LOG.error("Exception in resign",peerGroupException);
                throw new GroupManagerException(peerGroupException.getMessage());
            }
            activeGroup = parent;
            purgeGroups();
        }
       
        /*
         * The method to renew the membership to the currently active group. 
         */
         
        public void renew(Credential credential){
            // ??? Seems that the implementation does not have a concept of renewal
        }
       
        /**
         * Purge all groups from the cache. This help prevent us from creating
         * a copy of a group with the same ID.
         *
         */
         
        public void purgeGroups(){
            DiscoveryService discovery = parent.getDiscoveryService();
            try{
                discovery.flushAdvertisements(null,DiscoveryService.GROUP);
            } catch (java.io.IOException ioException) {
                LOG.error("Error in purging Groups",ioException);
                throw new GroupManagerException(ioException.getMessage());
            }
       }
    
        /**
         * Creates an ModuleImplAdvertisement which in this context is a 
         * MembershipService.
         * 
         */
         
        private ModuleImplAdvertisement mkImplAdvBuiltin(
                                        net.jxta.platform.ModuleSpecID specID,
                                        String code,String descr) {
                                        
            String moduleImplAdvType = ModuleImplAdvertisement.getAdvertisementType();
            ModuleImplAdvertisement implAdvertisement = (ModuleImplAdvertisement)
                        AdvertisementFactory.newAdvertisement(moduleImplAdvType);
            implAdvertisement.setModuleSpecID(specID);
            implAdvertisement.setCompat(stdCompatStatement);
            implAdvertisement.setCode(code);
            implAdvertisement.setUri(stdUri);
            implAdvertisement.setProvider(stdProvider);
            implAdvertisement.setDescription(descr);
            return implAdvertisement;
       }
    
    
        /**
         * Creates a compatibility segment for a ModuleImplAdvertisement.
         * This is needed so that our parent group can load modules of the 
         * reference implementation also.
         */
         
         //??? Taken from StdPeerGroup because it was private. This should have 
         //* been in a utility class.
        protected StructuredTextDocument mkCS() {
                                              
             StructuredTextDocument doc = (StructuredTextDocument)
                net.jxta.document.StructuredDocumentFactory.newStructuredDocument(
                    new net.jxta.document.MimeMediaType(DOCUMENT_MIME_TYPE,
                                                        DOCUMENT_BASE_TYPE),
                                                        DOCUMENT_ROOT_ELEMENT);
             net.jxta.document.Element e = doc.createElement(KEY, VALUE);
             doc.appendChild(e);
             e = doc.createElement(BINDING_KEY, BINDING_VALUE);
             doc.appendChild(e);
             return doc;
        }
        
        /**
         * This method is used for refreshing the peer with remotely published advertisements.
         * //???Makes little sense without a listener.Moreover the method is deprecated
         */
    
        public void refreshGroups(){
        
            //disco.getRemoteAdvertisements(null, DiscoveryService.GROUP, null, null,100);
        }
    
        /*
         * Method used to get the currently active group.
         */
    
        public PeerGroup getActiveGroup(){
        
            return activeGroup;           
        }
    }

    UniversityAdmissionsService

    package com.sams.jxta.groups.student;
    
    import net.jxta.membership.MembershipService;
    import net.jxta.membership.Authenticator;
    import net.jxta.credential.Credential;
    import net.jxta.credential.AuthenticationCredential;
    import net.jxta.exception.PeerGroupException;
    import net.jxta.exception.ProtocolNotSupportedException;
    import net.jxta.discovery.DiscoveryService;
    import net.jxta.document.Element;
    import net.jxta.document.Advertisement;
    import net.jxta.id.ID;
    import net.jxta.impl.membership.passwd.PasswdMembershipService;
    import net.jxta.peergroup.PeerGroup;
    import net.jxta.protocol.ModuleImplAdvertisement;
    import net.jxta.service.Service;
    import net.jxta.document.StructuredDocument;
    
    import java.util.Vector;
    
    import java.util.Enumeration;
    
    /*
     * A Membership Service designed to represent the Admission Process in a Univeristy.
     */
    
    public class UniversityAdmissionsService extends PasswdMembershipService{
    
        public UniversityAdmissionsService() throws PeerGroupException {
            super();
        }
    
        private static final org.apache.log4j.Category LOG = 
            org.apache.log4j.Category.getInstance(UniversityAdmissionsService.class.getName());
        private PeerGroup peerGroup;
        private ModuleImplAdvertisement implAdv;
        private ID assignedID;
        private Vector    invitationLetters          = new Vector();
        private Vector    authenticationCredentials = new Vector();
    
        /*
         * This method is called during an apply process.
         */
            
        public Authenticator apply( AuthenticationCredential unsubscribedCredential )
             throws PeerGroupException, ProtocolNotSupportedException{
             
             String method = unsubscribedCredential.getMethod();
            
             if( (null != method) && !"PreApplication".equals( method ) )
                throw new ProtocolNotSupportedException(
                "Authentication method not recognized : Required /"PreApplication/" ");
            StructuredDocument preApForm = 
                (StructuredDocument)unsubscribedCredential.getIdentityInfo();
            Enumeration enums = preApForm.getChildren();
            Element element = (Element) enums.nextElement();
            String departmentAppliedFor =(String) element.getValue();
            // Vacancies exist only in the Computer Science Department
            if(!departmentAppliedFor.equals(PreApplicationForm.DEPARTMENT_COMPUTER_SCIENCE))
                throw new PeerGroupException("No Admissions to this Department(code:"+departmentAppliedFor+")");
            ApplicationForm applicationForm = new ApplicationForm(this,unsubscribedCredential);        
            return applicationForm;
    
        }         
    
        /*
         * This method is called when the peer is interested in joining the peer group.
         */
         
        public Credential join(Authenticator authenticated )throws PeerGroupException{
    
            ApplicationForm applicationForm   = (ApplicationForm)authenticated;
            // We double check that the Authentiction is indeed successful
            if(!applicationForm.isReadyForJoin())
                throw new PeerGroupException("Application Form rejected !!");            
            // this means that the person can be taken in 
            InvitationLetter invitationLetter = new InvitationLetter(this);
            invitationLetters.addElement(invitationLetter);
            authenticationCredentials.addElement(authenticated.getAuthenticationCredential());
            return invitationLetter;
        }
    
        /*
         * This method is called when the peer leaves the group.
         * Here we destroy all previous records of Authentication
         * Credentials and Credentials
         */
        public void resign(){
            //Destory all records 
            invitationLetters          = new Vector();
            authenticationCredentials = new Vector();
       }
    
        /*
         * Returns all the Credentials for this peer 
         */
        public Enumeration getCurrentCredentials(){
         return invitationLetters.elements();
        }
    
        /*
         * Returns all the Authentication Credentials for this peer 
         */
        public Enumeration getAuthCredentials(){
         return authenticationCredentials.elements();
         }
    
        /*
         * Returns the ModuleImplAdvertisement
         */
        public Advertisement getImplAdvertisement(){
         return implAdv;
        }
    
        /*
         * This method is called when the module is initialized.
         */
        public void init(PeerGroup peerGroup,
                         ID assignedID,
                         Advertisement implAdv)
            throws PeerGroupException{
            
                this.peerGroup = peerGroup;
                this.assignedID=assignedID;
                this.implAdv=(ModuleImplAdvertisement)implAdv;
        }
    
        /*
         * Getter method for the peer group
         */
        public PeerGroup getPeerGroup(){
            return peerGroup;
        }
    
        /*
         * Getter for the Interface.For the sake of simplicity ,
         * this object acts as it's own interface.
         */
        public Service getInterface() {
            return this;
        }
        
        /*
         * Methods to be implemented by virtue of being a module.
         * Not used in this example 
         */
        
        public int startApp(String[] args){return 0;}
    
        public void stopApp(){}
    
        /*
         * This method is currently not supported .//??? Is this OK ?
         */
        public Credential makeCredential( Element element )
                throws PeerGroupException, Exception{
            return null;
        }
    
    }

    PreApplicationForm

    package com.sams.jxta.groups.student;
    
    import net.jxta.document.Element;
    import net.jxta.document.MimeMediaType;
    import net.jxta.document.StructuredDocument;
    import net.jxta.document.StructuredDocumentFactory;
    
    /*
     * A Pre Application Form is used as an identity info in the 
     * Authentication Credential.
     * 
     */
    
    public abstract class PreApplicationForm {
        
        public static final String DEPARTMENT_COMPUTER_SCIENCE = "CS";
        public static final String DEPARTMENT_MANAGEMENT       = "MT";
        public static final String DEPARTMENT_ARCHITECTURE     = "AT";
    
        /*
         * This methods creates a Structured Document representing the PreApp form.
         * This serves as an IdentityInfo in the authentication credential.
         */
        public static final StructuredDocument createPreAppForm(String department){
            
            MimeMediaType type = new MimeMediaType("text","xml");
            StructuredDocument doc =
                    StructuredDocumentFactory.newStructuredDocument( type,"PreAppForm" );
            Element e = doc.createElement( "Department",department); 
            doc.appendChild( e );
            return doc;
            
       }
    }

    InvitationLetter

    package com.sams.jxta.groups.student;
    
    import net.jxta.credential.Credential;
    import net.jxta.peergroup.PeerGroupID;
    import net.jxta.peer.PeerID;
    import net.jxta.service.Service;
    import net.jxta.id.ID;
    import net.jxta.membership.MembershipService;
    import net.jxta.document.StructuredDocument;
    import net.jxta.document.StructuredDocumentFactory;
    import net.jxta.document.MimeMediaType;
    import net.jxta.document.Element;
    
    /*
     * This class represents a Credential that is supplied to a
     * peer after a successful apply process.
     */
    public class InvitationLetter implements Credential {
        // Reference to the Membership Service
        private UniversityAdmissionsService admissionsService;
    
       /*
        * Constructor which takes a Membership Service Object
        */
        public InvitationLetter(UniversityAdmissionsService admissionsService){
                                
            this.admissionsService = admissionsService;
        }
        /*
         * Getter for the Membership Service
         */
        public Service  getSourceService(){
            
            return admissionsService;
        }
    
        /*
         * This method returns the PeerGroup ID
         */
        public ID getPeerGroupID(){
            return admissionsService.getPeerGroup().getPeerGroupID();
        }
        
        /*
         * This method returns the Peer ID
         */
        public ID getPeerID(){
            return admissionsService.getPeerGroup().getPeerID();
        }
    
        /*
         * This method returns a Structured Document representing the Credential
         */
        public StructuredDocument getDocument(MimeMediaType as) throws Exception {
            
                StructuredDocument doc =
                    StructuredDocumentFactory.newStructuredDocument( as,"InivtationLetter" );
                
                Element e = doc.createElement( "PeerGroupID", 
                        admissionsService.getPeerGroup().getPeerGroupID() );
                doc.appendChild( e );
                e = doc.createElement("TimeOfRequest",""+System.currentTimeMillis());
                doc.appendChild( e );
                return doc;
        }
        public Object getSubject() {
            return null;
        }
        public boolean isExpired() {
            return false;
        }
        public boolean isValid() {
            return false;
        }
    }

    ApplicationForm

    package com.sams.jxta.groups.student;
    
    import net.jxta.membership.Authenticator;
    import net.jxta.membership.MembershipService;
    import net.jxta.credential.AuthenticationCredential;
    
    /*
     * An Application Form represents an Authenticator.
     * 
     */
    public class ApplicationForm implements Authenticator{
        
        private String studentName;
        private float GPA;
        private UniversityAdmissionsService admissionsService;
        private AuthenticationCredential unsubscribedCredential;    
    
        /*
         * Constructor
         */
        public ApplicationForm(UniversityAdmissionsService admissionsService,
                               AuthenticationCredential unsubscribedCredential){
            this.admissionsService      = admissionsService;
            this.unsubscribedCredential = unsubscribedCredential;
        }
        
        /*
         * Returns a String representing the method Name
         */
         public String getMethodName(){
            return "ApplicationForm";
        }
    
        /*
         * Returns the Authentication Credential
         */
        public AuthenticationCredential getAuthenticationCredential(){
            return unsubscribedCredential;
        }
        
        /*
         * Returns the Source Membership Service
         */
        public MembershipService  getSourceService(){
         return admissionsService;
        }
    
        /*
         * This method checks if the Application Form is authenticated properly
         * Only if the form is "filled" properly , can the peer join the Membership
         * Service. Here we consider an Application Form as ready to join if 
         * the GPA is greater than 3.0 and a "non blank" name has been provided.
         * 
         */
        public boolean  isReadyForJoin(){
         if(studentName == null || studentName.trim().equals(""))
            return false;                    
         if(GPA >3.0f)
          return true;
         else
          return false;
        }
    
        /*
         * Setter for the GPA
         */
        public void setGPA(float GPA){
         this.GPA = GPA;
        }
        
        /*
         * Setter for the Student Name
         */
        public void setStudentName(String studentName){
            this.studentName=studentName;
        }
    }

    下面是使用PasswdMemeberShipService的例子

    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.net.URI;
    import java.util.Enumeration;
    import java.util.Hashtable;
    import java.util.Vector;
    import net.jxta.credential.AuthenticationCredential;
    import net.jxta.discovery.DiscoveryService;
    import net.jxta.document.Advertisement;
    import net.jxta.document.AdvertisementFactory;
    import net.jxta.document.Element;
    import net.jxta.document.MimeMediaType;
    import net.jxta.document.StructuredDocument;
    import net.jxta.document.StructuredDocumentFactory;
    import net.jxta.document.StructuredTextDocument;
    import net.jxta.document.TextElement;
    import net.jxta.exception.PeerGroupException;
    import net.jxta.id.ID;
    import net.jxta.id.IDFactory;
    import net.jxta.impl.membership.PasswdMembershipService;
    import net.jxta.membership.Authenticator;
    import net.jxta.membership.MembershipService;
    import net.jxta.peergroup.PeerGroup;
    import net.jxta.peergroup.PeerGroupFactory;
    import net.jxta.peergroup.PeerGroupID;
    import net.jxta.platform.ModuleSpecID;
    import net.jxta.protocol.ModuleImplAdvertisement;
    import net.jxta.protocol.PeerGroupAdvertisement;
    import net.jxta.impl.peergroup.StdPeerGroupParamAdv;
    
    public class PrivatePeerGroup {
        private PeerGroup myNetPeerGroup = null, satellaPeerGroup = null,
                discoveredSatellaPeerGroup = null;
        private final static PeerGroupID satellaPeerGroupID = PeerGroupID
                .create(URI.create("jxta:uuid-4d6172676572696e204272756e6f202002"));
    
        /** Creates new RootWS */
        public PrivatePeerGroup() {
            // Starts the JXTA Platform
            myNetPeerGroup = this.startJxta();
            if (myNetPeerGroup != null) {
                System.out.println("JXTA platform Started ...");
            } else {
                System.err.println("Failed to start JXTA : myNetPeerGroup is null");
                System.exit(1);
            }
            // Generate the parameters:
            // login, passwd, peer group name and peer group id
            // for creating the Peer Group
            String login = "PrivatePeerGroups";
            String passwd = "RULE";
            String groupName = "SatellaGroup";
            // create The Passwd Authenticated Peer Group
            satellaPeerGroup = this.createPeerGroup(myNetPeerGroup, groupName,
                    login, passwd);
            // join the satellaPeerGroup
            if (satellaPeerGroup != null) {
                System.out.println(" Peer Group Created ...");
                discoveredSatellaPeerGroup = this.discoverPeerGroup(myNetPeerGroup,
                        satellaPeerGroupID);
                if (discoveredSatellaPeerGroup != null) {
                    System.out.println(" Peer Group Found ...");
                    this.joinPeerGroup(discoveredSatellaPeerGroup, login, passwd);
                }
            }
            System.out.println(" Peer Group Joined ...");
            // Print the Peer Group Adverstisement on sdt out.
            this.printXmlAdvertisement(
                    "XML Advertisement forPeer Group Advertisement",
                    satellaPeerGroup.getPeerGroupAdvertisement());
        }
    
        private PeerGroup createPeerGroup(PeerGroup rootPeerGroup,
                String groupName, String login, String passwd) {
            // create the Peer Group by doing the following:
            // - Create a Peer Group Module Implementation Advertisement and publish
            // it
            // - Create a Peer Group Adv and publish it
            // - Create a Peer Group from the Peer Group Adv and return this object
            PeerGroup satellaPeerGroup = null;
            PeerGroupAdvertisement satellaPeerGroupAdvertisement;
            // Create the PeerGroup Module Implementation Adv
            ModuleImplAdvertisement passwdMembershipModuleImplAdv;
            passwdMembershipModuleImplAdv = this
                    .createPasswdMembershipPeerGroupModuleImplAdv(rootPeerGroup);
            // Publish it in the parent peer group
            DiscoveryService rootPeerGroupDiscoveryService = rootPeerGroup
                    .getDiscoveryService();
            try {
                rootPeerGroupDiscoveryService.publish(
                        passwdMembershipModuleImplAdv, PeerGroup.DEFAULT_LIFETIME,
                        PeerGroup.DEFAULT_EXPIRATION);
                rootPeerGroupDiscoveryService
                        .remotePublish(passwdMembershipModuleImplAdv,
                                PeerGroup.DEFAULT_EXPIRATION);
            } catch (java.io.IOException e) {
                System.err.println("Can't Publish passwdMembershipModuleImplAdv");
                System.exit(1);
            }
            // Now, Create the Peer Group Advertisement
            satellaPeerGroupAdvertisement = this.createPeerGroupAdvertisement(
                    passwdMembershipModuleImplAdv, groupName, login, passwd);
            // Publish it in the parent peer group
            try {
                rootPeerGroupDiscoveryService.publish(
                        satellaPeerGroupAdvertisement, PeerGroup.DEFAULT_LIFETIME,
                        PeerGroup.DEFAULT_EXPIRATION);
                rootPeerGroupDiscoveryService
                        .remotePublish(satellaPeerGroupAdvertisement,
                                PeerGroup.DEFAULT_EXPIRATION);
            } catch (java.io.IOException e) {
                System.err.println("Can't Publish satellaPeerGroupAdvertisement");
                System.exit(1);
            }
            // Finally Create the Peer Group
            if (satellaPeerGroupAdvertisement == null) {
                System.err.println("satellaPeerGroupAdvertisement is null");
            }
            try {
                satellaPeerGroup = rootPeerGroup
                        .newGroup(satellaPeerGroupAdvertisement);
            } catch (net.jxta.exception.PeerGroupException e) {
                System.err
                        .println("Can't create Satella Peer Group from Advertisement");
                e.printStackTrace();
                return null;
            }
            return satellaPeerGroup;
        }
    
        private PeerGroupAdvertisement createPeerGroupAdvertisement(
                ModuleImplAdvertisement passwdMembershipModuleImplAdv,
                String groupName, String login, String passwd) {
            // Create a PeerGroupAdvertisement for the peer group
            PeerGroupAdvertisement satellaPeerGroupAdvertisement = (PeerGroupAdvertisement) AdvertisementFactory
                    .newAdvertisement(PeerGroupAdvertisement.getAdvertisementType());
            // Instead of creating a new group ID each time, by using the
            // line below
            // satellaPeerGroupAdvertisement.setPeerGroupID
            // (IDFactory.newPeerGroupID());
            // I use a fixed ID so that each time I start PrivatePeerGroup,
            // it creates the same Group
            satellaPeerGroupAdvertisement.setPeerGroupID(satellaPeerGroupID);
            satellaPeerGroupAdvertisement
                    .setModuleSpecID(passwdMembershipModuleImplAdv
                            .getModuleSpecID());
            satellaPeerGroupAdvertisement.setName(groupName);
            satellaPeerGroupAdvertisement
                    .setDescription("Peer Group using Password Authentication");
            // Now create the Structured Document Containing the login and
            // passwd informations. Login and passwd are put into the Param
            // section of the peer Group
            if (login != null) {
                StructuredTextDocument loginAndPasswd = (StructuredTextDocument) StructuredDocumentFactory
                        .newStructuredDocument(new MimeMediaType("text/xml"),
                                "Parm");
                String loginAndPasswdString = login + ":"
                        + PasswdMembershipService.makePsswd(passwd) + ":";
                TextElement loginElement = loginAndPasswd.createElement("login",
                        loginAndPasswdString);
                loginAndPasswd.appendChild(loginElement);
                // All Right, now that loginAndPasswdElement
                // (The strucuted document
                // that is the Param Element for The PeerGroup Adv
                // is done, include it in the Peer Group Advertisement
                satellaPeerGroupAdvertisement.putServiceParam(
                        PeerGroup.membershipClassID, loginAndPasswd);
            }
            return satellaPeerGroupAdvertisement;
        }
    
        private ModuleImplAdvertisement createPasswdMembershipPeerGroupModuleImplAdv(
                PeerGroup rootPeerGroup) {
            // Create a ModuleImpl Advertisement for the Passwd
            // Membership Service Take a allPurposePeerGroupImplAdv
            // ModuleImplAdvertisement parameter to
            // Clone some of its fields. It is easier than to recreate
            // everything from scratch
            // Try to locate where the PasswdMembership is within this
            // ModuleImplAdvertisement.
            // For a PeerGroup Module Impl, the list of the services
            // (including Membership) are located in the Param section
            ModuleImplAdvertisement allPurposePeerGroupImplAdv = null;
            try {
                allPurposePeerGroupImplAdv = rootPeerGroup
                        .getAllPurposePeerGroupImplAdvertisement();
            } catch (java.lang.Exception e) {
                System.err
                        .println("Can't Execute: getAllPurposePeerGroupImplAdvertisement();");
                System.exit(1);
            }
            ModuleImplAdvertisement passwdMembershipPeerGroupModuleImplAdv = allPurposePeerGroupImplAdv;
            ModuleImplAdvertisement passwdMembershipServiceModuleImplAdv = null;
            StdPeerGroupParamAdv passwdMembershipPeerGroupParamAdv = null;
            passwdMembershipPeerGroupParamAdv = new StdPeerGroupParamAdv(
                    allPurposePeerGroupImplAdv.getParam());
            Hashtable allPurposePeerGroupServicesHashtable = (Hashtable) passwdMembershipPeerGroupParamAdv
                    .getServices();
            Enumeration allPurposePeerGroupServicesEnumeration = allPurposePeerGroupServicesHashtable
                    .keys();
            boolean membershipServiceFound = false;
            while ((!membershipServiceFound)
                    && (allPurposePeerGroupServicesEnumeration.hasMoreElements())) {
                Object allPurposePeerGroupServiceID = allPurposePeerGroupServicesEnumeration
                        .nextElement();
                if (allPurposePeerGroupServiceID
                        .equals(PeerGroup.membershipClassID)) {
                    // allPurposePeerGroupMemershipServiceModuleImplAdv is
                    // the all Purpose Mermbership Service for the all
                    // purpose Peer Group Module Impl adv
                    ModuleImplAdvertisement allPurposePeerGroupMemershipServiceModuleImplAdv = (ModuleImplAdvertisement) allPurposePeerGroupServicesHashtable
                            .get(allPurposePeerGroupServiceID);
                    // Create the passwdMembershipServiceModuleImplAdv
                    passwdMembershipServiceModuleImplAdv = this
                            .createPasswdMembershipServiceModuleImplAdv(allPurposePeerGroupMemershipServiceModuleImplAdv);
                    // Remove the All purpose Membership Service implementation
                    allPurposePeerGroupServicesHashtable
                            .remove(allPurposePeerGroupServiceID);
                    // And Replace it by the Passwd Membership Service
                    // Implementation
                    allPurposePeerGroupServicesHashtable.put(
                            PeerGroup.membershipClassID,
                            passwdMembershipServiceModuleImplAdv);
                    membershipServiceFound = true;
                    // Now the Service Advertisements are complete. Let's
                    // update the passwdMembershipPeerGroupModuleImplAdv by
                    // Updating its param
                    passwdMembershipPeerGroupModuleImplAdv
                            .setParam((Element) passwdMembershipPeerGroupParamAdv
                                    .getDocument(MimeMediaType.XMLUTF8));
                    // Update its Spec ID This comes from the
                    // Instant P2P PeerGroupManager Code (Thanks !!!!)
                    if (!passwdMembershipPeerGroupModuleImplAdv.getModuleSpecID()
                            .equals(PeerGroup.allPurposePeerGroupSpecID)) {
                        passwdMembershipPeerGroupModuleImplAdv
                                .setModuleSpecID(IDFactory
                                        .newModuleSpecID(passwdMembershipPeerGroupModuleImplAdv
                                                .getModuleSpecID().getBaseClass()));
                    } else {
                        ID passwdGrpModSpecID = ID.create(URI.create("urn"
                                + "jxta:uuid-" + "DeadBeefDeafBabaFeedBabe00000001"
                                + "04" + "06"));
                        passwdMembershipPeerGroupModuleImplAdv
                                .setModuleSpecID((ModuleSpecID) passwdGrpModSpecID);
                    } // End Else
                    membershipServiceFound = true;
                } // end if (allPurposePeerGroupServiceID.
                // equals(PeerGroup.membershipClassID))
            }// end While
            return passwdMembershipPeerGroupModuleImplAdv;
        }
    
        private ModuleImplAdvertisement createPasswdMembershipServiceModuleImplAdv(
                ModuleImplAdvertisement allPurposePeerGroupMemershipServiceModuleImplAdv) {
            // Create a new ModuleImplAdvertisement for the
            // Membership Service
            ModuleImplAdvertisement passwdMembershipServiceModuleImplAdv = (ModuleImplAdvertisement) AdvertisementFactory
                    .newAdvertisement(ModuleImplAdvertisement
                            .getAdvertisementType());
            passwdMembershipServiceModuleImplAdv
                    .setModuleSpecID(PasswdMembershipService.passwordMembershipSpecID);
            passwdMembershipServiceModuleImplAdv
                    .setCode(PasswdMembershipService.class.getName());
            passwdMembershipServiceModuleImplAdv
                    .setDescription(" Module Impl Advertisement for the PasswdMembership Service");
            passwdMembershipServiceModuleImplAdv
                    .setCompat(allPurposePeerGroupMemershipServiceModuleImplAdv
                            .getCompat());
            passwdMembershipServiceModuleImplAdv
                    .setUri(allPurposePeerGroupMemershipServiceModuleImplAdv
                            .getUri());
            passwdMembershipServiceModuleImplAdv
                    .setProvider(allPurposePeerGroupMemershipServiceModuleImplAdv
                            .getProvider());
            return passwdMembershipServiceModuleImplAdv;
        }
    
        private PeerGroup discoverPeerGroup(PeerGroup myNetPeerGroup,
                PeerGroupID satellaPeerGroupID) {
            // First discover the peer group
            // In most cases we should use discovery listeners so that
            // we can do the discovery asynchroneously.
            // Here I won't, for increased simplicity and because
            // The Peer Group Advertisement is in the local cache for
            // sure
            PeerGroup satellaPeerGroup;
            DiscoveryService myNetPeerGroupDiscoveryService = null;
            if (myNetPeerGroup != null) {
                myNetPeerGroupDiscoveryService = myNetPeerGroup
                        .getDiscoveryService();
            } else {
                System.err
                        .println("Can't join Peer Group since it's parent is null");
                System.exit(1);
            }
            boolean isGroupFound = false;
            Enumeration localPeerGroupAdvertisementEnumeration = null;
            PeerGroupAdvertisement satellaPeerGroupAdvertisement = null;
            while (!isGroupFound) {
                try {
                    localPeerGroupAdvertisementEnumeration = myNetPeerGroupDiscoveryService
                            .getLocalAdvertisements(DiscoveryService.GROUP, "GID",
                                    satellaPeerGroupID.toString());
                } catch (java.io.IOException e) {
                    System.out.println("Can't Discover Local Adv");
                }
                if (localPeerGroupAdvertisementEnumeration != null) {
                    while (localPeerGroupAdvertisementEnumeration.hasMoreElements()) {
                        PeerGroupAdvertisement pgAdv = null;
                        pgAdv = (PeerGroupAdvertisement) localPeerGroupAdvertisementEnumeration
                                .nextElement();
                        if (pgAdv.getPeerGroupID().equals(satellaPeerGroupID)) {
                            satellaPeerGroupAdvertisement = pgAdv;
                            isGroupFound = true;
                            break;
                        }
                    }
                }
                try {
                    Thread.sleep(5 * 1000);
                } catch (Exception e) {
                }
            }
            try {
                satellaPeerGroup = myNetPeerGroup
                        .newGroup(satellaPeerGroupAdvertisement);
            } catch (net.jxta.exception.PeerGroupException e) {
                System.err.println("Can't create Peer Group from Advertisement");
                e.printStackTrace();
                return null;
            }
            return satellaPeerGroup;
        }
    
        private void joinPeerGroup(PeerGroup satellaPeerGroup, String login,
                String passwd) {
            // Get the Heavy Weight Paper for the resume
            // Alias define the type of credential to be provided
            StructuredDocument creds = null;
            try {
                // Create the resume to apply for the Job
                // Alias generate the credentials for the Peer Group
                AuthenticationCredential authCred = new AuthenticationCredential(
                        satellaPeerGroup, null, creds);
                // Create the resume to apply for the Job
                // Alias generate the credentials for the Peer Group
                MembershipService membershipService = satellaPeerGroup
                        .getMembershipService();
                // Send the resume and get the Job application form
                // Alias get the Authenticator from the Authentication creds
                Authenticator auth = membershipService.apply(authCred);
                // Fill in the Job Application Form
                // Alias complete the authentication
                completeAuth(auth, login, passwd);
                // Check if I got the Job
                // Alias Check if the authentication that was submitted was
                // accepted.
                if (!auth.isReadyForJoin()) {
                    System.out.println("Failure in authentication.");
                    System.out
                            .println("Group was not joined. Does not know how to complete authenticator");
                }
                // I got the Job, Join the company
                // Alias I the authentication I completed was accepted,
                // therefore join the Peer Group accepted.
                membershipService.join(auth);
            } catch (Exception e) {
                System.out.println("Failure in authentication.");
                System.out.println("Group was not joined. Login was incorrect.");
                e.printStackTrace();
            }
        }
    
        private void completeAuth(Authenticator auth, String login, String passwd)
                throws Exception {
            Method[] methods = auth.getClass().getMethods();
            Vector authMethods = new Vector();
            // Find out with fields of the application needs to be
            // filled
            // Alias Go through the methods of the Authenticator
            // class and
            // copy them sorted by name into a vector.
            for (int eachMethod = 0; eachMethod < methods.length; eachMethod++) {
                if (methods[eachMethod].getName().startsWith("setAuth")) {
                    if (Modifier.isPublic(methods[eachMethod].getModifiers())) {
                        // sorted insertion.
                        for (int doInsert = 0; doInsert <= authMethods.size(); doInsert++) {
                            int insertHere = -1;
                            if (doInsert == authMethods.size())
                                insertHere = doInsert;
                            else {
                                if (methods[eachMethod].getName().compareTo(
                                        ((Method) authMethods.elementAt(doInsert))
                                                .getName()) <= 0)
                                    insertHere = doInsert;
                            } // end else
                            if (-1 != insertHere) {
                                authMethods.insertElementAt(methods[eachMethod],
                                        insertHere);
                                break;
                            } // end if ( -1 != insertHere)
                        } // end for (int doInsert=0
                    } // end if (modifier.isPublic
                } // end if (methods[eachMethod]
            } // end for (int eachMethod)
            Object[] AuthId = { login };
            Object[] AuthPasswd = { passwd };
            for (int eachAuthMethod = 0; eachAuthMethod < authMethods.size(); eachAuthMethod++) {
                Method doingMethod = (Method) authMethods.elementAt(eachAuthMethod);
                String authStepName = doingMethod.getName().substring(7);
                if (doingMethod.getName().equals("setAuth1Identity")) {
                    // Found identity Method, providing identity
                    doingMethod.invoke(auth, AuthId);
                } else if (doingMethod.getName().equals("setAuth2_Password")) {
                    // Found Passwd Method, providing passwd
                    doingMethod.invoke(auth, AuthPasswd);
                }
            }
        }
    
        private void printXmlAdvertisement(String title, Advertisement adv) {
            // First, Let's print a "nice" Title
            String separator = "";
            for (int i = 0; i < title.length() + 4; i++) {
                separator = separator + "-";
            }
            System.out.println(separator);
            System.out.println("| " + title + " |");
            System.out.println(separator);
            // Now let's print the Advertisement
            System.out.println(adv.toString());
            // Let's end up with a line
            System.out.println(separator);
        }
    
        /** Starts the jxta platform */
        private PeerGroup startJxta() {
            PeerGroup myNetPeerGroup = null;
            try {
                myNetPeerGroup = PeerGroupFactory.newNetPeerGroup();
            } catch (PeerGroupException e) {
                // could not instantiate the group, print the stack
                // and exit
                System.out.println("fatal error : group creation failure");
                e.printStackTrace();
                System.exit(1);
            }
            return myNetPeerGroup;
        }
    
        public static void main(String args[]) {
            PrivatePeerGroup satellaRoot = new PrivatePeerGroup();
            System.exit(0);
        }
    }

    这段代码是基于旧版本的jxta实现,所以运行起来需要旧版本的jxta支持,下载地址:www.samspublishing.com中,搜索jxta并且点击download

    我还没有弄出新版本的实现,总是出现兼容问题,让我很郁闷,希望得到帮组啊

    CSDN 下载地址:http://download.csdn.net/source/1442761

  • 相关阅读:
    利用SVN合并代码(merge)
    Swagger UI初识
    Jenkins详细教程
    Hangfire 分布式后端作业调度框架服务
    【转】Centos下MySQL使用总结
    MySQL基础
    IDE:IDEA Commit Changes Dialog local changes refresh
    JavaEE:JavaEE技术组成
    MyBatis-Exception:org.apache.ibatis.exceptions.PersistenceException
    JSON-fastjson
  • 原文地址:https://www.cnblogs.com/cuizhf/p/3321093.html
Copyright © 2011-2022 走看看