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 <nst...@gmail.com> Authored: Tue Jul 24 18:27:32 2018 +0400 Committer: benwa <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org