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 }