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 bt...@apache.org on 2019/10/31 09:48:38 UTC

[james-project] branch master updated (f9004d4 -> 3d21b8b)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from f9004d4  Fix for Apache GitHub label 'IMAP' - must be lowercase alphanumerical and <= 35 characters!
     new 4a4a2d6  JAMES-2929 JDBCMailRepository broken: SQL and JDBC code out of sync
     new 89fd4d4  JAMES-2929 format fix only: XML indentation, trailing spaces
     new b217a70  JAMES-2828 JDBC Mail Repository fails to save message into PostgreSQL when per recipient headers are absent
     new 63d8419  JAMES-2936 add a method to check for empty names in the hierarchy in a mailbox path
     new f278151  JAMES-2936 reject path with empty names in the hierachy when creating mailbox
     new 3d21b8b  JAMES-2936 reject path with empty names in the hierachy when renaming mailbox and sanitize new name

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../run/spring/destination/conf/sqlResources.xml   | 154 +++-
 ...> HasEmptyMailboxNameInHierarchyException.java} |   8 +-
 .../apache/james/mailbox/model/MailboxPath.java    |   7 +
 .../apache/james/mailbox/MailboxManagerTest.java   | 114 ++-
 .../james/mailbox/model/MailboxPathTest.java       |  56 ++
 .../james/mailbox/store/StoreMailboxManager.java   |  75 +-
 server/app/src/main/resources/sqlResources.xml     | 795 +++++++++++----------
 .../mailrepository/jdbc/JDBCMailRepository.java    |   2 +-
 .../src/test/resources/sqlResources-mail.xml       | 556 +++++++-------
 .../data-jdbc/src/test/resources/sqlResources.xml  | 567 ++++++++-------
 10 files changed, 1316 insertions(+), 1018 deletions(-)
 copy mailbox/api/src/main/java/org/apache/james/mailbox/exception/{TooLongMailboxNameException.java => HasEmptyMailboxNameInHierarchyException.java} (81%)


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


[james-project] 01/06: JAMES-2929 JDBCMailRepository broken: SQL and JDBC code out of sync

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 4a4a2d6b8d93c884830144cd302cb50d5d2276bc
Author: Joerg Thomas <jo...@consol.de>
AuthorDate: Wed Oct 30 17:01:50 2019 +0100

    JAMES-2929 JDBCMailRepository broken: SQL and JDBC code out of sync
---
 .../run/spring/destination/conf/sqlResources.xml   | 102 ++++++++++++++++++---
 server/app/src/main/resources/sqlResources.xml     |  39 +++++---
 .../src/test/resources/sqlResources-mail.xml       |  39 +++++---
 .../data-jdbc/src/test/resources/sqlResources.xml  |  40 ++++----
 4 files changed, 161 insertions(+), 59 deletions(-)

diff --git a/dockerfiles/run/spring/destination/conf/sqlResources.xml b/dockerfiles/run/spring/destination/conf/sqlResources.xml
index a5284d8..26cf914 100644
--- a/dockerfiles/run/spring/destination/conf/sqlResources.xml
+++ b/dockerfiles/run/spring/destination/conf/sqlResources.xml
@@ -17,8 +17,29 @@
   under the License.                                           
  -->
 
+<!--
+   This template file can be used as example for James Server configuration
+   DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS
+-->
+
+<!-- See http://james.apache.org/server/3/config.html for usage -->
+
 <sqlResources>
 
+<!--
+     This section provided configuration to determine the
+     database product which is being used for storage. Different database
+     products may require different SQL syntax.
+
+     The jdbc database connection is examined to see if it matches with the
+     regular expressions specified in any of the defined matchers. The matchers
+     are processed in the over provided here, with the first successful match
+     defining the "db" value for this connection.
+
+     This value is then used to choose between different definitions for various
+     named sql statements, defined below. If no match is found,
+     the default sql statements are used.
+-->
     <dbMatchers>
         <dbMatcher db="mssql" databaseProductName="microsoft sql server"/>
         <dbMatcher db="oracle" databaseProductName="oracle.*"/>
@@ -32,6 +53,32 @@
         <dbMatcher db="ingres" databaseProductName="ingres.*"/>
     </dbMatchers>
 
+<!--
+    With the following section it is possible to associate several name/value pairs
+        of options to a database product, identified by the "db" XML attribute name.
+
+    An element without a "db" attribute, if used for an option name, will become a default value for such option.
+    Each option may have a "default default", i.e. a default that applies if no element with an empty
+        "db" attribute (default element) exists as said above;
+        such default default must be documented for such option below.
+
+    The order of the XML elements is meaningless.
+
+    Here only "getBody" and "getAttributes" option names are set, but others could be used in the future.
+    Option names:
+        "getBody" - a string (case insensitive) telling which JDBC ResultSet method will be used to
+            get the message body field for a database product.
+            The default default value is "useBytes"..
+            Values (case insensitive):
+                "useBytes"  - use getBytes(int).
+                "useBlob"   - use getBlob(int).
+        "getAttributes" - a string (case insensitive) telling which JDBC ResultSet method will be used to
+            get the message attributes field for a database product.
+           The default default value is "useBytes"..
+            Values (case insensitive):
+                "useBytes"  - use getBytes(int).
+                "useBlob"   - use getBlob(int).
+-->
     <dbOptions>
         <dbOption name="getBody" value="useBytes"/>
         <dbOption name="getAttributes" value="useBytes"/>
@@ -57,6 +104,15 @@
         <dbOption db="ingres" name="getAttributes" value="useBytes"/>
     </dbOptions>
 
+<!-- SQL statements to use for various components. -->
+<!-- -->
+<!-- Parameter definitions ${param} are replaced with parameter values -->
+<!-- read from the configuration file. -->
+<!-- -->
+<!-- If a named statement has a definition defined for the current database product, -->
+<!-- then that statement is used. Otherwise the default statement is used. -->
+
+<!-- SQL statements for the JdbcMailRepository  -->
     <sqlDefs name="org.apache.james.mailrepository.jdbc.JDBCMailRepository">
 
         <!-- Statements used to check whether a particular message exists in this repository. -->
@@ -74,11 +130,11 @@
         <!-- Statements used to insert a message into this repository. -->
         <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
             repository_name, message_state, error_message, sender, recipients,
-            remote_host, remote_addr, last_updated, message_body,
-            message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
+    remote_host, remote_addr, per_recipient_headers, last_updated, message_body,
+    message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
 
         <!-- Statements used to retrieve a message stored in this repository. -->
-        <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+    <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, per_recipient_headers, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
         <!-- Statements used to retrieve the body of a message stored in this repository. -->
         <sql name="retrieveMessageBodySQL">SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
@@ -104,6 +160,9 @@
         <!-- Statements used to list all messages stored in this repository. -->
         <sql name="listMessagesSQL">SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC</sql>
 
+    <!-- Statements used to count messages stored in this repository. -->
+    <sql name="countMessagesSQL">SELECT COUNT(*) FROM ${table}</sql>
+
         <!-- Statements used to create the table associated with this class. -->
         <sql name="createTable" db="mysql">
             CREATE TABLE ${table} (
@@ -115,9 +174,10 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers longblob NULL ,
+            last_updated datetime NOT NULL,
             message_body longblob NOT NULL ,
             message_attributes longblob NULL ,
-            last_updated datetime NOT NULL,
             PRIMARY KEY (repository_name, message_name)
             )
         </sql>
@@ -131,9 +191,10 @@
             recipients varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers varchar NULL ,
+            last_updated timestamp NOT NULL,
             message_body varchar NOT NULL ,
             message_attributes varchar NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
             )
         </sql>
@@ -147,9 +208,10 @@
             recipients varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers varchar NULL ,
+            last_updated timestamp NOT NULL,
             message_body varchar NOT NULL ,
             message_attributes varchar NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
             )
         </sql>
@@ -163,9 +225,10 @@
             [recipients] [text] NOT NULL ,
             [remote_host] [varchar] (255) NOT NULL ,
             [remote_addr] [varchar] (20) NOT NULL ,
+            [per_recipient_headers] [image] NULL ,
+            [last_updated] [datetime] NOT NULL,
             [message_body] [image] NOT NULL ,
             [message_attributes] [image] NULL ,
-            [last_updated] [datetime] NOT NULL,
             PRIMARY KEY (repository_name, message_name)
             )
         </sql>
@@ -179,9 +242,10 @@
             recipients varchar2(1000) NOT NULL ,
             remote_host varchar2(100) NOT NULL ,
             remote_addr varchar2(20) NOT NULL ,
+            per_recipient_headers blob NULL ,
+            last_updated date NOT NULL ,
             message_body blob NOT NULL ,
             message_attributes blob NULL ,
-            last_updated date NOT NULL ,
             PRIMARY KEY (repository_name, message_name)
             )
         </sql>
@@ -195,9 +259,10 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers oid NULL ,
+            last_updated timestamp NOT NULL,
             message_body bytea NOT NULL ,
             message_attributes bytea NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
             )
         </sql>
@@ -211,9 +276,10 @@
             recipients long NOT NULL ,
             remote_host varchar (100) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers long byte NULL ,
+            last_updated date NOT NULL,
             message_body long byte NOT NULL ,
             message_attributes long byte NULL ,
-            last_updated date NOT NULL,
             PRIMARY KEY (repository_name, message_name)
             )
         </sql>
@@ -227,9 +293,10 @@
             recipients varchar(1000) NOT NULL ,
             remote_host varchar(100) NOT NULL ,
             remote_addr varchar(20) NOT NULL ,
+            per_recipient_headers blob ,
+            last_updated timestamp NOT NULL ,
             message_body blob NOT NULL ,
             message_attributes blob ,
-            last_updated timestamp NOT NULL ,
             PRIMARY KEY (repository_name, message_name)
             )
         </sql>
@@ -243,9 +310,10 @@
             recipients LONG VARCHAR NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers LONG BYTE ,
+            last_updated DATE NOT NULL
             message_body LONG BYTE NOT NULL ,
             message_attributes LONG BYTE ,
-            last_updated DATE NOT NULL
             )
         </sql>
         <sql name="createTable" db="derby">
@@ -258,14 +326,18 @@
             recipients long varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers blob ,
+            last_updated timestamp NOT NULL,
             message_body blob NOT NULL ,
             message_attributes blob ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
             )
         </sql>
     </sqlDefs>
 
+
+<!-- SQL statements to support the BayesianAnalysis and the BayesianAnalysisFeeder mailets -->
+<!-- -->
     <sqlDefs name="org.apache.james.util.bayesian.JDBCBayesianAnalyzer">
 
         <sql name="hamTableName">bayesiananalysis_ham</sql>
@@ -399,6 +471,8 @@
         </sql>
     </sqlDefs>
 
+<!-- SQL statements to support the WhiteListManager mailet and the IsInWhiteList matcher -->
+<!-- -->
     <sqlDefs name="WhiteList">
 
         <sql name="whiteListTableName">whitelist</sql>
@@ -589,6 +663,8 @@
 
     </sqlDefs>
 
+<!-- SQL statements to support the GreyList Handler-->
+<!-- -->
     <sqlDefs name="GreyList">
 
         <sql name="greyListTableName">greylist</sql>
diff --git a/server/app/src/main/resources/sqlResources.xml b/server/app/src/main/resources/sqlResources.xml
index 1e67b51..10d6c2b 100644
--- a/server/app/src/main/resources/sqlResources.xml
+++ b/server/app/src/main/resources/sqlResources.xml
@@ -130,11 +130,11 @@
     <!-- Statements used to insert a message into this repository. -->
     <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
     repository_name, message_state, error_message, sender, recipients,
-    remote_host, remote_addr, last_updated, message_body,
-    message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
+    remote_host, remote_addr, per_recipient_headers, last_updated, message_body,
+    message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
 
     <!-- Statements used to retrieve a message stored in this repository. -->
-    <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+    <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, per_recipient_headers, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
     <!-- Statements used to retrieve the body of a message stored in this repository. -->
     <sql name="retrieveMessageBodySQL">SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
@@ -160,6 +160,9 @@
     <!-- Statements used to list all messages stored in this repository. -->
     <sql name="listMessagesSQL">SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC</sql>
 
+    <!-- Statements used to count messages stored in this repository. -->
+    <sql name="countMessagesSQL">SELECT COUNT(*) FROM ${table}</sql>
+
     <!-- Statements used to create the table associated with this class. -->
     <sql name="createTable" db="mysql">
         CREATE TABLE ${table} (
@@ -171,9 +174,10 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers longblob NULL ,
+            last_updated datetime NOT NULL,
             message_body longblob NOT NULL ,
             message_attributes longblob NULL ,
-            last_updated datetime NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -187,9 +191,10 @@
             recipients varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers varchar NULL ,
+            last_updated timestamp NOT NULL,
             message_body varchar NOT NULL ,
             message_attributes varchar NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -203,9 +208,10 @@
             recipients varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers varchar NULL ,
+            last_updated timestamp NOT NULL,
             message_body varchar NOT NULL ,
             message_attributes varchar NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -219,9 +225,10 @@
             [recipients] [text] NOT NULL ,
             [remote_host] [varchar] (255) NOT NULL ,
             [remote_addr] [varchar] (20) NOT NULL ,
+            [per_recipient_headers] [image] NULL ,
+            [last_updated] [datetime] NOT NULL,
             [message_body] [image] NOT NULL ,
             [message_attributes] [image] NULL ,
-            [last_updated] [datetime] NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -235,9 +242,10 @@
             recipients varchar2(1000) NOT NULL ,
             remote_host varchar2(100) NOT NULL ,
             remote_addr varchar2(20) NOT NULL ,
+            per_recipient_headers blob NULL ,
+            last_updated date NOT NULL ,
             message_body blob NOT NULL ,
             message_attributes blob NULL ,
-            last_updated date NOT NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -251,9 +259,10 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers oid NULL ,
+            last_updated timestamp NOT NULL,
             message_body bytea NOT NULL ,
             message_attributes bytea NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -267,9 +276,10 @@
             recipients long NOT NULL ,
             remote_host varchar (100) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers long byte NULL ,
+            last_updated date NOT NULL,
             message_body long byte NOT NULL ,
             message_attributes long byte NULL ,
-            last_updated date NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -283,9 +293,10 @@
             recipients varchar(1000) NOT NULL ,
             remote_host varchar(100) NOT NULL ,
             remote_addr varchar(20) NOT NULL ,
+            per_recipient_headers blob ,
+            last_updated timestamp NOT NULL ,
             message_body blob NOT NULL ,
             message_attributes blob ,
-            last_updated timestamp NOT NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -299,9 +310,10 @@
             recipients LONG VARCHAR NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers LONG BYTE ,
+            last_updated DATE NOT NULL
             message_body LONG BYTE NOT NULL ,
             message_attributes LONG BYTE ,
-            last_updated DATE NOT NULL
         )
     </sql>
     <sql name="createTable" db="derby">
@@ -314,9 +326,10 @@
             recipients long varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers blob ,
+            last_updated timestamp NOT NULL,
             message_body blob NOT NULL ,
             message_attributes blob ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
diff --git a/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml b/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml
index 4e90638..4b17cff 100644
--- a/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml
+++ b/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml
@@ -115,11 +115,11 @@
     <!-- Statements used to insert a message into this repository. -->
     <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
     repository_name, message_state, error_message, sender, recipients,
-    remote_host, remote_addr, last_updated, message_body,
-    message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
+    remote_host, remote_addr, per_recipient_headers, last_updated, message_body,
+    message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
 
     <!-- Statements used to retrieve a message stored in this repository. -->
-    <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+    <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, per_recipient_headers, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
     <!-- Statements used to retrieve the body of a message stored in this repository. -->
     <sql name="retrieveMessageBodySQL">SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
@@ -145,6 +145,9 @@
     <!-- Statements used to list all messages stored in this repository. -->
     <sql name="listMessagesSQL">SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC</sql>
 
