Package com.sun.sgs.impl.io

Source Code of com.sun.sgs.impl.io.ServerSocketEndpoint

/*
* Copyright (c) 2007-2009, 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:
*
*     * Redistributions of source code must retain the above copyright
*       notice, this list of conditions and the following disclaimer.
*     * 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.
*     * Neither the name of Sun Microsystems, Inc. nor the names of its
*       contributors may be used to endorse or promote products derived
*       from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS 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 THE COPYRIGHT
* OWNER OR 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.
*/

package com.sun.sgs.impl.io;

import java.net.SocketAddress;
import java.util.concurrent.Executor;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.IoServiceConfig;
import org.apache.mina.transport.socket.nio.DatagramAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;

import com.sun.sgs.impl.sharedutil.LoggerWrapper;
import com.sun.sgs.io.Acceptor;
import com.sun.sgs.io.ServerEndpoint;

/**
* An implementation of {@link ServerEndpoint} that wraps a
* local {@link SocketAddress}.
*/
public class ServerSocketEndpoint extends AbstractSocketEndpoint
        implements ServerEndpoint<SocketAddress>
{
    /** The System property for whether to set the reuse-address property. */
    public static final String REUSE_ADDRESS_PROPERTY =
        "com.sun.sgs.impl.io.ServerSocketEndpoint.reuseAddress";
   
    /** Default value for the reuse-address property if not specified. */
    public static final String DEFAULT_REUSE_ADDRESS = "true";
   
    /** The logger for this class. */
    private static final LoggerWrapper logger =
        new LoggerWrapper(Logger.getLogger(
                ServerSocketEndpoint.class.getName()));

    /**
     * Constructs a {@code ServerSocketEndpoint} with the given
     * {@link TransportType}. This is the simplest way to create a
     * {@code ServerSocketEndpoint}. The returned endpoint will use
     * new daemon threads as necessary for processing events.
     *
     * @param address the socket address to encapsulate
     * @param type the type of transport
     */
    public ServerSocketEndpoint(SocketAddress address, TransportType type) {
        super(address, type);
    }

    /**
     * Constructs a {@code ServerSocketEndpoint} with the given TransportType
     * using the given {@link Executor} for thread management.
     *
     * @param address the socket address to encapsulate
     * @param type the type of transport
     * @param executor an {@code Executor} specifying the threading policy
     */
    public ServerSocketEndpoint(SocketAddress address, TransportType type,
            Executor executor) {
        this(address, type, executor, 1);
    }

    /**
     * Constructs a {@code ServerSocketEndpoint} with the given TransportType
     * using the given {@link Executor} for thread management.
     * The {@code numProcessors} parameter refers to the number of
     * MINA {@code SocketIOProcessors} to initially create.
     * {@code numProcessors} must be greater than 0.
     * <p>
     * (Note: A {@code SocketIOProcessor} is a MINA implementation detail that
     * controls the internal processing of the IO. It is exposed here to allow
     * clients the option to configure this value, which may aid
     * performance tuning).
     *
     * @param address the socket address to encapsulate
     * @param type the type of transport
     * @param executor An {@code Executor} specifying the threading policy
     * @param numProcessors the number of processors available on this
     *        system.  This value must be greater than 0.
     *
     * @throws IllegalArgumentException if {@code numProcessors} is
     *         zero or negative.
     */
    public ServerSocketEndpoint(SocketAddress address, TransportType type,
            Executor executor, int numProcessors)
    {
        super(address, type, executor, numProcessors);
    }

    /**
     * {@inheritDoc}
     */
    public Acceptor<SocketAddress> createAcceptor() {
        IoAcceptor minaAcceptor;
       
        if (transportType.equals(TransportType.RELIABLE)) {
            org.apache.mina.transport.socket.nio.SocketAcceptor
                    minaSocketAcceptor =
                    new org.apache.mina.transport.socket.nio.SocketAcceptor(
                    numProcessors, executor);
           
            IoServiceConfig ioConfig = minaSocketAcceptor.getDefaultConfig();
           
            /**
             * Note: I assume that this object will always be of type
             * "SocketAcceptConfig," but the javadocs do not guarantee this so I
             * will be cautious and test first before casting it...
             */
            if (ioConfig instanceof SocketAcceptorConfig) {
                SocketAcceptorConfig socketConfig =
                        (SocketAcceptorConfig) ioConfig;
               
                socketConfig.setReuseAddress(Boolean.parseBoolean(
                        System.getProperty(REUSE_ADDRESS_PROPERTY,
                                           DEFAULT_REUSE_ADDRESS)));
            } else {
                logger.log(Level.WARNING,
                    "IoServiceConfig object from mina SocketAcceptor object" +
                    " was not a subclass of SocketAcceptorConfig as expected;" +
                           " setReuseAddress() was not called.  {0}", ioConfig);
            }
     
            minaAcceptor = minaSocketAcceptor;
        } else {
            minaAcceptor = new DatagramAcceptor(executor);
        }
        SocketAcceptor acceptor = new SocketAcceptor(this, minaAcceptor);
        logger.log(Level.FINE, "returning {0}", acceptor);
        return acceptor;
    }
}
TOP

Related Classes of com.sun.sgs.impl.io.ServerSocketEndpoint

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.