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:


Reply via email to