View Javadoc

    1   /***
    2    *
    3    * Copyright 2004 Hiram Chirino
    4    *
    5    * Licensed under the Apache License, Version 2.0 (the "License");
    6    * you may not use this file except in compliance with the License.
    7    * You may obtain a copy of the License at
    8    *
    9    * http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   *
    17   **/
    18
    19  package org.activeio.net;
    20
    21  import java.io.IOException;
    22  import java.net.SocketException;
    23  import java.net.SocketTimeoutException;
    24  import java.net.URI;
    25
    26  import org.activeio.AsynchChannel;
    27  import org.activeio.Channel;
    28  import org.activeio.SynchChannelServer;
    29  import org.activeio.filter.WriteBufferedAsynchChannel;
    30  import org.activeio.packet.ByteBufferPacket;
    31
    32  import com.ibm.io.async.AsyncServerSocketChannel;
    33
    34  /***
    35   * @version $Revision$
    36   */
    37  public class AIOSynchChannelServer implements SynchChannelServer {
    38
    39      private final AsyncServerSocketChannel serverSocket;
    40      private final URI bindURI;
    41      private final URI connectURI;
    42      private int curentSoTimeout;
    43
    44      public AIOSynchChannelServer(AsyncServerSocketChannel serverSocket, URI bindURI, URI connectURI) throws IOException {
    45          this.serverSocket=serverSocket;
    46          this.bindURI=bindURI;
    47          this.connectURI=connectURI;
    48          this.curentSoTimeout = serverSocket.socket().getSoTimeout();
    49      }
    50
    51      public URI getBindURI() {
    52          return bindURI;
    53      }
    54
    55      public URI getConnectURI() {
    56          return this.connectURI;
    57      }
    58
    59      public void dispose() {
    60          try {
    61              serverSocket.close();
    62          } catch (IOException e) {
    63          }
    64      }
    65
    66      synchronized public void start() throws IOException {
    67      }
    68
    69      synchronized public void stop(long timeout) {
    70      }
    71
    72      public Channel accept(long timeout) throws IOException {
    73          try {
    74
    75              if (timeout == SynchChannelServer.WAIT_FOREVER_TIMEOUT)
    76  	            setSoTimeout(0);
    77  	        else if (timeout == SynchChannelServer.NO_WAIT_TIMEOUT)
    78  	            setSoTimeout(1);
    79  	        else
    80  	            setSoTimeout((int) timeout);
    81
    82              AsynchChannel channel = new AIOAsynchChannel(serverSocket.accept());
    83              channel = new WriteBufferedAsynchChannel(channel, ByteBufferPacket.createDefaultBuffer(true), false);
    84              return channel;
    85
    86          } catch (SocketTimeoutException ignore) {
    87          }
    88          return null;
    89      }
    90
    91      private void setSoTimeout(int i) throws SocketException {
    92          if (curentSoTimeout != i) {
    93              serverSocket.socket().setSoTimeout(i);
    94              curentSoTimeout = i;
    95          }
    96      }
    97
    98      public Object narrow(Class target) {
    99          if( target.isAssignableFrom(getClass()) ) {
    100             return this;
    101         }
    102         return null;
    103     }
    104
    105     public String toString() {
    106         return "AIO Server: "+getConnectURI();
    107     }
    108
    109 }