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

📄 endpointserviceinterface.java

📁 JXTA&#8482 is a set of open, generalized peer-to-peer (P2P) protocols that allow any networked devi
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2001-2007 Sun Microsystems, Inc.  All rights reserved. *   *  The Sun Project JXTA(TM) Software License *   *  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 Sun Microsystems, Inc. for JXTA(TM) technology."  *     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. *   *  JXTA is a registered trademark of Sun Microsystems, Inc. in the United  *  States and other countries. *   *  Please see the license information page at : *  <http://www.jxta.org/project/www/license.html> for instructions on use of  *  the license in source files. *   *  ==================================================================== *   *  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.  */package net.jxta.impl.endpoint;import net.jxta.document.Advertisement;import net.jxta.endpoint.ChannelMessenger;import net.jxta.endpoint.EndpointAddress;import net.jxta.endpoint.EndpointListener;import net.jxta.endpoint.EndpointService;import net.jxta.endpoint.ListenerAdaptor;import net.jxta.endpoint.Message;import net.jxta.endpoint.MessageFilterListener;import net.jxta.endpoint.MessageTransport;import net.jxta.endpoint.Messenger;import net.jxta.endpoint.MessengerEventListener;import net.jxta.id.ID;import net.jxta.impl.util.TimeUtils;import net.jxta.impl.peergroup.StdPeerGroup;import net.jxta.peergroup.PeerGroup;import net.jxta.protocol.ModuleImplAdvertisement;import java.lang.ref.Reference;import java.lang.ref.WeakReference;import java.util.Iterator;import java.util.Map;import java.util.WeakHashMap;import net.jxta.platform.Module;/** * Provides an interface object appropriate for applications using the endpoint * service. The interface provides a number of convenience features and * implementation necessary for legacy features. */class EndpointServiceInterface implements EndpointService {    /**     * The service interface that we will be fronting.     */    private final EndpointServiceImpl theRealThing;    /**     * The number of active instances of this class. We use this for deciding     * when to instantiate and shutdown the listener adaptor.     */    private static int activeInstanceCount = 0;    /**     * Provides emulation of the legacy send-message-with-listener and get-messenger-with-listener APIs.     */    private static ListenerAdaptor listenerAdaptor;    /**     * The cache of channels. If a given owner of this EndpointService interface     * object requests channels for the same exact destination multiple times,     * we will return the same channel object as much as possible.  We keep     * channels in a weak map, so that when channels are discarded, they     * eventually disappear.  Channels that have messages in them are always     * referenced. Therefore, this prevents the creation of more than one     * channel with messages in it for the same destination in the same context     * (owner of interface object - typically one module). This is required to     * properly support the common (and convenient) pattern:     * <p/>     * <code>m = endpointServiceInterface.getMessenger(); messenger.sendMessage(); m = null;</code>     * <p/>     * If that was not kept in check, it would be possible to inadvertently     * create an infinite number of channels with pending messages, thus an     * infinite number of messages too.     */    private final Map<EndpointAddress, Reference<Messenger>> channelCache = new WeakHashMap<EndpointAddress, Reference<Messenger>>();    /**     * Builds a new interface object.     *     * @param endpointService the endpoint service that we will front.     */    public EndpointServiceInterface(EndpointServiceImpl endpointService) {        theRealThing = endpointService;        synchronized (this.getClass()) {            activeInstanceCount++;            if (1 == activeInstanceCount) {                listenerAdaptor = new ListenerAdaptor(Thread.currentThread().getThreadGroup(), ((StdPeerGroup) endpointService.getGroup()).getExecutor());            }        }    }    /**     * {@inheritDoc}     * <p/>     * This is rather heavy-weight if instances are frequently created and     * discarded since finalization significantly delays GC.     */    @Override    protected void finalize() throws Throwable {        synchronized (this.getClass()) {            activeInstanceCount--;            if (0 == activeInstanceCount) {                listenerAdaptor.shutdown();                listenerAdaptor = null;            }        }        super.finalize();    }    /**     * {@inheritDoc}     * <p/>     * it is there only to satisfy the requirements of the interface that we     * implement. Ultimately, the API should define two levels of interfaces :     * one for the real service implementation and one for the interface object.     * Right now it feels a bit heavy to so that since the only different     * between the two would be init() and may-be getName().     */    public void init(PeerGroup peerGroup, ID id, Advertisement implAdv) {    }    /**     * {@inheritDoc}     * <p/>     * This is here for temporary class hierarchy reasons.     * it is ALWAYS ignored. By definition, the interface object     * protects the real object's start/stop methods from being called     */    public int startApp(String[] arg) {        return Module.START_OK;    }    /**     * {@inheritDoc}     * <p/>     * This is here for temporary class hierarchy reasons.     * it is ALWAYS ignored. By definition, the interface object     * protects the real object's start/stop methods from being called     * <p/>     * This request is currently ignored.     */    public void stopApp() {    }    /**     * {@inheritDoc}     */    public ModuleImplAdvertisement getImplAdvertisement() {        return theRealThing.getImplAdvertisement();    }    /**     * {@inheritDoc}     * <p/>     * Sort of absurd but this is part of the API we're implementing.     * We would not do a two-level API just for that.     */    public EndpointService getInterface() {        return this;    }    /**     * {@inheritDoc}     */    public PeerGroup getGroup() {        return theRealThing.getGroup();    }    /**     * {@inheritDoc}     */    public Messenger getCanonicalMessenger(EndpointAddress addr, Object hint) {        // XXX: maybe we should enforce the stripping of the address here.        // That would prevent application from making canonical messengers with a variety of service names and        // service params. On the other hand that would cost useless cloning of endp addrs and prevent future        // flexibility regarding QOS params, possibly. Be liberal for now.        return theRealThing.getCanonicalMessenger(addr, hint);    }    /**     * {@inheritDoc}     */    public Messenger getMessengerImmediate(EndpointAddress addr, Object hint) {        // Note: for now, the hint is not used for canonicalization (hint != QOS).        synchronized (channelCache) {            Reference<Messenger> existing = channelCache.get(addr);            if (existing != null) {                Messenger messenger = existing.get();                if ((messenger != null) && ((messenger.getState() & Messenger.USABLE) != 0)) {                    return messenger;                }            }        }                // We do not have a good one at hand. Make a new one.        // Use the stripped address to get a canonical msngr; not doing so        // would reduce the sharing to almost nothing.        EndpointAddress plainAddr = new EndpointAddress(addr, null, null);

⌨️ 快捷键说明

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