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  package org.activeio.adapter;
    18
    19  import java.io.IOException;
    20  import java.io.InputStream;
    21  import java.io.OutputStream;
    22  import java.net.InetAddress;
    23  import java.net.Socket;
    24  import java.net.SocketAddress;
    25  import java.net.SocketException;
    26  import java.nio.channels.SocketChannel;
    27
    28  import org.activeio.Packet;
    29  import org.activeio.SynchChannel;
    30  import org.activeio.net.SocketMetadata;
    31  import org.activeio.packet.ByteArrayPacket;
    32
    33  /***
    34   * Provides a {@see java.net.Socket} interface to a {@see org.activeio.SynchChannel}.
    35   *
    36   * If the {@see org.activeio.SynchChannel} being adapted can not be
    37   * {@see org.activeio.Channel#narrow(Class)}ed to a {@see org.activeio.net.SocketMetadata}
    38   * then all methods accessing socket metadata will throw a {@see java.net.SocketException}.
    39   *
    40   */
    41  public class SynchChannelToSocketAdapter extends Socket {
    42
    43      private final SynchChannel channel;
    44      private final SynchChannelInputStream inputStream;
    45      private final SynchChannelOutputStream outputStream;
    46      private final SocketMetadata socketMetadata;
    47      private final Packet urgentPackget = new ByteArrayPacket(new byte[1]);
    48      boolean closed;
    49
    50      public SynchChannelToSocketAdapter(SynchChannel channel) {
    51          this(channel, (SocketMetadata)channel.narrow(SocketMetadata.class));
    52      }
    53
    54      public SynchChannelToSocketAdapter(SynchChannel channel, SocketMetadata socketMetadata) {
    55          this.channel = channel;
    56          this.socketMetadata = socketMetadata;
    57          this.inputStream = new SynchChannelInputStream(channel);
    58          this.outputStream = new SynchChannelOutputStream(channel);
    59      }
    60
    61      public boolean isConnected() {
    62          return true;
    63      }
    64
    65      public boolean isBound() {
    66          return true;
    67      }
    68
    69      public boolean isClosed() {
    70          return closed;
    71      }
    72
    73      public void bind(SocketAddress bindpoint) throws IOException {
    74          throw new IOException("Not supported");
    75      }
    76
    77      public synchronized void close() throws IOException {
    78          if( closed )
    79              return;
    80          closed = true;
    81          inputStream.close();
    82          outputStream.close();
    83          channel.dispose();
    84      }
    85
    86      public void connect(SocketAddress endpoint) throws IOException {
    87          throw new IOException("Not supported");
    88      }
    89
    90      public void connect(SocketAddress endpoint, int timeout) throws IOException {
    91          throw new IOException("Not supported");
    92      }
    93
    94      public SocketChannel getChannel() {
    95          return null;
    96      }
    97
    98      public InputStream getInputStream() throws IOException {
    99          return inputStream;
    100     }
    101
    102     public OutputStream getOutputStream() throws IOException {
    103         return outputStream;
    104     }
    105
    106     public boolean isInputShutdown() {
    107         return inputStream.isClosed();
    108     }
    109
    110     public boolean isOutputShutdown() {
    111         return outputStream.isClosed();
    112     }
    113
    114     public void sendUrgentData(int data) throws IOException {
    115         urgentPackget.clear();
    116         urgentPackget.write(data);
    117         urgentPackget.flip();
    118         channel.write(urgentPackget);
    119     }
    120
    121     public int getSoTimeout() throws SocketException {
    122         return (int) inputStream.getTimeout();
    123     }
    124
    125     public synchronized void setSoTimeout(int timeout) throws SocketException {
    126         inputStream.setTimeout(timeout);
    127     }
    128
    129     public void shutdownOutput() throws IOException {
    130         outputStream.close();
    131     }
    132
    133     public void shutdownInput() throws IOException {
    134         inputStream.close();
    135     }
    136
    137     protected SocketMetadata getSocketMetadata() throws SocketException {
    138         if( socketMetadata == null )
    139             throw new SocketException("No socket metadata available.");
    140         return socketMetadata;
    141     }
    142
    143     public InetAddress getInetAddress() {
    144         if( socketMetadata ==null )
    145             return null;
    146         return socketMetadata.getInetAddress();
    147     }
    148     public boolean getKeepAlive() throws SocketException {
    149         return getSocketMetadata().getKeepAlive();
    150     }
    151     public InetAddress getLocalAddress() {
    152         if( socketMetadata ==null )
    153             return null;
    154         return socketMetadata.getLocalAddress();
    155     }
    156     public int getLocalPort() {
    157         if( socketMetadata ==null )
    158             return -1;
    159         return socketMetadata.getLocalPort();
    160     }
    161     public SocketAddress getLocalSocketAddress() {
    162         if( socketMetadata ==null )
    163             return null;
    164         return socketMetadata.getLocalSocketAddress();
    165     }
    166     public boolean getOOBInline() throws SocketException {
    167         return getSocketMetadata().getOOBInline();
    168     }
    169     public int getPort() {
    170         if( socketMetadata ==null )
    171             return -1;
    172         return socketMetadata.getPort();
    173     }
    174     public int getReceiveBufferSize() throws SocketException {
    175         return getSocketMetadata().getReceiveBufferSize();
    176     }
    177     public SocketAddress getRemoteSocketAddress() {
    178         if( socketMetadata ==null )
    179             return null;
    180         return socketMetadata.getRemoteSocketAddress();
    181     }
    182     public boolean getReuseAddress() throws SocketException {
    183         return getSocketMetadata().getReuseAddress();
    184     }
    185     public int getSendBufferSize() throws SocketException {
    186         return getSocketMetadata().getSendBufferSize();
    187     }
    188     public int getSoLinger() throws SocketException {
    189         return getSocketMetadata().getSoLinger();
    190     }
    191     public boolean getTcpNoDelay() throws SocketException {
    192         return getSocketMetadata().getTcpNoDelay();
    193     }
    194     public int getTrafficClass() throws SocketException {
    195         return getSocketMetadata().getTrafficClass();
    196     }
    197     public void setKeepAlive(boolean on) throws SocketException {
    198         getSocketMetadata().setKeepAlive(on);
    199     }
    200     public void setOOBInline(boolean on) throws SocketException {
    201         getSocketMetadata().setOOBInline(on);
    202     }
    203     public void setReceiveBufferSize(int size) throws SocketException {
    204         getSocketMetadata().setReceiveBufferSize(size);
    205     }
    206     public void setReuseAddress(boolean on) throws SocketException {
    207         getSocketMetadata().setReuseAddress(on);
    208     }
    209     public void setSendBufferSize(int size) throws SocketException {
    210         getSocketMetadata().setSendBufferSize(size);
    211     }
    212     public void setSoLinger(boolean on, int linger) throws SocketException {
    213         getSocketMetadata().setSoLinger(on, linger);
    214     }
    215     public void setTcpNoDelay(boolean on) throws SocketException {
    216         getSocketMetadata().setTcpNoDelay(on);
    217     }
    218     public void setTrafficClass(int tc) throws SocketException {
    219         getSocketMetadata().setTrafficClass(tc);
    220     }
    221 }