View Javadoc

    1   /*
    2    *  Licensed to the Apache Software Foundation (ASF) under one
    3    *  or more contributor license agreements.  See the NOTICE file
    4    *  distributed with this work for additional information
    5    *  regarding copyright ownership.  The ASF licenses this file
    6    *  to you under the Apache License, Version 2.0 (the
    7    *  "License"); you may not use this file except in compliance
    8    *  with the License.  You may obtain a copy of the License at
    9    *
    10   *    http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   *  Unless required by applicable law or agreed to in writing,
    13   *  software distributed under the License is distributed on an
    14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    15   *  KIND, either express or implied.  See the License for the
    16   *  specific language governing permissions and limitations
    17   *  under the License.
    18   *
    19   */
    20  package org.apache.mina.transport.socket.apr;
    21
    22  import java.net.InetSocketAddress;
    23
    24  import org.apache.mina.core.filterchain.DefaultIoFilterChain;
    25  import org.apache.mina.core.filterchain.IoFilterChain;
    26  import org.apache.mina.core.service.IoProcessor;
    27  import org.apache.mina.core.service.IoService;
    28  import org.apache.mina.core.session.AbstractIoSession;
    29  import org.apache.mina.core.session.IoSession;
    30  import org.apache.tomcat.jni.Address;
    31  import org.apache.tomcat.jni.Socket;
    32
    33  /**
    34   * An abstract {@link IoSession} serving of base for APR based sessions.
    35   *
    36   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
    37   */
    38  public abstract class AprSession extends AbstractIoSession {
    39
    40      // good old socket descriptor
    41      private long descriptor;
    42
    43      // the processor processing this session
    44      private final IoProcessor<AprSession> processor;
    45
    46      // the mandatory filter chain of this session
    47      private final IoFilterChain filterChain = new DefaultIoFilterChain(this);
    48
    49      // the two endpoint addresses
    50      private final InetSocketAddress remoteAddress;
    51
    52      private final InetSocketAddress localAddress;
    53
    54      // current polling results
    55      private boolean readable = true;
    56
    57      private boolean writable = true;
    58
    59      private boolean interestedInRead;
    60
    61      private boolean interestedInWrite;
    62
    63      /**
    64       * Creates a new instance of {@link AprSession}. Need to be called by extending types
    65       * @param service the {@link IoService} creating this session. Can be {@link AprSocketAcceptor} or
    66       *         {@link AprSocketConnector}
    67       * @param processor the {@link AprIoProcessor} managing this session.
    68       * @param descriptor the low level APR socket descriptor for this socket. {@see Socket#create(int, int, int, long)}
    69       * @throws Exception exception produced during the setting of all the socket parameters.
    70       */
    71      AprSession(IoService service, IoProcessor<AprSession> processor, long descriptor) throws Exception {
    72          super(service);
    73          this.processor = processor;
    74          this.descriptor = descriptor;
    75
    76          long ra = Address.get(Socket.APR_REMOTE, descriptor);
    77          long la = Address.get(Socket.APR_LOCAL, descriptor);
    78
    79          this.remoteAddress = new InetSocketAddress(Address.getip(ra), Address.getInfo(ra).port);
    80          this.localAddress = new InetSocketAddress(Address.getip(la), Address.getInfo(la).port);
    81      }
    82
    83      /**
    84       * Creates a new instance of {@link AprSession}. Need to be called by extending types.
    85       * The constructor add remote address for UDP based sessions.
    86       * @param service the {@link IoService} creating this session. Can be {@link AprSocketAcceptor} or
    87       *         {@link AprSocketConnector}
    88       * @param processor the {@link AprIoProcessor} managing this session.
    89       * @param descriptor the low level APR socket descriptor for this socket. {@see Socket#create(int, int, int, long)}
    90       * @param remoteAddress the remote end-point
    91       * @throws Exception exception produced during the setting of all the socket parameters.
    92       */
    93      AprSession(IoService service, IoProcessor<AprSession> processor, long descriptor, InetSocketAddress remoteAddress)
    94              throws Exception {
    95          super(service);
    96          this.processor = processor;
    97          this.descriptor = descriptor;
    98
    99          long la = Address.get(Socket.APR_LOCAL, descriptor);
    100
    101         this.remoteAddress = remoteAddress;
    102         this.localAddress = new InetSocketAddress(Address.getip(la), Address.getInfo(la).port);
    103     }
    104
    105     /**
    106      * Get the socket descriptor {@see Socket#create(int, int, int, long)}.
    107      * @return the low level APR socket descriptor
    108      */
    109     long getDescriptor() {
    110         return descriptor;
    111     }
    112
    113     /**
    114      * Set the socket descriptor.
    115      * @param desc the low level APR socket descriptor created by {@see Socket#create(int, int, int, long)}
    116      */
    117     void setDescriptor(long desc) {
    118         this.descriptor = desc;
    119     }
    120
    121     /**
    122      * {@inheritDoc}
    123      */
    124     @Override
    125     public IoProcessor<AprSession> getProcessor() {
    126         return processor;
    127     }
    128
    129     /**
    130      * {@inheritDoc}
    131      */
    132     public InetSocketAddress getLocalAddress() {
    133         return localAddress;
    134     }
    135
    136     /**
    137      * {@inheritDoc}
    138      */
    139     public InetSocketAddress getRemoteAddress() {
    140         return remoteAddress;
    141     }
    142
    143     /**
    144      * {@inheritDoc}
    145      */
    146     public IoFilterChain getFilterChain() {
    147         return filterChain;
    148     }
    149
    150     /**
    151      * {@inheritDoc}
    152      */
    153     @Override
    154     public InetSocketAddress getServiceAddress() {
    155         return (InetSocketAddress) super.getServiceAddress();
    156     }
    157
    158     /**
    159      * Is this session was tagged are readable after a call to {@link Socket#pool(long)}.
    160      * @return true if this session is ready for read operations
    161      */
    162     boolean isReadable() {
    163         return readable;
    164     }
    165
    166     /**
    167      * Set if this session is readable after a call to {@link Socket#pool(long)}.
    168      * @param readable  true for set this session ready for read operations
    169      */
    170     void setReadable(boolean readable) {
    171         this.readable = readable;
    172     }
    173
    174     /**
    175      * Is this session is tagged writable after a call to {@link Socket#pool(long)}.
    176      * @return true if this session is ready for write operations
    177      */
    178     boolean isWritable() {
    179         return writable;
    180     }
    181
    182     /**
    183      * Set if this session is writable after a call to {@link Socket#pool(long)}.
    184      * @param writable true for set this session ready for write operations
    185      */
    186     void setWritable(boolean writable) {
    187         this.writable = writable;
    188     }
    189
    190     /**
    191      * Does this session needs to be registered for read events.
    192      * Used for building poll set {@see Poll}.
    193      * @return true if registered
    194      */
    195     boolean isInterestedInRead() {
    196         return interestedInRead;
    197     }
    198
    199     /**
    200      * Set if this session needs to be registered for read events.
    201      * Used for building poll set {@see Poll}.
    202      * @param isOpRead true if need to be registered
    203      */
    204     void setInterestedInRead(boolean isOpRead) {
    205         this.interestedInRead = isOpRead;
    206     }
    207
    208     /**
    209      * Does this session needs to be registered for write events.
    210      * Used for building poll set {@see Poll}.
    211      * @return true if registered
    212      */
    213     boolean isInterestedInWrite() {
    214         return interestedInWrite;
    215     }
    216
    217     /**
    218      * Set if this session needs to be registered for write events.
    219      * Used for building poll set {@see Poll}.
    220      * @param isOpWrite true if need to be registered
    221      */
    222     void setInterestedInWrite(boolean isOpWrite) {
    223         this.interestedInWrite = isOpWrite;
    224     }
    225 }