⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 peerinfoserviceimpl.java

📁 jxme的一些相关程序,主要是手机上程序开发以及手机和计算机通信的一些程序资料,程序编译需要Ant支持
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 *  Copyright (c) 2001 Sun Microsystems, Inc.  All rights
 *  reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *  1. Redistributions of source code must retain the above copyright
 *  notice, this list of conditions and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in
 *  the documentation and/or other materials provided with the
 *  distribution.
 *
 *  3. The end-user documentation included with the redistribution,
 *  if any, must include the following acknowledgment:
 *  "This product includes software developed by the
 *  Sun Microsystems, Inc. for Project JXTA."
 *  Alternately, this acknowledgment may appear in the software itself,
 *  if and wherever such third-party acknowledgments normally appear.
 *
 *  4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must
 *  not be used to endorse or promote products derived from this
 *  software without prior written permission. For written
 *  permission, please contact Project JXTA at http://www.jxta.org.
 *
 *  5. Products derived from this software may not be called "JXTA",
 *  nor may "JXTA" appear in their name, without prior written
 *  permission of Sun.
 *
 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *  DISCLAIMED.  IN NO EVENT SHALL SUN MICROSYSTEMS OR
 *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 *  SUCH DAMAGE.
 *  ====================================================================
 *
 *  This software consists of voluntary contributions made by many
 *  individuals on behalf of Project JXTA.  For more
 *  information on Project JXTA, please see
 *  <http://www.jxta.org/>.
 *
 *  This license is based on the BSD license adopted by the Apache Foundation.
 *
 *  $Id: PeerInfoServiceImpl.java,v 1.2 2002/03/04 21:42:59 echtcherbina Exp $
 */
package net.jxta.impl.peer;

import java.util.Enumeration;
import java.util.Vector;
import java.util.Hashtable;
import java.io.IOException;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.URL;
import java.lang.reflect.InvocationTargetException;
import org.apache.log4j.Category;
import org.apache.log4j.Priority;

import net.jxta.service.Service;
import net.jxta.endpoint.EndpointService;
import net.jxta.resolver.ResolverService;
import net.jxta.resolver.QueryHandler;
import net.jxta.document.Advertisement;
import net.jxta.document.AdvertisementFactory;
import net.jxta.document.Document;
import net.jxta.document.StructuredDocument;
import net.jxta.document.StructuredDocumentFactory;
import net.jxta.document.StructuredTextDocument;
import net.jxta.document.MimeMediaType;
import net.jxta.document.Element;
import net.jxta.id.ID;
import net.jxta.protocol.ResolverQueryMsg;
import net.jxta.protocol.ResolverResponseMsg;
import net.jxta.protocol.PeerGroupAdvertisement;
import net.jxta.protocol.PeerAdvertisement;
import net.jxta.protocol.ModuleImplAdvertisement;
import net.jxta.protocol.PeerInfoQueryMessage;
import net.jxta.protocol.PeerInfoResponseMessage;
import net.jxta.peergroup.PeerGroup;
import net.jxta.exception.PeerGroupException;
import net.jxta.exception.NoResponseException;
import net.jxta.exception.ServiceNotFoundException;
import net.jxta.peer.PeerInfoService;
import net.jxta.peer.PeerInfoListener;
import net.jxta.peer.PeerInfoEvent;

import net.jxta.impl.cm.Cm;
import net.jxta.impl.protocol.ResolverQuery;
import net.jxta.impl.protocol.ResolverResponse;
import net.jxta.impl.protocol.PeerInfoQueryMsg;
import net.jxta.impl.protocol.PeerInfoResponseMsg;
import net.jxta.impl.peer.PeerInfoServiceInterface;
import net.jxta.impl.peergroup.RefPeerGroup;
import net.jxta.impl.util.EndpointServiceStatsFilter;

/**
 *  Peer Info provides a mechanism to obtain  information about peers.
 *
 *@since    1.0
 */

public class PeerInfoServiceImpl implements PeerInfoService, QueryHandler {
    
    private final static Category LOG =
    Category.getInstance(PeerInfoServiceImpl.class.getName());
    
    /**
     *  Directory name for Cm's PeerInfoService cache
     */
    private final static String dirname = "PeerInfoService";
    
    /**
     *  Time in milli seconds since midnight, January 1, 1970 UTC and when this
     *  peer was started.
     */
    private long startTime = 0;
    
    /**
     *  ResolverServiceImpl Query Id.
     */
    private volatile int qid = 0;
    
