You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ba...@apache.org on 2008/08/25 11:48:30 UTC

svn commit: r688688 [1/3] - in /james/server/trunk: avalon-socket-library/src/main/java/org/apache/james/socket/ nntpserver-function/src/main/java/org/apache/james/nntpserver/ phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ pop3se...

Author: bago
Date: Mon Aug 25 02:48:29 2008
New Revision: 688688

URL: http://svn.apache.org/viewvc?rev=688688&view=rev
Log:
Refactored all of our services/handlers to use delegation.
The interfaces will need much more care, but at least they are now functionally delegated.
As a first step I preferred to keep the diff as short as possible to avoid introducing bugs.

Removed:
    james/server/trunk/smtpserver-function/src/main/java/org/apache/james/smtpserver/DelegatingSMTPServer.java
    james/server/trunk/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPProtocolHandler.java
Modified:
    james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/AbstractJamesService.java
    james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/DelegatingJamesHandler.java
    james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandler.java
    james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandlerHelper.java
    james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPHandler.java
    james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPServer.java
    james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapHandler.java
    james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapServer.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Handler.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Server.java
    james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/RemoteManager.java
    james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/RemoteManagerHandler.java
    james/server/trunk/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPHandler.java
    james/server/trunk/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPHandlerChain.java
    james/server/trunk/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPServer.java

Modified: james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/AbstractJamesService.java
URL: http://svn.apache.org/viewvc/james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/AbstractJamesService.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/AbstractJamesService.java (original)
+++ james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/AbstractJamesService.java Mon Aug 25 02:48:29 2008
@@ -571,14 +571,14 @@
         getLogger().info(logString);
 
         if (connectionLimit != null) {
-            theHandlerPool = new HardResourceLimitingPool((ObjectFactory) this, 5, connectionLimit.intValue());
+            theHandlerPool = new HardResourceLimitingPool(this, 5, connectionLimit.intValue());
             if (getLogger().isDebugEnabled()) {
                 getLogger().debug("Using a bounded pool for "+getServiceType()+" handlers with upper limit " + connectionLimit.intValue());
             }
         } else {
             // NOTE: The maximum here is not a real maximum.  The handler pool will continue to
             //       provide handlers beyond this value.
-            theHandlerPool = new DefaultPool((ObjectFactory) this, null, 5, 30);
+            theHandlerPool = new DefaultPool(this, null, 5, 30);
             getLogger().debug("Using an unbounded pool for "+getServiceType()+" handlers.");
         }
     }
@@ -783,5 +783,22 @@
         ContainerUtil.service(conn, componentManager);
         return conn;
     }
+    
+    /**
+     * @see org.apache.avalon.excalibur.pool.ObjectFactory#newInstance()
+     */
+    public Object newInstance() throws Exception {
+        return new DelegatingJamesHandler(newProtocolHandlerInstance());
+    }
+    
+    protected abstract ProtocolHandler newProtocolHandlerInstance();
+
+		/**
+     * @see org.apache.avalon.excalibur.pool.ObjectFactory#getCreatedClass()
+     */
+    public Class getCreatedClass() {
+        return DelegatingJamesHandler.class;
+    }
+
 }
 

Modified: james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/DelegatingJamesHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/DelegatingJamesHandler.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/DelegatingJamesHandler.java (original)
+++ james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/DelegatingJamesHandler.java Mon Aug 25 02:48:29 2008
@@ -24,6 +24,9 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.net.Socket;
 
 /**
  * Common Handler code
@@ -62,6 +65,22 @@
     */
     public void resetHandler() {
         protocolHandler.resetHandler();
+        remoteHost = null;
+        remoteIP = null;
+    }
+
+    /**
+     * @see org.apache.james.socket.AbstractJamesHandler#errorHandler(java.lang.RuntimeException)
+     */
+    protected void errorHandler(RuntimeException e) {
+       protocolHandler.errorHandler(e);
+    }
+    
+    /**
+     * @see org.apache.james.socket.ProtocolHandlerHelper#defaultErrorHandler(java.lang.RuntimeException)
+     */
+    public void defaultErrorHandler(RuntimeException e) {
+        super.errorHandler(e);
     }
     
     /**
@@ -71,32 +90,60 @@
         return remoteIP;
     }
 
+    /**
+     * @see org.apache.james.socket.ProtocolHandlerHelper#getInputReader()
+     */
     public CRLFTerminatedReader getInputReader() {
         return inReader;
     }
 
+    /**
+     * @see org.apache.james.socket.ProtocolHandlerHelper#getInputStream()
+     */
     public InputStream getInputStream() {
         return in;
     }
 