+    <!-- Statements used to count messages stored in this repository. -->
+    <sql name="countMessagesSQL">SELECT COUNT(*) FROM ${table}</sql>
+
     <!-- Statements used to create the table associated with this class. -->
     <sql name="createTable" db="mysql">
         CREATE TABLE ${table} (
@@ -156,9 +159,10 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers longblob NULL ,
+            last_updated datetime NOT NULL,
             message_body longblob NOT NULL ,
             message_attributes longblob NULL ,
-            last_updated datetime NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -172,9 +176,10 @@
             recipients varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers varchar NULL ,
+            last_updated timestamp NOT NULL,
             message_body varchar NOT NULL ,
             message_attributes varchar NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -188,9 +193,10 @@
             recipients varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers varchar NULL ,
+            last_updated timestamp NOT NULL,
             message_body varchar NOT NULL ,
             message_attributes varchar NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -204,9 +210,10 @@
             [recipients] [text] NOT NULL ,
             [remote_host] [varchar] (255) NOT NULL ,
             [remote_addr] [varchar] (20) NOT NULL ,
+            [per_recipient_headers] [image] NULL ,
+            [last_updated] [datetime] NOT NULL,
             [message_body] [image] NOT NULL ,
             [message_attributes] [image] NULL ,
-            [last_updated] [datetime] NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -220,9 +227,10 @@
             recipients varchar2(1000) NOT NULL ,
             remote_host varchar2(100) NOT NULL ,
             remote_addr varchar2(20) NOT NULL ,
+            per_recipient_headers blob NULL ,
+            last_updated date NOT NULL ,
             message_body blob NOT NULL ,
             message_attributes blob NULL ,
-            last_updated date NOT NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -236,9 +244,10 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers oid NULL ,
+            last_updated timestamp NOT NULL,
             message_body bytea NOT NULL ,
             message_attributes bytea NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -252,9 +261,10 @@
             recipients long NOT NULL ,
             remote_host varchar (100) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers long byte NULL ,
+            last_updated date NOT NULL,
             message_body long byte NOT NULL ,
             message_attributes long byte NULL ,
-            last_updated date NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -268,9 +278,10 @@
             recipients varchar(1000) NOT NULL ,
             remote_host varchar(100) NOT NULL ,
             remote_addr varchar(20) NOT NULL ,
+            per_recipient_headers blob ,
+            last_updated timestamp NOT NULL ,
             message_body blob NOT NULL ,
             message_attributes blob ,
-            last_updated timestamp NOT NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -284,9 +295,10 @@
             recipients LONG VARCHAR NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers LONG BYTE ,
+            last_updated DATE NOT NULL
             message_body LONG BYTE NOT NULL ,
             message_attributes LONG BYTE ,
-            last_updated DATE NOT NULL
         )
     </sql>
     <sql name="createTable" db="derby">
@@ -299,9 +311,10 @@
             recipients long varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers blob ,
+            last_updated timestamp NOT NULL,
             message_body blob NOT NULL ,
             message_attributes blob ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
diff --git a/server/data/data-jdbc/src/test/resources/sqlResources.xml b/server/data/data-jdbc/src/test/resources/sqlResources.xml
index 3d6d9f9..f1daca9 100644
--- a/server/data/data-jdbc/src/test/resources/sqlResources.xml
+++ b/server/data/data-jdbc/src/test/resources/sqlResources.xml
@@ -166,10 +166,10 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
-            message_body longblob NOT NULL ,
-            message_attributes longblob NULL ,
             per_recipient_headers longblob NULL ,
             last_updated datetime NOT NULL,
+            message_body longblob NOT NULL ,
+            message_attributes longblob NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -183,10 +183,10 @@
             recipients varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
-            message_body varchar NOT NULL ,
-            message_attributes varchar NULL ,
             per_recipient_headers varchar NULL ,
             last_updated timestamp NOT NULL,
+            message_body varchar NOT NULL ,
+            message_attributes varchar NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -200,10 +200,10 @@
             recipients varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
-            message_body varchar NOT NULL ,
-            message_attributes varchar NULL ,
             per_recipient_headers varchar NULL ,
             last_updated timestamp NOT NULL,
+            message_body varchar NOT NULL ,
+            message_attributes varchar NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -217,10 +217,10 @@
             [recipients] [text] NOT NULL ,
             [remote_host] [varchar] (255) NOT NULL ,
             [remote_addr] [varchar] (20) NOT NULL ,
-            [message_body] [image] NOT NULL ,
-            [message_attributes] [image] NULL ,
             [per_recipient_headers] [image] NULL ,
             [last_updated] [datetime] NOT NULL,
+            [message_body] [image] NOT NULL ,
+            [message_attributes] [image] NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -234,10 +234,10 @@
             recipients varchar2(1000) NOT NULL ,
             remote_host varchar2(100) NOT NULL ,
             remote_addr varchar2(20) NOT NULL ,
-            message_body blob NOT NULL ,
-            message_attributes blob NULL ,
             per_recipient_headers blob NULL ,
             last_updated date NOT NULL ,
+            message_body blob NOT NULL ,
+            message_attributes blob NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -251,10 +251,10 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
+            per_recipient_headers oid NULL ,
+            last_updated timestamp NOT NULL,
             message_body bytea NOT NULL ,
             message_attributes bytea NULL ,
-            per_recipient_headers bytea NULL ,
-            last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -268,10 +268,10 @@
             recipients long NOT NULL ,
             remote_host varchar (100) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
-            message_body long byte NOT NULL ,
-            message_attributes long byte NULL ,
             per_recipient_headers long byte NULL ,
             last_updated date NOT NULL,
+            message_body long byte NOT NULL ,
+            message_attributes long byte NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -285,10 +285,10 @@
             recipients varchar(1000) NOT NULL ,
             remote_host varchar(100) NOT NULL ,
             remote_addr varchar(20) NOT NULL ,
-            message_body blob NOT NULL ,
-            message_attributes blob ,
             per_recipient_headers blob ,
             last_updated timestamp NOT NULL ,
+            message_body blob NOT NULL ,
+            message_attributes blob ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
@@ -302,10 +302,10 @@
             recipients LONG VARCHAR NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
-            message_body LONG BYTE NOT NULL ,
-            message_attributes LONG BYTE ,
             per_recipient_headers LONG BYTE ,
             last_updated DATE NOT NULL
+            message_body LONG BYTE NOT NULL ,
+            message_attributes LONG BYTE ,
         )
     </sql>
     <sql name="createTable" db="derby">
@@ -318,10 +318,10 @@
             recipients long varchar NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
-            message_body blob NOT NULL ,
-            message_attributes blob ,
             per_recipient_headers blob ,
             last_updated timestamp NOT NULL,
+            message_body blob NOT NULL ,
+            message_attributes blob ,
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>


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


[james-project] 05/06: JAMES-2936 reject path with empty names in the hierachy when creating mailbox

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit f278151ba938a5e0b81c7671c443bf434e1bca29
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Mon Oct 28 15:20:08 2019 +0100

    JAMES-2936 reject path with empty names in the hierachy when creating mailbox
---
 .../HasEmptyMailboxNameInHierarchyException.java   | 35 ++++++++++++
 .../apache/james/mailbox/MailboxManagerTest.java   | 52 +++++++++++++++++-
 .../james/mailbox/store/StoreMailboxManager.java   | 62 +++++++++++++---------
 3 files changed, 123 insertions(+), 26 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/HasEmptyMailboxNameInHierarchyException.java b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/HasEmptyMailboxNameInHierarchyException.java
