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 2018/07/30 06:54:54 UTC

[8/8] james-project git commit: JAMES-2303 JDBC Mail repository do not persist Per recipient headers.

JAMES-2303 JDBC Mail repository do not persist Per recipient headers.

Using JDK serialization to persist Per recipient headers.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/2d6d69ec
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/2d6d69ec
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/2d6d69ec

Branch: refs/heads/master
Commit: 2d6d69ecac24bf7c1b1d1e0f1dc009d2b1ff1bdf
Parents: a2cdc55
Author: Edgar Asatryan <ns...@gmail.com>
Authored: Tue Jul 24 18:27:32 2018 +0400
Committer: benwa <bt...@linagora.com>
Committed: Mon Jul 30 13:54:05 2018 +0700

----------------------------------------------------------------------
 .../mailrepository/jdbc/JDBCMailRepository.java | 27 +++++++++++++++-----
 .../jdbc/JDBCMailRepositoryTest.java            | 24 -----------------
 .../src/test/resources/sqlResources.xml         | 16 +++++++++---
 3 files changed, 33 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/2d6d69ec/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java
----------------------------------------------------------------------
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 9875676..0c95dd5 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
@@ -33,6 +33,7 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.sql.Types;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -51,6 +52,7 @@ import javax.sql.DataSource;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.lang3.SerializationUtils;
 import org.apache.james.core.MailAddress;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.mailrepository.api.MailKey;
