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 do...@apache.org on 2001/03/07 04:37:15 UTC

cvs commit: jakarta-james/src/org/apache/james/imapserver IMAPServer.java SingleThreadedConnectionHandler.java ConnectionHandler.java

donaldp     01/03/06 19:37:15

  Modified:    src/org/apache/james James.java
               src/org/apache/james/imapserver IMAPServer.java
                        SingleThreadedConnectionHandler.java
  Removed:     src/org/apache/james/imapserver ConnectionHandler.java
  Log:
  Updated IMAP to use non-deprecated blocks.
  
  Revision  Changes    Path
  1.27      +16 -18    jakarta-james/src/org/apache/james/James.java
  
  Index: James.java
  ===================================================================
  RCS file: /home/cvs/jakarta-james/src/org/apache/james/James.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- James.java	2001/03/05 15:42:15	1.26
  +++ James.java	2001/03/07 03:37:11	1.27
  @@ -1,19 +1,27 @@
  -/*****************************************************************************
  - * Copyright (C) The Apache Software Foundation. All rights reserved.        *
  - * ------------------------------------------------------------------------- *
  - * This software is published under the terms of the Apache Software License *
  - * version 1.1, a copy of which has been included  with this distribution in *
  - * the LICENSE file.                                                         *
  - *****************************************************************************/
  -
  +/*
  + * Copyright (C) The Apache Software Foundation. All rights reserved.
  + *
  + * This software is published under the terms of the Apache Software License
  + * version 1.1, a copy of which has been included with this distribution in
  + * the LICENSE file.
  + */
   package org.apache.james;
   
  +import java.io.*;
  +import java.net.*;
  +import java.util.*;
  +import javax.mail.Address;
  +import javax.mail.MessagingException;
  +import javax.mail.Session;
  +import javax.mail.internet.*;
  +import org.apache.avalon.AbstractLoggable;
   import org.apache.avalon.Component;
   import org.apache.avalon.ComponentManager;
   import org.apache.avalon.ComponentManagerException;
   import org.apache.avalon.Composer;
   import org.apache.avalon.Context;
   import org.apache.avalon.Contextualizable;
  +import org.apache.avalon.Contextualizable;
   import org.apache.avalon.DefaultComponentManager;
   import org.apache.avalon.DefaultContext;
   import org.apache.avalon.Initializable;
  @@ -21,15 +29,6 @@
   import org.apache.avalon.configuration.Configuration;
   import org.apache.avalon.configuration.ConfigurationException;
   import org.apache.avalon.configuration.DefaultConfiguration;
  -import java.io.*;
  -import java.net.*;
  -import java.util.*;
  -import javax.mail.Address;
  -import javax.mail.MessagingException;
  -import javax.mail.Session;
  -import javax.mail.internet.*;
  -import org.apache.avalon.AbstractLoggable;
  -import org.apache.avalon.Contextualizable;
   import org.apache.avalon.util.thread.ThreadPool;
   import org.apache.james.core.*;
   import org.apache.james.dnsserver.*;
  @@ -636,7 +635,6 @@
        * @param password String plaintext password
        * @returns boolean true if user added succesfully, else false.
        */
  -
       public boolean addUser(String userName, String password) {
           localusers.addUser(userName, password);
           if (useIMAPstorage) {
  
  
  
  1.8       +30 -63    jakarta-james/src/org/apache/james/imapserver/IMAPServer.java
  
  Index: IMAPServer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-james/src/org/apache/james/imapserver/IMAPServer.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- IMAPServer.java	2001/03/06 07:39:07	1.7
  +++ IMAPServer.java	2001/03/07 03:37:13	1.8
  @@ -7,22 +7,14 @@
    */
   package org.apache.james.imapserver;
   
  -import java.net.*;
  -import java.util.Date;
  -import org.apache.avalon.AbstractLoggable;
  -import org.apache.avalon.Component;
  -import org.apache.avalon.ComponentManager;
  -import org.apache.avalon.Composer;
  -import org.apache.avalon.Context;
  -import org.apache.avalon.Contextualizable;
  -import org.apache.avalon.Loggable;
  +import java.net.InetAddress;
  +import java.net.UnknownHostException;
   import org.apache.avalon.configuration.Configurable;
   import org.apache.avalon.configuration.Configuration;
   import org.apache.avalon.configuration.ConfigurationException;
  -import org.apache.avalon.util.lang.*;
  -import org.apache.avalon.util.thread.ThreadPool;
  -import org.apache.cornerstone.services.SocketServer;
  -import org.apache.james.*;
  +import org.apache.cornerstone.services.connection.AbstractService;
  +import org.apache.cornerstone.services.connection.ConnectionHandlerFactory;
  +import org.apache.cornerstone.services.connection.DefaultHandlerFactory;
   
   /**
    * The Server listens on a specified port and passes connections to a
  @@ -34,68 +26,43 @@
    * @author  <a href="mailto:charles@benett1.demon.co.uk">Charles Benett</a>
    */
   public class IMAPServer 
  -    extends AbstractLoggable
  -    implements SocketServer.SocketHandler,  Component, Configurable, Composer, Contextualizable {
  +    extends AbstractService {
   
  -    private Context context;
  -    private Configuration conf;
  -    private ComponentManager compMgr;
  -    private ThreadPool threadPool;
  -
  -    public void configure(Configuration conf) throws ConfigurationException {
  -        this.conf = conf;
  -    }
  -    
  -    public void contextualize(Context context) {
  -        this.context = context;
  -    }
  -    
  -    public void compose(ComponentManager comp) {
  -        compMgr = comp;
  +    protected ConnectionHandlerFactory createFactory()
  +    {
  +        return new DefaultHandlerFactory( SingleThreadedConnectionHandler.class );
       }
   
  -    public void init() throws Exception {
  +    public void configure( final Configuration configuration )
  +        throws ConfigurationException {
   
  -        getLogger().info("IMAPServer init...");
  +        m_port = configuration.getChild( "port" ).getValueAsInt( 143 );
   
  -        threadPool = ThreadManager.getWorkerPool("whateverNameYouFancy");
  -        SocketServer socketServer = (SocketServer) compMgr.lookup("org.apache.cornerstone.services.SocketServer");
  -        int port = conf.getChild("port").getValueAsInt(143);
  -
  -        InetAddress bind = null;
  -        try {
  -            String bindTo = conf.getChild("bind").getValue();
  -            if (bindTo.length() > 0) {
  -                bind = InetAddress.getByName(bindTo);
  +        try 
  +        { 
  +            final String bindAddress = configuration.getChild( "bind" ).getValue( null );
  +            if( null != bindAddress )
  +            {
  +                m_bindTo = InetAddress.getByName( bindAddress ); 
               }
  -        } catch (ConfigurationException e) {
           }
  -
  -        String type = SocketServer.DEFAULT;
  -        try {
  -            if (conf.getChild("useTLS").getValue().equals("TRUE")) type = SocketServer.TLS;
  -        } catch (ConfigurationException e) {
  +        catch( final UnknownHostException unhe ) 
  +        {
  +            throw new ConfigurationException( "Malformed bind parameter", unhe );
           }
  -        getLogger().info("IMAPListener using " + type + " on port " + port);
   
  -        socketServer.openListener("IMAPListener", type, port, bind, this);
  -        getLogger().info("IMAPServer ...init end");
  +        final String useTLS = configuration.getChild("useTLS").getValue( "" );
  +        if( useTLS.equals( "TRUE" ) ) m_serverSocketType = "ssl";
  +
  +        super.configure( configuration.getChild( "pop3handler" ) );
       }
   
  -    public void parseRequest(Socket s) {
  +    public void init() throws Exception {
   
  -        try {
  -            ConnectionHandler handler = new SingleThreadedConnectionHandler();
  -            ((Loggable)handler).setLogger( getLogger() );
  -            handler.configure(conf.getChild("imaphandler"));
  -            handler.contextualize(context);
  -            handler.compose(compMgr);
  -            handler.init();
  -            handler.parseRequest(s);
  -            threadPool.execute((Runnable) handler);
  -        } catch (Exception e) {
  -            getLogger().error("IMAPServer: Cannot parse request on socket " + s + " : " + e.getMessage());
  -        }
  +        getLogger().info( "IMAPServer init..." );
  +        getLogger().info( "IMAPListener using " + m_serverSocketType + " on port " + m_port );
  +        super.init();
  +        getLogger().info("IMAPServer ...init end");
       }
   }
       
  
  
  
  1.9       +57 -54    jakarta-james/src/org/apache/james/imapserver/SingleThreadedConnectionHandler.java
  
  Index: SingleThreadedConnectionHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-james/src/org/apache/james/imapserver/SingleThreadedConnectionHandler.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SingleThreadedConnectionHandler.java	2001/03/06 07:39:14	1.8
  +++ SingleThreadedConnectionHandler.java	2001/03/07 03:37:14	1.9
  @@ -11,24 +11,29 @@
   import java.net.*;
   import java.text.*;
   import java.util.*;
  -import javax.mail.MessagingException;
  -import javax.mail.Session;
   import javax.mail.internet.*;
   import org.apache.avalon.ComponentManager;
  +import org.apache.avalon.ComponentManagerException;
  +import org.apache.avalon.Composer;
   import org.apache.avalon.Context;
  +import org.apache.avalon.Contextualizable;
  +import org.apache.avalon.Initializable;
  +import org.apache.avalon.Stoppable;
  +import org.apache.avalon.configuration.Configurable;
   import org.apache.avalon.configuration.Configuration;
   import org.apache.avalon.configuration.ConfigurationException;
  -import org.apache.cornerstone.services.Scheduler;
  +import org.apache.cornerstone.services.connection.ConnectionHandler;
  +import org.apache.cornerstone.services.scheduler.PeriodicTimeTrigger;
  +import org.apache.cornerstone.services.scheduler.Target;
  +import org.apache.cornerstone.services.scheduler.TimeScheduler;
   import org.apache.james.AccessControlException;
   import org.apache.james.AuthenticationException;
   import org.apache.james.AuthorizationException;
   import org.apache.james.Constants;
  -import org.apache.james.core.EnhancedMimeMessage;
   import org.apache.james.services.*;
   import org.apache.james.util.InternetPrintWriter;
   import org.apache.log.LogKit;
   import org.apache.log.Logger;
  -import org.apache.mailet.Mail;
   
   /**
    * An IMAP Handler handles one IMAP connection. TBC - it may spawn worker
  @@ -41,7 +46,8 @@
    */
   public class SingleThreadedConnectionHandler
       extends BaseCommand
  -    implements ConnectionHandler {
  +    implements ConnectionHandler, Contextualizable, Composer, Configurable, 
  +    Initializable, Stoppable, Target, MailboxEventListener {
   
       //mainly to switch on stack traces and catch responses;  
       private static final boolean DEEP_DEBUG = true;
  @@ -89,14 +95,11 @@
       private static final String NO_NOTLOCAL_MSG
           = "NO Mailbox does not exist on this server";
   
  -    private ComponentManager compMgr;
  -    private Configuration conf;
  -    private Context context;
  -    private Logger securityLogger = LogKit.getLoggerFor("james.Security") ;
  +    private Logger securityLogger = LogKit.getLoggerFor("james.Security");
       private MailServer mailServer;
       private UsersRepository users;
  -    private Scheduler scheduler;
  -    private long timeout;
  +    private TimeScheduler scheduler;
  +    private int timeout;
   
       private Socket socket;
       private BufferedReader in;
  @@ -105,7 +108,7 @@
       private String remoteHost;
       private String remoteIP;
       private String servername;
  -    private String softwaretype;
  +    private String softwaretype  = "JAMES IMAP4rev1 Server " + Constants.SOFTWARE_VERSION;
       private int state;
       private String user;
   
  @@ -127,50 +130,50 @@
       private int exists;
       private int recent;
       private List sequence;
  - 
  -    /**
  -     * Constructor has no parameters to allow Class.forName() stuff.
  -     */
  -    public void configure(Configuration conf) throws ConfigurationException {
  -        this.conf = conf;
  -        timeout = conf.getChild("connectiontimeout").getValueAsLong();
  -    }
   
  -    public void compose(ComponentManager comp) {
  -        compMgr = comp;
  +    public void compose( final ComponentManager componentManager ) 
  +        throws ComponentManagerException {
  +
  +        mailServer = (MailServer)componentManager.
  +            lookup("org.apache.james.services.MailServer");
  +        users = (UsersRepository)componentManager.
  +            lookup("org.apache.james.services.UsersRepository");
  +        scheduler = (TimeScheduler)componentManager.
  +            lookup("org.apache.cornerstone.services.scheduler.TimeScheduler");
  +        imapSystem = (IMAPSystem)componentManager.
  +            lookup("org.apache.james.imapserver.IMAPSystem");
  +        imapHost = (Host)componentManager.
  +            lookup("org.apache.james.imapserver.Host");
  +    }
  + 
  +    public void contextualize( final Context context ) {
  +        servername = (String)context.get( Constants.HELO_NAME );
       }
   
  -    public void contextualize(Context context) {
  -        this.context = context;
  +    public void configure( final Configuration configuration ) 
  +        throws ConfigurationException {
  +        timeout = configuration.getChild( "connectiontimeout" ).getValueAsInt( 1800000 );
       }
   
       public void init() throws Exception {
  -        try {
  -            logger.info("SingleThreadedConnectionHandler starting ...");
  -            this.mailServer = (MailServer)
  -                compMgr.lookup("org.apache.james.services.MailServer");
  -            users = (UsersRepository) compMgr.lookup("org.apache.james.services.UsersRepository");
  -            scheduler = (Scheduler) compMgr.lookup("org.apache.cornerstone.services.Scheduler");
  -            softwaretype = "JAMES IMAP4rev1 Server "
  -                + Constants.SOFTWARE_VERSION;
  -            servername = (String) context.get(Constants.HELO_NAME);
  -            imapSystem = (IMAPSystem)
  -                compMgr.lookup("org.apache.james.imapserver.IMAPSystem");
  -            imapHost = (Host) compMgr.lookup("org.apache.james.imapserver.Host");
  -            namespaceToken = imapSystem.getNamespaceToken();
  -            logger.info("SingleThreadedConnectionHandler initialized");
  -        } catch (Exception e) {
  -            logger.error("Exception initialising SingleThreadedConnectionHandler : " + e);
  -            logger.error("Exception message is: " + e.getMessage());
  -            e.printStackTrace();
  -            throw e;
  -        }
  +        logger.info("SingleThreadedConnectionHandler starting ...");
  +        namespaceToken = imapSystem.getNamespaceToken();
  +        logger.info("SingleThreadedConnectionHandler initialized");
       }
   
  -    public void parseRequest(Socket socket) {
  +    /**
  +     * Handle a connection.
  +     * This handler is responsible for processing connections as they occur.
  +     *
  +     * @param connection the connection
  +     * @exception IOException if an error reading from socket occurs
  +     * @exception ProtocolException if an error handling connection occurs
  +     */
  +    public void handleConnection( final Socket connection ) 
  +        throws IOException {
   
           try {
  -            this.socket = socket;
  +            this.socket = connection;
               in = new BufferedReader(new
                                       InputStreamReader(socket.getInputStream()));
               outs = socket.getOutputStream();
  @@ -182,12 +185,10 @@
                            + remoteIP + "): " + e.getMessage());
           }
           logger.info("Connection from " + remoteHost + " (" + remoteIP + ")");
  -    }
   
  -    public void run() {
  -
           try {
  -            scheduler.setAlarm(this.toString(), new Scheduler.Alarm(timeout), this);
  +            final PeriodicTimeTrigger trigger = new PeriodicTimeTrigger( timeout, -1 );
  +            scheduler.addTrigger( this.toString(), trigger, this );
              
               if (false) { // arbitrary rejection of connection
                   // could screen connections by IP or host or implement
  @@ -215,7 +216,7 @@
                                           + ") received by SingleThreadedConnectionHandler");
                   }
                   while (parseCommand(in.readLine())) {
  -                    scheduler.resetAlarm(this.toString());
  +                    scheduler.resetTrigger(this.toString());
                   }
               }
   
  @@ -233,9 +234,11 @@
               connectionClosed = closeConnection(UNTAGGED_BYE,
                                                  "Error processing command.", "");
           }
  +
  +        scheduler.removeTrigger(this.toString());
       }
   
  -    public void wake( String name, Scheduler.Event event ) {
  +    public void targetTriggered( final String triggerName ) {
           logger.info("Connection timeout on socket");
           connectionClosed = closeConnection(UNTAGGED_BYE,
                                              "Autologout. Idle too long.", "");
  @@ -244,7 +247,7 @@
       private boolean closeConnection( int exitStatus, 
                                        String message1,
                                        String message2 ) {
  -        scheduler.removeAlarm(this.toString());
  +        scheduler.removeTrigger(this.toString());
           if (state == SELECTED) {
               currentMailbox.removeMailboxEventListener(this);
               imapHost.releaseMailbox(user, currentMailbox);