new file mode 100644
index 0000000..5363c95
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/HasEmptyMailboxNameInHierarchyException.java
@@ -0,0 +1,35 @@
+/****************************************************************
+ * 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.mailbox.exception;
+
+public class HasEmptyMailboxNameInHierarchyException extends MailboxNameException {
+    public HasEmptyMailboxNameInHierarchyException() {
+        super();
+    }
+
+    public HasEmptyMailboxNameInHierarchyException(String message) {
+        super(message);
+    }
+
+    public HasEmptyMailboxNameInHierarchyException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 0409ccc..138422c 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.events.MessageMoveEvent;
 import org.apache.james.mailbox.exception.AnnotationException;
+import org.apache.james.mailbox.exception.HasEmptyMailboxNameInHierarchyException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.TooLongMailboxNameException;
 import org.apache.james.mailbox.extension.PreDeletionHook;
@@ -82,7 +83,6 @@ import org.mockito.ArgumentCaptor;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-
 import reactor.core.publisher.Mono;
 
 /**
@@ -211,6 +211,56 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
             assertThatThrownBy(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session))
                 .isInstanceOf(TooLongMailboxNameException.class);
         }
+
+        @Test
+        void creatingMailboxShouldNotThrowWhenNameWithoutEmptyHierarchicalLevel() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  "a.b.c";
+
+            assertThatCode(() -> mailboxManager.createMailbox(MailboxPath.forUser(USER_1, mailboxName), session)).doesNotThrowAnyException();
+        }
+
+        @Test
+        void creatingMailboxShouldNotThrowWhenNameWithASingleToBeNormalizedTrailingDelimiter() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  "a.b.";
+
+            assertThatCode(() -> mailboxManager.createMailbox(MailboxPath.forUser(USER_1, mailboxName), session))
+                .doesNotThrowAnyException();
+        }
+
+        @Test
+        void creatingMailboxShouldThrowWhenNameWithMoreThanOneTrailingDelimiter() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  "a..";
+
+            assertThatThrownBy(() -> mailboxManager.createMailbox(MailboxPath.forUser(USER_1, mailboxName), session))
+                .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class);
+        }
+
+        @Test
+        void creatingMailboxShouldThrowWhenNameWithHeadingDelimiter() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  ".a";
+
+            assertThatThrownBy(() -> mailboxManager.createMailbox(MailboxPath.forUser(USER_1, mailboxName), session))
+                .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class);
+        }
+
+        @Test
+        void creatingMailboxShouldThrowWhenNameWithEmptyHierarchicalLevel() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  "a..b";
+
+            assertThatThrownBy(() -> mailboxManager.createMailbox(MailboxPath.forUser(USER_1, mailboxName), session))
+                .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class);
+        }
+
     }
 
     @Nested
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 901efe6..7944aa2 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -43,6 +43,7 @@ import org.apache.james.mailbox.MetadataWithMailboxId;
 import org.apache.james.mailbox.StandardMailboxMetaDataComparator;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
+import org.apache.james.mailbox.exception.HasEmptyMailboxNameInHierarchyException;
 import org.apache.james.mailbox.exception.InsufficientRightsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
@@ -333,37 +334,17 @@ public class StoreMailboxManager implements MailboxManager {
             if (isMailboxNameTooLong(mailboxPath)) {
                 throw new TooLongMailboxNameException("Mailbox name exceed maximum size of " + MAX_MAILBOX_NAME_LENGTH + " characters");
             }
+
             if (mailboxExists(sanitizedMailboxPath, mailboxSession)) {
                 throw new MailboxExistsException(sanitizedMailboxPath.asString());
             }
-            // Create parents first
-            // If any creation fails then the mailbox will not be created
-            // TODO: transaction
-            List<MailboxId> mailboxIds = new ArrayList<>();
-            for (MailboxPath mailbox : sanitizedMailboxPath.getHierarchyLevels(getDelimiter())) {
-                locker.executeWithLock(mailboxSession, mailbox, (LockAwareExecution<Void>) () -> {
-                    if (!mailboxExists(mailbox, mailboxSession)) {
-                        Mailbox m = doCreateMailbox(mailbox);
-                        MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
-                        try {
-                            mapper.execute(Mapper.toTransaction(() -> mailboxIds.add(mapper.save(m))));
-                            // notify listeners
-                            eventBus.dispatch(EventFactory.mailboxAdded()
-                                .randomEventId()
-                                .mailboxSession(mailboxSession)
-                                .mailbox(m)
-                                .build(),
-                                new MailboxIdRegistrationKey(m.getMailboxId()))
-                                .block();
-                        } catch (MailboxExistsException e) {
-                            LOGGER.info("{} mailbox was created concurrently", m.generateAssociatedPath());
-                        }
-                    }
-                    return null;
 
-                }, true);
+            if (sanitizedMailboxPath.hasEmptyNameInHierarchy(mailboxSession.getPathDelimiter())) {
+                throw new HasEmptyMailboxNameInHierarchyException(sanitizedMailboxPath.asString());
             }
 
+            List<MailboxId> mailboxIds = createMailboxesForPath(mailboxSession, sanitizedMailboxPath);
+
             if (!mailboxIds.isEmpty()) {
                 return Optional.ofNullable(Iterables.getLast(mailboxIds));
             }
@@ -371,6 +352,37 @@ public class StoreMailboxManager implements MailboxManager {
         return Optional.empty();
     }
 
+    private List<MailboxId> createMailboxesForPath(MailboxSession mailboxSession, MailboxPath sanitizedMailboxPath) throws MailboxException {
+        // Create parents first
+        // If any creation fails then the mailbox will not be created
+        // TODO: transaction
+        List<MailboxId> mailboxIds = new ArrayList<>();
+        for (MailboxPath mailbox : sanitizedMailboxPath.getHierarchyLevels(getDelimiter())) {
+            locker.executeWithLock(mailboxSession, mailbox, (LockAwareExecution<Void>) () -> {
+                if (!mailboxExists(mailbox, mailboxSession)) {
+                    Mailbox m = doCreateMailbox(mailbox);
+                    MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
+                    try {
+                        mapper.execute(Mapper.toTransaction(() -> mailboxIds.add(mapper.save(m))));
+                        // notify listeners
+                        eventBus.dispatch(EventFactory.mailboxAdded()
+                            .randomEventId()
+                            .mailboxSession(mailboxSession)
+                            .mailbox(m)
+                            .build(),
+                            new MailboxIdRegistrationKey(m.getMailboxId()))
+                            .block();
+                    } catch (MailboxExistsException e) {
+                        LOGGER.info("{} mailbox was created concurrently", m.generateAssociatedPath());
+                    }
+                }
+                return null;
+
+            }, true);
+        }
+        return mailboxIds;
+    }
+
     private void assertMailboxPathBelongToUser(MailboxSession mailboxSession, MailboxPath mailboxPath) throws MailboxException {
         if (!mailboxPath.belongsTo(mailboxSession)) {
             throw new InsufficientRightsException("mailboxPath '" + mailboxPath.asString() + "'"


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


[james-project] 02/06: JAMES-2929 format fix only: XML indentation, trailing spaces

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 89fd4d4334698da52e28fbf68dadb2a29fc59a1d
Author: Joerg Thomas <jo...@consol.de>
AuthorDate: Wed Oct 30 17:49:54 2019 +0100

    JAMES-2929 format fix only: XML indentation, trailing spaces
---
 .../run/spring/destination/conf/sqlResources.xml   |  52 +-
 server/app/src/main/resources/sqlResources.xml     | 756 +++++++++++----------
 .../src/test/resources/sqlResources-mail.xml       | 567 ++++++++--------
 .../data-jdbc/src/test/resources/sqlResources.xml  | 567 ++++++++--------
 4 files changed, 974 insertions(+), 968 deletions(-)

diff --git a/dockerfiles/run/spring/destination/conf/sqlResources.xml b/dockerfiles/run/spring/destination/conf/sqlResources.xml
index 26cf914..e742057 100644
--- a/dockerfiles/run/spring/destination/conf/sqlResources.xml
+++ b/dockerfiles/run/spring/destination/conf/sqlResources.xml
@@ -1,20 +1,20 @@
 <!--
-  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.                                           
+  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.
  -->
 
 <!--
@@ -497,7 +497,8 @@
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-            )    </sql>
+            )
+        </sql>
         <sql name="createWhiteListTable" db="hsqldb">
             CREATE CACHED TABLE ${table} (
             CREATE TABLE whitelist (
@@ -506,7 +507,8 @@
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-            )    </sql>
+            )
+        </sql>
         <sql name="createWhiteListTable" db="mysql">
             CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
@@ -596,14 +598,16 @@
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost)
-            )    </sql>
+            )
+        </sql>
         <sql name="createNetworkWhiteListTable" db="hsqldb">
             CREATE CACHED TABLE ${table} (
             CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL
-            )    </sql>
+            )
+        </sql>
         <sql name="createNetworkWhiteListTable" db="mysql">
             CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
@@ -693,8 +697,8 @@
             count int NOT NULL,
             create_time datetime NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-            )    </sql>
-
+            )
+        </sql>
         <sql name="createGreyListTable" db="hsqldb">
             CREATE CACHED TABLE ${table} (
             CREATE TABLE greylist (
@@ -704,7 +708,8 @@
             count int NOT NULL,
             create_time timestamo NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-            )    </sql>
+            )
+        </sql>
         <sql name="createGreyListTable" db="mysql">
             CREATE TABLE greylist (
             ipaddress varchar (20) NOT NULL,
@@ -788,4 +793,3 @@
     </sqlDefs>
 
 </sqlResources>
-
diff --git a/server/app/src/main/resources/sqlResources.xml b/server/app/src/main/resources/sqlResources.xml
index 10d6c2b..e742057 100644
--- a/server/app/src/main/resources/sqlResources.xml
+++ b/server/app/src/main/resources/sqlResources.xml
@@ -1,27 +1,27 @@
 <!--
-  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.                                           
+  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.
  -->
 
 <!--
    This template file can be used as example for James Server configuration
    DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS
 -->
- 
+
 <!-- See http://james.apache.org/server/3/config.html for usage -->
 
 <sqlResources>
@@ -40,30 +40,30 @@
      named sql statements, defined below. If no match is found,
      the default sql statements are used.
 -->
-<dbMatchers>
-    <dbMatcher db="mssql" databaseProductName="microsoft sql server"/>
-    <dbMatcher db="oracle" databaseProductName="oracle.*"/>
-    <dbMatcher db="mysql" databaseProductName="my.*"/>
-    <dbMatcher db="derby" databaseProductName="derby.*"/>
-    <dbMatcher db="postgresql" databaseProductName="postgres.*"/>
-    <dbMatcher db="hsqldb" databaseProductName="hsql.*"/>
-    <dbMatcher db="sapdb" databaseProductName="sap.*"/>
-    <dbMatcher db="hypersonic" databaseProductName="HypersonicSQL"/>
-    <dbMatcher db="db2" databaseProductName="db2.*"/>
-    <dbMatcher db="ingres" databaseProductName="ingres.*"/>
-</dbMatchers>
+    <dbMatchers>
+        <dbMatcher db="mssql" databaseProductName="microsoft sql server"/>
+        <dbMatcher db="oracle" databaseProductName="oracle.*"/>
+        <dbMatcher db="mysql" databaseProductName="my.*"/>
+        <dbMatcher db="derby" databaseProductName="derby.*"/>
+        <dbMatcher db="postgresql" databaseProductName="postgres.*"/>
+        <dbMatcher db="hsqldb" databaseProductName="hsql.*"/>
+        <dbMatcher db="sapdb" databaseProductName="sap.*"/>
+        <dbMatcher db="hypersonic" databaseProductName="HypersonicSQL"/>
+        <dbMatcher db="db2" databaseProductName="db2.*"/>
+        <dbMatcher db="ingres" databaseProductName="ingres.*"/>
+    </dbMatchers>
 
 <!--
     With the following section it is possible to associate several name/value pairs
         of options to a database product, identified by the "db" XML attribute name.
-    
+
     An element without a "db" attribute, if used for an option name, will become a default value for such option.
     Each option may have a "default default", i.e. a default that applies if no element with an empty
         "db" attribute (default element) exists as said above;
         such default default must be documented for such option below.
-    
+
     The order of the XML elements is meaningless.
-    
+
     Here only "getBody" and "getAttributes" option names are set, but others could be used in the future.
     Option names:
         "getBody" - a string (case insensitive) telling which JDBC ResultSet method will be used to
@@ -79,30 +79,30 @@
                 "useBytes"  - use getBytes(int).
                 "useBlob"   - use getBlob(int).
 -->
-<dbOptions>
-    <dbOption name="getBody" value="useBytes"/>
-    <dbOption name="getAttributes" value="useBytes"/>
-    <dbOption db="mssql" name="getBody" value="useBytes"/>
-    <dbOption db="mssql" name="getAttributes" value="useBytes"/>
-    <dbOption db="oracle" name="getBody" value="useBlob"/>
-    <dbOption db="oracle" name="getAttributes" value="useBlob"/>
-    <dbOption db="mysql" name="getBody" value="useBytes"/>
-    <dbOption db="mysql" name="getAttributes" value="useBytes"/>
-    <dbOption db="derby" name="getBody" value="useBytes"/>
-    <dbOption db="derby" name="getAttributes" value="useBytes"/>
-    <dbOption db="postgresql" name="getBody" value="useBytes"/>
-    <dbOption db="postgresql" name="getAttributes" value="useBytes"/>
-    <dbOption db="sapdb" name="getBody" value="useBytes"/>
-    <dbOption db="sapdb" name="getAttributes" value="useBytes"/>
-    <dbOption db="hypersonic" name="getBody" value="useBytes"/>
-    <dbOption db="hypersonic" name="getAttributes" value="useBytes"/>
-    <dbOption db="hsqldb" name="getBody" value="useBytes"/>
-    <dbOption db="hsqldb" name="getAttributes" value="useBytes"/>
-    <dbOption db="db2" name="getBody" value="useBlob"/>
-    <dbOption db="db2" name="getAttributes" value="useBlob"/>
-    <dbOption db="ingres" name="getBody" value="useBytes"/>
-    <dbOption db="ingres" name="getAttributes" value="useBytes"/>
-</dbOptions>
+    <dbOptions>
+        <dbOption name="getBody" value="useBytes"/>
+        <dbOption name="getAttributes" value="useBytes"/>
+        <dbOption db="mssql" name="getBody" value="useBytes"/>
+        <dbOption db="mssql" name="getAttributes" value="useBytes"/>
+        <dbOption db="oracle" name="getBody" value="useBlob"/>
+        <dbOption db="oracle" name="getAttributes" value="useBlob"/>
+        <dbOption db="mysql" name="getBody" value="useBytes"/>
+        <dbOption db="mysql" name="getAttributes" value="useBytes"/>
+        <dbOption db="derby" name="getBody" value="useBytes"/>
+        <dbOption db="derby" name="getAttributes" value="useBytes"/>
+        <dbOption db="postgresql" name="getBody" value="useBytes"/>
+        <dbOption db="postgresql" name="getAttributes" value="useBytes"/>
+        <dbOption db="sapdb" name="getBody" value="useBytes"/>
+        <dbOption db="sapdb" name="getAttributes" value="useBytes"/>
+        <dbOption db="hypersonic" name="getBody" value="useBytes"/>
+        <dbOption db="hypersonic" name="getAttributes" value="useBytes"/>
+        <dbOption db="hsqldb" name="getBody" value="useBytes"/>
+        <dbOption db="hsqldb" name="getAttributes" value="useBytes"/>
+        <dbOption db="db2" name="getBody" value="useBlob"/>
+        <dbOption db="db2" name="getAttributes" value="useBlob"/>
+        <dbOption db="ingres" name="getBody" value="useBytes"/>
+        <dbOption db="ingres" name="getAttributes" value="useBytes"/>
+    </dbOptions>
 
 <!-- SQL statements to use for various components. -->
 <!-- -->
@@ -113,59 +113,59 @@
 <!-- then that statement is used. Otherwise the default statement is used. -->
 
 <!-- SQL statements for the JdbcMailRepository  -->
-<sqlDefs name="org.apache.james.mailrepository.jdbc.JDBCMailRepository">
+    <sqlDefs name="org.apache.james.mailrepository.jdbc.JDBCMailRepository">
 
-    <!-- Statements used to check whether a particular message exists in this repository. -->
-    <sql name="checkMessageExistsSQL">SELECT count(*) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to check whether a particular message exists in this repository. -->
+        <sql name="checkMessageExistsSQL">SELECT count(*) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to update a message stored in this repository. -->
-    <sql name="updateMessageSQL">UPDATE ${table} SET message_state = ?, error_message = ?, sender = ?, recipients = ?, remote_host = ?, remote_addr = ?, last_updated = ? WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to update a message stored in this repository. -->
+        <sql name="updateMessageSQL">UPDATE ${table} SET message_state = ?, error_message = ?, sender = ?, recipients = ?, remote_host = ?, remote_addr = ?, last_updated = ? WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to update the body of a message stored in this repository. -->
-    <sql name="updateMessageBodySQL">UPDATE ${table} SET message_body = ? WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to update the body of a message stored in this repository. -->
+        <sql name="updateMessageBodySQL">UPDATE ${table} SET message_body = ? WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to update the attributes of a message stored in this repository. -->
-    <sql name="updateMessageAttributesSQL">UPDATE ${table} SET message_attributes = ? WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to update the attributes of a message stored in this repository. -->
+        <sql name="updateMessageAttributesSQL">UPDATE ${table} SET message_attributes = ? WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to insert a message into this repository. -->
-    <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
-    repository_name, message_state, error_message, sender, recipients,
+        <!-- Statements used to insert a message into this repository. -->
+        <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
+            repository_name, message_state, error_message, sender, recipients,
     remote_host, remote_addr, per_recipient_headers, last_updated, message_body,
     message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
 
-    <!-- Statements used to retrieve a message stored in this repository. -->
+        <!-- Statements used to retrieve a message stored in this repository. -->
     <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, per_recipient_headers, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to retrieve the body of a message stored in this repository. -->
-    <sql name="retrieveMessageBodySQL">SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve the body of a message stored in this repository. -->
+        <sql name="retrieveMessageBodySQL">SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to retrieve the attributes of a message stored in this repository. -->
-    <sql name="retrieveMessageAttributesSQL">SELECT message_attributes FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve the attributes of a message stored in this repository. -->
+        <sql name="retrieveMessageAttributesSQL">SELECT message_attributes FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to retrieve the size of the body of a message stored in this repository. -->
-    <!-- NOTE: This statement is optional and need not be implemented for a particular database to be supported. -->
-    <sql name="retrieveMessageBodySizeSQL" db="mssql">SELECT datalength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="mysql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="hypersonic">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="hsqldb">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="postgresql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="oracle">SELECT dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="db2">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="ingres">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="derby">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve the size of the body of a message stored in this repository. -->
+        <!-- NOTE: This statement is optional and need not be implemented for a particular database to be supported. -->
+        <sql name="retrieveMessageBodySizeSQL" db="mssql">SELECT datalength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="mysql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="hypersonic">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="hsqldb">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="postgresql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="oracle">SELECT dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="db2">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="ingres">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="derby">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to delete a message stored in this repository. -->
-    <sql name="removeMessageSQL">DELETE FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to delete a message stored in this repository. -->
+        <sql name="removeMessageSQL">DELETE FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to list all messages stored in this repository. -->
-    <sql name="listMessagesSQL">SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC</sql>
+        <!-- Statements used to list all messages stored in this repository. -->
+        <sql name="listMessagesSQL">SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC</sql>
 
     <!-- Statements used to count messages stored in this repository. -->
     <sql name="countMessagesSQL">SELECT COUNT(*) FROM ${table}</sql>
 
-    <!-- Statements used to create the table associated with this class. -->
-    <sql name="createTable" db="mysql">
-        CREATE TABLE ${table} (
+        <!-- Statements used to create the table associated with this class. -->
+        <sql name="createTable" db="mysql">
+            CREATE TABLE ${table} (
             message_name varchar (200) NOT NULL,
             repository_name varchar (100) NOT NULL,
             message_state varchar (30) NOT NULL ,
@@ -179,10 +179,10 @@
             message_body longblob NOT NULL ,
             message_attributes longblob NULL ,
             PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="hypersonic">
-        CREATE CACHED TABLE ${table} (
+            )
+        </sql>
+        <sql name="createTable" db="hypersonic">
+            CREATE CACHED TABLE ${table} (
             message_name varchar (200) NOT NULL,
             repository_name varchar (255) NOT NULL,
             message_state varchar (30) NOT NULL ,
@@ -196,10 +196,10 @@
             message_body varchar NOT NULL ,
             message_attributes varchar NULL ,
             PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="hsqldb">
-        CREATE CACHED TABLE ${table} (
+            )
+        </sql>
+        <sql name="createTable" db="hsqldb">
+            CREATE CACHED TABLE ${table} (
             message_name varchar (200) NOT NULL,
             repository_name varchar (255) NOT NULL,
             message_state varchar (30) NOT NULL ,
@@ -213,10 +213,10 @@
             message_body varchar NOT NULL ,
             message_attributes varchar NULL ,
             PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="mssql">
-        CREATE TABLE [${table}] (
+            )
+        </sql>
+        <sql name="createTable" db="mssql">
+            CREATE TABLE [${table}] (
             [message_name] [varchar] (200) NOT NULL,
             [repository_name] [varchar] (255) NOT NULL,
             [message_state] [varchar] (30) NOT NULL ,
@@ -230,10 +230,10 @@
             [message_body] [image] NOT NULL ,
             [message_attributes] [image] NULL ,
             PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="oracle">
-        CREATE TABLE ${table} (
+            )
+        </sql>
+        <sql name="createTable" db="oracle">
+            CREATE TABLE ${table} (
             message_name varchar2(200) NOT NULL ,
             repository_name varchar2(255) NOT NULL ,
             message_state varchar2(30) NOT NULL ,
@@ -247,10 +247,10 @@
             message_body blob NOT NULL ,
             message_attributes blob NULL ,
             PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="postgresql">
-        CREATE TABLE ${table} (
+            )
+        </sql>
+        <sql name="createTable" db="postgresql">
+            CREATE TABLE ${table} (
             message_name varchar (200) NOT NULL,
             repository_name varchar (255) NOT NULL,
             message_state varchar (30) NOT NULL ,
@@ -264,10 +264,10 @@
             message_body bytea NOT NULL ,
             message_attributes bytea NULL ,
             PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="sapdb">
-        CREATE TABLE ${table} (
+            )
+        </sql>
+        <sql name="createTable" db="sapdb">
+            CREATE TABLE ${table} (
             message_name varchar (200) NOT NULL,
             repository_name varchar (200) NOT NULL,
             message_state varchar (30) NOT NULL ,
@@ -281,10 +281,10 @@
             message_body long byte NOT NULL ,
             message_attributes long byte NULL ,
             PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="db2">
-        CREATE TABLE ${table} (
+            )
+        </sql>
+        <sql name="createTable" db="db2">
+            CREATE TABLE ${table} (
             message_name varchar(200) NOT NULL ,
             repository_name varchar(255) NOT NULL ,
             message_state varchar(30) NOT NULL ,
@@ -298,10 +298,10 @@
             message_body blob NOT NULL ,
             message_attributes blob ,
             PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="ingres">
-        CREATE TABLE ${table} (
+            )
+        </sql>
+        <sql name="createTable" db="ingres">
+            CREATE TABLE ${table} (
             message_name varchar (200) NOT NULL,
             repository_name varchar (255) NOT NULL,
             message_state varchar (30) NOT NULL ,
@@ -314,10 +314,10 @@
             last_updated DATE NOT NULL
             message_body LONG BYTE NOT NULL ,
             message_attributes LONG BYTE ,
-        )
-    </sql>
-    <sql name="createTable" db="derby">
-        CREATE TABLE ${table} (
+            )
+        </sql>
+        <sql name="createTable" db="derby">
+            CREATE TABLE ${table} (
             message_name varchar (200) NOT NULL,
             repository_name varchar (255) NOT NULL,
             message_state varchar (30) NOT NULL ,
@@ -331,461 +331,465 @@
             message_body blob NOT NULL ,
             message_attributes blob ,
             PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-</sqlDefs>
+            )
+        </sql>
+    </sqlDefs>
 
 
 <!-- SQL statements to support the BayesianAnalysis and the BayesianAnalysisFeeder mailets -->
 <!-- -->
-<sqlDefs name="org.apache.james.util.bayesian.JDBCBayesianAnalyzer">
+    <sqlDefs name="org.apache.james.util.bayesian.JDBCBayesianAnalyzer">
+
+        <sql name="hamTableName">bayesiananalysis_ham</sql>
+        <sql name="spamTableName">bayesiananalysis_spam</sql>
+        <sql name="messageCountsTableName">bayesiananalysis_messagecounts</sql>
+
+        <!-- Statements used to retrieve the message counts. -->
+        <sql name="selectMessageCounts">SELECT HAMCOUNT, SPAMCOUNT FROM bayesiananalysis_messagecounts</sql>
 
-    <sql name="hamTableName">bayesiananalysis_ham</sql>
-    <sql name="spamTableName">bayesiananalysis_spam</sql>
-    <sql name="messageCountsTableName">bayesiananalysis_messagecounts</sql>
+        <!-- Statements used to initialize the message counts. -->
+        <sql name="initializeMessageCounts">INSERT INTO bayesiananalysis_messagecounts (HAMCOUNT, SPAMCOUNT) VALUES (0,0)</sql>
 
-    <!-- Statements used to retrieve the message counts. -->
-    <sql name="selectMessageCounts">SELECT HAMCOUNT, SPAMCOUNT FROM bayesiananalysis_messagecounts</sql>
+        <!-- Statements used to update the ham message counts. -->
+        <sql name="updateHamMessageCounts">UPDATE bayesiananalysis_messagecounts SET HAMCOUNT=(HAMCOUNT + ?)</sql>
 
-    <!-- Statements used to initialize the message counts. -->
-    <sql name="initializeMessageCounts">INSERT INTO bayesiananalysis_messagecounts (HAMCOUNT, SPAMCOUNT) VALUES (0,0)</sql>
+        <!-- Statements used to update the spam message counts. -->
+        <sql name="updateSpamMessageCounts">UPDATE bayesiananalysis_messagecounts SET SPAMCOUNT=(SPAMCOUNT + ?)</sql>
 
-    <!-- Statements used to update the ham message counts. -->
-    <sql name="updateHamMessageCounts">UPDATE bayesiananalysis_messagecounts SET HAMCOUNT=(HAMCOUNT + ?)</sql>
+        <!-- Statements used to retrieve the ham token counts. -->
+        <sql name="selectHamTokens">SELECT TOKEN, OCCURRENCES FROM bayesiananalysis_ham</sql>
 
-    <!-- Statements used to update the spam message counts. -->
-    <sql name="updateSpamMessageCounts">UPDATE bayesiananalysis_messagecounts SET SPAMCOUNT=(SPAMCOUNT + ?)</sql>
+        <!-- Statements used to retrieve the spam token counts. -->
+        <sql name="selectSpamTokens">SELECT TOKEN, OCCURRENCES FROM bayesiananalysis_spam</sql>
 
-    <!-- Statements used to retrieve the ham token counts. -->
-    <sql name="selectHamTokens">SELECT TOKEN, OCCURRENCES FROM bayesiananalysis_ham</sql>
+        <!-- Statements used to insert the ham token counts. -->
+        <sql name="insertHamToken">INSERT INTO bayesiananalysis_ham (TOKEN, OCCURRENCES) VALUES (?,?)</sql>
 
-    <!-- Statements used to retrieve the spam token counts. -->
-    <sql name="selectSpamTokens">SELECT TOKEN, OCCURRENCES FROM bayesiananalysis_spam</sql>
+        <!-- Statements used to insert the spam token counts. -->
+        <sql name="insertSpamToken">INSERT INTO bayesiananalysis_spam (TOKEN, OCCURRENCES) VALUES (?,?)</sql>
 
-    <!-- Statements used to insert the ham token counts. -->
-    <sql name="insertHamToken">INSERT INTO bayesiananalysis_ham (TOKEN, OCCURRENCES) VALUES (?,?)</sql>
+        <!-- Statements used to update the ham token counts. -->
+        <sql name="updateHamToken">UPDATE bayesiananalysis_ham SET OCCURRENCES=(OCCURRENCES + ?) WHERE (TOKEN=?)</sql>
 
-    <!-- Statements used to insert the spam token counts. -->
-    <sql name="insertSpamToken">INSERT INTO bayesiananalysis_spam (TOKEN, OCCURRENCES) VALUES (?,?)</sql>
+        <!-- Statements used to update the spam token counts. -->
+        <sql name="updateSpamToken">UPDATE bayesiananalysis_spam SET OCCURRENCES=(OCCURRENCES + ?) WHERE (TOKEN=?)</sql>
 
-    <!-- Statements used to update the ham token counts. -->
-    <sql name="updateHamToken">UPDATE bayesiananalysis_ham SET OCCURRENCES=(OCCURRENCES + ?) WHERE (TOKEN=?)</sql>
+        <!-- Statements used to delete ham tokens. -->
+        <sql name="deleteHamTokens">DELETE FROM bayesiananalysis_ham</sql>
 
-    <!-- Statements used to update the spam token counts. -->
-    <sql name="updateSpamToken">UPDATE bayesiananalysis_spam SET OCCURRENCES=(OCCURRENCES + ?) WHERE (TOKEN=?)</sql>
+        <!-- Statements used to delete spam tokens. -->
+        <sql name="deleteSpamTokens">DELETE FROM bayesiananalysis_spam</sql>
 
-    <!-- Statements used to delete ham tokens. -->
-    <sql name="deleteHamTokens">DELETE FROM bayesiananalysis_ham</sql>
-    
-    <!-- Statements used to delete spam tokens. -->
-    <sql name="deleteSpamTokens">DELETE FROM bayesiananalysis_spam</sql>
-    
-    <!-- Statements used to delete message counts. -->
-    <sql name="deleteMessageCounts">DELETE FROM bayesiananalysis_messagecounts</sql>
+        <!-- Statements used to delete message counts. -->
+        <sql name="deleteMessageCounts">DELETE FROM bayesiananalysis_messagecounts</sql>
 
 
-    <!-- Statements used to create the "ham" table (the 'token' field must be case sensitive). -->
-    <sql name="createHamTable" db="mysql">
-        CREATE TABLE bayesiananalysis_ham (
+        <!-- Statements used to create the "ham" table (the 'token' field must be case sensitive). -->
+        <sql name="createHamTable" db="mysql">
+            CREATE TABLE bayesiananalysis_ham (
             token varchar(128) binary NOT NULL default '',
             occurrences int(11) NOT NULL default '0',
             PRIMARY KEY (token)
-        ) TYPE=InnoDB
-    </sql>
-    <sql name="createHamTable" db="mssql">
-        CREATE TABLE [bayesiananalysis_ham] (
-        [token] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL,
-        [occurrences] [int] NOT NULL default (0),
+            ) TYPE=InnoDB
+        </sql>
+        <sql name="createHamTable" db="mssql">
+            CREATE TABLE [bayesiananalysis_ham] (
+            [token] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL,
+            [occurrences] [int] NOT NULL default (0),
             PRIMARY KEY (token)
-        )
-    </sql>
-    <sql name="createHamTable" db="derby">
-        CREATE TABLE bayesiananalysis_ham (
+            )
+        </sql>
+        <sql name="createHamTable" db="derby">
+            CREATE TABLE bayesiananalysis_ham (
             token varchar(128) NOT NULL,
             occurrences INTEGER NOT NULL default 0,
             PRIMARY KEY (token)
-        )
-    </sql>
-    <sql name="createHamTable" db="postgresql">
-        CREATE TABLE bayesiananalysis_ham (
+            )
+        </sql>
+        <sql name="createHamTable" db="postgresql">
+            CREATE TABLE bayesiananalysis_ham (
             token varchar(128) NOT NULL,
             occurrences int NOT NULL default 0,
             PRIMARY KEY (token)
-        )
-    </sql>
+            )
+        </sql>
 
-    <!-- Statements used to create the "spam" table (the 'token' field must be case sensitive). -->
-    <sql name="createSpamTable" db="mysql">
-        CREATE TABLE bayesiananalysis_spam (
+        <!-- Statements used to create the "spam" table (the 'token' field must be case sensitive). -->
+        <sql name="createSpamTable" db="mysql">
+            CREATE TABLE bayesiananalysis_spam (
             token varchar(128) binary NOT NULL default '',
             occurrences int(11) NOT NULL default '0',
             PRIMARY KEY (token)
-        ) TYPE=InnoDB
-    </sql>
-    <sql name="createSpamTable" db="mssql">
-        CREATE TABLE [bayesiananalysis_spam] (
-        [token] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL,
-        [occurrences] [int] NOT NULL default (0),
+            ) TYPE=InnoDB
+        </sql>
+        <sql name="createSpamTable" db="mssql">
+            CREATE TABLE [bayesiananalysis_spam] (
+            [token] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL,
+            [occurrences] [int] NOT NULL default (0),
             PRIMARY KEY (token)
-        )
-    </sql>
-    <sql name="createSpamTable" db="derby">
-        CREATE TABLE bayesiananalysis_spam (
+            )
+        </sql>
+        <sql name="createSpamTable" db="derby">
+            CREATE TABLE bayesiananalysis_spam (
             token varchar (128) NOT NULL,
             occurrences INTEGER  NOT NULL default 0,
             PRIMARY KEY (token)
-        )
-    </sql>
-    <sql name="createSpamTable" db="postgresql">
-        CREATE TABLE bayesiananalysis_spam (
+            )
+        </sql>
+        <sql name="createSpamTable" db="postgresql">
+            CREATE TABLE bayesiananalysis_spam (
             token varchar (128) NOT NULL,
             occurrences int  NOT NULL default 0,
             PRIMARY KEY (token)
-        )
-    </sql>
+            )
+        </sql>
 
-    <!-- Statements used to create the "message counts" table. -->
-    <sql name="createMessageCountsTable" db="mysql">
-        CREATE TABLE bayesiananalysis_messagecounts (
+        <!-- Statements used to create the "message counts" table. -->
+        <sql name="createMessageCountsTable" db="mysql">
+            CREATE TABLE bayesiananalysis_messagecounts (
             hamcount int(11) NOT NULL default '0',
             spamcount int(11) NOT NULL default '0'
-        ) TYPE=InnoDB
-    </sql>
-    <sql name="createMessageCountsTable" db="mssql">
-        CREATE TABLE [bayesiananalysis_messagecounts] (
-        [hamcount] [int] NOT NULL default (0),
-        [spamcount] [int] NOT NULL default (0)
-        )
-    </sql>
-    <sql name="createMessageCountsTable" db="derby">
-        CREATE TABLE bayesiananalysis_messagecounts (
+            ) TYPE=InnoDB
+        </sql>
+        <sql name="createMessageCountsTable" db="mssql">
+            CREATE TABLE [bayesiananalysis_messagecounts] (
+            [hamcount] [int] NOT NULL default (0),
+            [spamcount] [int] NOT NULL default (0)
+            )
+        </sql>
+        <sql name="createMessageCountsTable" db="derby">
+            CREATE TABLE bayesiananalysis_messagecounts (
             hamcount INTEGER NOT NULL default 0,
             spamcount INTEGER  NOT NULL default 0
-        )
-    </sql>
-    <sql name="createMessageCountsTable" db="postgresql">
-        CREATE TABLE bayesiananalysis_messagecounts (
+            )
+        </sql>
+        <sql name="createMessageCountsTable" db="postgresql">
+            CREATE TABLE bayesiananalysis_messagecounts (
             hamcount int NOT NULL default 0,
             spamcount int  NOT NULL default 0
-        )
-    </sql>
-</sqlDefs>
+            )
+        </sql>
+    </sqlDefs>
 
 <!-- SQL statements to support the WhiteListManager mailet and the IsInWhiteList matcher -->
 <!-- -->
-<sqlDefs name="WhiteList">
+    <sqlDefs name="WhiteList">
 
-    <sql name="whiteListTableName">whitelist</sql>
+        <sql name="whiteListTableName">whitelist</sql>
 
-    <!-- Statements used to retrieve a single entry. -->
-    <sql name="selectByPK">SELECT localUser, localHost FROM whitelist where (localUser=? AND localHost=? AND remoteUser=? AND remoteHost=?)</sql>
+        <!-- Statements used to retrieve a single entry. -->
+        <sql name="selectByPK">SELECT localUser, localHost FROM whitelist where (localUser=? AND localHost=? AND remoteUser=? AND remoteHost=?)</sql>
 
-    <!-- Statements used to all entries by sender address. -->
-    <sql name="selectBySender">SELECT remoteUser, remoteHost FROM whitelist where (localUser=? AND localHost=?) ORDER BY remoteUser, remoteHost</sql>
+        <!-- Statements used to all entries by sender address. -->
+        <sql name="selectBySender">SELECT remoteUser, remoteHost FROM whitelist where (localUser=? AND localHost=?) ORDER BY remoteUser, remoteHost</sql>
 
-    <!-- Statements used to insert an entry. -->
-    <sql name="insert">INSERT INTO whitelist (localUser, localHost, remoteUser, remoteHost) VALUES (?,?,?,?)</sql>
+        <!-- Statements used to insert an entry. -->
+        <sql name="insert">INSERT INTO whitelist (localUser, localHost, remoteUser, remoteHost) VALUES (?,?,?,?)</sql>
 
-    <!-- Statements used to delete an entry. -->
-    <sql name="deleteByPK">DELETE FROM whitelist where (localUser=? AND localHost=? AND remoteUser=? AND remoteHost=?)</sql>
+        <!-- Statements used to delete an entry. -->
+        <sql name="deleteByPK">DELETE FROM whitelist where (localUser=? AND localHost=? AND remoteUser=? AND remoteHost=?)</sql>
 
-    <!-- Statements used to create the "whitelist" table. -->
-    <sql name="createWhiteListTable" db="hypersonic">
-        CREATE TABLE whitelist (
+        <!-- Statements used to create the "whitelist" table. -->
+        <sql name="createWhiteListTable" db="hypersonic">
+            CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        )    </sql>
-    <sql name="createWhiteListTable" db="hsqldb">
-        CREATE CACHED TABLE ${table} (
-        CREATE TABLE whitelist (
+            )
+        </sql>
+        <sql name="createWhiteListTable" db="hsqldb">
+            CREATE CACHED TABLE ${table} (
+            CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        )    </sql>
-    <sql name="createWhiteListTable" db="mysql">
-        CREATE TABLE whitelist (
+            )
+        </sql>
+        <sql name="createWhiteListTable" db="mysql">
+            CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) character set latin1 NOT NULL,
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) character set latin1 NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        ) TYPE=InnoDB
-    </sql>
-    <sql name="createWhiteListTable" db="mssql">
-        CREATE TABLE [whitelist] (
+            ) TYPE=InnoDB
+        </sql>
+        <sql name="createWhiteListTable" db="mssql">
+            CREATE TABLE [whitelist] (
             [localUser] [varchar] (64) NOT NULL,
             [localHost] [varchar] (255) NOT NULL,
             [remoteUser] [varchar] (64) NOT NULL,
             [remoteHost] [varchar] (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        )
-    </sql>
-    <sql name="createWhiteListTable" db="oracle">
-        CREATE TABLE whitelist (
+            )
+        </sql>
+        <sql name="createWhiteListTable" db="oracle">
+            CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        )
-    </sql>
-    <sql name="createWhiteListTable" db="postgresql">
-        CREATE TABLE whitelist (
+            )
+        </sql>
+        <sql name="createWhiteListTable" db="postgresql">
+            CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        )
-    </sql>
-    <sql name="createWhiteListTable" db="sapdb">
-        CREATE TABLE whitelist (
+            )
+        </sql>
+        <sql name="createWhiteListTable" db="sapdb">
+            CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        )
-    </sql>
-    <sql name="createWhiteListTable" db="db2">
-        CREATE TABLE whitelist (
+            )
+        </sql>
+        <sql name="createWhiteListTable" db="db2">
+            CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        )
-    </sql>
-    <sql name="createWhiteListTable" db="ingres">
-        CREATE TABLE whitelist (
+            )
+        </sql>
+        <sql name="createWhiteListTable" db="ingres">
+            CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        )
-    </sql>
-    <sql name="createWhiteListTable" db="derby">
-        CREATE TABLE whitelist (
+            )
+        </sql>
+        <sql name="createWhiteListTable" db="derby">
+            CREATE TABLE whitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             remoteUser varchar (64) NOT NULL,
             remoteHost varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost, remoteUser, remoteHost)
-        )
-    </sql>
+            )
+        </sql>
 
-</sqlDefs>
+    </sqlDefs>
 
-<sqlDefs name="NetworkWhiteList">
+    <sqlDefs name="NetworkWhiteList">
 
-    <sql name="networkWhiteListTableName">networkWhitelist</sql>
+        <sql name="networkWhiteListTableName">networkWhitelist</sql>
 
-    <!-- Statements used to retrieve a single entry. -->
-    <sql name="selectNetwork">SELECT network FROM networkWhitelist where (localUser=? AND localHost=?)</sql>
+        <!-- Statements used to retrieve a single entry. -->
+        <sql name="selectNetwork">SELECT network FROM networkWhitelist where (localUser=? AND localHost=?)</sql>
 
-    <!-- Statements used to create the "whitelist" table. -->
-    <sql name="createNetworkWhiteListTable" db="hypersonic">
-        CREATE TABLE networkWhitelist (
+        <!-- Statements used to create the "whitelist" table. -->
+        <sql name="createNetworkWhiteListTable" db="hypersonic">
+            CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL,
             PRIMARY KEY (localUser, localHost)
-        )    </sql>
-    <sql name="createNetworkWhiteListTable" db="hsqldb">
-        CREATE CACHED TABLE ${table} (
-        CREATE TABLE networkWhitelist (
+            )
+        </sql>
+        <sql name="createNetworkWhiteListTable" db="hsqldb">
+            CREATE CACHED TABLE ${table} (
+            CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL
-        )    </sql>
-    <sql name="createNetworkWhiteListTable" db="mysql">
-        CREATE TABLE networkWhitelist (
+            )
+        </sql>
+        <sql name="createNetworkWhiteListTable" db="mysql">
+            CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) character set latin1 NOT NULL,
             network varchar (255) NOT NULL
-        ) TYPE=InnoDB
-    </sql>
-    <sql name="createNetworkWhiteListTable" db="mssql">
-        CREATE TABLE [networkWhitelist] (
+            ) TYPE=InnoDB
+        </sql>
+        <sql name="createNetworkWhiteListTable" db="mssql">
+            CREATE TABLE [networkWhitelist] (
             [localUser] [varchar] (64) NOT NULL,
             [localHost] [varchar] (255) NOT NULL,
             [network] [varchar] (255) NOT NULL
-        )
-    </sql>
-    <sql name="createNetworkWhiteListTable" db="oracle">
-        CREATE TABLE networkWhitelist (
+            )
+        </sql>
+        <sql name="createNetworkWhiteListTable" db="oracle">
+            CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL
-        )
-    </sql>
-    <sql name="createNetworkWhiteListTable" db="postgresql">
-        CREATE TABLE networkWhitelist (
+            )
+        </sql>
+        <sql name="createNetworkWhiteListTable" db="postgresql">
+            CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL
-        )
-    </sql>
-    <sql name="createNetworkWhiteListTable" db="sapdb">
-        CREATE TABLE networkWhitelist (
+            )
+        </sql>
+        <sql name="createNetworkWhiteListTable" db="sapdb">
+            CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL
-        )
-    </sql>
-    <sql name="createNetworkWhiteListTable" db="db2">
-        CREATE TABLE networkWhitelist (
+            )
+        </sql>
+        <sql name="createNetworkWhiteListTable" db="db2">
+            CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL
-        )
-    </sql>
-    <sql name="createNetworkWhiteListTable" db="ingres">
-        CREATE TABLE networkWhitelist (
+            )
+        </sql>
+        <sql name="createNetworkWhiteListTable" db="ingres">
+            CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL
-        )
-    </sql>
-    <sql name="createNetworkWhiteListTable" db="derby">
-        CREATE TABLE networkWhitelist (
+            )
+        </sql>
+        <sql name="createNetworkWhiteListTable" db="derby">
+            CREATE TABLE networkWhitelist (
             localUser varchar (64) NOT NULL,
             localHost varchar (255) NOT NULL,
             network varchar (255) NOT NULL
-        )
-    </sql>
+            )
+        </sql>
 
-</sqlDefs>
+    </sqlDefs>
 
 <!-- SQL statements to support the GreyList Handler-->
 <!-- -->
-<sqlDefs name="GreyList">
+    <sqlDefs name="GreyList">
 
-    <sql name="greyListTableName">greylist</sql>
+        <sql name="greyListTableName">greylist</sql>
 
-    <!-- Statements used to retrieve a single entry. -->
-    <sql name="selectQuery">SELECT create_time,count FROM greylist WHERE ipaddress = ? AND sender = ? AND recip = ?</sql>
+        <!-- Statements used to retrieve a single entry. -->
+        <sql name="selectQuery">SELECT create_time,count FROM greylist WHERE ipaddress = ? AND sender = ? AND recip = ?</sql>
 
-    <!-- Statements used to insert an entry. -->
-    <sql name="insertQuery">INSERT INTO greylist (ipaddress,sender,recip,count,create_time) values (?,?,?,?,?)</sql>
+        <!-- Statements used to insert an entry. -->
+        <sql name="insertQuery">INSERT INTO greylist (ipaddress,sender,recip,count,create_time) values (?,?,?,?,?)</sql>
 
-    <!-- Statements used to delete an entry. -->
-    <sql name="deleteQuery">DELETE FROM greylist WHERE create_time &lt; ? AND count = 0</sql>
-    
-    <!-- Statements used to delete an entry. -->
-    <sql name="deleteAutoWhitelistQuery">DELETE FROM greylist WHERE create_time &lt; ?</sql>
-    
-    <!-- Statements used to delete an entry. -->
-    <sql name="updateQuery">UPDATE greylist SET create_time = ? , count = ? WHERE ipaddress = ? AND sender = ? AND recip = ?</sql>
+        <!-- Statements used to delete an entry. -->
+        <sql name="deleteQuery">DELETE FROM greylist WHERE create_time &lt; ? AND count = 0</sql>
 
-    <!-- Statements used to create the "whitelist" table. -->
-    <sql name="createGreyListTable" db="hypersonic">
-        CREATE TABLE greylist (
+        <!-- Statements used to delete an entry. -->
+        <sql name="deleteAutoWhitelistQuery">DELETE FROM greylist WHERE create_time &lt; ?</sql>
+
+        <!-- Statements used to delete an entry. -->
+        <sql name="updateQuery">UPDATE greylist SET create_time = ? , count = ? WHERE ipaddress = ? AND sender = ? AND recip = ?</sql>
+
+        <!-- Statements used to create the "whitelist" table. -->
+        <sql name="createGreyListTable" db="hypersonic">
+            CREATE TABLE greylist (
             ipaddress varchar (20) NOT NULL,
             sender varchar (255) NOT NULL,
             recip varchar (255) NOT NULL,
             count int NOT NULL,
-            create_time datetime NOT NULL,           
+            create_time datetime NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        )    </sql>
-        
-    <sql name="createGreyListTable" db="hsqldb">
-        CREATE CACHED TABLE ${table} (
-        CREATE TABLE greylist (
+            )
+        </sql>
+        <sql name="createGreyListTable" db="hsqldb">
+            CREATE CACHED TABLE ${table} (
+            CREATE TABLE greylist (
             ipaddress varchar (20) NOT NULL,
             sender varchar (255) NOT NULL,
             recip varchar (255) NOT NULL,
             count int NOT NULL,
-            create_time timestamo NOT NULL,  
+            create_time timestamo NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        )    </sql>
-    <sql name="createGreyListTable" db="mysql">
+            )
+        </sql>
+        <sql name="createGreyListTable" db="mysql">
             CREATE TABLE greylist (
             ipaddress varchar (20) NOT NULL,
             sender varchar (255) NOT NULL,
             recip varchar (255) NOT NULL,
             count int NOT NULL,
-            create_time datetime NOT NULL,  
+            create_time datetime NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        ) TYPE=InnoDB
-    </sql>
-    <sql name="createGreyListTable" db="mssql">
-        CREATE TABLE [greylist] (
+            ) TYPE=InnoDB
+        </sql>
+        <sql name="createGreyListTable" db="mssql">
+            CREATE TABLE [greylist] (
             [ipaddress] [varchar] (20) NOT NULL,
             [sender] [varchar] (255) NOT NULL,
             [recip] [varchar] (255) NOT NULL,
             [count] [int] NOT NULL,
-            [create_time] [datetime] NOT NULL,  
+            [create_time] [datetime] NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        )
-    </sql>
-    <sql name="createGreyListTable" db="oracle">
+            )
+        </sql>
+        <sql name="createGreyListTable" db="oracle">
             CREATE TABLE greylist (
             ipaddress varchar2(20) NOT NULL,
             sender varchar2(255) NOT NULL,
             recip varchar2(255) NOT NULL,
             count int NOT NULL,
-            create_time datetime NOT NULL,  
+            create_time datetime NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        )
-    </sql>
-    <sql name="createGreyListTable" db="postgresql">
+            )
+        </sql>
+        <sql name="createGreyListTable" db="postgresql">
             CREATE TABLE greylist (
             ipaddress varchar (20) NOT NULL,
             sender varchar (255) NOT NULL,
             recip varchar (255) NOT NULL,
             count int NOT NULL,
-            create_time timestamp NOT NULL,  
+            create_time timestamp NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        )
-    </sql>
-    <sql name="createGreyListTable" db="sapdb">
+            )
+        </sql>
+        <sql name="createGreyListTable" db="sapdb">
             CREATE TABLE greylist (
             ipaddress varchar (20) NOT NULL,
             sender varchar (255) NOT NULL,
             recip varchar (255) NOT NULL,
             count int NOT NULL,
-            create_time date NOT NULL,  
+            create_time date NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        )
-    </sql>
-    <sql name="createGreyListTable" db="db2">
+            )
+        </sql>
+        <sql name="createGreyListTable" db="db2">
             CREATE TABLE greylist (
             ipaddress varchar (20) NOT NULL,
             sender varchar (255) NOT NULL,
             recip varchar (255) NOT NULL,
             count int NOT NULL,
-            create_time timestamp NOT NULL,  
+            create_time timestamp NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        )
-    </sql>
-    <sql name="createGreyListTable" db="ingres">
+            )
+        </sql>
+        <sql name="createGreyListTable" db="ingres">
             CREATE TABLE greylist (
             ipaddress varchar (20) NOT NULL,
             sender varchar (255) NOT NULL,
             recip varchar (255) NOT NULL,
             count int NOT NULL,
-            create_time date NOT NULL,  
+            create_time date NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        )
-    </sql>
-    <sql name="createGreyListTable" db="derby">
+            )
+        </sql>
+        <sql name="createGreyListTable" db="derby">
             CREATE TABLE greylist (
             ipaddress varchar (20) NOT NULL,
             sender varchar (255) NOT NULL,
             recip varchar (255) NOT NULL,
             count int NOT NULL,
-            create_time timestamp NOT NULL,  
+            create_time timestamp NOT NULL,
             PRIMARY KEY (ipaddress,sender,recip)
-        )
-    </sql>
-</sqlDefs>
+            )
+        </sql>
+    </sqlDefs>
 
 </sqlResources>
-
diff --git a/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml b/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml
index 4b17cff..3257670 100644
--- a/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml
+++ b/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml
@@ -19,306 +19,305 @@
 <!-- SQL Statements used by James for database access. -->
 <sqlResources>
 
-<!--
-     This section provided configuration to determine the determine the
-     database product which is being used for storage. Different database
-     products may require different SQL syntax.
+    <!--
+         This section provided configuration to determine the determine the
+         database product which is being used for storage. Different database
+         products may require different SQL syntax.
 
-     The jdbc database connection is examined to see if it matches with the
-     regular expressions specified in any of the defined matchers. The matchers
-     are processed in the over provided here, with the first successful match
-     defining the "db" value for this connection.
+         The jdbc database connection is examined to see if it matches with the
+         regular expressions specified in any of the defined matchers. The matchers
+         are processed in the over provided here, with the first successful match
+         defining the "db" value for this connection.
 
-     This value is then used to choose between different definitions for various
-     named sql statements, defined below. If no match is found,
-     the default sql statements are used.
--->
-<dbMatchers>
-    <dbMatcher db="mssql" databaseProductName="microsoft sql server"/>
-    <dbMatcher db="oracle" databaseProductName="oracle.*"/>
-    <dbMatcher db="mysql" databaseProductName="my.*"/>
-    <dbMatcher db="derby" databaseProductName="derby.*"/>
-    <dbMatcher db="postgresql" databaseProductName="postgres.*"/>
-    <dbMatcher db="hsqldb" databaseProductName="hsql.*"/>
-    <dbMatcher db="sapdb" databaseProductName="sap.*"/>
-    <dbMatcher db="hypersonic" databaseProductName="HypersonicSQL"/>
-    <dbMatcher db="db2" databaseProductName="db2.*"/>
-    <dbMatcher db="ingres" databaseProductName="ingres.*"/>
-</dbMatchers>
+         This value is then used to choose between different definitions for various
+         named sql statements, defined below. If no match is found,
+         the default sql statements are used.
+    -->
+    <dbMatchers>
+        <dbMatcher db="mssql" databaseProductName="microsoft sql server"/>
+        <dbMatcher db="oracle" databaseProductName="oracle.*"/>
+        <dbMatcher db="mysql" databaseProductName="my.*"/>
+        <dbMatcher db="derby" databaseProductName="derby.*"/>
+        <dbMatcher db="postgresql" databaseProductName="postgres.*"/>
+        <dbMatcher db="hsqldb" databaseProductName="hsql.*"/>
+        <dbMatcher db="sapdb" databaseProductName="sap.*"/>
+        <dbMatcher db="hypersonic" databaseProductName="HypersonicSQL"/>
+        <dbMatcher db="db2" databaseProductName="db2.*"/>
+        <dbMatcher db="ingres" databaseProductName="ingres.*"/>
+    </dbMatchers>
 
-<!--
-    With the following section it is possible to associate several name/value pairs
-        of options to a database product, identified by the "db" XML attribute name.
-    
-    An element without a "db" attribute, if used for an option name, will become a default value for such option.
-    Each option may have a "default default", i.e. a default that applies if no element with an empty
-        "db" attribute (default element) exists as said above;
-        such default default must be documented for such option below.
-    
-    The order of the XML elements is meaningless.
-    
-    Here only "getBody" and "getAttributes" option names are set, but others could be used in the future.
-    Option names:
-        "getBody" - a string (case insensitive) telling which JDBC ResultSet method will be used to
-            get the message body field for a database product.
-            The default default value is "useBytes"..
-            Values (case insensitive):
-                "useBytes"  - use getBytes(int).
-                "useBlob"   - use getBlob(int).
-        "getAttributes" - a string (case insensitive) telling which JDBC ResultSet method will be used to
-            get the message attributes field for a database product.
-           The default default value is "useBytes"..
-            Values (case insensitive):
-                "useBytes"  - use getBytes(int).
-                "useBlob"   - use getBlob(int).
--->
-<dbOptions>
-    <dbOption name="getBody" value="useBytes"/>
-    <dbOption name="getAttributes" value="useBytes"/>
-    <dbOption db="mssql" name="getBody" value="useBytes"/>
-    <dbOption db="mssql" name="getAttributes" value="useBytes"/>
-    <dbOption db="oracle" name="getBody" value="useBlob"/>
-    <dbOption db="oracle" name="getAttributes" value="useBlob"/>
-    <dbOption db="mysql" name="getBody" value="useBytes"/>
-    <dbOption db="mysql" name="getAttributes" value="useBytes"/>
-    <dbOption db="derby" name="getBody" value="useBytes"/>
-    <dbOption db="derby" name="getAttributes" value="useBytes"/>
-    <dbOption db="postgresql" name="getBody" value="useBytes"/>
-    <dbOption db="postgresql" name="getAttributes" value="useBytes"/>
-    <dbOption db="sapdb" name="getBody" value="useBytes"/>
-    <dbOption db="sapdb" name="getAttributes" value="useBytes"/>
-    <dbOption db="hypersonic" name="getBody" value="useBytes"/>
-    <dbOption db="hypersonic" name="getAttributes" value="useBytes"/>
-    <dbOption db="hsqldb" name="getBody" value="useBytes"/>
-    <dbOption db="hsqldb" name="getAttributes" value="useBytes"/>
-    <dbOption db="db2" name="getBody" value="useBlob"/>
-    <dbOption db="db2" name="getAttributes" value="useBlob"/>
-    <dbOption db="ingres" name="getBody" value="useBytes"/>
-    <dbOption db="ingres" name="getAttributes" value="useBytes"/>
-</dbOptions>
+    <!--
+        With the following section it is possible to associate several name/value pairs
+            of options to a database product, identified by the "db" XML attribute name.
+        
+        An element without a "db" attribute, if used for an option name, will become a default value for such option.
+        Each option may have a "default default", i.e. a default that applies if no element with an empty
+            "db" attribute (default element) exists as said above;
+            such default default must be documented for such option below.
+        
+        The order of the XML elements is meaningless.
+        
+        Here only "getBody" and "getAttributes" option names are set, but others could be used in the future.
+        Option names:
+            "getBody" - a string (case insensitive) telling which JDBC ResultSet method will be used to
+                get the message body field for a database product.
+                The default default value is "useBytes"..
+                Values (case insensitive):
+                    "useBytes"  - use getBytes(int).
+                    "useBlob"   - use getBlob(int).
+            "getAttributes" - a string (case insensitive) telling which JDBC ResultSet method will be used to
+                get the message attributes field for a database product.
+               The default default value is "useBytes"..
+                Values (case insensitive):
+                    "useBytes"  - use getBytes(int).
+                    "useBlob"   - use getBlob(int).
+    -->
+    <dbOptions>
+        <dbOption name="getBody" value="useBytes"/>
+        <dbOption name="getAttributes" value="useBytes"/>
+        <dbOption db="mssql" name="getBody" value="useBytes"/>
+        <dbOption db="mssql" name="getAttributes" value="useBytes"/>
+        <dbOption db="oracle" name="getBody" value="useBlob"/>
+        <dbOption db="oracle" name="getAttributes" value="useBlob"/>
+        <dbOption db="mysql" name="getBody" value="useBytes"/>
+        <dbOption db="mysql" name="getAttributes" value="useBytes"/>
+        <dbOption db="derby" name="getBody" value="useBytes"/>
+        <dbOption db="derby" name="getAttributes" value="useBytes"/>
+        <dbOption db="postgresql" name="getBody" value="useBytes"/>
+        <dbOption db="postgresql" name="getAttributes" value="useBytes"/>
+        <dbOption db="sapdb" name="getBody" value="useBytes"/>
+        <dbOption db="sapdb" name="getAttributes" value="useBytes"/>
+        <dbOption db="hypersonic" name="getBody" value="useBytes"/>
+        <dbOption db="hypersonic" name="getAttributes" value="useBytes"/>
+        <dbOption db="hsqldb" name="getBody" value="useBytes"/>
+        <dbOption db="hsqldb" name="getAttributes" value="useBytes"/>
+        <dbOption db="db2" name="getBody" value="useBlob"/>
+        <dbOption db="db2" name="getAttributes" value="useBlob"/>
+        <dbOption db="ingres" name="getBody" value="useBytes"/>
+        <dbOption db="ingres" name="getAttributes" value="useBytes"/>
+    </dbOptions>
 
-<!-- SQL statements for the JdbcMailRepository  -->
-<sqlDefs name="org.apache.james.mailrepository.jdbc.JDBCMailRepository">
+    <!-- SQL statements for the JdbcMailRepository  -->
+    <sqlDefs name="org.apache.james.mailrepository.jdbc.JDBCMailRepository">
 
-    <!-- Statements used to check whether a particular message exists in this repository. -->
-    <sql name="checkMessageExistsSQL">SELECT count(*) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to check whether a particular message exists in this repository. -->
+        <sql name="checkMessageExistsSQL">SELECT count(*) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to update a message stored in this repository. -->
-    <sql name="updateMessageSQL">UPDATE ${table} SET message_state = ?, error_message = ?, sender = ?, recipients = ?, remote_host = ?, remote_addr = ?, last_updated = ? WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to update a message stored in this repository. -->
+        <sql name="updateMessageSQL">UPDATE ${table} SET message_state = ?, error_message = ?, sender = ?, recipients = ?, remote_host = ?, remote_addr = ?, last_updated = ? WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to update the body of a message stored in this repository. -->
-    <sql name="updateMessageBodySQL">UPDATE ${table} SET message_body = ? WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to update the body of a message stored in this repository. -->
+        <sql name="updateMessageBodySQL">UPDATE ${table} SET message_body = ? WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to update the attributes of a message stored in this repository. -->
-    <sql name="updateMessageAttributesSQL">UPDATE ${table} SET message_attributes = ? WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to update the attributes of a message stored in this repository. -->
+        <sql name="updateMessageAttributesSQL">UPDATE ${table} SET message_attributes = ? WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to insert a message into this repository. -->
-    <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
-    repository_name, message_state, error_message, sender, recipients,
-    remote_host, remote_addr, per_recipient_headers, last_updated, message_body,
-    message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
+        <!-- Statements used to insert a message into this repository. -->
+        <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
+        repository_name, message_state, error_message, sender, recipients,
+        remote_host, remote_addr, per_recipient_headers, last_updated, message_body,
+        message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
 
-    <!-- Statements used to retrieve a message stored in this repository. -->
-    <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, per_recipient_headers, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve a message stored in this repository. -->
+        <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, per_recipient_headers, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to retrieve the body of a message stored in this repository. -->
-    <sql name="retrieveMessageBodySQL">SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve the body of a message stored in this repository. -->
+        <sql name="retrieveMessageBodySQL">SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to retrieve the attributes of a message stored in this repository. -->
-    <sql name="retrieveMessageAttributesSQL">SELECT message_attributes FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve the attributes of a message stored in this repository. -->
+        <sql name="retrieveMessageAttributesSQL">SELECT message_attributes FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to retrieve the size of the body of a message stored in this repository. -->
-    <!-- NOTE: This statement is optional and need not be implemented for a particular database to be supported. -->
-    <sql name="retrieveMessageBodySizeSQL" db="mssql">SELECT datalength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="mysql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="hypersonic">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="hsqldb">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="postgresql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="oracle">SELECT dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="db2">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="ingres">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="derby">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve the size of the body of a message stored in this repository. -->
+        <!-- NOTE: This statement is optional and need not be implemented for a particular database to be supported. -->
+        <sql name="retrieveMessageBodySizeSQL" db="mssql">SELECT datalength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="mysql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="hypersonic">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="hsqldb">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="postgresql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="oracle">SELECT dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="db2">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="ingres">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="derby">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to delete a message stored in this repository. -->
-    <sql name="removeMessageSQL">DELETE FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to delete a message stored in this repository. -->
+        <sql name="removeMessageSQL">DELETE FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to list all messages stored in this repository. -->
-    <sql name="listMessagesSQL">SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC</sql>
+        <!-- Statements used to list all messages stored in this repository. -->
+        <sql name="listMessagesSQL">SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC</sql>
 
-    <!-- Statements used to count messages stored in this repository. -->
-    <sql name="countMessagesSQL">SELECT COUNT(*) FROM ${table}</sql>
+        <!-- Statements used to count messages stored in this repository. -->
+        <sql name="countMessagesSQL">SELECT COUNT(*) FROM ${table}</sql>
 
-    <!-- Statements used to create the table associated with this class. -->
-    <sql name="createTable" db="mysql">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (100) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (255) NULL ,
-            recipients text NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers longblob NULL ,
-            last_updated datetime NOT NULL,
-            message_body longblob NOT NULL ,
-            message_attributes longblob NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="hypersonic">
-        CREATE CACHED TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (255) NULL ,
-            recipients varchar NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers varchar NULL ,
-            last_updated timestamp NOT NULL,
-            message_body varchar NOT NULL ,
-            message_attributes varchar NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="hsqldb">
-        CREATE CACHED TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (255) NULL ,
-            recipients varchar NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers varchar NULL ,
-            last_updated timestamp NOT NULL,
-            message_body varchar NOT NULL ,
-            message_attributes varchar NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="mssql">
-        CREATE TABLE [${table}] (
-            [message_name] [varchar] (200) NOT NULL,
-            [repository_name] [varchar] (255) NOT NULL,
-            [message_state] [varchar] (30) NOT NULL ,
-            [error_message] [varchar] (1000) NULL ,
-            [sender] [varchar] (255) NULL ,
-            [recipients] [text] NOT NULL ,
-            [remote_host] [varchar] (255) NOT NULL ,
-            [remote_addr] [varchar] (20) NOT NULL ,
-            [per_recipient_headers] [image] NULL ,
-            [last_updated] [datetime] NOT NULL,
-            [message_body] [image] NOT NULL ,
-            [message_attributes] [image] NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="oracle">
-        CREATE TABLE ${table} (
-            message_name varchar2(200) NOT NULL ,
-            repository_name varchar2(255) NOT NULL ,
-            message_state varchar2(30) NOT NULL ,
-            error_message varchar2(200) NULL ,
-            sender varchar2(255) ,
-            recipients varchar2(1000) NOT NULL ,
-            remote_host varchar2(100) NOT NULL ,
-            remote_addr varchar2(20) NOT NULL ,
-            per_recipient_headers blob NULL ,
-            last_updated date NOT NULL ,
-            message_body blob NOT NULL ,
-            message_attributes blob NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="postgresql">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (255) NULL ,
-            recipients text NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers oid NULL ,
-            last_updated timestamp NOT NULL,
-            message_body bytea NOT NULL ,
-            message_attributes bytea NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="sapdb">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (200) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (200) NULL ,
-            recipients long NOT NULL ,
-            remote_host varchar (100) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers long byte NULL ,
-            last_updated date NOT NULL,
-            message_body long byte NOT NULL ,
-            message_attributes long byte NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="db2">
-        CREATE TABLE ${table} (
-            message_name varchar(200) NOT NULL ,
-            repository_name varchar(255) NOT NULL ,
-            message_state varchar(30) NOT NULL ,
-            error_message varchar(200) ,
-            sender varchar(255) ,
-            recipients varchar(1000) NOT NULL ,
-            remote_host varchar(100) NOT NULL ,
-            remote_addr varchar(20) NOT NULL ,
-            per_recipient_headers blob ,
-            last_updated timestamp NOT NULL ,
-            message_body blob NOT NULL ,
-            message_attributes blob ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="ingres">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) ,
-            sender varchar (255) ,
-            recipients LONG VARCHAR NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers LONG BYTE ,
-            last_updated DATE NOT NULL
-            message_body LONG BYTE NOT NULL ,
-            message_attributes LONG BYTE ,
-        )
-    </sql>
-    <sql name="createTable" db="derby">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) ,
-            sender varchar (255) ,
-            recipients long varchar NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers blob ,
-            last_updated timestamp NOT NULL,
-            message_body blob NOT NULL ,
-            message_attributes blob ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-</sqlDefs>
+        <!-- Statements used to create the table associated with this class. -->
+        <sql name="createTable" db="mysql">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (100) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (255) NULL ,
+                recipients text NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers longblob NULL ,
+                last_updated datetime NOT NULL,
+                message_body longblob NOT NULL ,
+                message_attributes longblob NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="hypersonic">
+            CREATE CACHED TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (255) NULL ,
+                recipients varchar NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers varchar NULL ,
+                last_updated timestamp NOT NULL,
+                message_body varchar NOT NULL ,
+                message_attributes varchar NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="hsqldb">
+            CREATE CACHED TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (255) NULL ,
+                recipients varchar NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers varchar NULL ,
+                last_updated timestamp NOT NULL,
+                message_body varchar NOT NULL ,
+                message_attributes varchar NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="mssql">
+            CREATE TABLE [${table}] (
+                [message_name] [varchar] (200) NOT NULL,
+                [repository_name] [varchar] (255) NOT NULL,
+                [message_state] [varchar] (30) NOT NULL ,
+                [error_message] [varchar] (1000) NULL ,
+                [sender] [varchar] (255) NULL ,
+                [recipients] [text] NOT NULL ,
+                [remote_host] [varchar] (255) NOT NULL ,
+                [remote_addr] [varchar] (20) NOT NULL ,
+                [per_recipient_headers] [image] NULL ,
+                [last_updated] [datetime] NOT NULL,
+                [message_body] [image] NOT NULL ,
+                [message_attributes] [image] NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="oracle">
+            CREATE TABLE ${table} (
+                message_name varchar2(200) NOT NULL ,
+                repository_name varchar2(255) NOT NULL ,
+                message_state varchar2(30) NOT NULL ,
+                error_message varchar2(200) NULL ,
+                sender varchar2(255) ,
+                recipients varchar2(1000) NOT NULL ,
+                remote_host varchar2(100) NOT NULL ,
+                remote_addr varchar2(20) NOT NULL ,
+                per_recipient_headers blob NULL ,
+                last_updated date NOT NULL ,
+                message_body blob NOT NULL ,
+                message_attributes blob NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="postgresql">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (255) NULL ,
+                recipients text NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers oid NULL ,
+                last_updated timestamp NOT NULL,
+                message_body bytea NOT NULL ,
+                message_attributes bytea NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="sapdb">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (200) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (200) NULL ,
+                recipients long NOT NULL ,
+                remote_host varchar (100) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers long byte NULL ,
+                last_updated date NOT NULL,
+                message_body long byte NOT NULL ,
+                message_attributes long byte NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="db2">
+            CREATE TABLE ${table} (
+                message_name varchar(200) NOT NULL ,
+                repository_name varchar(255) NOT NULL ,
+                message_state varchar(30) NOT NULL ,
+                error_message varchar(200) ,
+                sender varchar(255) ,
+                recipients varchar(1000) NOT NULL ,
+                remote_host varchar(100) NOT NULL ,
+                remote_addr varchar(20) NOT NULL ,
+                per_recipient_headers blob ,
+                last_updated timestamp NOT NULL ,
+                message_body blob NOT NULL ,
+                message_attributes blob ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="ingres">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) ,
+                sender varchar (255) ,
+                recipients LONG VARCHAR NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers LONG BYTE ,
+                last_updated DATE NOT NULL
+                message_body LONG BYTE NOT NULL ,
+                message_attributes LONG BYTE ,
+            )
+        </sql>
+        <sql name="createTable" db="derby">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) ,
+                sender varchar (255) ,
+                recipients long varchar NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers blob ,
+                last_updated timestamp NOT NULL,
+                message_body blob NOT NULL ,
+                message_attributes blob ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+    </sqlDefs>
 
 </sqlResources>
-
diff --git a/server/data/data-jdbc/src/test/resources/sqlResources.xml b/server/data/data-jdbc/src/test/resources/sqlResources.xml
index f1daca9..9cdbd79 100644
--- a/server/data/data-jdbc/src/test/resources/sqlResources.xml
+++ b/server/data/data-jdbc/src/test/resources/sqlResources.xml
@@ -26,306 +26,305 @@
 
 <sqlResources>
 
-<!--
-     This section provided configuration to determine the
-     database product which is being used for storage. Different database
-     products may require different SQL syntax.
+    <!--
+         This section provided configuration to determine the
+         database product which is being used for storage. Different database
+         products may require different SQL syntax.
 
-     The jdbc database connection is examined to see if it matches with the
-     regular expressions specified in any of the defined matchers. The matchers
-     are processed in the over provided here, with the first successful match
-     defining the "db" value for this connection.
+         The jdbc database connection is examined to see if it matches with the
+         regular expressions specified in any of the defined matchers. The matchers
+         are processed in the over provided here, with the first successful match
+         defining the "db" value for this connection.
 
-     This value is then used to choose between different definitions for various
-     named sql statements, defined below. If no match is found,
-     the default sql statements are used.
--->
-<dbMatchers>
-    <dbMatcher db="mssql" databaseProductName="microsoft sql server"/>
-    <dbMatcher db="oracle" databaseProductName="oracle.*"/>
-    <dbMatcher db="mysql" databaseProductName="my.*"/>
-    <dbMatcher db="derby" databaseProductName="derby.*"/>
-    <dbMatcher db="postgresql" databaseProductName="postgres.*"/>
-    <dbMatcher db="hsqldb" databaseProductName="hsql.*"/>
-    <dbMatcher db="sapdb" databaseProductName="sap.*"/>
-    <dbMatcher db="hypersonic" databaseProductName="HypersonicSQL"/>
-    <dbMatcher db="db2" databaseProductName="db2.*"/>
-    <dbMatcher db="ingres" databaseProductName="ingres.*"/>
-</dbMatchers>
+         This value is then used to choose between different definitions for various
+         named sql statements, defined below. If no match is found,
+         the default sql statements are used.
+    -->
+    <dbMatchers>
+        <dbMatcher db="mssql" databaseProductName="microsoft sql server"/>
+        <dbMatcher db="oracle" databaseProductName="oracle.*"/>
+        <dbMatcher db="mysql" databaseProductName="my.*"/>
+        <dbMatcher db="derby" databaseProductName="derby.*"/>
+        <dbMatcher db="postgresql" databaseProductName="postgres.*"/>
+        <dbMatcher db="hsqldb" databaseProductName="hsql.*"/>
+        <dbMatcher db="sapdb" databaseProductName="sap.*"/>
+        <dbMatcher db="hypersonic" databaseProductName="HypersonicSQL"/>
+        <dbMatcher db="db2" databaseProductName="db2.*"/>
+        <dbMatcher db="ingres" databaseProductName="ingres.*"/>
+    </dbMatchers>
 
-<!--
-    With the following section it is possible to associate several name/value pairs
-        of options to a database product, identified by the "db" XML attribute name.
-    
-    An element without a "db" attribute, if used for an option name, will become a default value for such option.
-    Each option may have a "default default", i.e. a default that applies if no element with an empty
-        "db" attribute (default element) exists as said above;
-        such default default must be documented for such option below.
-    
-    The order of the XML elements is meaningless.
-    
-    Here only "getBody" and "getAttributes" option names are set, but others could be used in the future.
-    Option names:
-        "getBody" - a string (case insensitive) telling which JDBC ResultSet method will be used to
-            get the message body field for a database product.
-            The default default value is "useBytes"..
-            Values (case insensitive):
-                "useBytes"  - use getBytes(int).
-                "useBlob"   - use getBlob(int).
-        "getAttributes" - a string (case insensitive) telling which JDBC ResultSet method will be used to
-            get the message attributes field for a database product.
-           The default default value is "useBytes"..
-            Values (case insensitive):
-                "useBytes"  - use getBytes(int).
-                "useBlob"   - use getBlob(int).
--->
-<dbOptions>
-    <dbOption name="getBody" value="useBytes"/>
-    <dbOption name="getAttributes" value="useBytes"/>
-    <dbOption db="mssql" name="getBody" value="useBytes"/>
-    <dbOption db="mssql" name="getAttributes" value="useBytes"/>
-    <dbOption db="oracle" name="getBody" value="useBlob"/>
-    <dbOption db="oracle" name="getAttributes" value="useBlob"/>
-    <dbOption db="mysql" name="getBody" value="useBytes"/>
-    <dbOption db="mysql" name="getAttributes" value="useBytes"/>
-    <dbOption db="derby" name="getBody" value="useBytes"/>
-    <dbOption db="derby" name="getAttributes" value="useBytes"/>
-    <dbOption db="postgresql" name="getBody" value="useBytes"/>
-    <dbOption db="postgresql" name="getAttributes" value="useBytes"/>
-    <dbOption db="sapdb" name="getBody" value="useBytes"/>
-    <dbOption db="sapdb" name="getAttributes" value="useBytes"/>
-    <dbOption db="hypersonic" name="getBody" value="useBytes"/>
-    <dbOption db="hypersonic" name="getAttributes" value="useBytes"/>
-    <dbOption db="hsqldb" name="getBody" value="useBytes"/>
-    <dbOption db="hsqldb" name="getAttributes" value="useBytes"/>
-    <dbOption db="db2" name="getBody" value="useBlob"/>
-    <dbOption db="db2" name="getAttributes" value="useBlob"/>
-    <dbOption db="ingres" name="getBody" value="useBytes"/>
-    <dbOption db="ingres" name="getAttributes" value="useBytes"/>
-</dbOptions>
+    <!--
+        With the following section it is possible to associate several name/value pairs
+            of options to a database product, identified by the "db" XML attribute name.
+        
+        An element without a "db" attribute, if used for an option name, will become a default value for such option.
+        Each option may have a "default default", i.e. a default that applies if no element with an empty
+            "db" attribute (default element) exists as said above;
+            such default default must be documented for such option below.
+        
+        The order of the XML elements is meaningless.
+        
+        Here only "getBody" and "getAttributes" option names are set, but others could be used in the future.
+        Option names:
+            "getBody" - a string (case insensitive) telling which JDBC ResultSet method will be used to
+                get the message body field for a database product.
+                The default default value is "useBytes"..
+                Values (case insensitive):
+                    "useBytes"  - use getBytes(int).
+                    "useBlob"   - use getBlob(int).
+            "getAttributes" - a string (case insensitive) telling which JDBC ResultSet method will be used to
+                get the message attributes field for a database product.
+               The default default value is "useBytes"..
+                Values (case insensitive):
+                    "useBytes"  - use getBytes(int).
+                    "useBlob"   - use getBlob(int).
+    -->
+    <dbOptions>
+        <dbOption name="getBody" value="useBytes"/>
+        <dbOption name="getAttributes" value="useBytes"/>
+        <dbOption db="mssql" name="getBody" value="useBytes"/>
+        <dbOption db="mssql" name="getAttributes" value="useBytes"/>
+        <dbOption db="oracle" name="getBody" value="useBlob"/>
+        <dbOption db="oracle" name="getAttributes" value="useBlob"/>
+        <dbOption db="mysql" name="getBody" value="useBytes"/>
+        <dbOption db="mysql" name="getAttributes" value="useBytes"/>
+        <dbOption db="derby" name="getBody" value="useBytes"/>
+        <dbOption db="derby" name="getAttributes" value="useBytes"/>
+        <dbOption db="postgresql" name="getBody" value="useBytes"/>
+        <dbOption db="postgresql" name="getAttributes" value="useBytes"/>
+        <dbOption db="sapdb" name="getBody" value="useBytes"/>
+        <dbOption db="sapdb" name="getAttributes" value="useBytes"/>
+        <dbOption db="hypersonic" name="getBody" value="useBytes"/>
+        <dbOption db="hypersonic" name="getAttributes" value="useBytes"/>
+        <dbOption db="hsqldb" name="getBody" value="useBytes"/>
+        <dbOption db="hsqldb" name="getAttributes" value="useBytes"/>
+        <dbOption db="db2" name="getBody" value="useBlob"/>
+        <dbOption db="db2" name="getAttributes" value="useBlob"/>
+        <dbOption db="ingres" name="getBody" value="useBytes"/>
+        <dbOption db="ingres" name="getAttributes" value="useBytes"/>
+    </dbOptions>
 
-<!-- SQL statements for the JdbcMailRepository  -->
-<sqlDefs name="org.apache.james.mailrepository.jdbc.JDBCMailRepository">
+    <!-- SQL statements for the JdbcMailRepository  -->
+    <sqlDefs name="org.apache.james.mailrepository.jdbc.JDBCMailRepository">
 
-    <!-- Statements used to check whether a particular message exists in this repository. -->
-    <sql name="checkMessageExistsSQL">SELECT count(*) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to check whether a particular message exists in this repository. -->
+        <sql name="checkMessageExistsSQL">SELECT count(*) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to update a message stored in this repository. -->
-    <sql name="updateMessageSQL">UPDATE ${table} SET message_state = ?, error_message = ?, sender = ?, recipients = ?, remote_host = ?, remote_addr = ?, last_updated = ? WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to update a message stored in this repository. -->
+        <sql name="updateMessageSQL">UPDATE ${table} SET message_state = ?, error_message = ?, sender = ?, recipients = ?, remote_host = ?, remote_addr = ?, last_updated = ? WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to update the body of a message stored in this repository. -->
-    <sql name="updateMessageBodySQL">UPDATE ${table} SET message_body = ? WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to update the body of a message stored in this repository. -->
+        <sql name="updateMessageBodySQL">UPDATE ${table} SET message_body = ? WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to update the attributes of a message stored in this repository. -->
-    <sql name="updateMessageAttributesSQL">UPDATE ${table} SET message_attributes = ? WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to update the attributes of a message stored in this repository. -->
+        <sql name="updateMessageAttributesSQL">UPDATE ${table} SET message_attributes = ? WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to insert a message into this repository. -->
-    <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
-    repository_name, message_state, error_message, sender, recipients,
-    remote_host, remote_addr, per_recipient_headers, last_updated, message_body,
-    message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
+        <!-- Statements used to insert a message into this repository. -->
+        <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
+        repository_name, message_state, error_message, sender, recipients,
+        remote_host, remote_addr, per_recipient_headers, last_updated, message_body,
+        message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
 
-    <!-- Statements used to retrieve a message stored in this repository. -->
-    <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, per_recipient_headers, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve a message stored in this repository. -->
+        <sql name="retrieveMessageSQL">SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, per_recipient_headers, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to retrieve the body of a message stored in this repository. -->
-    <sql name="retrieveMessageBodySQL">SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve the body of a message stored in this repository. -->
+        <sql name="retrieveMessageBodySQL">SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to retrieve the attributes of a message stored in this repository. -->
-    <sql name="retrieveMessageAttributesSQL">SELECT message_attributes FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve the attributes of a message stored in this repository. -->
+        <sql name="retrieveMessageAttributesSQL">SELECT message_attributes FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to retrieve the size of the body of a message stored in this repository. -->
-    <!-- NOTE: This statement is optional and need not be implemented for a particular database to be supported. -->
-    <sql name="retrieveMessageBodySizeSQL" db="mssql">SELECT datalength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="mysql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="hypersonic">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="hsqldb">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="postgresql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="oracle">SELECT dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="db2">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="ingres">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
-    <sql name="retrieveMessageBodySizeSQL" db="derby">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to retrieve the size of the body of a message stored in this repository. -->
+        <!-- NOTE: This statement is optional and need not be implemented for a particular database to be supported. -->
+        <sql name="retrieveMessageBodySizeSQL" db="mssql">SELECT datalength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="mysql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="hypersonic">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="hsqldb">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="postgresql">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="oracle">SELECT dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="db2">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="ingres">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <sql name="retrieveMessageBodySizeSQL" db="derby">SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to delete a message stored in this repository. -->
-    <sql name="removeMessageSQL">DELETE FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+        <!-- Statements used to delete a message stored in this repository. -->
+        <sql name="removeMessageSQL">DELETE FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
 
-    <!-- Statements used to list all messages stored in this repository. -->
-    <sql name="listMessagesSQL">SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC</sql>
+        <!-- Statements used to list all messages stored in this repository. -->
+        <sql name="listMessagesSQL">SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC</sql>
 
-    <!-- Statements used to count messages stored in this repository. -->
-    <sql name="countMessagesSQL">SELECT COUNT(*) FROM ${table}</sql>
+        <!-- Statements used to count messages stored in this repository. -->
+        <sql name="countMessagesSQL">SELECT COUNT(*) FROM ${table}</sql>
 
-    <!-- Statements used to create the table associated with this class. -->
-    <sql name="createTable" db="mysql">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (100) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (255) NULL ,
-            recipients text NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers longblob NULL ,
-            last_updated datetime NOT NULL,
-            message_body longblob NOT NULL ,
-            message_attributes longblob NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="hypersonic">
-        CREATE CACHED TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (255) NULL ,
-            recipients varchar NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers varchar NULL ,
-            last_updated timestamp NOT NULL,
-            message_body varchar NOT NULL ,
-            message_attributes varchar NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="hsqldb">
-        CREATE CACHED TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (255) NULL ,
-            recipients varchar NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers varchar NULL ,
-            last_updated timestamp NOT NULL,
-            message_body varchar NOT NULL ,
-            message_attributes varchar NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="mssql">
-        CREATE TABLE [${table}] (
-            [message_name] [varchar] (200) NOT NULL,
-            [repository_name] [varchar] (255) NOT NULL,
-            [message_state] [varchar] (30) NOT NULL ,
-            [error_message] [varchar] (1000) NULL ,
-            [sender] [varchar] (255) NULL ,
-            [recipients] [text] NOT NULL ,
-            [remote_host] [varchar] (255) NOT NULL ,
-            [remote_addr] [varchar] (20) NOT NULL ,
-            [per_recipient_headers] [image] NULL ,
-            [last_updated] [datetime] NOT NULL,
-            [message_body] [image] NOT NULL ,
-            [message_attributes] [image] NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="oracle">
-        CREATE TABLE ${table} (
-            message_name varchar2(200) NOT NULL ,
-            repository_name varchar2(255) NOT NULL ,
-            message_state varchar2(30) NOT NULL ,
-            error_message varchar2(200) NULL ,
-            sender varchar2(255) ,
-            recipients varchar2(1000) NOT NULL ,
-            remote_host varchar2(100) NOT NULL ,
-            remote_addr varchar2(20) NOT NULL ,
-            per_recipient_headers blob NULL ,
-            last_updated date NOT NULL ,
-            message_body blob NOT NULL ,
-            message_attributes blob NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="postgresql">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (255) NULL ,
-            recipients text NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers oid NULL ,
-            last_updated timestamp NOT NULL,
-            message_body bytea NOT NULL ,
-            message_attributes bytea NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="sapdb">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (200) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) NULL ,
-            sender varchar (200) NULL ,
-            recipients long NOT NULL ,
-            remote_host varchar (100) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers long byte NULL ,
-            last_updated date NOT NULL,
-            message_body long byte NOT NULL ,
-            message_attributes long byte NULL ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="db2">
-        CREATE TABLE ${table} (
-            message_name varchar(200) NOT NULL ,
-            repository_name varchar(255) NOT NULL ,
-            message_state varchar(30) NOT NULL ,
-            error_message varchar(200) ,
-            sender varchar(255) ,
-            recipients varchar(1000) NOT NULL ,
-            remote_host varchar(100) NOT NULL ,
-            remote_addr varchar(20) NOT NULL ,
-            per_recipient_headers blob ,
-            last_updated timestamp NOT NULL ,
-            message_body blob NOT NULL ,
-            message_attributes blob ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-    <sql name="createTable" db="ingres">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) ,
-            sender varchar (255) ,
-            recipients LONG VARCHAR NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers LONG BYTE ,
-            last_updated DATE NOT NULL
-            message_body LONG BYTE NOT NULL ,
-            message_attributes LONG BYTE ,
-        )
-    </sql>
-    <sql name="createTable" db="derby">
-        CREATE TABLE ${table} (
-            message_name varchar (200) NOT NULL,
-            repository_name varchar (255) NOT NULL,
-            message_state varchar (30) NOT NULL ,
-            error_message varchar (200) ,
-            sender varchar (255) ,
-            recipients long varchar NOT NULL ,
-            remote_host varchar (255) NOT NULL ,
-            remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers blob ,
-            last_updated timestamp NOT NULL,
-            message_body blob NOT NULL ,
-            message_attributes blob ,
-            PRIMARY KEY (repository_name, message_name)
-        )
-    </sql>
-</sqlDefs>
+        <!-- Statements used to create the table associated with this class. -->
+        <sql name="createTable" db="mysql">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (100) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (255) NULL ,
+                recipients text NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers longblob NULL ,
+                last_updated datetime NOT NULL,
+                message_body longblob NOT NULL ,
+                message_attributes longblob NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="hypersonic">
+            CREATE CACHED TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (255) NULL ,
+                recipients varchar NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers varchar NULL ,
+                last_updated timestamp NOT NULL,
+                message_body varchar NOT NULL ,
+                message_attributes varchar NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="hsqldb">
+            CREATE CACHED TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (255) NULL ,
+                recipients varchar NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers varchar NULL ,
+                last_updated timestamp NOT NULL,
+                message_body varchar NOT NULL ,
+                message_attributes varchar NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="mssql">
+            CREATE TABLE [${table}] (
+                [message_name] [varchar] (200) NOT NULL,
+                [repository_name] [varchar] (255) NOT NULL,
+                [message_state] [varchar] (30) NOT NULL ,
+                [error_message] [varchar] (1000) NULL ,
+                [sender] [varchar] (255) NULL ,
+                [recipients] [text] NOT NULL ,
+                [remote_host] [varchar] (255) NOT NULL ,
+                [remote_addr] [varchar] (20) NOT NULL ,
+                [per_recipient_headers] [image] NULL ,
+                [last_updated] [datetime] NOT NULL,
+                [message_body] [image] NOT NULL ,
+                [message_attributes] [image] NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="oracle">
+            CREATE TABLE ${table} (
+                message_name varchar2(200) NOT NULL ,
+                repository_name varchar2(255) NOT NULL ,
+                message_state varchar2(30) NOT NULL ,
+                error_message varchar2(200) NULL ,
+                sender varchar2(255) ,
+                recipients varchar2(1000) NOT NULL ,
+                remote_host varchar2(100) NOT NULL ,
+                remote_addr varchar2(20) NOT NULL ,
+                per_recipient_headers blob NULL ,
+                last_updated date NOT NULL ,
+                message_body blob NOT NULL ,
+                message_attributes blob NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="postgresql">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (255) NULL ,
+                recipients text NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers oid NULL ,
+                last_updated timestamp NOT NULL,
+                message_body bytea NOT NULL ,
+                message_attributes bytea NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="sapdb">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (200) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) NULL ,
+                sender varchar (200) NULL ,
+                recipients long NOT NULL ,
+                remote_host varchar (100) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers long byte NULL ,
+                last_updated date NOT NULL,
+                message_body long byte NOT NULL ,
+                message_attributes long byte NULL ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="db2">
+            CREATE TABLE ${table} (
+                message_name varchar(200) NOT NULL ,
+                repository_name varchar(255) NOT NULL ,
+                message_state varchar(30) NOT NULL ,
+                error_message varchar(200) ,
+                sender varchar(255) ,
+                recipients varchar(1000) NOT NULL ,
+                remote_host varchar(100) NOT NULL ,
+                remote_addr varchar(20) NOT NULL ,
+                per_recipient_headers blob ,
+                last_updated timestamp NOT NULL ,
+                message_body blob NOT NULL ,
+                message_attributes blob ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+        <sql name="createTable" db="ingres">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) ,
+                sender varchar (255) ,
+                recipients LONG VARCHAR NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers LONG BYTE ,
+                last_updated DATE NOT NULL
+                message_body LONG BYTE NOT NULL ,
+                message_attributes LONG BYTE ,
+            )
+        </sql>
+        <sql name="createTable" db="derby">
+            CREATE TABLE ${table} (
+                message_name varchar (200) NOT NULL,
+                repository_name varchar (255) NOT NULL,
+                message_state varchar (30) NOT NULL ,
+                error_message varchar (200) ,
+                sender varchar (255) ,
+                recipients long varchar NOT NULL ,
+                remote_host varchar (255) NOT NULL ,
+                remote_addr varchar (20) NOT NULL ,
+                per_recipient_headers blob ,
+                last_updated timestamp NOT NULL,
+                message_body blob NOT NULL ,
+                message_attributes blob ,
+                PRIMARY KEY (repository_name, message_name)
+            )
+        </sql>
+    </sqlDefs>
 
 </sqlResources>
-


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


[james-project] 04/06: JAMES-2936 add a method to check for empty names in the hierarchy in a mailbox path

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 63d8419fb6b655243423f795647104e2ce227f03
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Mon Oct 28 15:14:49 2019 +0100

    JAMES-2936 add a method to check for empty names in the hierarchy in a mailbox path
---
 .../apache/james/mailbox/model/MailboxPath.java    |  7 +++
 .../james/mailbox/model/MailboxPathTest.java       | 56 ++++++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
index ec6a2ee..d6c2621 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
@@ -147,6 +147,13 @@ public class MailboxPath {
         return this;
     }
 
+    public boolean hasEmptyNameInHierarchy(char pathDelimiter) {
+        String delimiterString = String.valueOf(pathDelimiter);
+        return this.name.isEmpty()
+            || this.name.contains(delimiterString + delimiterString)
+            || this.name.startsWith(delimiterString)
+            || this.name.endsWith(delimiterString);
+    }
 
     public String asString() {
         return namespace + ":" + user + ":" + name;
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java
index 422d587..d6606cc 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java
@@ -126,6 +126,62 @@ public class MailboxPathTest {
     }
 
     @Test
+    public void hasEmptyNameInHierarchyShouldBeFalseIfSingleLevelPath() {
+        assertThat(MailboxPath.forUser("user", "a")
+            .hasEmptyNameInHierarchy('.'))
+            .isFalse();
+    }
+
+    @Test
+    public void hasEmptyNameInHierarchyShouldBeFalseIfNestedLevelWithNonEmptyNames() {
+        assertThat(MailboxPath.forUser("user", "a.b.c")
+            .hasEmptyNameInHierarchy('.'))
+            .isFalse();
+    }
+
+    @Test
+    public void hasEmptyNameInHierarchyShouldBeTrueIfEmptyPath() {
+        assertThat(MailboxPath.forUser("user", "")
+            .hasEmptyNameInHierarchy('.'))
+            .isTrue();
+    }
+
+    @Test
+    public void hasEmptyNameInHierarchyShouldBeTrueIfPathWithTwoEmptyNames() {
+        assertThat(MailboxPath.forUser("user", ".")
+            .hasEmptyNameInHierarchy('.'))
+            .isTrue();
+    }
+
+    @Test
+    public void hasEmptyNameInHierarchyShouldBeTrueIfPathWithAnEmptyNameBetweenTwoNames() {
+        assertThat(MailboxPath.forUser("user", "a..b")
+            .hasEmptyNameInHierarchy('.'))
+            .isTrue();
+    }
+
+    @Test
+    public void hasEmptyNameInHierarchyShouldBeTrueIfPathWithHeadingEmptyNames() {
+        assertThat(MailboxPath.forUser("user", "..a")
+            .hasEmptyNameInHierarchy('.'))
+            .isTrue();
+    }
+
+    @Test
+    public void hasEmptyNameInHierarchyShouldBeTrueIfPathWithATrailingEmptyName() {
+        assertThat(MailboxPath.forUser("user", "a.")
+            .hasEmptyNameInHierarchy('.'))
+            .isTrue();
+    }
+
+    @Test
+    public void hasEmptyNameInHierarchyShouldBeTrueIfPathWithTrailingEmptyNames() {
+        assertThat(MailboxPath.forUser("user", "a..")
+            .hasEmptyNameInHierarchy('.'))
+            .isTrue();
+    }
+
+    @Test
     public void isInboxShouldReturnTrueWhenINBOX() {
         MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", DefaultMailboxes.INBOX);
         assertThat(mailboxPath.isInbox()).isTrue();


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


[james-project] 06/06: JAMES-2936 reject path with empty names in the hierachy when renaming mailbox and sanitize new name

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 3d21b8bb27f2e1ec85b554221cd8715b4bee132d
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Mon Oct 28 15:20:52 2019 +0100

    JAMES-2936 reject path with empty names in the hierachy when renaming mailbox and sanitize new name
---
 .../apache/james/mailbox/MailboxManagerTest.java   | 62 ++++++++++++++++++++++
 .../james/mailbox/store/StoreMailboxManager.java   | 13 +++--
 2 files changed, 70 insertions(+), 5 deletions(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 138422c..e0a2ad9 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -261,6 +261,68 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                 .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class);
         }
 
+        @Test
+        void renamingMailboxShouldNotThrowWhenNameWithoutEmptyHierarchicalLevel() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  "a.b.c";
+
+            MailboxPath originPath = MailboxPath.forUser(USER_1, "origin");
+            mailboxManager.createMailbox(originPath, session);
+
+            assertThatCode(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session)).doesNotThrowAnyException();
+        }
+
+        @Test
+        void renamingMailboxShouldNotThrowWhenNameWithASingleToBeNormalizedTrailingDelimiter() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  "a.b.";
+
+            MailboxPath originPath = MailboxPath.forUser(USER_1, "origin");
+            mailboxManager.createMailbox(originPath, session);
+
+            assertThatCode(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session)).doesNotThrowAnyException();
+        }
+
+        @Test
+        void renamingMailboxShouldThrowWhenNameWithMoreThanOneTrailingDelimiter() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  "a..";
+
+            MailboxPath originPath = MailboxPath.forUser(USER_1, "origin");
+            mailboxManager.createMailbox(originPath, session);
+
+            assertThatThrownBy(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session))
+                .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class);
+        }
+
+        @Test
+        void renamingMailboxShouldThrowWhenNameWithHeadingDelimiter() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  ".a";
+
+            MailboxPath originPath = MailboxPath.forUser(USER_1, "origin");
+            mailboxManager.createMailbox(originPath, session);
+
+            assertThatThrownBy(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session))
+                .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class);
+        }
+
+        @Test
+        void renamingMailboxShouldThrowWhenNameWithEmptyHierarchicalLevel() throws Exception {
+            MailboxSession session = mailboxManager.createSystemSession(USER_1);
+
+            String mailboxName =  "a..b";
+
+            MailboxPath originPath = MailboxPath.forUser(USER_1, "origin");
+            mailboxManager.createMailbox(originPath, session);
+
+            assertThatThrownBy(() -> mailboxManager.renameMailbox(originPath, MailboxPath.forUser(USER_1, mailboxName), session))
+                .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class);
+        }
     }
 
     @Nested
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 7944aa2..abd895c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -438,22 +438,25 @@ public class StoreMailboxManager implements MailboxManager {
             return m;
         });
 
-
     }
 
     @Override
     public void renameMailbox(MailboxPath from, MailboxPath to, MailboxSession session) throws MailboxException {
         LOGGER.debug("renameMailbox {} to {}", from, to);
-        if (mailboxExists(to, session)) {
-            throw new MailboxExistsException(to.toString());
+        MailboxPath sanitizedMailboxPath = to.sanitize(session.getPathDelimiter());
+        if (mailboxExists(sanitizedMailboxPath, session)) {
+            throw new MailboxExistsException(sanitizedMailboxPath.toString());
         }
-        if (isMailboxNameTooLong(to)) {
+        if (isMailboxNameTooLong(sanitizedMailboxPath)) {
             throw new TooLongMailboxNameException("Mailbox name exceed maximum size of " + MAX_MAILBOX_NAME_LENGTH + " characters");
         }
+        if (sanitizedMailboxPath.hasEmptyNameInHierarchy(session.getPathDelimiter())) {
+            throw new HasEmptyMailboxNameInHierarchyException(to.asString());
+        }
 
         assertIsOwner(session, from);
         MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
-        mapper.execute(Mapper.toTransaction(() -> doRenameMailbox(from, to, session, mapper)));
+        mapper.execute(Mapper.toTransaction(() -> doRenameMailbox(from, sanitizedMailboxPath, session, mapper)));
     }
 
     private void assertIsOwner(MailboxSession mailboxSession, MailboxPath mailboxPath) throws MailboxNotFoundException {


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


[james-project] 03/06: JAMES-2828 JDBC Mail Repository fails to save message into PostgreSQL when per recipient headers are absent

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit b217a706cd7eb78de5a884aa6792715a6e0c55ca
Author: Joerg Thomas <jo...@consol.de>
AuthorDate: Wed Oct 30 19:13:42 2019 +0100

    JAMES-2828 JDBC Mail Repository fails to save message into PostgreSQL when per recipient headers are absent
---
 dockerfiles/run/spring/destination/conf/sqlResources.xml                | 2 +-
 server/app/src/main/resources/sqlResources.xml                          | 2 +-
 .../java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java   | 2 +-
 server/data/data-jdbc/src/test/resources/sqlResources-mail.xml          | 2 +-
 server/data/data-jdbc/src/test/resources/sqlResources.xml               | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/dockerfiles/run/spring/destination/conf/sqlResources.xml b/dockerfiles/run/spring/destination/conf/sqlResources.xml
index e742057..286a994 100644
--- a/dockerfiles/run/spring/destination/conf/sqlResources.xml
+++ b/dockerfiles/run/spring/destination/conf/sqlResources.xml
@@ -259,7 +259,7 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers oid NULL ,
+            per_recipient_headers bytea NULL ,
             last_updated timestamp NOT NULL,
             message_body bytea NOT NULL ,
             message_attributes bytea NULL ,
diff --git a/server/app/src/main/resources/sqlResources.xml b/server/app/src/main/resources/sqlResources.xml
index e742057..286a994 100644
--- a/server/app/src/main/resources/sqlResources.xml
+++ b/server/app/src/main/resources/sqlResources.xml
@@ -259,7 +259,7 @@
             recipients text NOT NULL ,
             remote_host varchar (255) NOT NULL ,
             remote_addr varchar (20) NOT NULL ,
-            per_recipient_headers oid NULL ,
+            per_recipient_headers bytea NULL ,
             last_updated timestamp NOT NULL,
             message_body bytea NOT NULL ,
             message_attributes bytea NULL ,
diff --git a/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java b/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java
index 3ed2a29..f6a7405 100644
--- a/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java
+++ b/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java
@@ -550,7 +550,7 @@ public class JDBCMailRepository extends AbstractMailRepository {
                     insertMessage.setString(7, mc.getRemoteHost());
                     insertMessage.setString(8, mc.getRemoteAddr());
                     if (mc.getPerRecipientSpecificHeaders().getHeadersByRecipient().isEmpty()) {
-                        insertMessage.setNull(9, Types.BLOB);
+                        insertMessage.setObject(9, null);
                     } else {
                         byte[] bytes = SerializationUtils.serialize(mc.getPerRecipientSpecificHeaders());
                         insertMessage.setBinaryStream(9, new ByteArrayInputStream(bytes), bytes.length);
diff --git a/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml b/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml
index 3257670..6d75e41 100644
--- a/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml
+++ b/server/data/data-jdbc/src/test/resources/sqlResources-mail.xml
@@ -244,7 +244,7 @@
                 recipients text NOT NULL ,
                 remote_host varchar (255) NOT NULL ,
                 remote_addr varchar (20) NOT NULL ,
-                per_recipient_headers oid NULL ,
+                per_recipient_headers bytea NULL ,
                 last_updated timestamp NOT NULL,
                 message_body bytea NOT NULL ,
                 message_attributes bytea NULL ,
diff --git a/server/data/data-jdbc/src/test/resources/sqlResources.xml b/server/data/data-jdbc/src/test/resources/sqlResources.xml
index 9cdbd79..d426946 100644
--- a/server/data/data-jdbc/src/test/resources/sqlResources.xml
+++ b/server/data/data-jdbc/src/test/resources/sqlResources.xml
@@ -251,7 +251,7 @@
                 recipients text NOT NULL ,
                 remote_host varchar (255) NOT NULL ,
                 remote_addr varchar (20) NOT NULL ,
-                per_recipient_headers oid NULL ,
+                per_recipient_headers bytea NULL ,
                 last_updated timestamp NOT NULL,
                 message_body bytea NOT NULL ,
                 message_attributes bytea NULL ,


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