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/11/29 18:12:56 UTC
svn commit: r721691 - in /james/protocol-tester/trunk/antlib: ./
src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/james/ src/main/java/org/apache/james/mpt/
src/main/java/org/apache/james/mpt/ant/ src/main/resources/ src/main/resou...
Author: rdonkin
Date: Sat Nov 29 09:12:55 2008
New Revision: 721691
URL: http://svn.apache.org/viewvc?rev=721691&view=rev
Log:
Outline ant task
Added:
james/protocol-tester/trunk/antlib/src/main/java/org/
james/protocol-tester/trunk/antlib/src/main/java/org/apache/
james/protocol-tester/trunk/antlib/src/main/java/org/apache/james/
james/protocol-tester/trunk/antlib/src/main/java/org/apache/james/mpt/
james/protocol-tester/trunk/antlib/src/main/java/org/apache/james/mpt/ant/
james/protocol-tester/trunk/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java (with props)
james/protocol-tester/trunk/antlib/src/main/resources/
james/protocol-tester/trunk/antlib/src/main/resources/org/
james/protocol-tester/trunk/antlib/src/main/resources/org/apache/
james/protocol-tester/trunk/antlib/src/main/resources/org/apache/james/
james/protocol-tester/trunk/antlib/src/main/resources/org/apache/james/mpt/
james/protocol-tester/trunk/antlib/src/main/resources/org/apache/james/mpt/ant/
james/protocol-tester/trunk/antlib/src/main/resources/org/apache/james/mpt/ant/antlib.xml (with props)
james/protocol-tester/trunk/antlib/src/site/
james/protocol-tester/trunk/antlib/src/site/resources/
james/protocol-tester/trunk/antlib/src/site/resources/images/
james/protocol-tester/trunk/antlib/src/site/site.xml (contents, props changed)
- copied, changed from r721659, james/protocol-tester/trunk/main/src/site/site.xml
james/protocol-tester/trunk/antlib/src/site/xdoc/
james/protocol-tester/trunk/antlib/src/site/xdoc/index.xml (contents, props changed)
- copied, changed from r721673, james/protocol-tester/trunk/main/src/site/xdoc/index.xml
james/protocol-tester/trunk/antlib/src/test/resources/
james/protocol-tester/trunk/antlib/src/test/resources/build.xml
Modified:
james/protocol-tester/trunk/antlib/pom.xml
Modified: james/protocol-tester/trunk/antlib/pom.xml
URL: http://svn.apache.org/viewvc/james/protocol-tester/trunk/antlib/pom.xml?rev=721691&r1=721690&r2=721691&view=diff
==============================================================================
--- james/protocol-tester/trunk/antlib/pom.xml (original)
+++ james/protocol-tester/trunk/antlib/pom.xml Sat Nov 29 09:12:55 2008
@@ -57,5 +57,45 @@
<artifactId>jmock</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-antunit</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>test</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <tasks>
+ <ant antfile="src/test/resources/build.xml" inheritAll="false" inheritRefs="false">
+ <property name="jar.name" location="${project.build.outputDirectory}"/>
+ <property name="base.dir" location="${basedir}"/>
+ <property name="test.skipped" value="${maven.test.skip}"/>
+ <property name="test.classpath" refid="maven.test.classpath" />
+ </ant>
+ </tasks>
+ </configuration>
+ </execution>
+ </executions>
+ <dependencies>
+ <!-- AntUnit require Ant 1.7+ -->
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.7.1</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+ </build>
+
</project>
Added: james/protocol-tester/trunk/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java
URL: http://svn.apache.org/viewvc/james/protocol-tester/trunk/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java?rev=721691&view=auto
==============================================================================
--- james/protocol-tester/trunk/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java (added)
+++ james/protocol-tester/trunk/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java Sat Nov 29 09:12:55 2008
@@ -0,0 +1,251 @@
+/****************************************************************
+ * 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.mpt.ant;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.resources.Union;
+
+/**
+ * Task executes MPT scripts against a server
+ * running on a given port and host.
+ */
+public class MailProtocolTestTask extends Task {
+
+ private File script;
+ private Union scripts;
+ private int port = 0;
+ private String host = "127.0.0.1";
+ private boolean skip = false;
+ private Collection users = new ArrayList();
+
+ /**
+ * Should the execution be skipped?
+ * @return true if exection should be skipped,
+ * otherwise false
+ */
+ public boolean isSkip() {
+ return skip;
+ }
+
+ /**
+ * Sets execution skipping.
+ * @param skip true to skip excution
+ */
+ public void setSkip(boolean skip) {
+ this.skip = skip;
+ }
+
+ /**
+ * Gets the host (either name or number) against which this
+ * test will run.
+ * @return host, not null
+ */
+ public String getHost() {
+ return host;
+ }
+
+ /**
+ * Sets the host (either name or number) against which this
+ * test will run.
+ * @param host not null
+ */
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ /**
+ * Gets the port against which this test will run.
+ * @return port number
+ */
+ public int getPort() {
+ return port;
+ }
+
+ /**
+ * Sets the port aginst which this test will run.
+ * @param port port number
+ */
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ /**
+ * Gets the script to execute.
+ * @return file containing test script
+ */
+ public File getScript() {
+ return script;
+ }
+
+ /**
+ * Sets the script to execute.
+ * @param script not null
+ */
+ public void setScript(File script) {
+ this.script = script;
+ }
+
+ //@Override
+ public void execute() throws BuildException {
+ if (port <= 0) {
+ throw new BuildException("Port must be set to a positive integer");
+ }
+
+ if (scripts == null && script == null) {
+ throw new BuildException("Scripts must be specified as an embedded resource collection");
+ }
+
+ if (scripts != null && script != null) {
+ throw new BuildException("Scripts can be specified either by the script attribute or as resource collections but not both.");
+ }
+
+ for(final Iterator it=users.iterator();it.hasNext();) {
+ final AddUser user = (AddUser) it.next();
+ user.validate();
+ }
+
+ if(skip) {
+ log("Skipping excution");
+ } else {
+ doExecute();
+ }
+ }
+
+ public void add(ResourceCollection resources) {
+ if (scripts == null) {
+ scripts = new Union();
+ }
+ scripts.add(resources);
+ }
+
+ private void doExecute() {
+ super.execute();
+ }
+
+ public AddUser createAddUser() {
+ final AddUser result = new AddUser();
+ users.add(result);
+ return result;
+ }
+
+ /**
+ *
+ */
+ public static class AddUser {
+ private int port;
+ private String user;
+ private String passwd;
+ private File script;
+
+ /**
+ * Gets the port against which the user addition
+ * script should be executed.
+ * @return port number
+ */
+ public int getPort() {
+ return port;
+ }
+
+ /**
+ * Sets the port against which the user addition
+ * script should be executed.
+ * @param port port number
+ */
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ /**
+ * Gets the password for the user.
+ * @return password not null
+ */
+ public String getPasswd() {
+ return passwd;
+ }
+
+ /**
+ * Sets the password for the user.
+ * This will be passed in the user creation script.
+ * @param passwd not null
+ */
+ public void setPasswd(String passwd) {
+ this.passwd = passwd;
+ }
+
+ /**
+ * Gets the name of the user to be created.
+ * @return user name, not null
+ */
+ public String getUser() {
+ return user;
+ }
+
+ /**
+ * Sets the name of the user to be created.
+ * @param user not null
+ */
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+ /**
+ * Gets the file containing the user creation script.
+ * @return not null
+ */
+ public File getScript() {
+ return script;
+ }
+
+ /**
+ * Sets the file containing the user creation script.
+ * @param script not null
+ */
+ public void setScript(File script) {
+ this.script = script;
+ }
+
+ /**
+ * Validates mandatory fields have been filled.
+ */
+ void validate() throws BuildException {
+ if (script == null) {
+ throw new BuildException("'script' attribute must be set on AddUser to the file containing the user creations script.");
+ }
+ if (user == null) {
+ throw new BuildException("'user' attribute must be set on AddUser to the name of the user to be created.");
+ }
+ if (passwd == null) {
+ throw new BuildException("'passwd' attribute must be set on AddUser to the password to be set for the user created");
+ }
+ if (port <= 0) {
+ throw new BuildException("'port' attribute must be set on AddUser to the port against which the script should run.");
+ }
+
+ }
+ }
+}
Propchange: james/protocol-tester/trunk/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java
------------------------------------------------------------------------------
svn:mergeinfo =
Added: james/protocol-tester/trunk/antlib/src/main/resources/org/apache/james/mpt/ant/antlib.xml
URL: http://svn.apache.org/viewvc/james/protocol-tester/trunk/antlib/src/main/resources/org/apache/james/mpt/ant/antlib.xml?rev=721691&view=auto
==============================================================================
--- james/protocol-tester/trunk/antlib/src/main/resources/org/apache/james/mpt/ant/antlib.xml (added)
+++ james/protocol-tester/trunk/antlib/src/main/resources/org/apache/james/mpt/ant/antlib.xml Sat Nov 29 09:12:55 2008
@@ -0,0 +1,26 @@
+<?xml version='1.0'?>
+<!--
+
+ 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. *
+
+-->
+
+<antlib>
+ <typedef name="mpt"
+ classname="org.apache.james.mpt.ant.MailProtocolTestTask"/>
+</antlib>
\ No newline at end of file
Propchange: james/protocol-tester/trunk/antlib/src/main/resources/org/apache/james/mpt/ant/antlib.xml
------------------------------------------------------------------------------
svn:mergeinfo =
Copied: james/protocol-tester/trunk/antlib/src/site/site.xml (from r721659, james/protocol-tester/trunk/main/src/site/site.xml)
URL: http://svn.apache.org/viewvc/james/protocol-tester/trunk/antlib/src/site/site.xml?p2=james/protocol-tester/trunk/antlib/src/site/site.xml&p1=james/protocol-tester/trunk/main/src/site/site.xml&r1=721659&r2=721691&rev=721691&view=diff
==============================================================================
--- james/protocol-tester/trunk/main/src/site/site.xml (original)
+++ james/protocol-tester/trunk/antlib/src/site/site.xml Sat Nov 29 09:12:55 2008
@@ -32,7 +32,7 @@
<body>
- <menu name="Mail Protocol Tester">
+ <menu name="MPT AntLib">
<item name="Overview" href="index.html"/>
<item
name="DOAP"
Propchange: james/protocol-tester/trunk/antlib/src/site/site.xml
------------------------------------------------------------------------------
svn:mergeinfo =
Copied: james/protocol-tester/trunk/antlib/src/site/xdoc/index.xml (from r721673, james/protocol-tester/trunk/main/src/site/xdoc/index.xml)
URL: http://svn.apache.org/viewvc/james/protocol-tester/trunk/antlib/src/site/xdoc/index.xml?p2=james/protocol-tester/trunk/antlib/src/site/xdoc/index.xml&p1=james/protocol-tester/trunk/main/src/site/xdoc/index.xml&r1=721673&r2=721691&rev=721691&view=diff
==============================================================================
--- james/protocol-tester/trunk/main/src/site/xdoc/index.xml (original)
+++ james/protocol-tester/trunk/antlib/src/site/xdoc/index.xml Sat Nov 29 09:12:55 2008
@@ -22,7 +22,7 @@
<properties>
<title>Overview</title>
- <author email="server-dev@james.apache.org">Mail Protocol Tester</author>
+ <author email="server-dev@james.apache.org">Mail Protocol Tester AntLib</author>
</properties>
<body>
@@ -31,53 +31,103 @@
Apache James Mail Protocol Tester (MTP) is a library providing a framework for the
scritable functional testing of ASCII based line protocols.</p>
<p>
-This contains a lightweight scripting framework suitable for the
-functional testing of the ASCII line based protocols common in mail.
-A script contains a list of client requests and templated server
-responses. The framework runs the client lines against a host system
-and then compares the server lines received in response against the
-template responses.
+An antlib defines a suite of extensions for <a href='http://ant.apache.org'>Apache Ant</a>.
+This antlib defines a suite of functional testing tools particularly suitable for
+use with ASCII based line protocols (as are common in mail).
</p>
</section>
-<section name='Using MPT'>
-<subsection name='Host System'>
+<section name='Usage'>
<p>
-MPT is a lightweight, flexible framework which is capable of being used
-in a variety of ways. <code>HostSystem</code> is pivotal, defining the
-interface between the framework and the server system under test.
+See:
</p>
<ul>
-<li>
-The <code>ExternalHostSystem</code> implementation connects to a port on a server.
-This is typically used to test a complete running server (including the sockets).
-<a href='../antlib'>MPT AntLib</a> provides an
-<a href='http://ant.apache.org' rel='tag'>Ant</a> task suitable for this use case.
-</li>
-<li>
-When performing in-JVM testing (without a live server socket) a custom implementation
-must be created connecting the framework to the components under test. This use case
-is typically developed as a <a href='http://www.junit.org'>JUnit</a> test case.
-</li>
+<li>Apache Ant <a href='http://ant.apache.org/manual/CoreTypes/antlib.html'>manual</a></li>
+<li><a href='http://www.onjava.com/pub/a/onjava/2006/08/09/ant-1-7-using-antlibs.html'>Using AntLibs</a> (article)</li>
+<li><a href='http://www.oracle.com/technology/pub/articles/bodewig_taskwriters.html'>Ant 1.6 for Task Writers</a> (article)</li>
</ul>
-</subsection>
-<subsection name='With JUnit'>
+</section>
+<section name='Tasks'>
+<subsection name='mpt'>
<p>
-In-JVM JUnit testing is a typical use case. The framework provides
-abstract superclasses which setup up appropriate fixtures.
+Executes <a href='../main'>MPT</a> scripts against a running independent server.
+If these scripts require users then these can be added by script by using the <code>AddUser</code>
+element.
</p>
+<subsection name='Parameters'>
+<table>
+<tr>
+ <td><strong>Attribute</strong></td> <td><strong>Description</strong></td> <td><strong>Required</strong></td>
+</tr>
+<tr>
+ <td>port</td>
+ <td>Port number that the scripts should be executed against</td>
+ <td>Yes</td>
+</tr>
+<tr>
+ <td>host</td>
+ <td>Host name or IP address of the server against which the scripts should be executed</td>
+ <td>No (Defaults to <code>127.0.0.1</code>)</td>
+</tr>
+<tr>
+ <td>script</td>
+ <td>File containing a script to be executed. To execute multiple scripts,
+ use a <a href='#Any Resource Collection'>Resource Collection</a></td>
+ <td>When no resource collections elements exist</td>
+</tr>
+<tr>
+ <td>skip</td>
+ <td>Skips execution of scripts. For simple conditional execution</td>
+ <td>No</td>
+</tr>
+</table>
</subsection>
-</section>
-<section name="Script Features">
-<subsection name='Regex Matching Of Server Responses'>
+</subsection>
+
+<subsection name='Nested Elements'>
+<subsection name='Any Resource Collection'>
<p>
-The server responses in the script support regex matching.
+<a href='http://ant.apache.org/manual/CoreTypes/resources.html#collection'>Resource Collection</a>s
+are used to specify a group of scripts to execute. When resource collections are set, attribute <code>
+</code>
</p>
</subsection>
-<subsection name='Variable Substitution'>
+<subsection name='AddUser'>
<p>
-Variables of form <code>${<em>variable-name</em>}</code> may be substituted by values
-passed into the script builder before interpretation.
+Allows scripted addition of any users required by the tests.
+The port can vary but the host is inherited.
</p>
+<table>
+<tr>
+ <td><strong>Attribute</strong></td> <td><strong>Description</strong></td> <td><strong>Required</strong></td>
+</tr>
+<tr>
+ <td>port</td>
+ <td>Port number that the user addition script should be executed against</td>
+ <td>Yes</td>
+</tr>
+
+<tr>
+ <td>passwd</td>
+ <td>Password to be set for user created. Will be passed to the script.</td>
+ <td>Yes</td>
+</tr>
+
+<tr>
+ <td>user</td>
+ <td>Name of the user to be created. Will be passed to the script.</td>
+ <td>Yes</td>
+</tr>
+
+<tr>
+ <td>script</td>
+ <td>File containing the user creation script</td>
+ <td>Yes</td>
+</tr>
+</table>
+</subsection>
+<subsection name='Example'>
+<p>TODO:</p>
+</subsection>
</subsection>
</section>
</body>
Propchange: james/protocol-tester/trunk/antlib/src/site/xdoc/index.xml
------------------------------------------------------------------------------
svn:mergeinfo =
Added: james/protocol-tester/trunk/antlib/src/test/resources/build.xml
URL: http://svn.apache.org/viewvc/james/protocol-tester/trunk/antlib/src/test/resources/build.xml?rev=721691&view=auto
==============================================================================
--- james/protocol-tester/trunk/antlib/src/test/resources/build.xml (added)
+++ james/protocol-tester/trunk/antlib/src/test/resources/build.xml Sat Nov 29 09:12:55 2008
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<project
+ name="tests" default="all"
+ xmlns:au="antlib:org.apache.ant.antunit"
+ xmlns:mpt="antlib:org.apache.james.mpt.ant">
+
+ <taskdef uri="antlib:org.apache.ant.antunit"
+ resource="org/apache/ant/antunit/antlib.xml"
+ classpath="${test.classpath}" />
+
+ <taskdef uri="antlib:org.apache.james.mpt.ant"
+ resource="org/apache/james/mpt/ant/antlib.xml"
+ classpath="${jar.name}" />
+
+ <target name='testMustNotAllowScriptsAndScript'>
+ <au:expectfailure>
+ <mpt:mpt skip='true' port='10000' script='pom.xml'>
+ <fileset dir='${basedir}'/>
+ </mpt:mpt>
+ </au:expectfailure>
+ </target>
+
+ <target name='testMustSetScriptsOrScript'>
+ <au:expectfailure>
+ <mpt:mpt skip='true' port='10000'/>
+ </au:expectfailure>
+ <mpt:mpt port='10000' skip='true'>
+ <fileset dir='${basedir}'/>
+ </mpt:mpt>
+ <mpt:mpt port='10000' skip='true' script='pom.xml'/>
+ </target>
+
+ <target name='testMustSetPort'>
+ <au:expectfailure>
+ <mpt:mpt skip='true'>
+ <fileset dir='${basedir}'/>
+ </mpt:mpt>
+ </au:expectfailure>
+ <mpt:mpt port='10000' skip='true'>
+ <fileset dir='${basedir}'/>
+ </mpt:mpt>
+ </target>
+
+ <target name='testMaySetHost'>
+ <mpt:mpt port='10000' skip='true' host='example.org'>
+ <fileset dir='${basedir}'/>
+ </mpt:mpt>
+ <mpt:mpt port='10000' skip='true' host='10.0.0.66'>
+ <fileset dir='${basedir}'/>
+ </mpt:mpt>
+ </target>
+
+ <target name='testShouldAllowAddUserToBeSet'>
+ <mpt:mpt port='10000' skip='true' host='example.org'>
+ <fileset dir='${basedir}'/>
+ <addUser port='10001' user='user' passwd='passwd' script='pom.xml'/>
+ </mpt:mpt>
+ </target>
+
+
+ <target name='testAddUserMustSetPortNamePasswordScript'>
+ <au:expectfailure>
+ <mpt:mpt port='10000' skip='true' host='example.org'>
+ <fileset dir='${basedir}'/>
+ <addUser user='user' passwd='passwd' script='pom.xml'/>
+ </mpt:mpt>
+ </au:expectfailure>
+ <au:expectfailure>
+ <mpt:mpt port='10000' skip='true' host='example.org'>
+ <fileset dir='${basedir}'/>
+ <addUser port='10001' passwd='passwd' script='pom.xml'/>
+ </mpt:mpt>
+ </au:expectfailure>
+ <au:expectfailure>
+ <mpt:mpt port='10000' skip='true' host='example.org'>
+ <fileset dir='${basedir}'/>
+ <addUser port='10001' user='user' script='pom.xml'/>
+ </mpt:mpt>
+ </au:expectfailure>
+ <au:expectfailure>
+ <mpt:mpt port='10000' skip='true' host='example.org'>
+ <fileset dir='${basedir}'/>
+ <addUser port='10001' user='user' passwd='passwd'/>
+ </mpt:mpt>
+ </au:expectfailure>
+ </target>
+
+ <target name='testMptAttributes' depends='testMustSetPort, testMaySetHost,testMustSetScriptsOrScript, testMustNotAllowScriptsAndScript'/>
+ <target name='testAddUser' depends='testShouldAllowAddUserToBeSet, testAddUserMustSetPortNamePasswordScript'/>
+
+ <target name='all' depends='testMptAttributes, testAddUser'/>
+</project>
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org