-    public String getRemoteHost() {
-        return remoteHost;
-    }
-
-    public Watchdog getWatchdog() {
-        return getWatchdog();
+    /**
+     * @see org.apache.james.socket.ProtocolHandlerHelper#getOutputStream()
+     */
+    public OutputStream getOutputStream() {
+        return outs;
     }
 
-    public void setRemoteHost(String host) {
-        remoteHost = host;
+    /**
+     * @see org.apache.james.socket.ProtocolHandlerHelper#getOutputWriter()
+     */
+    public PrintWriter getOutputWriter() {
+        return out;
     }
 
-    public void setRemoteIP(String ip) {
-        remoteIP = ip;
+    /**
+     * @see org.apache.james.socket.ProtocolHandlerHelper#getRemoteHost()
+     */
+    public String getRemoteHost() {
+        return remoteHost;
     }
     
+    /**
+     * @see org.apache.james.socket.ProtocolHandlerHelper#getAvalonLogger()
+     */
     public Logger getAvalonLogger() {
         return getLogger();
     }
 
+    /**
+     * @see org.apache.james.socket.ProtocolHandlerHelper#getWatchdog()
+     */
+    public Watchdog getWatchdog() {
+        return theWatchdog;
+    }
+
+		/**
+		 * @see org.apache.james.socket.ProtocolHandlerHelper#getSocket()
+		 */
+		public Socket getSocket() {
+			return socket;
+		}
+
 }

Modified: james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandler.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandler.java (original)
+++ james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandler.java Mon Aug 25 02:48:29 2008
@@ -44,6 +44,16 @@
     public abstract void resetHandler();
     
     
+    /**
+     * Injects the ProtocolHandlerHelper service
+     * @param phh service
+     */
     public void setProtocolHandlerHelper(ProtocolHandlerHelper phh);
 
+    /**
+     * Provides errorHandling
+     * @param e exception
+     */
+    public abstract void errorHandler(RuntimeException e);
+
 }
\ No newline at end of file

Modified: james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandlerHelper.java
URL: http://svn.apache.org/viewvc/james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandlerHelper.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandlerHelper.java (original)
+++ james/server/trunk/avalon-socket-library/src/main/java/org/apache/james/socket/ProtocolHandlerHelper.java Mon Aug 25 02:48:29 2008
@@ -24,27 +24,86 @@
 import org.apache.james.util.watchdog.Watchdog;
 
 import java.io.InputStream;
-
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.net.Socket;
+
+/**
+ * This is the helper interface provided to ProtocolHandlers to let them
+ * communicate with the outside world.
+ */
 public interface ProtocolHandlerHelper {
 
+    /**
+     * Writes a response to the client and flush it.
+     * @param responseString the response string
+     */
     public void writeLoggedFlushedResponse(String responseString);
     
+    /**
+     * Writes a response to the client without flushing.
+     * @param responseString the response string
+     */
     public void writeLoggedResponse(String responseString);
     
+    /**
+     * The watchdog is used to deal with timeouts.
+     * @return the watchdog instance
+     */
     public Watchdog getWatchdog();
     
+    /**
+     * Provides logging facility to the handler.
+     * @return logger instance
+     */
     public Logger getAvalonLogger();
 
-    public void setRemoteHost(String host);
-    
-    public void setRemoteIP(String ip);
-
+    /**
+     * getter for the remote hostname
+     * @return remote hostname 
+     */
     public String getRemoteHost();
     
+    /**
+     * getter for the remote ip
+     * @return remote ip 
+     */
     public String getRemoteIP();
     
+    /**
+     * Returns a CRLF terminated line reader
+     * @return line reader
+     */
     public CRLFTerminatedReader getInputReader();
     
+    /**
+     * Returns the raw input stream
+     * @return the raw inputstream
+     */
     public InputStream getInputStream();
+    
+    /**
+     * Returns the raw outputstream
+     * @return outputstream
+     */
+    public OutputStream getOutputStream();
+    
+    /**
+     * Returns the printwriter.
+     * @return the output printwriter
+     */
+    public PrintWriter getOutputWriter();
+    
+    /**
+     * Provides basic errorhandling cleanup.
+     * @param e the runtimeexception
+     */
+    public void defaultErrorHandler(RuntimeException e);
+    
+    /**
+     * Provides access to the socket
+     * @return socket
+     */
+    public Socket getSocket();
 
 }
\ No newline at end of file

Modified: james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPHandler.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPHandler.java (original)
+++ james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPHandler.java Mon Aug 25 02:48:29 2008
@@ -24,7 +24,8 @@
 import org.apache.james.core.MailHeaders;
 import org.apache.james.nntpserver.repository.NNTPArticle;
 import org.apache.james.nntpserver.repository.NNTPGroup;
-import org.apache.james.socket.AbstractJamesHandler;
+import org.apache.james.socket.ProtocolHandler;
+import org.apache.james.socket.ProtocolHandlerHelper;
 import org.apache.james.util.stream.CharTerminatedInputStream;
 import org.apache.james.util.stream.DotStuffingInputStream;
 import org.apache.james.util.stream.ExtraDotOutputStream;
@@ -54,8 +55,9 @@
  *
  * Common NNTP extensions are in RFC 2980.
  */
-public class NNTPHandler
-    extends AbstractJamesHandler {
+public class NNTPHandler implements ProtocolHandler {
+
+    private ProtocolHandlerHelper helper;
 
     /**
      * used to calculate DATE from - see 11.3
@@ -263,7 +265,7 @@
     /**
      * @see org.apache.james.socket.AbstractJamesHandler#handleProtocol()
      */
-    protected void handleProtocol() throws IOException {
+    public void handleProtocol() throws IOException {
         // section 7.1
         if ( theConfigData.getNNTPRepository().isReadOnly() ) {
             StringBuffer respBuffer =
@@ -271,35 +273,35 @@
                     .append("201 ")
                     .append(theConfigData.getHelloName())
                     .append(" NNTP Service Ready, posting prohibited");
-            writeLoggedFlushedResponse(respBuffer.toString());
+            helper.writeLoggedFlushedResponse(respBuffer.toString());
         } else {
             StringBuffer respBuffer =
                 new StringBuffer(128)
                         .append("200 ")
                         .append(theConfigData.getHelloName())
                         .append(" NNTP Service Ready, posting permitted");
-            writeLoggedFlushedResponse(respBuffer.toString());
+            helper.writeLoggedFlushedResponse(respBuffer.toString());
         }
 
-        theWatchdog.start();
-        while (parseCommand(inReader.readLine())) {
-            theWatchdog.reset();
+        helper.getWatchdog().start();
+        while (parseCommand(helper.getInputReader().readLine())) {
+            helper.getWatchdog().reset();
         }
-        theWatchdog.stop();
+        helper.getWatchdog().stop();
 
-        getLogger().info("Connection closed");
+        helper.getAvalonLogger().info("Connection closed");
     }
     
     /**
      * @see org.apache.james.socket.AbstractJamesHandler#errorHandler(java.lang.RuntimeException)
      */
-    protected void errorHandler(RuntimeException e) {
-        super.errorHandler(e);
+    public void errorHandler(RuntimeException e) {
+        helper.defaultErrorHandler(e);
         // If the connection has been idled out, the
         // socket will be closed and null.  Do NOT
         // log the exception or attempt to send the
         // closing connection message
-        if (socket != null) {
+        if (helper.getSocket() != null) {
             try {
                 doQUIT(null);
             } catch (Throwable t) {}
@@ -309,7 +311,7 @@
     /**
      * @see org.apache.james.socket.AbstractJamesHandler#resetHandler
      */
-    protected void resetHandler() {
+    public void resetHandler() {
         // Clear the selected group, article info
         group = null;
         currentArticleNumber = -1;
@@ -339,8 +341,8 @@
         if (commandRaw == null) {
             return false;
         }
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug("Command received: " + commandRaw);
+        if (helper.getAvalonLogger().isDebugEnabled()) {
+            helper.getAvalonLogger().debug("Command received: " + commandRaw);
         }
 
         String command = commandRaw.trim();
@@ -354,8 +356,8 @@
 
         boolean returnValue = true;
         if (!isAuthorized(command) ) {
-            writeLoggedFlushedResponse("480 User is not authenticated");
-            getLogger().debug("Command not allowed.");
+            helper.writeLoggedFlushedResponse("480 User is not authenticated");
+            helper.getAvalonLogger().debug("Command not allowed.");
             return returnValue;
         }
         if ((command.equals(COMMAND_MODE)) && (argument != null)) {
@@ -364,7 +366,7 @@
             } else if (argument.toUpperCase(Locale.US).equals(MODE_TYPE_STREAM)) {
                 doMODESTREAM(argument);
             } else {
-                writeLoggedFlushedResponse("500 Command not understood");
+                helper.writeLoggedFlushedResponse("500 Command not understood");
             }
         } else if ( command.equals(COMMAND_LIST)) {
             doLIST(argument);
@@ -426,16 +428,16 @@
      * @param argument the argument passed in with the command
      */
     private void doUnknownCommand(String command, String argument) {
-        if (getLogger().isDebugEnabled()) {
+        if (helper.getAvalonLogger().isDebugEnabled()) {
             StringBuffer logBuffer =
                 new StringBuffer(128)
                     .append("Received unknown command ")
                     .append(command)
                     .append(" with argument ")
                     .append(argument);
-            getLogger().debug(logBuffer.toString());
+            helper.getAvalonLogger().debug(logBuffer.toString());
         }
-        writeLoggedFlushedResponse("500 Unknown command");
+        helper.writeLoggedFlushedResponse("500 Unknown command");
     }
 
     /**
@@ -456,29 +458,29 @@
             }
         }
         if (command == null) {
-            writeLoggedFlushedResponse("501 Syntax error");
+            helper.writeLoggedFlushedResponse("501 Syntax error");
             return;
         }
         command = command.toUpperCase(Locale.US);
         if ( command.equals(AUTHINFO_PARAM_USER) ) {
             // Reject re-authentication
             if ( isAlreadyAuthenticated ) {
-                writeLoggedFlushedResponse("482 Already authenticated - rejecting new credentials");
+                helper.writeLoggedFlushedResponse("482 Already authenticated - rejecting new credentials");
             }
             // Reject doubly sent user
             if (user != null) {
                 user = null;
                 password = null;
                 isAlreadyAuthenticated = false;
-                writeLoggedFlushedResponse("482 User already specified - rejecting new user");
+                helper.writeLoggedFlushedResponse("482 User already specified - rejecting new user");
                 return;
             }
             user = value;
-            writeLoggedFlushedResponse("381 More authentication information required");
+            helper.writeLoggedFlushedResponse("381 More authentication information required");
         } else if ( command.equals(AUTHINFO_PARAM_PASS) ) {
             // Reject password sent before user
             if (user == null) {
-                writeLoggedFlushedResponse("482 User not yet specified.  Rejecting user.");
+                helper.writeLoggedFlushedResponse("482 User not yet specified.  Rejecting user.");
                 return;
             }
             // Reject doubly sent password
@@ -486,21 +488,21 @@
                 user = null;
                 password = null;
                 isAlreadyAuthenticated = false;
-                writeLoggedFlushedResponse("482 Password already specified - rejecting new password");
+                helper.writeLoggedFlushedResponse("482 Password already specified - rejecting new password");
                 return;
             }
             password = value;
             isAlreadyAuthenticated = isAuthenticated();
             if ( isAlreadyAuthenticated ) {
-                writeLoggedFlushedResponse("281 Authentication accepted");
+                helper.writeLoggedFlushedResponse("281 Authentication accepted");
             } else {
-                writeLoggedFlushedResponse("482 Authentication rejected");
+                helper.writeLoggedFlushedResponse("482 Authentication rejected");
                 // Clear bad authentication
                 user = null;
                 password = null;
             }
         } else {
-            writeLoggedFlushedResponse("501 Syntax error");
+            helper.writeLoggedFlushedResponse("501 Syntax error");
             return;
         }
     }
@@ -523,13 +525,13 @@
                 wildmat = argument.substring(0, spaceIndex);
                 argument = argument.substring(spaceIndex + 1);
             } else {
-                getLogger().error("NEWNEWS had an invalid argument");
-                writeLoggedFlushedResponse("501 Syntax error");
+                helper.getAvalonLogger().error("NEWNEWS had an invalid argument");
+                helper.writeLoggedFlushedResponse("501 Syntax error");
                 return;
             }
         } else {
-            getLogger().error("NEWNEWS had a null argument");
-            writeLoggedFlushedResponse("501 Syntax error");
+            helper.getAvalonLogger().error("NEWNEWS had a null argument");
+            helper.writeLoggedFlushedResponse("501 Syntax error");
             return;
         }
 
@@ -537,12 +539,12 @@
         try {
             theDate = getDateFrom(argument);
         } catch (NNTPException nntpe) {
-            getLogger().error("NEWNEWS had an invalid argument", nntpe);
-            writeLoggedFlushedResponse("501 Syntax error");
+            helper.getAvalonLogger().error("NEWNEWS had an invalid argument", nntpe);
+            helper.writeLoggedFlushedResponse("501 Syntax error");
             return;
         }
 
-        writeLoggedFlushedResponse("230 list of new articles by message-id follows");
+        helper.writeLoggedFlushedResponse("230 list of new articles by message-id follows");
         Iterator groupIter = theConfigData.getNNTPRepository().getMatchedGroups(wildmat);
         while ( groupIter.hasNext() ) {
             Iterator articleIter = ((NNTPGroup)(groupIter.next())).getArticlesSince(theDate);
@@ -550,10 +552,10 @@
                 StringBuffer iterBuffer =
                     new StringBuffer(64)
                         .append(((NNTPArticle)articleIter.next()).getUniqueID());
-                writeLoggedResponse(iterBuffer.toString());
+                helper.writeLoggedResponse(iterBuffer.toString());
             }
         }
-        writeLoggedFlushedResponse(".");
+        helper.writeLoggedFlushedResponse(".");
     }
 
     /**
@@ -577,12 +579,12 @@
         try {
             theDate = getDateFrom(argument);
         } catch (NNTPException nntpe) {
-            getLogger().error("NEWGROUPS had an invalid argument", nntpe);
-            writeLoggedFlushedResponse("501 Syntax error");
+            helper.getAvalonLogger().error("NEWGROUPS had an invalid argument", nntpe);
+            helper.writeLoggedFlushedResponse("501 Syntax error");
             return;
         }
         Iterator iter = theConfigData.getNNTPRepository().getGroupsSince(theDate);
-        writeLoggedFlushedResponse("231 list of new newsgroups follows");
+        helper.writeLoggedFlushedResponse("231 list of new newsgroups follows");
         while ( iter.hasNext() ) {
             NNTPGroup currentGroup = (NNTPGroup)iter.next();
             StringBuffer iterBuffer =
@@ -594,9 +596,9 @@
                     .append(currentGroup.getFirstArticleNumber())
                     .append(" ")
                     .append((currentGroup.isPostAllowed()?"y":"n"));
-            writeLoggedResponse(iterBuffer.toString());
+            helper.writeLoggedResponse(iterBuffer.toString());
         }
-        writeLoggedFlushedResponse(".");
+        helper.writeLoggedFlushedResponse(".");
     }
 
     /**
@@ -605,8 +607,8 @@
      * @param argument the argument passed in with the HELP command.
      */
     private void doHELP(String argument) {
-        writeLoggedResponse("100 Help text follows");
-        writeLoggedFlushedResponse(".");
+        helper.writeLoggedResponse("100 Help text follows");
+        helper.writeLoggedFlushedResponse(".");
     }
 
     /**
@@ -616,7 +618,7 @@
      * @param argument the argument passed in with the SLAVE command.
      */
     private void doSLAVE(String argument) {
-        writeLoggedFlushedResponse("202 slave status noted");
+        helper.writeLoggedFlushedResponse("202 slave status noted");
     }
 
     /**
@@ -627,7 +629,7 @@
     private void doDATE(String argument) {
         Date dt = new Date(System.currentTimeMillis()-UTC_OFFSET);
         String dtStr = DF_RFC2980.format(new Date(dt.getTime() - UTC_OFFSET));
-        writeLoggedFlushedResponse("111 " + dtStr);
+        helper.writeLoggedFlushedResponse("111 " + dtStr);
     }
 
     /**
@@ -636,7 +638,7 @@
      * @param argument the argument passed in with the QUIT command
      */
     private void doQUIT(String argument) {
-        writeLoggedFlushedResponse("205 closing connection");
+        helper.writeLoggedFlushedResponse("205 closing connection");
     }
 
     /**
@@ -672,33 +674,33 @@
                 return;
             } else if (extension.equals("ACTIVE.TIMES") ) {
                 // not supported - 9.4.2.1, 9.4.3.1, 9.4.4.1
-                writeLoggedFlushedResponse("503 program error, function not performed");
+                helper.writeLoggedFlushedResponse("503 program error, function not performed");
                 return;
             } else if (extension.equals("DISTRIBUTIONS") ) {
                 // not supported - 9.4.2.1, 9.4.3.1, 9.4.4.1
-                writeLoggedFlushedResponse("503 program error, function not performed");
+                helper.writeLoggedFlushedResponse("503 program error, function not performed");
                 return;
             } else if (extension.equals("DISTRIB.PATS") ) {
                 // not supported - 9.4.2.1, 9.4.3.1, 9.4.4.1
-                writeLoggedFlushedResponse("503 program error, function not performed");
+                helper.writeLoggedFlushedResponse("503 program error, function not performed");
                 return;
             } else {
-                writeLoggedFlushedResponse("501 Syntax error");
+                helper.writeLoggedFlushedResponse("501 Syntax error");
                 return;
             }
         }
 
         Iterator iter = theConfigData.getNNTPRepository().getMatchedGroups(wildmat);
-        writeLoggedFlushedResponse("215 list of newsgroups follows");
+        helper.writeLoggedFlushedResponse("215 list of newsgroups follows");
         while ( iter.hasNext() ) {
             NNTPGroup theGroup = (NNTPGroup)iter.next();
             if (isListNewsgroups) {
-                writeLoggedResponse(theGroup.getListNewsgroupsFormat());
+                helper.writeLoggedResponse(theGroup.getListNewsgroupsFormat());
             } else {
-                writeLoggedResponse(theGroup.getListFormat());
+                helper.writeLoggedResponse(theGroup.getListFormat());
             }
         }
-        writeLoggedFlushedResponse(".");
+        helper.writeLoggedFlushedResponse(".");
     }
 
     /**
@@ -710,21 +712,21 @@
     private void doIHAVE(String id) {
         // see section 9.3.2.1
         if (!isMessageId(id)) {
-            writeLoggedFlushedResponse("501 command syntax error");
+            helper.writeLoggedFlushedResponse("501 command syntax error");
             return;
         }
         NNTPArticle article = theConfigData.getNNTPRepository().getArticleFromID(id);
         if ( article != null ) {
-            writeLoggedFlushedResponse("435 article not wanted - do not send it");
+            helper.writeLoggedFlushedResponse("435 article not wanted - do not send it");
         } else {
-            writeLoggedFlushedResponse("335 send article to be transferred. End with <CR-LF>.<CR-LF>");
+            helper.writeLoggedFlushedResponse("335 send article to be transferred. End with <CR-LF>.<CR-LF>");
             try {
                 createArticle();
             } catch (RuntimeException e) {
-                writeLoggedFlushedResponse("436 transfer failed - try again later");
+                helper.writeLoggedFlushedResponse("436 transfer failed - try again later");
                 throw e;
             }
-            writeLoggedFlushedResponse("235 article received ok");
+            helper.writeLoggedFlushedResponse("235 article received ok");
         }
     }
 
@@ -736,11 +738,11 @@
     private void doPOST(String argument) {
         // see section 9.3.1.1
         if ( argument != null ) {
-            writeLoggedFlushedResponse("501 Syntax error - unexpected parameter");
+            helper.writeLoggedFlushedResponse("501 Syntax error - unexpected parameter");
         }
-        writeLoggedFlushedResponse("340 send article to be posted. End with <CR-LF>.<CR-LF>");
+        helper.writeLoggedFlushedResponse("340 send article to be posted. End with <CR-LF>.<CR-LF>");
         createArticle();
-        writeLoggedFlushedResponse("240 article received ok");
+        helper.writeLoggedFlushedResponse("240 article received ok");
     }
 
     /**
@@ -758,24 +760,24 @@
         if (isMessageId(param)) {
             article = theConfigData.getNNTPRepository().getArticleFromID(param);
             if ( article == null ) {
-                writeLoggedFlushedResponse("430 no such article");
+                helper.writeLoggedFlushedResponse("430 no such article");
                 return;
             } else {
                 StringBuffer respBuffer =
                     new StringBuffer(64)
                             .append("223 0 ")
                             .append(param);
-                writeLoggedFlushedResponse(respBuffer.toString());
+                helper.writeLoggedFlushedResponse(respBuffer.toString());
             }
         } else {
             int newArticleNumber = currentArticleNumber;
             if ( group == null ) {
-                writeLoggedFlushedResponse("412 no newsgroup selected");
+                helper.writeLoggedFlushedResponse("412 no newsgroup selected");
                 return;
             } else {
                 if ( param == null ) {
                     if ( currentArticleNumber < 0 ) {
-                        writeLoggedFlushedResponse("420 no current article selected");
+                        helper.writeLoggedFlushedResponse("420 no current article selected");
                         return;
                     } else {
                         article = group.getArticle(currentArticleNumber);
@@ -786,7 +788,7 @@
                     article = group.getArticle(newArticleNumber);
                 }
                 if ( article == null ) {
-                    writeLoggedFlushedResponse("423 no such article number in this group");
+                    helper.writeLoggedFlushedResponse("423 no such article number in this group");
                     return;
                 } else {
                     currentArticleNumber = newArticleNumber;
@@ -800,7 +802,7 @@
                                 .append(article.getArticleNumber())
                                 .append(" ")
                                 .append(articleID);
-                    writeLoggedFlushedResponse(respBuffer.toString());
+                    helper.writeLoggedFlushedResponse(respBuffer.toString());
                 }
             }
         }
@@ -821,24 +823,24 @@
         if (isMessageId(param)) {
             article = theConfigData.getNNTPRepository().getArticleFromID(param);
             if ( article == null ) {
-                writeLoggedFlushedResponse("430 no such article");
+                helper.writeLoggedFlushedResponse("430 no such article");
                 return;
             } else {
                 StringBuffer respBuffer =
                     new StringBuffer(64)
                             .append("222 0 ")
                             .append(param);
-                writeLoggedFlushedResponse(respBuffer.toString());
+                helper.writeLoggedFlushedResponse(respBuffer.toString());
             }
         } else {
             int newArticleNumber = currentArticleNumber;
             if ( group == null ) {
-                writeLoggedFlushedResponse("412 no newsgroup selected");
+                helper.writeLoggedFlushedResponse("412 no newsgroup selected");
                 return;
             } else {
                 if ( param == null ) {
                     if ( currentArticleNumber < 0 ) {
-                        writeLoggedFlushedResponse("420 no current article selected");
+                        helper.writeLoggedFlushedResponse("420 no current article selected");
                         return;
                     } else {
                         article = group.getArticle(currentArticleNumber);
@@ -849,7 +851,7 @@
                     article = group.getArticle(newArticleNumber);
                 }
                 if ( article == null ) {
-                    writeLoggedFlushedResponse("423 no such article number in this group");
+                    helper.writeLoggedFlushedResponse("423 no such article number in this group");
                     return;
                 } else {
                     currentArticleNumber = newArticleNumber;
@@ -863,14 +865,14 @@
                                 .append(article.getArticleNumber())
                                 .append(" ")
                                 .append(articleID);
-                    writeLoggedFlushedResponse(respBuffer.toString());
+                    helper.writeLoggedFlushedResponse(respBuffer.toString());
                 }
             }
         }
         if (article != null) {
-            out.flush();
-            article.writeBody(new ExtraDotOutputStream(outs));
-            writeLoggedFlushedResponse("\r\n.");
+            helper.getOutputWriter().flush();
+            article.writeBody(new ExtraDotOutputStream(helper.getOutputStream()));
+            helper.writeLoggedFlushedResponse("\r\n.");
         }
     }
 
@@ -889,24 +891,24 @@
         if (isMessageId(param)) {
             article = theConfigData.getNNTPRepository().getArticleFromID(param);
             if ( article == null ) {
-                writeLoggedFlushedResponse("430 no such article");
+                helper.writeLoggedFlushedResponse("430 no such article");
                 return;
             } else {
                 StringBuffer respBuffer =
                     new StringBuffer(64)
                             .append("221 0 ")
                             .append(param);
-                writeLoggedFlushedResponse(respBuffer.toString());
+                helper.writeLoggedFlushedResponse(respBuffer.toString());
             }
         } else {
             int newArticleNumber = currentArticleNumber;
             if ( group == null ) {
-                writeLoggedFlushedResponse("412 no newsgroup selected");
+                helper.writeLoggedFlushedResponse("412 no newsgroup selected");
                 return;
             } else {
                 if ( param == null ) {
                     if ( currentArticleNumber < 0 ) {
-                        writeLoggedFlushedResponse("420 no current article selected");
+                        helper.writeLoggedFlushedResponse("420 no current article selected");
                         return;
                     } else {
                         article = group.getArticle(currentArticleNumber);
@@ -917,7 +919,7 @@
                     article = group.getArticle(newArticleNumber);
                 }
                 if ( article == null ) {
-                    writeLoggedFlushedResponse("423 no such article number in this group");
+                    helper.writeLoggedFlushedResponse("423 no such article number in this group");
                     return;
                 } else {
                     currentArticleNumber = newArticleNumber;
@@ -931,14 +933,14 @@
                                 .append(article.getArticleNumber())
                                 .append(" ")
                                 .append(articleID);
-                    writeLoggedFlushedResponse(respBuffer.toString());
+                    helper.writeLoggedFlushedResponse(respBuffer.toString());
                 }
             }
         }
         if (article != null) {
-            out.flush();
-            article.writeHead(new ExtraDotOutputStream(outs));
-            writeLoggedFlushedResponse(".");
+            helper.getOutputWriter().flush();
+            article.writeHead(new ExtraDotOutputStream(helper.getOutputStream()));
+            helper.writeLoggedFlushedResponse(".");
         }
     }
 
@@ -957,24 +959,24 @@
         if (isMessageId(param)) {
             article = theConfigData.getNNTPRepository().getArticleFromID(param);
             if ( article == null ) {
-                writeLoggedFlushedResponse("430 no such article");
+                helper.writeLoggedFlushedResponse("430 no such article");
                 return;
             } else {
                 StringBuffer respBuffer =
                     new StringBuffer(64)
                             .append("220 0 ")
                             .append(param);
-                writeLoggedResponse(respBuffer.toString());
+                helper.writeLoggedResponse(respBuffer.toString());
             }
         } else {
             int newArticleNumber = currentArticleNumber;
             if ( group == null ) {
-                writeLoggedFlushedResponse("412 no newsgroup selected");
+                helper.writeLoggedFlushedResponse("412 no newsgroup selected");
                 return;
             } else {
                 if ( param == null ) {
                     if ( currentArticleNumber < 0 ) {
-                        writeLoggedFlushedResponse("420 no current article selected");
+                        helper.writeLoggedFlushedResponse("420 no current article selected");
                         return;
                     } else {
                         article = group.getArticle(currentArticleNumber);
@@ -985,7 +987,7 @@
                     article = group.getArticle(newArticleNumber);
                 }
                 if ( article == null ) {
-                    writeLoggedFlushedResponse("423 no such article number in this group");
+                    helper.writeLoggedFlushedResponse("423 no such article number in this group");
                     return;
                 } else {
                     currentArticleNumber = newArticleNumber;
@@ -999,15 +1001,15 @@
                                 .append(article.getArticleNumber())
                                 .append(" ")
                                 .append(articleID);
-                    writeLoggedFlushedResponse(respBuffer.toString());
+                    helper.writeLoggedFlushedResponse(respBuffer.toString());
                 }
             }
         }
         if (article != null) {
-            out.flush();
-            article.writeArticle(new ExtraDotOutputStream(outs));
+            helper.getOutputWriter().flush();
+            article.writeArticle(new ExtraDotOutputStream(helper.getOutputStream()));
             // see jira JAMES-311 for an explanation of the "\r\n"
-            writeLoggedFlushedResponse("\r\n.");
+            helper.writeLoggedFlushedResponse("\r\n.");
         }
     }
 
@@ -1019,13 +1021,13 @@
     private void doNEXT(String argument) {
         // section 9.1.1.3.1
         if ( argument != null ) {
-            writeLoggedFlushedResponse("501 Syntax error - unexpected parameter");
+            helper.writeLoggedFlushedResponse("501 Syntax error - unexpected parameter");
         } else if ( group == null ) {
-            writeLoggedFlushedResponse("412 no newsgroup selected");
+            helper.writeLoggedFlushedResponse("412 no newsgroup selected");
         } else if ( currentArticleNumber < 0 ) {
-            writeLoggedFlushedResponse("420 no current article has been selected");
+            helper.writeLoggedFlushedResponse("420 no current article has been selected");
         } else if ( currentArticleNumber >= group.getLastArticleNumber() ) {
-            writeLoggedFlushedResponse("421 no next article in this group");
+            helper.writeLoggedFlushedResponse("421 no next article in this group");
         } else {
             currentArticleNumber++;
             NNTPArticle article = group.getArticle(currentArticleNumber);
@@ -1035,7 +1037,7 @@
                         .append(article.getArticleNumber())
                         .append(" ")
                         .append(article.getUniqueID());
-            writeLoggedFlushedResponse(respBuffer.toString());
+            helper.writeLoggedFlushedResponse(respBuffer.toString());
         }
     }
 
@@ -1048,13 +1050,13 @@
     private void doLAST(String argument) {
         // section 9.1.1.2.1
         if ( argument != null ) {
-            writeLoggedFlushedResponse("501 Syntax error - unexpected parameter");
+            helper.writeLoggedFlushedResponse("501 Syntax error - unexpected parameter");
         } else if ( group == null ) {
-            writeLoggedFlushedResponse("412 no newsgroup selected");
+            helper.writeLoggedFlushedResponse("412 no newsgroup selected");
         } else if ( currentArticleNumber < 0 ) {
-            writeLoggedFlushedResponse("420 no current article has been selected");
+            helper.writeLoggedFlushedResponse("420 no current article has been selected");
         } else if ( currentArticleNumber <= group.getFirstArticleNumber() ) {
-            writeLoggedFlushedResponse("422 no previous article in this group");
+            helper.writeLoggedFlushedResponse("422 no previous article in this group");
         } else {
             currentArticleNumber--;
             NNTPArticle article = group.getArticle(currentArticleNumber);
@@ -1064,7 +1066,7 @@
                         .append(article.getArticleNumber())
                         .append(" ")
                         .append(article.getUniqueID());
-            writeLoggedFlushedResponse(respBuffer.toString());
+            helper.writeLoggedFlushedResponse(respBuffer.toString());
         }
     }
 
@@ -1075,13 +1077,13 @@
      */
     private void doGROUP(String groupName) {
         if (groupName == null) {
-            writeLoggedFlushedResponse("501 Syntax error - missing required parameter");
+            helper.writeLoggedFlushedResponse("501 Syntax error - missing required parameter");
             return;
         }
         NNTPGroup newGroup = theConfigData.getNNTPRepository().getGroup(groupName);
         // section 9.1.1.1
         if ( newGroup == null ) {
-            writeLoggedFlushedResponse("411 no such newsgroup");
+            helper.writeLoggedFlushedResponse("411 no such newsgroup");
         } else {
             group = newGroup;
             // if the number of articles in group == 0
@@ -1112,7 +1114,7 @@
                         .append(" ")
                         .append(group.getName())
                         .append(" group selected");
-            writeLoggedFlushedResponse(respBuffer.toString());
+            helper.writeLoggedFlushedResponse(respBuffer.toString());
         }
     }
 
@@ -1121,14 +1123,14 @@
      */
     private void doLISTEXTENSIONS() {
         // 8.1.1
-        writeLoggedResponse("202 Extensions supported:");
-        writeLoggedResponse("LISTGROUP");
-        writeLoggedResponse("AUTHINFO");
-        writeLoggedResponse("OVER");
-        writeLoggedResponse("XOVER");
-        writeLoggedResponse("HDR");
-        writeLoggedResponse("XHDR");
-        writeLoggedFlushedResponse(".");
+        helper.writeLoggedResponse("202 Extensions supported:");
+        helper.writeLoggedResponse("LISTGROUP");
+        helper.writeLoggedResponse("AUTHINFO");
+        helper.writeLoggedResponse("OVER");
+        helper.writeLoggedResponse("XOVER");
+        helper.writeLoggedResponse("HDR");
+        helper.writeLoggedResponse("XHDR");
+        helper.writeLoggedFlushedResponse(".");
     }
 
     /**
@@ -1138,7 +1140,7 @@
      */
     private void doMODEREADER(String argument) {
         // 7.2
-        writeLoggedFlushedResponse(theConfigData.getNNTPRepository().isReadOnly()
+        helper.writeLoggedFlushedResponse(theConfigData.getNNTPRepository().isReadOnly()
                        ? "201 Posting Not Permitted" : "200 Posting Permitted");
     }
 
@@ -1149,7 +1151,7 @@
      */
     private void doMODESTREAM(String argument) {
         // 7.2
-        writeLoggedFlushedResponse("500 Command not understood");
+        helper.writeLoggedFlushedResponse("500 Command not understood");
     }
 
     /**
@@ -1162,14 +1164,14 @@
         // 9.5.1.1.1
         if (groupName==null) {
             if ( group == null) {
-                writeLoggedFlushedResponse("412 no news group currently selected");
+                helper.writeLoggedFlushedResponse("412 no news group currently selected");
                 return;
             }
         }
         else {
             group = theConfigData.getNNTPRepository().getGroup(groupName);
             if ( group == null ) {
-                writeLoggedFlushedResponse("411 no such newsgroup");
+                helper.writeLoggedFlushedResponse("411 no such newsgroup");
                 return;
             }
         }
@@ -1185,14 +1187,14 @@
                 currentArticleNumber = -1;
             }
 
-            writeLoggedFlushedResponse("211 list of article numbers follow");
+            helper.writeLoggedFlushedResponse("211 list of article numbers follow");
 
             Iterator iter = group.getArticles();
             while (iter.hasNext()) {
                 NNTPArticle article = (NNTPArticle)iter.next();
-                writeLoggedResponse(article.getArticleNumber() + "");
+                helper.writeLoggedResponse(article.getArticleNumber() + "");
             }
-            writeLoggedFlushedResponse(".");
+            helper.writeLoggedFlushedResponse(".");
         }
     }
 
@@ -1201,12 +1203,12 @@
      */
     private void doLISTOVERVIEWFMT() {
         // 9.5.3.1.1
-        writeLoggedFlushedResponse("215 Information follows");
+        helper.writeLoggedFlushedResponse("215 Information follows");
         String[] overviewHeaders = theConfigData.getNNTPRepository().getOverviewFormat();
         for (int i = 0;  i < overviewHeaders.length; i++) {
-            writeLoggedResponse(overviewHeaders[i]);
+            helper.writeLoggedResponse(overviewHeaders[i]);
         }
-        writeLoggedFlushedResponse(".");
+        helper.writeLoggedFlushedResponse(".");
     }
 
     /**
@@ -1216,7 +1218,7 @@
      */
     private void doPAT(String argument) {
         // 9.5.3.1.1 in draft-12
-        writeLoggedFlushedResponse("500 Command not recognized");
+        helper.writeLoggedFlushedResponse("500 Command not recognized");
     }
 
     /**
@@ -1238,7 +1240,7 @@
     private void doHDR(String argument) {
         // 9.5.3
         if (argument == null) {
-            writeLoggedFlushedResponse("501 Syntax error - missing required parameter");
+            helper.writeLoggedFlushedResponse("501 Syntax error - missing required parameter");
             return;
         }
         String hdr = argument;
@@ -1249,20 +1251,20 @@
             hdr = hdr.substring(0, spaceIndex);
         }
         if (group == null ) {
-            writeLoggedFlushedResponse("412 No news group currently selected.");
+            helper.writeLoggedFlushedResponse("412 No news group currently selected.");
             return;
         }
         if ((range == null) && (currentArticleNumber < 0)) {
-            writeLoggedFlushedResponse("420 No current article selected");
+            helper.writeLoggedFlushedResponse("420 No current article selected");
             return;
         }
         NNTPArticle[] article = getRange(range);
         if ( article == null ) {
-            writeLoggedFlushedResponse("412 no newsgroup selected");
+            helper.writeLoggedFlushedResponse("412 no newsgroup selected");
         } else if ( article.length == 0 ) {
-            writeLoggedFlushedResponse("430 no such article");
+            helper.writeLoggedFlushedResponse("430 no such article");
         } else {
-            writeLoggedFlushedResponse("221 Header follows");
+            helper.writeLoggedFlushedResponse("221 Header follows");
             for ( int i = 0 ; i < article.length ; i++ ) {
                 String val = article[i].getHeader(hdr);
                 if ( val == null ) {
@@ -1273,9 +1275,9 @@
                             .append(article[i].getArticleNumber())
                             .append(" ")
                             .append(val);
-                writeLoggedResponse(hdrBuffer.toString());
+                helper.writeLoggedResponse(hdrBuffer.toString());
             }
-            writeLoggedFlushedResponse(".");
+            helper.writeLoggedFlushedResponse(".");
         }
     }
 
@@ -1298,28 +1300,28 @@
     private void doOVER(String range) {
         // 9.5.2.2.1
         if ( group == null ) {
-            writeLoggedFlushedResponse("412 No newsgroup selected");
+            helper.writeLoggedFlushedResponse("412 No newsgroup selected");
             return;
         }
         if ((range == null) && (currentArticleNumber < 0)) {
-            writeLoggedFlushedResponse("420 No current article selected");
+            helper.writeLoggedFlushedResponse("420 No current article selected");
             return;
         }
         NNTPArticle[] article = getRange(range);
         if ( article.length == 0 ) {
-            writeLoggedFlushedResponse("420 No article(s) selected");
+            helper.writeLoggedFlushedResponse("420 No article(s) selected");
         } else {
-            writeLoggedResponse("224 Overview information follows");
+            helper.writeLoggedResponse("224 Overview information follows");
             for ( int i = 0 ; i < article.length ; i++ ) {
-                article[i].writeOverview(outs);
+                article[i].writeOverview(helper.getOutputStream());
                 if (i % 100 == 0) {
                     // Reset the watchdog every hundred headers or so
                     // to ensure the connection doesn't timeout for slow
                     // clients
-                    theWatchdog.reset();
+                    helper.getWatchdog().reset();
                 }
             }
-            writeLoggedFlushedResponse(".");
+            helper.writeLoggedFlushedResponse(".");
         }
     }
 
@@ -1328,7 +1330,7 @@
      */
     private void createArticle() {
         try {
-            InputStream msgIn = new CharTerminatedInputStream(in, NNTPTerminator);
+            InputStream msgIn = new CharTerminatedInputStream(helper.getInputStream(), NNTPTerminator);
             // Removes the dot stuffing
             msgIn = new DotStuffingInputStream(msgIn);
             MailHeaders headers = new MailHeaders(msgIn);
@@ -1515,6 +1517,10 @@
         } else {
             return false;
         }
-   }
+    }
+
+    public void setProtocolHandlerHelper(ProtocolHandlerHelper phh) {
+        this.helper = phh;
+    }
 
 }

Modified: james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPServer.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPServer.java (original)
+++ james/server/trunk/nntpserver-function/src/main/java/org/apache/james/nntpserver/NNTPServer.java Mon Aug 25 02:48:29 2008
@@ -29,6 +29,7 @@
 import org.apache.james.nntpserver.repository.NNTPRepository;
 import org.apache.james.services.MailServer;
 import org.apache.james.socket.AbstractJamesService;
+import org.apache.james.socket.ProtocolHandler;
 
 /**
  * NNTP Server
@@ -130,23 +131,14 @@
         return "NNTP Service";
     }
 
-
     /**
-     * @see org.apache.avalon.excalibur.pool.ObjectFactory#newInstance()
+     * @see org.apache.james.socket.AbstractJamesService#newProtocolHandlerInstance()
      */
-    public Object newInstance() throws Exception {
+    public ProtocolHandler newProtocolHandlerInstance() {
         return new NNTPHandler();
     }
 
     /**
-     * @see org.apache.avalon.excalibur.pool.ObjectFactory#getCreatedClass()
-     */
-    public Class getCreatedClass() {
-        return NNTPHandler.class;
-    }
-          
-
-    /**
      * A class to provide NNTP handler configuration to the handlers
      */
     private class NNTPHandlerConfigurationDataImpl

Modified: james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapHandler.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapHandler.java (original)
+++ james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapHandler.java Mon Aug 25 02:48:29 2008
@@ -19,11 +19,8 @@
 
 package org.apache.james.experimental.imapserver;
 
-import java.io.IOException;
-import java.net.Socket;
-
 import org.apache.avalon.cornerstone.services.connection.ConnectionHandler;
-import org.apache.avalon.excalibur.pool.Poolable;
+import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.james.Constants;
 import org.apache.james.api.imap.ImapConstants;
@@ -34,15 +31,20 @@
 import org.apache.james.imapserver.codec.encode.ImapEncoder;
 import org.apache.james.imapserver.codec.encode.ImapResponseComposer;
 import org.apache.james.imapserver.codec.encode.base.ImapResponseComposerImpl;
-import org.apache.james.socket.AbstractJamesHandler;
+import org.apache.james.socket.ProtocolHandler;
+import org.apache.james.socket.ProtocolHandlerHelper;
+
+import java.io.IOException;
+import java.net.Socket;
 
 /**
  * Handles IMAP connections.
  */
-public class ImapHandler
-        extends AbstractJamesHandler
-        implements ConnectionHandler, Poolable, ImapConstants
+public class ImapHandler implements ProtocolHandler, ImapConstants
 {
+	
+    private ProtocolHandlerHelper helper;
+
     private static final byte[] EMERGENCY_SIGNOFF = {'*',' ', 'B', 'Y', 'E', ' ', 
         'S', 'e', 'r', 'v', 'e', 'r', ' ', 'f', 'a', 'u', 'l', 't', '\r', '\n'};
 
@@ -94,8 +96,8 @@
     /**
      * @see ConnectionHandler#handleConnection(Socket)
      */
-    protected void handleProtocol() throws IOException {
-            final OutputStreamImapResponseWriter writer = new OutputStreamImapResponseWriter( outs );
+    public void handleProtocol() throws IOException {
+            final OutputStreamImapResponseWriter writer = new OutputStreamImapResponseWriter( helper.getOutputStream() );
             ImapResponseComposer response = new ImapResponseComposerImpl( writer);
 
             // Write welcome message
@@ -104,21 +106,22 @@
                     + theConfigData.getHelloName() + " is ready.");
 
             session = new ImapSessionImpl();
-            setupLogger(session);
+            
+            ContainerUtil.enableLogging(session, getLogger());
 
-            theWatchdog.start();
+            helper.getWatchdog().start();
             while ( handleRequest() ) {
-                theWatchdog.reset();
+                helper.getWatchdog().reset();
             }
-            theWatchdog.stop();
+            helper.getWatchdog().stop();
             
             getLogger().info(
-                    "Connection from " + remoteHost + " (" + remoteIP
+                    "Connection from " + helper.getRemoteHost() + " (" + helper.getRemoteIP()
                             + ") closed.");
     }
 
     private boolean handleRequest() {
-        final boolean result = requestHandler.handleRequest( in, outs, session );
+        final boolean result = requestHandler.handleRequest( helper.getInputStream(), helper.getOutputStream(), session );
         return result;
     }
     
@@ -127,18 +130,22 @@
      *  
      * @param e the RuntimeException
      */
-    protected void errorHandler(RuntimeException e) {
+    public void errorHandler(RuntimeException e) {
         try {
-            outs.write(EMERGENCY_SIGNOFF);
+            helper.getOutputStream().write(EMERGENCY_SIGNOFF);
         } catch (Throwable t) {
             getLogger().debug("Write emergency signoff failed.", t);
         }
-        super.errorHandler(e);
+        helper.defaultErrorHandler(e);
+    }
+    
+    public Logger getLogger() {
+        return helper.getAvalonLogger();
     }
 
-    public void enableLogging(Logger logger) {
-        super.enableLogging(logger);
-        setupLogger(requestHandler);
+    public void setProtocolHandlerHelper(ProtocolHandlerHelper phh) {
+        this.helper = phh;
     }
+
 }
 

Modified: james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapServer.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapServer.java (original)
+++ james/server/trunk/phoenix-deployment/src/java/org/apache/james/experimental/imapserver/ImapServer.java Mon Aug 25 02:48:29 2008
@@ -21,7 +21,6 @@
 
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.avalon.framework.logger.Logger;
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.james.api.imap.process.ImapProcessor;
@@ -32,6 +31,7 @@
 import org.apache.james.imapserver.codec.encode.ImapEncoderFactory;
 import org.apache.james.services.MailServer;
 import org.apache.james.socket.AbstractJamesService;
+import org.apache.james.socket.ProtocolHandler;
 
 /**
  * TODO: this is a quick cut-and-paste hack from POP3Server. Should probably be
@@ -114,21 +114,11 @@
      * Producing handlers.
      * @see org.apache.avalon.excalibur.pool.ObjectFactory#newInstance()
      */
-    public Object newInstance() throws Exception
+    public ProtocolHandler newProtocolHandlerInstance()
     {
         final ImapHandler imapHandler = new ImapHandler(); 
-        final Logger logger = getLogger(); 
-        logger.debug("Create handler instance"); 
-        setupLogger(imapHandler); 
-        return imapHandler; 
-    }
-
-    /**
-     * @see org.apache.avalon.excalibur.pool.ObjectFactory#getCreatedClass()
-     */
-    public Class getCreatedClass()
-    {
-        return ImapHandler.class;
+        getLogger().debug("Create handler instance");
+        return imapHandler;
     }
 
     /**

Modified: james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Handler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Handler.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Handler.java (original)
+++ james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Handler.java Mon Aug 25 02:48:29 2008
@@ -25,8 +25,9 @@
 import org.apache.james.Constants;
 import org.apache.james.core.MailImpl;
 import org.apache.james.services.MailRepository;
-import org.apache.james.socket.AbstractJamesHandler;
 import org.apache.james.socket.CRLFTerminatedReader;
+import org.apache.james.socket.ProtocolHandler;
+import org.apache.james.socket.ProtocolHandlerHelper;
 import org.apache.james.util.watchdog.Watchdog;
 import org.apache.mailet.Mail;
 
@@ -42,9 +43,10 @@
  * The handler class for POP3 connections.
  *
  */
-public class POP3Handler
-    extends AbstractJamesHandler implements POP3Session {
+public class POP3Handler implements POP3Session, ProtocolHandler {
 
+    private ProtocolHandlerHelper helper;
+    
     private final static byte COMMAND_MODE = 1;
     private final static byte RESPONSE_MODE = 2;
 
@@ -169,7 +171,7 @@
     /**
      * @see org.apache.james.socket.AbstractJamesHandler#handleProtocol()
      */
-    protected void handleProtocol() throws IOException {
+    public void handleProtocol() throws IOException {
         handlerState = AUTHENTICATION_READY;
         authenticatedUser = "unknown";
 
@@ -185,7 +187,7 @@
                     .append(POP3Handler.softwaretype)
                     .append(") ready ");
         String responseString = clearResponseBuffer();
-        writeLoggedFlushedResponse(responseString);
+        helper.writeLoggedFlushedResponse(responseString);
 
         //Session started - RUN all connect handlers
         List connectHandlers = handlerChain.getConnectHandlers();
@@ -200,7 +202,7 @@
         }
 
         
-        theWatchdog.start();
+        helper.getWatchdog().start();
         while(!sessionEnded) {
           //Reset the current command values
           curCommandName = null;
@@ -221,12 +223,12 @@
           }
           curCommandName = curCommandName.toUpperCase(Locale.US);
 
-          if (getLogger().isDebugEnabled()) {
+          if (helper.getAvalonLogger().isDebugEnabled()) {
               // Don't display password in logger
               if (!curCommandName.equals("PASS")) {
-                  getLogger().debug("Command received: " + cmdString);
+                  helper.getAvalonLogger().debug("Command received: " + cmdString);
               } else {
-                  getLogger().debug("Command received: PASS <password omitted>");
+                  helper.getAvalonLogger().debug("Command received: PASS <password omitted>");
               }
           }
 
@@ -239,7 +241,7 @@
               int count = commandHandlers.size();
               for(int i = 0; i < count; i++) {
                   ((CommandHandler)commandHandlers.get(i)).onCommand(this);
-                  theWatchdog.reset();
+                  helper.getWatchdog().reset();
                   //if the response is received, stop processing of command handlers
                   if(mode != COMMAND_MODE) {
                       break;
@@ -248,29 +250,29 @@
 
           }
         }
-        theWatchdog.stop();
-        if (getLogger().isInfoEnabled()) {
+        helper.getWatchdog().stop();
+        if (helper.getAvalonLogger().isInfoEnabled()) {
             StringBuffer logBuffer =
                 new StringBuffer(128)
                     .append("Connection for ")
                     .append(getUser())
                     .append(" from ")
-                    .append(remoteHost)
+                    .append(helper.getRemoteHost())
                     .append(" (")
-                    .append(remoteIP)
+                    .append(helper.getRemoteIP())
                     .append(") closed.");
-            getLogger().info(logBuffer.toString());
+            helper.getAvalonLogger().info(logBuffer.toString());
         }
     }
     
     /**
      * @see org.apache.james.socket.AbstractJamesHandler#errorHandler(java.lang.RuntimeException)
      */
-    protected void errorHandler(RuntimeException e) {
-        super.errorHandler(e);
+    public void errorHandler(RuntimeException e) {
+        helper.defaultErrorHandler(e);
         try {
-            out.println(ERR_RESPONSE + " Error closing connection.");
-            out.flush();
+            helper.getOutputWriter().println(ERR_RESPONSE + " Error closing connection.");
+            helper.getOutputWriter().flush();
         } catch (Throwable t) {
             
         }
@@ -279,7 +281,7 @@
     /**
      * Resets the handler data to a basic state.
      */
-    protected void resetHandler() {
+    public void resetHandler() {
         // Clear user data
         authenticatedUser = null;
         userInbox = null;
@@ -313,13 +315,13 @@
      */
     public final String readCommandLine() throws IOException {
         for (;;) try {
-            String commandLine = inReader.readLine();
+            String commandLine = helper.getInputReader().readLine();
             if (commandLine != null) {
                 commandLine = commandLine.trim();
             }
             return commandLine;
         } catch (CRLFTerminatedReader.TerminationException te) {
-            writeLoggedFlushedResponse("-ERR Syntax error at character position " + te.position() + ". CR and LF must be CRLF paired.  See RFC 1939 #3.");
+            helper.writeLoggedFlushedResponse("-ERR Syntax error at character position " + te.position() + ". CR and LF must be CRLF paired.  See RFC 1939 #3.");
         }
     }
 
@@ -336,14 +338,14 @@
      * @see org.apache.james.pop3server.POP3Session#getRemoteHost()
      */
     public String getRemoteHost() {
-        return remoteHost;
+        return helper.getRemoteHost();
     }
 
     /**
      * @see org.apache.james.pop3server.POP3Session#getRemoteIPAddress()
      */
     public String getRemoteIPAddress() {
-        return remoteIP;
+        return helper.getRemoteIP();
     }
 
     /**
@@ -408,7 +410,7 @@
      * @see org.apache.james.pop3server.POP3Session#getWatchdog()
      */
     public Watchdog getWatchdog() {
-        return theWatchdog;
+        return helper.getWatchdog();
     }
 
     /**
@@ -424,7 +426,7 @@
      * @see org.apache.james.pop3server.POP3Session#writeResponse(java.lang.String)
      */
     public void writeResponse(String respString) {
-        writeLoggedFlushedResponse(respString);
+        helper.writeLoggedFlushedResponse(respString);
         //TODO Explain this well
         if(mode == COMMAND_MODE) {
             mode = RESPONSE_MODE;
@@ -513,7 +515,14 @@
      * @see org.apache.james.pop3server.POP3Session#getOutputStream()
      */
     public OutputStream getOutputStream() {
-        return outs;
+        return helper.getOutputStream();
+    }
+
+    /**
+     * @see org.apache.james.socket.ProtocolHandler#setProtocolHandlerHelper(org.apache.james.socket.ProtocolHandlerHelper)
+     */
+    public void setProtocolHandlerHelper(ProtocolHandlerHelper phh) {
+        this.helper = phh;
     }
 
 }

Modified: james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Server.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Server.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Server.java (original)
+++ james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Server.java Mon Aug 25 02:48:29 2008
@@ -29,6 +29,7 @@
 import org.apache.james.api.user.UsersRepository;
 import org.apache.james.services.MailServer;
 import org.apache.james.socket.AbstractJamesService;
+import org.apache.james.socket.ProtocolHandler;
 
 /**
  * <p>Accepts POP3 connections on a server socket and dispatches them to POP3Handlers.</p>
@@ -136,25 +137,16 @@
 
 
     /**
-     * @see org.apache.avalon.excalibur.pool.ObjectFactory#newInstance()
+     * @see org.apache.james.socket.AbstractJamesService#newProtocolHandlerInstance()
      */
-     public Object newInstance() throws Exception {
-        POP3Handler theHandler = new POP3Handler();
-        
+    public ProtocolHandler newProtocolHandlerInstance() {
+        POP3Handler protocolHandler = new POP3Handler();
         //pass the handler chain to every POP3handler
-        theHandler.setHandlerChain(handlerChain);
-
-        return theHandler;
+        protocolHandler.setHandlerChain(handlerChain);
+        return protocolHandler;
     }
 
     /**
-     * @see org.apache.avalon.excalibur.pool.ObjectFactory#getCreatedClass()
-     */
-     public Class getCreatedClass() {
-         return POP3Handler.class;
-     }
-
-    /**
      * A class to provide POP3 handler configuration to the handlers
      */
     private class POP3HandlerConfigurationDataImpl

Modified: james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/RemoteManager.java
URL: http://svn.apache.org/viewvc/james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/RemoteManager.java?rev=688688&r1=688687&r2=688688&view=diff
==============================================================================
--- james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/RemoteManager.java (original)
+++ james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/RemoteManager.java Mon Aug 25 02:48:29 2008
@@ -37,6 +37,7 @@
 import org.apache.james.management.SpoolManagementService;
 import org.apache.james.services.MailServer;
 import org.apache.james.socket.AbstractJamesService;
+import org.apache.james.socket.ProtocolHandler;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -287,18 +288,11 @@
     }
     
     /**
-     * @see org.apache.avalon.excalibur.pool.ObjectFactory#newInstance()
+     * @see org.apache.james.socket.AbstractJamesService#newProtocolHandlerInstance()
      */
-    public Object newInstance() throws Exception {
+    public ProtocolHandler newProtocolHandlerInstance() {
         return new RemoteManagerHandler();
     }
-    
-    /**
-    * @see org.apache.avalon.excalibur.pool.ObjectFactory#getCreatedClass()
-    */
-    public Class getCreatedClass() {
-        return RemoteManagerHandler.class;
-    }
 
     /**
      * A class to provide RemoteManager handler configuration to the handlers



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org