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 rd...@apache.org on 2008/09/16 21:38:48 UTC
svn commit: r696024 - in /james/server/trunk/imapserver-function/src:
main/java/org/apache/james/experimental/imapserver/
main/java/org/apache/james/imapserver/
main/java/org/apache/james/imapserver/phoenix/
main/java/org/apache/james/mailboxmanager/im...
Author: rdonkin
Date: Tue Sep 16 12:38:47 2008
New Revision: 696024
URL: http://svn.apache.org/viewvc?rev=696024&view=rev
Log:
Rationalise avalon bindings
Added:
james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/DefaultImapFactory.java
james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/DefaultMailboxManager.java (contents, props changed)
- copied, changed from r695593, james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManagerFactory.java
Removed:
james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/phoenix/PhoenixImapProcessorFactory.java
james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManagerFactory.java
james/server/trunk/imapserver-function/src/main/resources/org/apache/james/experimental/imapserver/DefaultImapDecoderFactory.xinfo
james/server/trunk/imapserver-function/src/main/resources/org/apache/james/imapserver/codec/encode/main/DefaultImapEncoderFactory.xinfo
Modified:
james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapHandler.java
james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapServer.java
james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/impl/DefaultMailboxManagerProvider.java
james/server/trunk/imapserver-function/src/test/java/org/apache/james/user/impl/file/FileUserMetaDataRepositoryTest.java
Modified: james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapHandler.java?rev=696024&r1=696023&r2=696024&view=diff
==============================================================================
--- james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapHandler.java (original)
+++ james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapHandler.java Tue Sep 16 12:38:47 2008
@@ -19,28 +19,23 @@
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.framework.container.ContainerUtil;
import org.apache.avalon.framework.logger.Logger;
-import org.apache.james.Constants;
-import org.apache.james.api.imap.ImapConstants;
-import org.apache.james.api.imap.process.ImapProcessor;
import org.apache.james.api.imap.process.ImapSession;
import org.apache.james.experimental.imapserver.encode.writer.OutputStreamImapResponseWriter;
-import org.apache.james.imapserver.codec.decode.ImapDecoder;
-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.ProtocolHandler;
import org.apache.james.socket.ProtocolHandlerHelper;
-import java.io.IOException;
-import java.net.Socket;
-
/**
* Handles IMAP connections.
*/
-public class ImapHandler implements ProtocolHandler, ImapConstants
+public class ImapHandler implements ProtocolHandler
{
private ProtocolHandlerHelper helper;
@@ -48,32 +43,19 @@
private static final byte[] EMERGENCY_SIGNOFF = {'*',' ', 'B', 'Y', 'E', ' ',
'S', 'e', 'r', 'v', 'e', 'r', ' ', 'f', 'a', 'u', 'l', 't', '\r', '\n'};
- // TODO: inject dependency
- private String softwaretype = "JAMES "+VERSION+" Server " + Constants.SOFTWARE_VERSION;
- private ImapRequestHandler requestHandler;
+ private final String hello;
+ private final ImapRequestHandler requestHandler;
private ImapSession session;
- /**
- * The per-service configuration data that applies to all handlers
- */
- private ImapHandlerConfigurationData theConfigData;
-
- /**
- * Set the configuration data for the handler.
- *
- * @param theData the configuration data
- */
+ public ImapHandler(final ImapRequestHandler requestHandler, final String hello) {
+ super();
+ this.requestHandler = requestHandler;
+ this.hello = hello;
+ }
+
+ // TODO: this shouldn't be necessary
public void setConfigurationData( Object theData )
{
- if (theData instanceof ImapHandlerConfigurationData) {
- theConfigData = (ImapHandlerConfigurationData) theData;
- final ImapEncoder imapEncoder = theConfigData.getImapEncoder();
- final ImapProcessor imapProcessor = theConfigData.getImapProcessor();
- final ImapDecoder imapDecoder = theConfigData.getImapDecoder();
- requestHandler = new ImapRequestHandler(imapDecoder, imapProcessor, imapEncoder);
- } else {
- throw new IllegalArgumentException("Configuration object does not implement POP3HandlerConfigurationData");
- }
}
/**
@@ -102,8 +84,7 @@
// Write welcome message
- response.okResponse(null, softwaretype + " Server "
- + theConfigData.getHelloName() + " is ready.");
+ response.okResponse(null, hello);
session = new ImapSessionImpl();
Modified: james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapServer.java?rev=696024&r1=696023&r2=696024&view=diff
==============================================================================
--- james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapServer.java (original)
+++ james/server/trunk/imapserver-function/src/main/java/org/apache/james/experimental/imapserver/ImapServer.java Tue Sep 16 12:38:47 2008
@@ -23,13 +23,11 @@
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.james.api.imap.process.ImapProcessor;
-import org.apache.james.api.imap.process.ImapProcessorFactory;
-import org.apache.james.imapserver.codec.decode.ImapDecoder;
-import org.apache.james.imapserver.codec.decode.ImapDecoderFactory;
-import org.apache.james.imapserver.codec.encode.ImapEncoder;
-import org.apache.james.imapserver.codec.encode.ImapEncoderFactory;
-import org.apache.james.services.MailServer;
+import org.apache.james.Constants;
+import org.apache.james.api.imap.ImapConstants;
+import org.apache.james.api.user.UsersRepository;
+import org.apache.james.imapserver.DefaultImapFactory;
+import org.apache.james.services.FileSystem;
import org.apache.james.socket.AbstractJamesService;
import org.apache.james.socket.ProtocolHandler;
@@ -41,57 +39,35 @@
*
* <p>Also responsible for loading and parsing IMAP specific configuration.</p>
*/
-public class ImapServer extends AbstractJamesService
+public class ImapServer extends AbstractJamesService implements ImapConstants
{
- /**
- * The number of bytes to read before resetting
- * the connection timeout timer. Defaults to
- * 20 KB.
- */
- private int lengthReset = 20 * 1024;
-
- /**
- * The configuration data to be passed to the handler
- */
- private ImapHandlerConfigurationDataImpl theConfigData = new ImapHandlerConfigurationDataImpl();
+ private static final String softwaretype = "JAMES "+VERSION+" Server " + Constants.SOFTWARE_VERSION;
+
+ private DefaultImapFactory factory;
+
+ private String hello = softwaretype;
- private MailServer mailServer;
- private ImapDecoderFactory decoderFactory;
- private ImapEncoderFactory encoderFactory;
- private ImapProcessorFactory processorFactory;
+ public ImapServer()
+ {
+ }
- private ImapProcessor imapProcessor;
- private ImapDecoder imapDecoder;
- private ImapEncoder imapEncoder;
- public void service( ServiceManager serviceManager ) throws ServiceException
- {
- super.service( serviceManager );
- setMailServer((MailServer) serviceManager.lookup(MailServer.ROLE));
- processorFactory = (ImapProcessorFactory) serviceManager.lookup(ImapProcessorFactory.class.getName());
- decoderFactory = (ImapDecoderFactory) serviceManager.lookup(ImapDecoderFactory.class.getName());
- encoderFactory = (ImapEncoderFactory) serviceManager.lookup(ImapEncoderFactory.class.getName());
+
+ public void service(ServiceManager comp) throws ServiceException {
+ super.service(comp);
+ factory = new DefaultImapFactory((FileSystem) comp.lookup(FileSystem.ROLE),
+ (UsersRepository) comp.lookup(UsersRepository.ROLE), getLogger());
}
- void setMailServer(MailServer mailServer) {
- this.mailServer = mailServer;
- }
-
+
+
/**
* @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
*/
public void configure( final Configuration configuration ) throws ConfigurationException
{
super.configure( configuration );
- if ( isEnabled() ) {
- Configuration handlerConfiguration = configuration.getChild( "handler" );
- lengthReset = handlerConfiguration.getChild( "lengthReset" ).getValueAsInteger( lengthReset );
- getLogger().info( "The idle timeout will be reset every " + lengthReset + " bytes." );
-
- imapProcessor = processorFactory.buildImapProcessor();
- imapDecoder = decoderFactory.buildImapDecoder();
- imapEncoder = encoderFactory.buildImapEncoder();
- }
+ hello = softwaretype + " Server " + helloName + " is ready.";
}
/**
@@ -116,52 +92,14 @@
*/
public ProtocolHandler newProtocolHandlerInstance()
{
- final ImapHandler imapHandler = new ImapHandler();
+ final ImapRequestHandler handler = factory.createHandler();
+ final ImapHandler imapHandler = new ImapHandler(handler, hello);
getLogger().debug("Create handler instance");
return imapHandler;
}
- /**
- * Provides configuration to the handlers.
- */
- private class ImapHandlerConfigurationDataImpl implements ImapHandlerConfigurationData
- {
-
- /**
- * @see ImapHandlerConfigurationData#getHelloName()
- */
- public String getHelloName()
- {
- if (ImapServer.this.helloName == null) {
- return ImapServer.this.mailServer.getHelloName();
- } else {
- return ImapServer.this.helloName;
- }
- }
-
- /**
- * @see ImapHandlerConfigurationData#getResetLength()
- */
- public int getResetLength()
- {
- return ImapServer.this.lengthReset;
- }
-
- public ImapDecoder getImapDecoder() {
- return imapDecoder;
- }
-
- public ImapEncoder getImapEncoder() {
- return imapEncoder;
- }
-
- public ImapProcessor getImapProcessor() {
- return imapProcessor;
- }
- }
-
+ // TODO:
protected Object getConfigurationData() {
- return theConfigData;
+ return null;
}
-
}
Added: james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/DefaultImapFactory.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/DefaultImapFactory.java?rev=696024&view=auto
==============================================================================
--- james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/DefaultImapFactory.java (added)
+++ james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/DefaultImapFactory.java Tue Sep 16 12:38:47 2008
@@ -0,0 +1,60 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imapserver;
+
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.api.imap.process.ImapProcessor;
+import org.apache.james.api.user.UsersRepository;
+import org.apache.james.experimental.imapserver.DefaultImapDecoderFactory;
+import org.apache.james.experimental.imapserver.ImapRequestHandler;
+import org.apache.james.imapserver.codec.decode.ImapDecoder;
+import org.apache.james.imapserver.codec.encode.ImapEncoder;
+import org.apache.james.imapserver.codec.encode.main.DefaultImapEncoderFactory;
+import org.apache.james.imapserver.processor.main.DefaultImapProcessorFactory;
+import org.apache.james.mailboxmanager.impl.DefaultMailboxManagerProvider;
+import org.apache.james.mailboxmanager.torque.DefaultMailboxManager;
+import org.apache.james.mailboxmanager.torque.DefaultUserManager;
+import org.apache.james.services.FileSystem;
+import org.apache.james.user.impl.file.FileUserMetaDataRepository;
+
+public class DefaultImapFactory {
+
+ private final ImapEncoder encoder;
+ private final ImapDecoder decoder;
+ private final ImapProcessor processor;
+
+ public DefaultImapFactory(FileSystem fileSystem, UsersRepository users, Logger logger) {
+ super();
+ decoder = new DefaultImapDecoderFactory().buildImapDecoder();
+ encoder = new DefaultImapEncoderFactory().buildImapEncoder();
+ processor = DefaultImapProcessorFactory.createDefaultProcessor(
+ new DefaultMailboxManagerProvider(
+ new DefaultMailboxManager(new DefaultUserManager(
+ new FileUserMetaDataRepository("var/users"), users), fileSystem, logger)));
+ }
+
+
+
+ public ImapRequestHandler createHandler()
+ {
+ return new ImapRequestHandler(decoder, processor, encoder);
+ }
+}
Modified: james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/impl/DefaultMailboxManagerProvider.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/impl/DefaultMailboxManagerProvider.java?rev=696024&r1=696023&r2=696024&view=diff
==============================================================================
--- james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/impl/DefaultMailboxManagerProvider.java (original)
+++ james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/impl/DefaultMailboxManagerProvider.java Tue Sep 16 12:38:47 2008
@@ -19,68 +19,21 @@
package org.apache.james.mailboxmanager.impl;
-import org.apache.avalon.framework.activity.Initializable;
-import org.apache.avalon.framework.configuration.Configurable;
-import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.avalon.framework.container.ContainerUtil;
-import org.apache.avalon.framework.logger.AbstractLogEnabled;
-import org.apache.avalon.framework.service.ServiceException;
-import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.avalon.framework.service.Serviceable;
import org.apache.james.mailboxmanager.MailboxManagerException;
import org.apache.james.mailboxmanager.manager.MailboxManager;
import org.apache.james.mailboxmanager.manager.MailboxManagerProvider;
-public class DefaultMailboxManagerProvider extends AbstractLogEnabled implements MailboxManagerProvider, Configurable, Serviceable, Initializable {
+public class DefaultMailboxManagerProvider implements MailboxManagerProvider {
- public static final char HIERARCHY_DELIMITER = '.';
-
- public static final String USER_NAMESPACE = "#mail";
-
- public static final String INBOX = "INBOX";
-
- private MailboxManager mailboxManager;
-
- private ServiceManager serviceManager;
-
- public MailboxManager getMailboxManager()
- throws MailboxManagerException {
- return mailboxManager;
- }
-
- public void configure(Configuration conf) throws ConfigurationException {
- Configuration factoryConf=conf.getChild("factory",false);
- String className=factoryConf.getAttribute("class");
- MailboxManager factory= (MailboxManager) getClassInstace(className);
- ContainerUtil.enableLogging(factory, getLogger());
- ContainerUtil.configure(factory, factoryConf);
- setMailboxManagerInstance(factory);
- }
+ private final MailboxManager mailboxManager;
- public void setMailboxManagerInstance(MailboxManager mailboxManager) {
+ public DefaultMailboxManagerProvider(final MailboxManager mailboxManager) {
+ super();
this.mailboxManager = mailboxManager;
}
- private static Object getClassInstace(String name) {
- Object object=null;
- try {
- Class clazz = Thread.currentThread().getContextClassLoader().loadClass(name);
- object=clazz.newInstance();
- return object;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- }
-
- public void service(ServiceManager serviceManager) throws ServiceException {
- this.serviceManager=serviceManager;
-
- }
-
- public void initialize() throws Exception {
- ContainerUtil.service(mailboxManager, serviceManager);
- ContainerUtil.initialize(mailboxManager);
+ public MailboxManager getMailboxManager()
+ throws MailboxManagerException {
+ return mailboxManager;
}
}
Copied: james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/DefaultMailboxManager.java (from r695593, james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManagerFactory.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/DefaultMailboxManager.java?p2=james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/DefaultMailboxManager.java&p1=james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManagerFactory.java&r1=695593&r2=696024&rev=696024&view=diff
==============================================================================
--- james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManagerFactory.java (original)
+++ james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/DefaultMailboxManager.java Tue Sep 16 12:38:47 2008
@@ -27,22 +27,12 @@
import java.util.HashMap;
import java.util.Locale;
-import org.apache.avalon.framework.activity.Initializable;
-import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.avalon.framework.logger.LogEnabled;
import org.apache.avalon.framework.logger.Logger;
-import org.apache.avalon.framework.service.ServiceException;
-import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.avalon.framework.service.Serviceable;
import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.logging.impl.AvalonLogger;
-import org.apache.james.api.user.UserMetaDataRespository;
-import org.apache.james.api.user.UsersRepository;
import org.apache.james.mailboxmanager.MailboxManagerException;
-import org.apache.james.mailboxmanager.manager.MailboxManager;
-import org.apache.james.mailboxmanager.manager.MailboxManagerProvider;
import org.apache.james.mailboxmanager.torque.om.MailboxRowPeer;
import org.apache.james.mailboxmanager.torque.om.MessageBodyPeer;
import org.apache.james.mailboxmanager.torque.om.MessageFlagsPeer;
@@ -55,24 +45,26 @@
import org.apache.torque.util.BasePeer;
import org.apache.torque.util.Transaction;
-public class TorqueMailboxManagerFactory extends TorqueMailboxManager implements MailboxManager,
- Configurable, Initializable, Serviceable, LogEnabled {
-
- public TorqueMailboxManagerFactory(UserManager userManager) {
- super(userManager);
- }
+public class DefaultMailboxManager extends TorqueMailboxManager {
+ private static final String[] tableNames = new String[] {
+ MailboxRowPeer.TABLE_NAME, MessageRowPeer.TABLE_NAME,
+ MessageHeaderPeer.TABLE_NAME, MessageBodyPeer.TABLE_NAME,
+ MessageFlagsPeer.TABLE_NAME };
+
private BaseConfiguration torqueConf;
private boolean initialized;
- private FileSystem fileSystem;
+ private final FileSystem fileSystem;
private String configFile;
+
+ public DefaultMailboxManager(UserManager userManager, FileSystem fileSystem, Logger logger) {
+ super(userManager);
+ this.fileSystem = fileSystem;
+ log = new AvalonLogger(logger);
+ }
- private static final String[] tableNames = new String[] {
- MailboxRowPeer.TABLE_NAME, MessageRowPeer.TABLE_NAME,
- MessageHeaderPeer.TABLE_NAME, MessageBodyPeer.TABLE_NAME,
- MessageFlagsPeer.TABLE_NAME };
public void initialize() throws Exception {
if (!initialized) {
@@ -89,7 +81,7 @@
SqlResources sqlResources = new SqlResources();
sqlResources.init(fileSystem
.getResource(configFile),
- TorqueMailboxManagerFactory.class.getName(), conn,
+ DefaultMailboxManager.class.getName(), conn,
new HashMap());
DatabaseMetaData dbMetaData = conn.getMetaData();
@@ -189,29 +181,4 @@
}
}
}
-
- public boolean isInitialized() {
- return initialized;
- }
-
- public String toString() {
- return "TorqueMailboxManagerFactory";
- }
-
- public void enableLogging(Logger logger) {
- log = new AvalonLogger(logger);
-
- }
-
- public void service(ServiceManager serviceManager) throws ServiceException {
- setFileSystem((FileSystem) serviceManager.lookup(FileSystem.ROLE));
-// UsersRepository usersRepository = ( UsersRepository ) serviceManager.
-// lookup( UsersRepository.ROLE );
-// UserMetaDataRespository userMetaDataRepository =
-// (UserMetaDataRespository) serviceManager.lookup( UserMetaDataRespository.ROLE );
- }
-
- protected void setFileSystem(FileSystem system) {
- this.fileSystem = system;
- }
}
Propchange: james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/DefaultMailboxManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: james/server/trunk/imapserver-function/src/main/java/org/apache/james/mailboxmanager/torque/DefaultMailboxManager.java
------------------------------------------------------------------------------
svn:mergeinfo =
Modified: james/server/trunk/imapserver-function/src/test/java/org/apache/james/user/impl/file/FileUserMetaDataRepositoryTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver-function/src/test/java/org/apache/james/user/impl/file/FileUserMetaDataRepositoryTest.java?rev=696024&r1=696023&r2=696024&view=diff
==============================================================================
--- james/server/trunk/imapserver-function/src/test/java/org/apache/james/user/impl/file/FileUserMetaDataRepositoryTest.java (original)
+++ james/server/trunk/imapserver-function/src/test/java/org/apache/james/user/impl/file/FileUserMetaDataRepositoryTest.java Tue Sep 16 12:38:47 2008
@@ -21,10 +21,10 @@
import java.io.File;
-import org.apache.commons.io.FileUtils;
-
import junit.framework.TestCase;
+import org.apache.commons.io.FileUtils;
+
public class FileUserMetaDataRepositoryTest extends TestCase {
private static final String SYMBOLIC_KEY = "\\/><'@~ #][}{()=+.,| !`%$3\" exit(0)";
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org