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 }