@@ -528,7 +530,7 @@ public class JDBCMailRepository extends AbstractMailRepository {
                     insertMessage.setString(3, mc.getState());
                     insertMessage.setString(4, mc.getErrorMessage());
                     if (mc.getSender() == null) {
-                        insertMessage.setNull(5, java.sql.Types.VARCHAR);
+                        insertMessage.setNull(5, Types.VARCHAR);
                     } else {
                         insertMessage.setString(5, mc.getSender().toString());
                     }
@@ -542,12 +544,18 @@ public class JDBCMailRepository extends AbstractMailRepository {
                     insertMessage.setString(6, recipients.toString());
                     insertMessage.setString(7, mc.getRemoteHost());
                     insertMessage.setString(8, mc.getRemoteAddr());
-                    insertMessage.setTimestamp(9, new java.sql.Timestamp(mc.getLastUpdated().getTime()));
+                    if (mc.getPerRecipientSpecificHeaders().getHeadersByRecipient().isEmpty()) {
+                        insertMessage.setNull(9, Types.BLOB);
+                    } else {
+                        byte[] bytes = SerializationUtils.serialize(mc.getPerRecipientSpecificHeaders());
+                        insertMessage.setBinaryStream(9, new ByteArrayInputStream(bytes), bytes.length);
+                    }
+                    insertMessage.setTimestamp(10, new java.sql.Timestamp(mc.getLastUpdated().getTime()));
 
-                    insertMessage.setBinaryStream(10, is, (int) is.getSize());
+                    insertMessage.setBinaryStream(11, is, (int) is.getSize());
 
                     // Store attributes
-                    if (numberOfParameters > 10) {
+                    if (numberOfParameters > 11) {
                         ByteArrayOutputStream baos = new ByteArrayOutputStream();
                         ObjectOutputStream oos = new ObjectOutputStream(baos);
                         try {
@@ -563,7 +571,7 @@ public class JDBCMailRepository extends AbstractMailRepository {
                             }
                             oos.flush();
                             ByteArrayInputStream attrInputStream = new ByteArrayInputStream(baos.toByteArray());
-                            insertMessage.setBinaryStream(11, attrInputStream, baos.size());
+                            insertMessage.setBinaryStream(12, attrInputStream, baos.size());
                         } finally {
                             try {
                                 if (oos != null) {
@@ -680,7 +688,13 @@ public class JDBCMailRepository extends AbstractMailRepository {
             mc.setRecipients(recipients);
             mc.setRemoteHost(rsMessage.getString(5));
             mc.setRemoteAddr(rsMessage.getString(6));
-            mc.setLastUpdated(rsMessage.getTimestamp(7));
+            try (InputStream is = rsMessage.getBinaryStream(7)) {
+                if (is != null) {
+                    mc.addAllSpecificHeaderForRecipient(SerializationUtils.deserialize(is));
+                }
+            }
+
+            mc.setLastUpdated(rsMessage.getTimestamp(8));
 
             MimeMessageJDBCSource source = new MimeMessageJDBCSource(this, key.asString(), sr);
             MimeMessageCopyOnWriteProxy message = new MimeMessageCopyOnWriteProxy(source);
@@ -735,7 +749,6 @@ public class JDBCMailRepository extends AbstractMailRepository {
 
     @Override
     public Iterator<MailKey> list() throws MessagingException {
-        // System.err.println("listing messages");
         Connection conn = null;
         PreparedStatement listMessages = null;
         ResultSet rsListMessages = null;

http://git-wip-us.apache.org/repos/asf/james-project/blob/2d6d69ec/server/data/data-jdbc/src/test/java/org/apache/james/mailrepository/jdbc/JDBCMailRepositoryTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-jdbc/src/test/java/org/apache/james/mailrepository/jdbc/JDBCMailRepositoryTest.java b/server/data/data-jdbc/src/test/java/org/apache/james/mailrepository/jdbc/JDBCMailRepositoryTest.java
index 08f03fd..db385a0 100644
--- a/server/data/data-jdbc/src/test/java/org/apache/james/mailrepository/jdbc/JDBCMailRepositoryTest.java
+++ b/server/data/data-jdbc/src/test/java/org/apache/james/mailrepository/jdbc/JDBCMailRepositoryTest.java
@@ -19,9 +19,6 @@
 
 package org.apache.james.mailrepository.jdbc;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertAll;
-
 import java.sql.SQLException;
 
 import javax.sql.DataSource;
@@ -33,11 +30,8 @@ import org.apache.james.filesystem.api.mock.MockFileSystem;
 import org.apache.james.lifecycle.api.LifecycleUtil;
 import org.apache.james.mailrepository.MailRepositoryContract;
 import org.apache.james.mailrepository.api.MailRepository;
-import org.apache.mailet.Mail;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
 
 public class JDBCMailRepositoryTest implements MailRepositoryContract {
 
@@ -78,22 +72,4 @@ public class JDBCMailRepositoryTest implements MailRepositoryContract {
         ds.setPassword("james");
         return ds;
     }
-
-    /**
-     * JAMES-2303 JDBC doesn't store PerRecipientSpecificHeaders
-     */
-    @Override
-    public void checkMailEquality(Mail actual, Mail expected) {
-        assertAll(
-            () -> assertThat(actual.getMessage().getContent()).isEqualTo(expected.getMessage().getContent()),
-            () -> assertThat(actual.getMessageSize()).isEqualTo(expected.getMessageSize()),
-            () -> assertThat(actual.getName()).isEqualTo(expected.getName()),
-            () -> assertThat(actual.getState()).isEqualTo(expected.getState()),
-            () -> assertThat(actual.getAttribute(TEST_ATTRIBUTE)).isEqualTo(expected.getAttribute(TEST_ATTRIBUTE)),
-            () -> assertThat(actual.getErrorMessage()).isEqualTo(expected.getErrorMessage()),
-            () -> assertThat(actual.getRemoteHost()).isEqualTo(expected.getRemoteHost()),
-            () -> assertThat(actual.getRemoteAddr()).isEqualTo(expected.getRemoteAddr()),
-            () -> assertThat(actual.getLastUpdated()).isEqualTo(expected.getLastUpdated())
-        );
-    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/2d6d69ec/server/data/data-jdbc/src/test/resources/sqlResources.xml
----------------------------------------------------------------------
diff --git a/server/data/data-jdbc/src/test/resources/sqlResources.xml b/server/data/data-jdbc/src/test/resources/sqlResources.xml
index b91f974..68cd0e7 100644
--- a/server/data/data-jdbc/src/test/resources/sqlResources.xml
+++ b/server/data/data-jdbc/src/test/resources/sqlResources.xml
@@ -257,11 +257,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>
@@ -303,6 +303,7 @@
             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,
             PRIMARY KEY (repository_name, message_name)
         )
@@ -319,6 +320,7 @@
             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,
             PRIMARY KEY (repository_name, message_name)
         )
@@ -335,6 +337,7 @@
             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,
             PRIMARY KEY (repository_name, message_name)
         )
@@ -351,6 +354,7 @@
             [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,
             PRIMARY KEY (repository_name, message_name)
         )
@@ -367,6 +371,7 @@
             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 ,
             PRIMARY KEY (repository_name, message_name)
         )
@@ -383,6 +388,7 @@
             remote_addr varchar (20) 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)
         )
@@ -399,6 +405,7 @@
             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,
             PRIMARY KEY (repository_name, message_name)
         )
@@ -415,6 +422,7 @@
             remote_addr varchar(20) NOT NULL ,
             message_body blob NOT NULL ,
             message_attributes blob ,
+            per_recipient_headers blob ,
             last_updated timestamp NOT NULL ,
             PRIMARY KEY (repository_name, message_name)
         )
@@ -431,6 +439,7 @@
             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
         )
     </sql>
@@ -446,6 +455,7 @@
             remote_addr varchar (20) NOT NULL ,
             message_body blob NOT NULL ,
             message_attributes blob ,
+            per_recipient_headers blob ,
             last_updated timestamp NOT NULL,
             PRIMARY KEY (repository_name, message_name)
         )


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