/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.mina.transport.vmpipe; import java.io.IOException; import java.net.SocketAddress; import org.apache.mina.common.ConnectFuture; import org.apache.mina.common.ExceptionMonitor; import org.apache.mina.common.IoFilterChain; import org.apache.mina.common.IoHandler; import org.apache.mina.common.IoServiceConfig; import org.apache.mina.common.IoSessionConfig; import org.apache.mina.common.support.AbstractIoFilterChain; import org.apache.mina.common.support.BaseIoConnector; import org.apache.mina.common.support.BaseIoConnectorConfig; import org.apache.mina.common.support.BaseIoSessionConfig; import org.apache.mina.common.support.DefaultConnectFuture; import org.apache.mina.transport.vmpipe.support.VmPipe; import org.apache.mina.transport.vmpipe.support.VmPipeIdleStatusChecker; import org.apache.mina.transport.vmpipe.support.VmPipeSessionImpl; import org.apache.mina.util.AnonymousSocketAddress; /** * Connects to {@link IoHandler}s which is bound on the specified * {@link VmPipeAddress}. * * @author The Apache Directory Project (mina-dev@directory.apache.org) * @version $Rev: 619823 $, $Date: 2008-02-08 10:09:37 +0000 (Fri, 08 Feb 2008) $ */ public class QpidVmPipeConnector extends VmPipeConnector { private static final IoSessionConfig CONFIG = new BaseIoSessionConfig() {}; private final IoServiceConfig defaultConfig = new BaseIoConnectorConfig() { public IoSessionConfig getSessionConfig() { return CONFIG; } }; /** * Creates a new instance. */ public QpidVmPipeConnector() { } public ConnectFuture connect( SocketAddress address, IoHandler handler, IoServiceConfig config ) { return connect( address, null, handler, config ); } public ConnectFuture connect( SocketAddress address, SocketAddress localAddress, IoHandler handler, IoServiceConfig config ) { if( address == null ) throw new NullPointerException( "address" ); if( handler == null ) throw new NullPointerException( "handler" ); if( ! ( address instanceof VmPipeAddress ) ) throw new IllegalArgumentException( "address must be VmPipeAddress." ); if( config == null ) { config = getDefaultConfig(); } VmPipe entry = ( VmPipe ) VmPipeAcceptor.boundHandlers.get( address ); if( entry == null ) { return DefaultConnectFuture.newFailedFuture( new IOException( "Endpoint unavailable: " + address ) ); } DefaultConnectFuture future = new DefaultConnectFuture(); VmPipeSessionImpl localSession = new VmPipeSessionImpl( this, config, getListeners(), new Object(), // lock new AnonymousSocketAddress(), handler, entry ); // initialize acceptor session VmPipeSessionImpl remoteSession = localSession.getRemoteSession(); try { IoFilterChain filterChain = remoteSession.getFilterChain(); entry.getAcceptor().getFilterChainBuilder().buildFilterChain( filterChain ); entry.getConfig().getFilterChainBuilder().buildFilterChain( filterChain ); entry.getConfig().getThreadModel().buildFilterChain( filterChain ); // The following sentences don't throw any exceptions. entry.getListeners().fireSessionCreated( remoteSession ); VmPipeIdleStatusChecker.getInstance().addSession( remoteSession ); } catch( Throwable t ) { ExceptionMonitor.getInstance().exceptionCaught( t ); remoteSession.close(); } // initialize connector session try { IoFilterChain filterChain = localSession.getFilterChain(); this.getFilterChainBuilder().buildFilterChain( filterChain ); config.getFilterChainBuilder().buildFilterChain( filterChain ); config.getThreadModel().buildFilterChain( filterChain ); // The following sentences don't throw any exceptions. localSession.setAttribute( AbstractIoFilterChain.CONNECT_FUTURE, future ); getListeners().fireSessionCreated( localSession ); VmPipeIdleStatusChecker.getInstance().addSession( localSession); } catch( Throwable t ) { future.setException( t ); } return future; } public IoServiceConfig getDefaultConfig() { return defaultConfig; } }