    private Cm cm = null;
    private ResolverService resolver = null;
    private RefPeerGroup pg = null;
    private EndpointService endpoint = null;
    private EndpointServiceStatsFilter incomingStats = null;
    private EndpointServiceStatsFilter outgoingStats = null;
    private ID localPeerId = null;
    private Vector listeners = new Vector();
    private Hashtable listenerTable = new Hashtable();
    private ModuleImplAdvertisement implAdvertisement = null;
    private String handlerName = null;
    
    
    /**
     *  Supply arguments and starts this service if it hadn't started by
     *  itself. Currently this service starts by itself and does not expect
     *  arguments.
     *
     *@param  arg  A table of strings arguments.
     *@return      int status indication.
     */
    public int startApp(String[] arg) {

        
	// XXX lomax@jxta.org platform issue 89
	// This service is disabled. Also look at stopApp and init.
	// and other public methods.
	if (true) {
	    return 0;
	}
        
        resolver = pg.getResolverService();
	resolver.registerHandler(handlerName, this);
        try {
            String pgdir = "info-" + pg.getPeerGroupID().getUniqueValue().toString();
            cm = new Cm(pgdir, false);
            cm.createFolder(dirname);
        } catch (Exception e) {
            if (LOG.isEnabledFor(Priority.DEBUG)) {
                LOG.debug("error during creation of local store", e);
            }
        }
        
        return 0;
    }
    
    
    /**
     *  Ask this service to stop. This request is currently ignored.
     */
    public void stopApp() {
	// XXX lomax@jxta.org platform issue 89
	// This service is disabled
	if (true) {
	    return;
	} 
        resolver.unregisterHandler(handlerName);
    }
    
    
    /**
     *  Service objects are not manipulated directly to protect usage of the
     *  service. A Service interface is returned to access the service
     *  methods.
     *
     *@return    Service public interface of the service
     *@since     JXTA 1.0
     */
    public Service getInterface() {
        return new PeerInfoServiceInterface(this);
    }
    
    
    /**
     *  Returns the advertisement for that service.
     *
     *@return    Advertisement the advertisement.
     *@since     JXTA 1.0
     */
    public Advertisement getImplAdvertisement() {
        return implAdvertisement;
    }
    
    
    /**
     *  init is called by PeerGroup to init the Service
     *
     *@param  group
     *@param  assignedID
     *@param  impl
     *@throws  PeerGroupException  throw any exception thrown during
     *      obtaining Service
     */

    // WARNING: lomax@jxta.org
    // The class EndpointServiceStatsFilters introduces an important memory leak.
    // This protocol is disabled until his problem is fixed. See platform issue #89
    // for furher details.
    // Look at the start method as well.

    
    public void init(PeerGroup group, ID assignedID, Advertisement impl)
    throws PeerGroupException {

	incomingStats = new EndpointServiceStatsFilter();
	outgoingStats = new EndpointServiceStatsFilter();

	pg = (RefPeerGroup) group;
	endpoint = pg.getEndpointService();
	implAdvertisement = (ModuleImplAdvertisement) impl;
	localPeerId = pg.getPeerID();
	handlerName = assignedID.toString();
        
        // record start time at end of successful init
        startTime = System.currentTimeMillis();

	if (true) {
	    // XXX: lomax@jxta.org see platform issue 89
            // XXX: chgenly@jxta.org moved to prevent
	    // XXX:     null pointer exceptions. Hopefully
            // XXX:     this does not cause memory to accumulate.
	    return;
	}

	// XXX: lomax@jxta.org see platform issue 89
	endpoint.addFilterListener("jxta", incomingStats, true);
	endpoint.addFilterListener("jxta", outgoingStats, false);
    }
    
    
    /**
     *  Retrieve Peer Information Advertisement of localhost
     *
     *@return    PeerInfoResponseMessage
     */
    public PeerInfoResponseMessage getPeerInfoService() {
        int now = ((int) (System.currentTimeMillis() / 1000L));
        
        Hashtable itraffic = new Hashtable();
        Enumeration ik = incomingStats.getChannelNames();
        while (ik.hasMoreElements()) {
            String k = (String) ik.nextElement();
            itraffic.put(k, new Long(incomingStats.getTrafficOnChannel(k)));
        }
        
        Hashtable otraffic = new Hashtable();
        Enumeration ok = outgoingStats.getChannelNames();
        while (ok.hasMoreElements()) {
            String k = (String) ok.nextElement();
            otraffic.put(k, new Long(outgoingStats.getTrafficOnChannel(k)));
        }
        
        PeerInfoResponseMessage adv =
        new PeerInfoResponseMsg(
        localPeerId,
        // source pid
        localPeerId,
        // target pid
        now - startTime,
        // uptime
        now,
        // timestamp
        incomingStats.getLastMessageTime(),
        outgoingStats.getLastMessageTime(),
        itraffic,
        otraffic);
        return adv;
    }
    
    
    /**
     *  Get PeerInfoService from a remote peer.
     *
     *@param  peer  Address of a peer, or portal to connect to, if address
     *      is null
     *@return       The remotePeerInfo value
     */
    public int getRemotePeerInfo(ID peer) {
        
        // If this is invoked before startApp(), just pretend.
        if (resolver == null) {
            return qid++;
        }
        
        StructuredTextDocument doc = (StructuredTextDocument)
        StructuredDocumentFactory.newStructuredDocument
        (new MimeMediaType("text/xml"),
        PeerInfoQueryMessage.getMessageType());
        
        Element e = null;
        
        e = doc.createElement("sourcePid", localPeerId);
        doc.appendChild(e);
        
        e = doc.createElement("targetPid", peer);
        doc.appendChild(e);
        
        ResolverQuery query = null;
        String ds = docToString(doc);
        
        // protect increment of the query id
        synchronized (this) {
            query = new ResolverQuery
            (handlerName, "JXTACRED",
            localPeerId.toString(), ds, qid++);
        }
        
        if (LOG.isEnabledFor(Priority.DEBUG)) {
            LOG.debug("sending query " + query.getQueryId() +
            " from " +
            Integer.toHexString(localPeerId.hashCode()) +
            " to " +
            (peer == null ?
            "null" : Integer.toHexString(peer.hashCode())));
        }
        
        resolver.sendQuery(peer.toString(), query);
        return query.getQueryId();
    }
    
    
    /**
     *  Gets the remotePeerInfo attribute of the PeerInfoServiceImpl object
     *
     *@param  peerid
     *@param  listener
     */
    public void getRemotePeerInfo(ID peerid, PeerInfoListener listener) {
        
        // If this is invoked before startApp(), just pretend.
        if (resolver == null) {
            return;
        }
        
        StructuredTextDocument doc = (StructuredTextDocument)
        StructuredDocumentFactory.newStructuredDocument
        (new MimeMediaType("text/xml"),

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -