Author: elecharny
Date: Mon Dec 5 10:30:14 2011
New Revision: 1210398
URL: http://svn.apache.org/viewvc?rev=1210398&view=rev
Log:
o Added states and flag to manage secured services and sessions
Modified:
mina/trunk/core/src/main/java/org/apache/mina/api/IoService.java
mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java
mina/trunk/core/src/main/java/org/apache/mina/service/AbstractIoService.java
mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/api/IoService.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/api/IoService.java?rev=1210398&r1=1210397&r2=1210398&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/api/IoService.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/api/IoService.java Mon Dec 5
10:30:14 2011
@@ -78,4 +78,16 @@ public interface IoService {
* created by this service.
*/
IoSessionConfig getSessionConfig();
+
+ /**
+ * Tells if the service provide some encryption (SSL/TLS)
+ * @return <code>true</code> if the service is secured
+ */
+ boolean isSecured();
+
+ /**
+ * Set the mode to use, either secured or not secured
+ * @param secured The mode to use
+ */
+ void setSecured(boolean secured);
}
Modified: mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java?rev=1210398&r1=1210397&r2=1210398&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java Mon Dec 5
10:30:14 2011
@@ -98,6 +98,13 @@ public interface IoSession {
boolean isClosed();
/**
+ * Tells if the session is being closed.
+ *
+ * @return <code>true</code> if this session is in the process of being
closed.
+ */
+ boolean isClosing();
+
+ /**
* Tells if the session is processing a SSL/TLS handshake.
*
* @return <code>true</tt> if and only if this session is processing a
SSL/TLS handshake.
@@ -105,11 +112,18 @@ public interface IoSession {
boolean isSecuring();
/**
+ * Tells if the session is belonging to a secured connection.
+ *
+ * @return <code>true</tt> if and only if this session is belonging a
secured connection.
+ */
+ boolean isSecured();
+
+ /**
* Tells if the session is using SSL/TLS.
*
* @return <code>true</tt> if and only if this session is exchanging data
over a SSL/TLS connection
*/
- boolean isSecured();
+ boolean isConnectedSecured();
/**
* Closes this session immediately or after all queued write requests are
flushed. This operation is asynchronous.
Modified:
mina/trunk/core/src/main/java/org/apache/mina/service/AbstractIoService.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/service/AbstractIoService.java?rev=1210398&r1=1210397&r2=1210398&view=diff
==============================================================================
---
mina/trunk/core/src/main/java/org/apache/mina/service/AbstractIoService.java
(original)
+++
mina/trunk/core/src/main/java/org/apache/mina/service/AbstractIoService.java
Mon Dec 5 10:30:14 2011
@@ -42,6 +42,9 @@ public abstract class AbstractIoService
/** The service state */
private ServiceState state;
+
+ /** The service mode : secured or not */
+ private ServiceMode mode;
private final Map<Long, IoSession> managedSessions = new
ConcurrentHashMap<Long, IoSession>();
@@ -72,12 +75,23 @@ public abstract class AbstractIoService
/** The service is stopped */
DISPOSED
}
+
+ /**
+ * The Service secured mode
+ */
+ protected enum ServiceMode {
+ /** SSL/TLS activated */
+ SECURED,
+ /** SSL/TLS not activated */
+ NOT_SECURED
+ }
/**
* Create an AbstractIoService
*/
protected AbstractIoService() {
state = ServiceState.NONE;
+ mode = ServiceMode.NOT_SECURED;
}
@Override
@@ -243,13 +257,39 @@ public abstract class AbstractIoService
private IoFilter[] filters;
+ /**
+ * {@inheritDoc}
+ */
@Override
public IoFilter[] getFilters() {
return filters;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public void setFilters(IoFilter... filters) {
this.filters = filters;
}
+
+ /**
+ * Tells if the service provide some encryption (SSL/TLS)
+ * @return <code>true</code> if the service is secured
+ */
+ public boolean isSecured() {
+ return mode == ServiceMode.SECURED;
+ }
+
+ /**
+ * Set the mode to use, either secured or not secured
+ * @param secured The mode to use
+ */
+ public void setSecured(boolean secured) {
+ if (secured) {
+ mode = ServiceMode.SECURED;
+ } else {
+ mode = ServiceMode.NOT_SECURED;
+ }
+ }
}
\ No newline at end of file
Modified:
mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java?rev=1210398&r1=1210397&r2=1210398&view=diff
==============================================================================
---
mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
(original)
+++
mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
Mon Dec 5 10:30:14 2011
@@ -77,6 +77,9 @@ public abstract class AbstractIoSession
protected final Object stateMonitor = new Object();
protected volatile SessionState state;
+
+ /** Tells if the session is secured or not */
+ protected volatile boolean secured;
/** is this session registered for being polled for write ready events */
private AtomicBoolean registeredForWrite = new AtomicBoolean();
@@ -102,15 +105,75 @@ public abstract class AbstractIoSession
this.filterProcessor = new
DefaultIoFilterController(service.getFilters());
LOG.debug("Created new session with id : {}", id);
- synchronized (stateMonitor) {
- this.state = SessionState.CREATED;
- }
+
+ this.state = SessionState.CREATED;
+ }
+
+ //------------------------------------------------------------------------
+ // Session State management
+ //------------------------------------------------------------------------
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isClosed() {
+ return state == SessionState.CLOSED;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isClosing() {
+ return state == SessionState.CLOSING;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isConnected() {
+ return state == SessionState.CONNECTED;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isSecuring() {
+ return state == SessionState.SECURING;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isConnectedSecured() {
+ return state == SessionState.CONNECTED_SECURED;
}
public SessionState getState() {
return state;
}
+ //------------------------------------------------------------------------
+ // SSL/TLS session state management
+ //------------------------------------------------------------------------
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isSecured() {
+ return secured;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setSecured(boolean secured) {
+ this.secured = secured;
+ }
+
/**
* {@inheritDoc}
*/
Modified:
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java?rev=1210398&r1=1210397&r2=1210398&view=diff
==============================================================================
---
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
(original)
+++
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
Mon Dec 5 10:30:14 2011
@@ -191,46 +191,58 @@ public class NioSelectorProcessor implem
}
// apply the default service socket configuration
-
Boolean keepAlive = defaultConfig.isKeepAlive();
+
if (keepAlive != null) {
session.getConfig().setKeepAlive(keepAlive);
}
Boolean oobInline = defaultConfig.isOobInline();
+
if (oobInline != null) {
session.getConfig().setOobInline(oobInline);
}
Boolean reuseAddress = defaultConfig.isReuseAddress();
+
if (reuseAddress != null) {
session.getConfig().setReuseAddress(reuseAddress);
}
Boolean tcpNoDelay = defaultConfig.isTcpNoDelay();
+
if (tcpNoDelay != null) {
session.getConfig().setTcpNoDelay(tcpNoDelay);
}
Integer receiveBufferSize = defaultConfig.getReceiveBufferSize();
+
if (receiveBufferSize != null) {
session.getConfig().setReceiveBufferSize(receiveBufferSize);
}
Integer sendBufferSize = defaultConfig.getSendBufferSize();
+
if (sendBufferSize != null) {
session.getConfig().setSendBufferSize(sendBufferSize);
}
Integer trafficClass = defaultConfig.getTrafficClass();
+
if (trafficClass != null) {
session.getConfig().setTrafficClass(trafficClass);
}
Integer soLinger = defaultConfig.getSoLinger();
+
if (soLinger != null) {
session.getConfig().setSoLinger(soLinger);
}
+
+ // Set the secured fag if the service is to be used over SSL/TLS
+ if (service.isSecured()) {
+ session.setSecured(true);
+ }
// event session created
session.getFilterChain().processSessionCreated(session);
@@ -308,10 +320,16 @@ public class NioSelectorProcessor implem
SelectionKey key =
session.getSocketChannel().register(selector, SelectionKey.OP_READ);
key.attach(session);
sessionReadKey.put(session, key);
- session.setConnected();
- // fire the event
- ((AbstractIoService)
session.getService()).fireSessionCreated(session);
-
session.getFilterChain().processSessionOpened(session);
+
+ // Switch to CONNECTED, only if the session is not
secured, as the SSL Handshake
+ // will occur later.
+ if (!session.isSecured()) {
+ session.setConnected();
+
+ // fire the event
+ ((AbstractIoService)
session.getService()).fireSessionCreated(session);
+
session.getFilterChain().processSessionOpened(session);
+ }
}
}
@@ -366,7 +384,12 @@ public class NioSelectorProcessor implem
// we have read some data
// limit at the current position & rewind
buffer back to start & push to the chain
readBuffer.flip();
-
session.getFilterChain().processMessageReceived(session, readBuffer);
+
+ if (session.isSecured() &&
!session.isConnectedSecured()) {
+ // Process the SSL handshake now
+ } else {
+
session.getFilterChain().processMessageReceived(session, readBuffer);
+ }
}
}
Modified:
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java?rev=1210398&r1=1210397&r2=1210398&view=diff
==============================================================================
---
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java
(original)
+++
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java
Mon Dec 5 10:30:14 2011
@@ -120,38 +120,6 @@ public class NioTcpSession extends Abstr
* {@inheritDoc}
*/
@Override
- public boolean isConnected() {
- return state == SessionState.CONNECTED;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isSecuring() {
- return state == SessionState.SECURING;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isSecured() {
- return state == SessionState.CONNECTED_SECURED;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isClosed() {
- return state == SessionState.CLOSED;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
public IoFuture<Void> close(boolean immediately) {
switch (state) {
case CREATED: