QpidVmPipeConnector.java
001 /*
002  *  Licensed to the Apache Software Foundation (ASF) under one
003  *  or more contributor license agreements.  See the NOTICE file
004  *  distributed with this work for additional information
005  *  regarding copyright ownership.  The ASF licenses this file
006  *  to you under the Apache License, Version 2.0 (the
007  *  "License"); you may not use this file except in compliance
008  *  with the License.  You may obtain a copy of the License at
009  *
010  *    http://www.apache.org/licenses/LICENSE-2.0
011  *
012  *  Unless required by applicable law or agreed to in writing,
013  *  software distributed under the License is distributed on an
014  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015  *  KIND, either express or implied.  See the License for the
016  *  specific language governing permissions and limitations
017  *  under the License.
018  *
019  */
020 package org.apache.mina.transport.vmpipe;
021 
022 import java.io.IOException;
023 import java.net.SocketAddress;
024 
025 import org.apache.mina.common.ConnectFuture;
026 import org.apache.mina.common.ExceptionMonitor;
027 import org.apache.mina.common.IoFilterChain;
028 import org.apache.mina.common.IoHandler;
029 import org.apache.mina.common.IoServiceConfig;
030 import org.apache.mina.common.IoSessionConfig;
031 import org.apache.mina.common.support.AbstractIoFilterChain;
032 import org.apache.mina.common.support.BaseIoConnector;
033 import org.apache.mina.common.support.BaseIoConnectorConfig;
034 import org.apache.mina.common.support.BaseIoSessionConfig;
035 import org.apache.mina.common.support.DefaultConnectFuture;
036 import org.apache.mina.transport.vmpipe.support.VmPipe;
037 import org.apache.mina.transport.vmpipe.support.VmPipeIdleStatusChecker;
038 import org.apache.mina.transport.vmpipe.support.VmPipeSessionImpl;
039 import org.apache.mina.util.AnonymousSocketAddress;
040 
041 /**
042  * Connects to {@link IoHandler}s which is bound on the specified
043  {@link VmPipeAddress}.
044  *
045  @author The Apache Directory Project (mina-dev@directory.apache.org)
046  @version $Rev: 619823 $, $Date: 2008-02-08 10:09:37 +0000 (Fri, 08 Feb 2008) $
047  */
048 public class QpidVmPipeConnector extends VmPipeConnector
049 {
050     private static final IoSessionConfig CONFIG = new BaseIoSessionConfig() {};
051     private final IoServiceConfig defaultConfig = new BaseIoConnectorConfig()
052     {
053         public IoSessionConfig getSessionConfig()
054         {
055             return CONFIG;
056         }
057     };
058 
059     /**
060      * Creates a new instance.
061      */
062     public QpidVmPipeConnector()
063     {
064     }
065 
066     public ConnectFuture connectSocketAddress address, IoHandler handler, IoServiceConfig config )
067     {
068         return connectaddress, null, handler, config );
069     }
070 
071     public ConnectFuture connectSocketAddress address, SocketAddress localAddress, IoHandler handler, IoServiceConfig config )
072     {
073         ifaddress == null )
074             throw new NullPointerException"address" );
075         ifhandler == null )
076             throw new NullPointerException"handler" );
077         ifaddress instanceof VmPipeAddress ) )
078             throw new IllegalArgumentException(
079                                                 "address must be VmPipeAddress." );
080 
081         ifconfig == null )
082         {
083             config = getDefaultConfig();
084         }
085 
086         VmPipe entry = VmPipe VmPipeAcceptor.boundHandlers.getaddress );
087         ifentry == null )
088         {
089             return DefaultConnectFuture.newFailedFuture(
090                     new IOException"Endpoint unavailable: " + address ) );
091         }
092 
093         DefaultConnectFuture future = new DefaultConnectFuture();
094         VmPipeSessionImpl localSession =
095             new VmPipeSessionImpl(
096                     this,
097                     config,
098                     getListeners(),
099                     new Object()// lock
100                     new AnonymousSocketAddress(),
101                     handler,
102                     entry );
103 
104            // initialize acceptor session
105         VmPipeSessionImpl remoteSession = localSession.getRemoteSession();
106         try
107         {
108             IoFilterChain filterChain = remoteSession.getFilterChain();
109             entry.getAcceptor().getFilterChainBuilder().buildFilterChainfilterChain );
110             entry.getConfig().getFilterChainBuilder().buildFilterChainfilterChain );
111             entry.getConfig().getThreadModel().buildFilterChainfilterChain );
112 
113             // The following sentences don't throw any exceptions.
114             entry.getListeners().fireSessionCreatedremoteSession );
115             VmPipeIdleStatusChecker.getInstance().addSessionremoteSession );
116         }
117         catchThrowable t )
118         {
119             ExceptionMonitor.getInstance().exceptionCaught);
120             remoteSession.close();
121         }
122 
123 
124         // initialize connector session
125         try
126         {
127             IoFilterChain filterChain = localSession.getFilterChain();
128             this.getFilterChainBuilder().buildFilterChainfilterChain );
129             config.getFilterChainBuilder().buildFilterChainfilterChain );
130             config.getThreadModel().buildFilterChainfilterChain );
131 
132             // The following sentences don't throw any exceptions.
133             localSession.setAttributeAbstractIoFilterChain.CONNECT_FUTURE, future );
134             getListeners().fireSessionCreatedlocalSession );
135             VmPipeIdleStatusChecker.getInstance().addSessionlocalSession);
136         }
137         catchThrowable t )
138         {
139             future.setException);
140         }
141 
142 
143 
144         return future;
145     }
146 
147     public IoServiceConfig getDefaultConfig()
148     {
149         return defaultConfig;
150     }
151 }