JAMES-2521 Move JPA migrator utils as a separate tool project
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/a937a334 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a937a334 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a937a334 Branch: refs/heads/master Commit: a937a334211d9a7f643b70d54f4a00a92cb7212f Parents: 77fdac5 Author: Benoit Tellier <[email protected]> Authored: Tue Aug 14 17:31:30 2018 +0700 Committer: Benoit Tellier <[email protected]> Committed: Wed Aug 29 10:11:46 2018 +0700 ---------------------------------------------------------------------- mailbox/tool/pom.xml | 4 - .../james/mailbox/jpa/migrator/JpaMigrator.java | 75 --------- .../command/IMAP165JpaMigrateCommand.java | 42 ----- .../command/IMAP168JpaMigrateCommand.java | 120 -------------- .../command/IMAP172JpaMigrateCommand.java | 41 ----- .../command/IMAP176JpaMigrateCommand.java | 40 ----- .../command/IMAP180JpaMigrateCommand.java | 158 ------------------- .../command/IMAP184JpaMigrateCommand.java | 40 ----- .../jpa/migrator/command/JpaMigrateCommand.java | 41 ----- .../jpa/migrator/command/JpaMigrateQuery.java | 39 ----- .../migrator/exception/JpaMigrateException.java | 47 ------ .../mailbox/jpa/migrator/JpaMigratorTest.java | 55 ------- mailbox/tools/jpa-migrator/pom.xml | 45 ++++++ .../mailbox/tools/jpa/migrator/JpaMigrator.java | 75 +++++++++ .../command/IMAP165JpaMigrateCommand.java | 42 +++++ .../command/IMAP168JpaMigrateCommand.java | 120 ++++++++++++++ .../command/IMAP172JpaMigrateCommand.java | 41 +++++ .../command/IMAP176JpaMigrateCommand.java | 40 +++++ .../command/IMAP180JpaMigrateCommand.java | 158 +++++++++++++++++++ .../command/IMAP184JpaMigrateCommand.java | 40 +++++ .../jpa/migrator/command/JpaMigrateCommand.java | 41 +++++ .../jpa/migrator/command/JpaMigrateQuery.java | 39 +++++ .../migrator/exception/JpaMigrateException.java | 47 ++++++ .../tools/jpa/migrator/JpaMigratorTest.java | 55 +++++++ mailbox/tools/pom.xml | 1 + server/container/spring/pom.xml | 4 + 26 files changed, 748 insertions(+), 702 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/pom.xml ---------------------------------------------------------------------- diff --git a/mailbox/tool/pom.xml b/mailbox/tool/pom.xml index 240294d..74aef43 100644 --- a/mailbox/tool/pom.xml +++ b/mailbox/tool/pom.xml @@ -34,10 +34,6 @@ <dependencies> <dependency> <groupId>${james.groupId}</groupId> - <artifactId>apache-james-backends-jpa</artifactId> - </dependency> - <dependency> - <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-api</artifactId> </dependency> <dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/JpaMigrator.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/JpaMigrator.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/JpaMigrator.java deleted file mode 100644 index a557acc..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/JpaMigrator.java +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator; - -import java.util.Locale; - -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; - -import org.apache.james.mailbox.jpa.migrator.command.JpaMigrateCommand; -import org.apache.james.mailbox.jpa.migrator.exception.JpaMigrateException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The class that will manage the migration commands for the James JPA database. - * All SQL commands should be moved from JAVA code to a separate file. - */ -public class JpaMigrator { - - private static final Logger LOGGER = LoggerFactory.getLogger(JpaMigrator.class); - - /** - * The package name where all commands reside. - */ - private static final String JPA_MIGRATION_COMMAND_PACKAGE = JpaMigrateCommand.class.getPackage().getName(); - - /**<p>Executes the database migration for the provided JIRAs numbers. - * For example, for the https://issues.apache.org/jira/browse/IMAP-165 JIRA, simply invoke - * with IMAP165 as parameter. - * You can also invoke with many JIRA at once. They will be all serially executed.</p> - * - * TODO Extract the SQL in JAVA classes to XML file. - * - * @param jiras the JIRAs numbers - * @throws JpaMigrateException - */ - public static void main(String[] jiras) throws JpaMigrateException { - - try { - EntityManagerFactory factory = Persistence.createEntityManagerFactory("JamesMigrator"); - EntityManager em = factory.createEntityManager(); - - for (String jira: jiras) { - JpaMigrateCommand jiraJpaMigratable = (JpaMigrateCommand) Class.forName(JPA_MIGRATION_COMMAND_PACKAGE + "." + jira.toUpperCase(Locale.US) + JpaMigrateCommand.class.getSimpleName()).newInstance(); - LOGGER.info("Now executing {} migration", jira); - em.getTransaction().begin(); - jiraJpaMigratable.migrate(em); - em.getTransaction().commit(); - LOGGER.info("{} migration is successfully achieved", jira); - } - } catch (Throwable t) { - throw new JpaMigrateException(t); - } - - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP165JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP165JpaMigrateCommand.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP165JpaMigrateCommand.java deleted file mode 100644 index c17c7ed..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP165JpaMigrateCommand.java +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator.command; - -import javax.persistence.EntityManager; - -import org.apache.james.mailbox.jpa.migrator.exception.JpaMigrateException; - -/** - * JIRA IMAP-165 is "Add index annotation on frequently used columns". - * - * Add 3 indexes for the DELETED, SEEN and RECENT columns of MEMBERSHIP table. - * - * @link https://issues.apache.org/jira/browse/IMAP-165 - * - */ -public class IMAP165JpaMigrateCommand implements JpaMigrateCommand { - - @Override - public void migrate(EntityManager em) throws JpaMigrateException { - JpaMigrateQuery.executeUpdate(em, "CREATE INDEX I_MMBRSHP_SEEN ON MEMBERSHIP (SEEN)"); - JpaMigrateQuery.executeUpdate(em, "CREATE INDEX I_MMBRSHP_RECENT ON MEMBERSHIP (RECENT)"); - JpaMigrateQuery.executeUpdate(em, "CREATE INDEX I_MMBRSHP_DELETED ON MEMBERSHIP (DELETED)"); - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP168JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP168JpaMigrateCommand.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP168JpaMigrateCommand.java deleted file mode 100644 index cadfc83..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP168JpaMigrateCommand.java +++ /dev/null @@ -1,120 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator.command; - -import java.util.List; - -import javax.persistence.EntityManager; -import javax.persistence.Query; - -import org.apache.james.mailbox.jpa.migrator.exception.JpaMigrateException; - -/** - * <p> - * JIRA IMAP-168 is "mailboxes can't be identified 100% unambiguously using virtual hosting". - * - * MAILBOX.NAME contains data such as - * "#[email protected]" - * "#[email protected]" - * "#[email protected]" - * "#[email protected]" - * - * It needs to be splitted into MAILBOX.NAMESPACE | MAILBOX.USER0 | MAILBOX.NAME with - * "#mail" | "[email protected]" | "" ==> was created before, but is not used anymore - * "#mail" | "[email protected]" | "INBOX" - * "#mail" | "[email protected]" | "INBOX.test" - * "#mail" | "[email protected]" | "Trash" - *</p> - * - * @link https://issues.apache.org/jira/browse/IMAP-168 - * - */ -public class IMAP168JpaMigrateCommand implements JpaMigrateCommand { - - @Override - public void migrate(EntityManager em) throws JpaMigrateException { - - JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOX ADD COLUMN NAMESPACE VARCHAR(255)"); - JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOX ADD COLUMN USER0 VARCHAR(255)"); - - Query query = em.createNativeQuery("SELECT NAME FROM MAILBOX"); - - @SuppressWarnings("unchecked") - List<String> nameList = query.getResultList(); - System.out.println("getResultList returned a result=" + nameList.size()); - for (String name: nameList) { - MailboxPath mailboxPath = new MailboxPath(name); - System.out.println(mailboxPath); - Query update = em.createNativeQuery("UPDATE MAILBOX SET NAMESPACE = ?, USER0 = ?, NAME = ? WHERE NAME = ?"); - update.setParameter(1, mailboxPath.namespace); - update.setParameter(2, mailboxPath.userName); - update.setParameter(3, mailboxPath.mailboxName); - update.setParameter(4, name); - int resultUpdate = update.executeUpdate(); - System.out.println("ExecuteUpdate returned a result=" + resultUpdate); - } - - } - - /** - * - */ - private class MailboxPath { - - protected String namespace; - protected String userName; - protected String mailboxName; - - /** - * @param name - */ - public MailboxPath(String name) { - - if (! name.startsWith("#mail")) { - throw new IllegalArgumentException("The name must begin with #private"); - } - - namespace = "#mail"; - - name = name.substring(6); - - int atIndex = name.indexOf("@"); - int firstDotIndex = name.indexOf(".", atIndex); - int secondDotIndex = name.indexOf(".", firstDotIndex + 1); - - if (secondDotIndex > 0) { - userName = name.substring(0, secondDotIndex); - mailboxName = name.substring(userName.length() + 1); - } else { - // We don't have a mailbox name... - userName = name.substring(0); - mailboxName = ""; - } - - } - - @Override - public String toString() { - return "MailboxPath [namespace=" + namespace + - ", userName=" + userName + ", mailboxName=" + mailboxName + "]"; - } - - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP172JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP172JpaMigrateCommand.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP172JpaMigrateCommand.java deleted file mode 100644 index f74df60..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP172JpaMigrateCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator.command; - -import javax.persistence.EntityManager; - -import org.apache.james.mailbox.jpa.migrator.exception.JpaMigrateException; - -/** - * JIRA IMAP-172 is "Cleanup JPAMailbox". - * - * Simply drop the MAILBOX.MESSAGECOUNT and MAILBOX.SIZE columns. - * - * @link https://issues.apache.org/jira/browse/IMAP-172 - * - */ -public class IMAP172JpaMigrateCommand implements JpaMigrateCommand { - - @Override - public void migrate(EntityManager em) throws JpaMigrateException { - JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOX DROP COLUMN MESSAGECOUNT"); - JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOX DROP COLUMN SIZE"); - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP176JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP176JpaMigrateCommand.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP176JpaMigrateCommand.java deleted file mode 100644 index d919c8f..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP176JpaMigrateCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator.command; - -import javax.persistence.EntityManager; - -import org.apache.james.mailbox.jpa.migrator.exception.JpaMigrateException; - -/** - * JIRA 176 is "Change users' namespace to #private". - * - * Simply update the MAILBOX.NAMESPACE column with "#private" value. - * - * @link https://issues.apache.org/jira/browse/IMAP-176 - * - */ -public class IMAP176JpaMigrateCommand implements JpaMigrateCommand { - - @Override - public void migrate(EntityManager em) throws JpaMigrateException { - JpaMigrateQuery.executeUpdate(em, "UPDATE MAILBOX SET NAMESPACE = '#private'"); - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP180JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP180JpaMigrateCommand.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP180JpaMigrateCommand.java deleted file mode 100644 index 71d2bb4..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP180JpaMigrateCommand.java +++ /dev/null @@ -1,158 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator.command; - -import javax.persistence.EntityManager; -import javax.persistence.Query; - -import org.apache.james.mailbox.jpa.migrator.exception.JpaMigrateException; -import org.apache.openjpa.kernel.DelegatingResultList; -import org.apache.openjpa.lib.rop.ResultList; - -/** - * JIRA IMAP-180 is "Add @ElementJoinColumn for Property and Header tables". - * - * 1. Add the needed columns on HEADER and PROPERTY - * ALTER TABLE HEADER ADD COLUMN MESSAGE_ID BIGINT - * ALTER TABLE PROPERTY ADD COLUMN MESSAGE_ID BIGINT - * - * 2. Link the HEADER/PROPERTY tables with the MESSAGE table - * SELECT * FROM MESSAGE_HEADER / MESSAGE_HEADER - * - * 3. Add the needed FK and indexes on HEADER and PROPERTY - * CREATE INDEX SQL100727182411700 ON HEADER(MESSAGE_ID) - * ALTER TABLE HEADER ADD CONSTRAINT SQL100727182411700 FOREIGN KEY (MESSAGE_ID) REFERENCES MESSAGE(ID) - * CREATE INDEX SQL100727182411780 ON PROPERTY(MESSAGE_ID) - * ALTER TABLE PROPERTY ADD CONSTRAINT SQL100727182411780 FOREIGN KEY (MESSAGE_ID) REFERENCES MESSAGE(ID) - * - * 4. Drop the MESSAGE_HEADER and MESSAGE_PROPERY tables - * DROP TABLE MESSAGE_HEADER - * DROP TABLE MESSAGE_PROPERTY - * - * @link https://issues.apache.org/jira/browse/IMAP-180 - * - */ -public class IMAP180JpaMigrateCommand implements JpaMigrateCommand { - - @Override - public void migrate(EntityManager em) throws JpaMigrateException { - em.getTransaction().commit(); - migrateHeaders(em); - // Commit after header migration. - migrateProperties(em); - em.getTransaction().begin(); - } - - /** - * Migrate the headers. - */ - @SuppressWarnings("rawtypes") - private static void migrateHeaders(EntityManager em) { - - em.getTransaction().begin(); - Query headerCountQuery = em.createNativeQuery("SELECT COUNT(MESSAGE_ID) FROM MESSAGE_HEADER", Integer.class); - Integer headerCount = (Integer) headerCountQuery.getResultList().get(0); - System.out.println("Number of headers=" + headerCount); - - JpaMigrateQuery.executeUpdate(em, "ALTER TABLE HEADER ADD COLUMN MESSAGE_ID BIGINT"); - - Query headerQuery = em.createNativeQuery("SELECT MESSAGE_ID, HEADERS_ID FROM MESSAGE_HEADER"); - em.getTransaction().commit(); - - DelegatingResultList headerNameList = (DelegatingResultList) headerQuery.getResultList(); - ResultList rl = headerNameList.getDelegate(); - for (int i = 0; i < rl.size(); i++) { - Object[] results = (Object[]) rl.get(i); - Long messageId = (Long) results[0]; - Long headerId = (Long) results[1]; - em.getTransaction().begin(); - Query update = em.createNativeQuery("UPDATE HEADER SET MESSAGE_ID = ? WHERE ID = ?"); - update.setParameter(1, messageId); - update.setParameter(2, headerId); - int result = update.executeUpdate(); - System.out.printf("ExecuteUpdate returned a result=" + result + " for header %d of %d\n", i + 1, headerCount); - em.getTransaction().commit(); - } - - em.getTransaction().begin(); - System.out.println("Creating index."); - JpaMigrateQuery.executeUpdate(em, "CREATE INDEX SQL100727182411700 ON HEADER(MESSAGE_ID)"); - em.getTransaction().commit(); - - em.getTransaction().begin(); - System.out.println("Creating foreign key."); - JpaMigrateQuery.executeUpdate(em, "ALTER TABLE HEADER ADD CONSTRAINT SQL100727182411700 FOREIGN KEY (MESSAGE_ID) REFERENCES MESSAGE(ID)"); - em.getTransaction().commit(); - - em.getTransaction().begin(); - System.out.println("Dropping table."); - JpaMigrateQuery.executeUpdate(em, "DROP TABLE MESSAGE_HEADER"); - em.getTransaction().commit(); - - } - - /** - * Migrate the properties. - */ - @SuppressWarnings("rawtypes") - private static void migrateProperties(EntityManager em) { - - em.getTransaction().begin(); - Query propertyCountQuery = em.createNativeQuery("SELECT COUNT(MESSAGE_ID) FROM MESSAGE_PROPERTY", Integer.class); - Integer propertyCount = (Integer) propertyCountQuery.getResultList().get(0); - System.out.println("Number of headers=" + propertyCount); - - JpaMigrateQuery.executeUpdate(em, "ALTER TABLE PROPERTY ADD COLUMN MESSAGE_ID BIGINT"); - - Query propertyQuery = em.createNativeQuery("SELECT MESSAGE_ID, PROPERTIES_ID FROM MESSAGE_PROPERTY"); - em.getTransaction().commit(); - - DelegatingResultList propertyNameList = (DelegatingResultList) propertyQuery.getResultList(); - ResultList rl = propertyNameList.getDelegate(); - for (int i = 0; i < rl.size(); i++) { - Object[] results = (Object[]) rl.get(i); - Long messageId = (Long) results[0]; - Long propertyId = (Long) results[1]; - em.getTransaction().begin(); - Query update = em.createNativeQuery("UPDATE PROPERTY SET MESSAGE_ID = ? WHERE ID = ?"); - update.setParameter(1, messageId); - update.setParameter(2, propertyId); - int result = update.executeUpdate(); - System.out.printf("ExecuteUpdate returned a result=" + result + " for property %d of %d\n", i + 1, propertyCount); - em.getTransaction().commit(); - } - - em.getTransaction().begin(); - System.out.println("Creating index."); - JpaMigrateQuery.executeUpdate(em, "CREATE INDEX SQL100727182411780 ON PROPERTY(MESSAGE_ID)"); - em.getTransaction().commit(); - - em.getTransaction().begin(); - System.out.println("Creating foreign key."); - JpaMigrateQuery.executeUpdate(em, "ALTER TABLE PROPERTY ADD CONSTRAINT SQL100727182411780 FOREIGN KEY (MESSAGE_ID) REFERENCES MESSAGE(ID)"); - em.getTransaction().commit(); - - em.getTransaction().begin(); - System.out.println("Dropping table."); - JpaMigrateQuery.executeUpdate(em, "DROP TABLE MESSAGE_PROPERTY"); - em.getTransaction().commit(); - - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP184JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP184JpaMigrateCommand.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP184JpaMigrateCommand.java deleted file mode 100644 index 9904736..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/IMAP184JpaMigrateCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator.command; - -import javax.persistence.EntityManager; - -import org.apache.james.mailbox.jpa.migrator.exception.JpaMigrateException; - -/** - * JIRA IMAP-184 is "Remove size of MailboxMembership". - * - * Simply drop the MAILBOXMEMBERSHIP.SIZE column. - * - * @link https://issues.apache.org/jira/browse/IMAP-184 - * - */ -public class IMAP184JpaMigrateCommand implements JpaMigrateCommand { - - @Override - public void migrate(EntityManager em) throws JpaMigrateException { - JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOXMEMBERSHIP DROP COLUMN SIZE"); - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/JpaMigrateCommand.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/JpaMigrateCommand.java deleted file mode 100644 index 6198826..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/JpaMigrateCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator.command; - -import javax.persistence.EntityManager; - -import org.apache.james.mailbox.jpa.migrator.exception.JpaMigrateException; - -/** - * A command that apply to James database the needed updates. - */ -public interface JpaMigrateCommand { - - /** - * Executes the needed SQL commands on the database via the provided JPA entity manager. - * A transaction on the provided entity manager must be begun by the caller. - * It is also the reponsibility of the caller to commit the opened transaction after - * calling the migrate method. - * - * @param em the provided Entity Manager - * @throws JpaMigrateException - */ - void migrate(EntityManager em) throws JpaMigrateException; - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/JpaMigrateQuery.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/JpaMigrateQuery.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/JpaMigrateQuery.java deleted file mode 100644 index 752c3ff..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/command/JpaMigrateQuery.java +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator.command; - -import javax.persistence.EntityManager; -import javax.persistence.Query; - -/** - * - */ -public class JpaMigrateQuery { - - /** - * @param em - * @param update - */ - public static void executeUpdate(EntityManager em, String update) { - Query query = em.createNativeQuery(update); - int result = query.executeUpdate(); - System.out.println("ExecuteUpdate returned a result=" + result); - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/exception/JpaMigrateException.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/exception/JpaMigrateException.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/exception/JpaMigrateException.java deleted file mode 100644 index 4c83e18..0000000 --- a/mailbox/tool/src/main/java/org/apache/james/mailbox/jpa/migrator/exception/JpaMigrateException.java +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator.exception; - -/** - * Exception to be thrown when a problem occurs in the migration process. - * - */ -public class JpaMigrateException extends Exception { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public JpaMigrateException() { - } - - public JpaMigrateException(String message) { - super(message); - } - - public JpaMigrateException(Throwable cause) { - super(cause); - } - - public JpaMigrateException(String message, Throwable cause) { - super(message, cause); - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java b/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java deleted file mode 100644 index bd47945..0000000 --- a/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.mailbox.jpa.migrator; - -import org.junit.Ignore; -import org.junit.Test; - -@Ignore("This class needs to be reviewed") -public class JpaMigratorTest { - @Test - public void testImap165() throws Exception { - JpaMigrator.main(new String[]{"IMAP165"}); - } - - @Test - public void testImap168() throws Exception { - JpaMigrator.main(new String[]{"IMAP168"}); - } - - @Test - public void testImap172() throws Exception { - JpaMigrator.main(new String[]{"IMAP172"}); - } - - @Test - public void testImap176() throws Exception { - JpaMigrator.main(new String[]{"IMAP176"}); - } - - @Test - public void testImap180() throws Exception { - JpaMigrator.main(new String[]{"IMAP180"}); - } - - @Test - public void testImap184() throws Exception { - JpaMigrator.main(new String[]{"IMAP184"}); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/pom.xml ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/pom.xml b/mailbox/tools/jpa-migrator/pom.xml new file mode 100644 index 0000000..1a15887 --- /dev/null +++ b/mailbox/tools/jpa-migrator/pom.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <artifactId>apache-james-mailbox-tools</artifactId> + <groupId>org.apache.james</groupId> + <version>3.2.0-SNAPSHOT</version> + </parent> + + <artifactId>apache-james-mailbvox-tools-jpa-migrator</artifactId> + + <name>Apache James :: Mailbox :: Tools :: JPA migrator</name> + + <dependencies> + <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>apache-james-backends-jpa</artifactId> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigrator.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigrator.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigrator.java new file mode 100644 index 0000000..20ec314 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigrator.java @@ -0,0 +1,75 @@ +/**************************************************************** + * 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.tools.jpa.migrator; + +import java.util.Locale; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; + +import org.apache.james.mailbox.tools.jpa.migrator.command.JpaMigrateCommand; +import org.apache.james.mailbox.tools.jpa.migrator.exception.JpaMigrateException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The class that will manage the migration commands for the James JPA database. + * All SQL commands should be moved from JAVA code to a separate file. + */ +public class JpaMigrator { + + private static final Logger LOGGER = LoggerFactory.getLogger(JpaMigrator.class); + + /** + * The package name where all commands reside. + */ + private static final String JPA_MIGRATION_COMMAND_PACKAGE = JpaMigrateCommand.class.getPackage().getName(); + + /**<p>Executes the database migration for the provided JIRAs numbers. + * For example, for the https://issues.apache.org/jira/browse/IMAP-165 JIRA, simply invoke + * with IMAP165 as parameter. + * You can also invoke with many JIRA at once. They will be all serially executed.</p> + * + * TODO Extract the SQL in JAVA classes to XML file. + * + * @param jiras the JIRAs numbers + * @throws JpaMigrateException + */ + public static void main(String[] jiras) throws JpaMigrateException { + + try { + EntityManagerFactory factory = Persistence.createEntityManagerFactory("JamesMigrator"); + EntityManager em = factory.createEntityManager(); + + for (String jira: jiras) { + JpaMigrateCommand jiraJpaMigratable = (JpaMigrateCommand) Class.forName(JPA_MIGRATION_COMMAND_PACKAGE + "." + jira.toUpperCase(Locale.US) + JpaMigrateCommand.class.getSimpleName()).newInstance(); + LOGGER.info("Now executing {} migration", jira); + em.getTransaction().begin(); + jiraJpaMigratable.migrate(em); + em.getTransaction().commit(); + LOGGER.info("{} migration is successfully achieved", jira); + } + } catch (Throwable t) { + throw new JpaMigrateException(t); + } + + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP165JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP165JpaMigrateCommand.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP165JpaMigrateCommand.java new file mode 100644 index 0000000..7ba0c98 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP165JpaMigrateCommand.java @@ -0,0 +1,42 @@ +/**************************************************************** + * 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.tools.jpa.migrator.command; + +import javax.persistence.EntityManager; + +import org.apache.james.mailbox.tools.jpa.migrator.exception.JpaMigrateException; + +/** + * JIRA IMAP-165 is "Add index annotation on frequently used columns". + * + * Add 3 indexes for the DELETED, SEEN and RECENT columns of MEMBERSHIP table. + * + * @link https://issues.apache.org/jira/browse/IMAP-165 + * + */ +public class IMAP165JpaMigrateCommand implements JpaMigrateCommand { + + @Override + public void migrate(EntityManager em) throws JpaMigrateException { + JpaMigrateQuery.executeUpdate(em, "CREATE INDEX I_MMBRSHP_SEEN ON MEMBERSHIP (SEEN)"); + JpaMigrateQuery.executeUpdate(em, "CREATE INDEX I_MMBRSHP_RECENT ON MEMBERSHIP (RECENT)"); + JpaMigrateQuery.executeUpdate(em, "CREATE INDEX I_MMBRSHP_DELETED ON MEMBERSHIP (DELETED)"); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP168JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP168JpaMigrateCommand.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP168JpaMigrateCommand.java new file mode 100644 index 0000000..8f67357 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP168JpaMigrateCommand.java @@ -0,0 +1,120 @@ +/**************************************************************** + * 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.tools.jpa.migrator.command; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.Query; + +import org.apache.james.mailbox.tools.jpa.migrator.exception.JpaMigrateException; + +/** + * <p> + * JIRA IMAP-168 is "mailboxes can't be identified 100% unambiguously using virtual hosting". + * + * MAILBOX.NAME contains data such as + * "#[email protected]" + * "#[email protected]" + * "#[email protected]" + * "#[email protected]" + * + * It needs to be splitted into MAILBOX.NAMESPACE | MAILBOX.USER0 | MAILBOX.NAME with + * "#mail" | "[email protected]" | "" ==> was created before, but is not used anymore + * "#mail" | "[email protected]" | "INBOX" + * "#mail" | "[email protected]" | "INBOX.test" + * "#mail" | "[email protected]" | "Trash" + *</p> + * + * @link https://issues.apache.org/jira/browse/IMAP-168 + * + */ +public class IMAP168JpaMigrateCommand implements JpaMigrateCommand { + + @Override + public void migrate(EntityManager em) throws JpaMigrateException { + + JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOX ADD COLUMN NAMESPACE VARCHAR(255)"); + JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOX ADD COLUMN USER0 VARCHAR(255)"); + + Query query = em.createNativeQuery("SELECT NAME FROM MAILBOX"); + + @SuppressWarnings("unchecked") + List<String> nameList = query.getResultList(); + System.out.println("getResultList returned a result=" + nameList.size()); + for (String name: nameList) { + MailboxPath mailboxPath = new MailboxPath(name); + System.out.println(mailboxPath); + Query update = em.createNativeQuery("UPDATE MAILBOX SET NAMESPACE = ?, USER0 = ?, NAME = ? WHERE NAME = ?"); + update.setParameter(1, mailboxPath.namespace); + update.setParameter(2, mailboxPath.userName); + update.setParameter(3, mailboxPath.mailboxName); + update.setParameter(4, name); + int resultUpdate = update.executeUpdate(); + System.out.println("ExecuteUpdate returned a result=" + resultUpdate); + } + + } + + /** + * + */ + private class MailboxPath { + + protected String namespace; + protected String userName; + protected String mailboxName; + + /** + * @param name + */ + public MailboxPath(String name) { + + if (! name.startsWith("#mail")) { + throw new IllegalArgumentException("The name must begin with #private"); + } + + namespace = "#mail"; + + name = name.substring(6); + + int atIndex = name.indexOf("@"); + int firstDotIndex = name.indexOf(".", atIndex); + int secondDotIndex = name.indexOf(".", firstDotIndex + 1); + + if (secondDotIndex > 0) { + userName = name.substring(0, secondDotIndex); + mailboxName = name.substring(userName.length() + 1); + } else { + // We don't have a mailbox name... + userName = name.substring(0); + mailboxName = ""; + } + + } + + @Override + public String toString() { + return "MailboxPath [namespace=" + namespace + + ", userName=" + userName + ", mailboxName=" + mailboxName + "]"; + } + + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP172JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP172JpaMigrateCommand.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP172JpaMigrateCommand.java new file mode 100644 index 0000000..3c153be --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP172JpaMigrateCommand.java @@ -0,0 +1,41 @@ +/**************************************************************** + * 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.tools.jpa.migrator.command; + +import javax.persistence.EntityManager; + +import org.apache.james.mailbox.tools.jpa.migrator.exception.JpaMigrateException; + +/** + * JIRA IMAP-172 is "Cleanup JPAMailbox". + * + * Simply drop the MAILBOX.MESSAGECOUNT and MAILBOX.SIZE columns. + * + * @link https://issues.apache.org/jira/browse/IMAP-172 + * + */ +public class IMAP172JpaMigrateCommand implements JpaMigrateCommand { + + @Override + public void migrate(EntityManager em) throws JpaMigrateException { + JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOX DROP COLUMN MESSAGECOUNT"); + JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOX DROP COLUMN SIZE"); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP176JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP176JpaMigrateCommand.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP176JpaMigrateCommand.java new file mode 100644 index 0000000..6c31bd0 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP176JpaMigrateCommand.java @@ -0,0 +1,40 @@ +/**************************************************************** + * 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.tools.jpa.migrator.command; + +import javax.persistence.EntityManager; + +import org.apache.james.mailbox.tools.jpa.migrator.exception.JpaMigrateException; + +/** + * JIRA 176 is "Change users' namespace to #private". + * + * Simply update the MAILBOX.NAMESPACE column with "#private" value. + * + * @link https://issues.apache.org/jira/browse/IMAP-176 + * + */ +public class IMAP176JpaMigrateCommand implements JpaMigrateCommand { + + @Override + public void migrate(EntityManager em) throws JpaMigrateException { + JpaMigrateQuery.executeUpdate(em, "UPDATE MAILBOX SET NAMESPACE = '#private'"); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP180JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP180JpaMigrateCommand.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP180JpaMigrateCommand.java new file mode 100644 index 0000000..cc99930 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP180JpaMigrateCommand.java @@ -0,0 +1,158 @@ +/**************************************************************** + * 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.tools.jpa.migrator.command; + +import javax.persistence.EntityManager; +import javax.persistence.Query; + +import org.apache.james.mailbox.tools.jpa.migrator.exception.JpaMigrateException; +import org.apache.openjpa.kernel.DelegatingResultList; +import org.apache.openjpa.lib.rop.ResultList; + +/** + * JIRA IMAP-180 is "Add @ElementJoinColumn for Property and Header tables". + * + * 1. Add the needed columns on HEADER and PROPERTY + * ALTER TABLE HEADER ADD COLUMN MESSAGE_ID BIGINT + * ALTER TABLE PROPERTY ADD COLUMN MESSAGE_ID BIGINT + * + * 2. Link the HEADER/PROPERTY tables with the MESSAGE table + * SELECT * FROM MESSAGE_HEADER / MESSAGE_HEADER + * + * 3. Add the needed FK and indexes on HEADER and PROPERTY + * CREATE INDEX SQL100727182411700 ON HEADER(MESSAGE_ID) + * ALTER TABLE HEADER ADD CONSTRAINT SQL100727182411700 FOREIGN KEY (MESSAGE_ID) REFERENCES MESSAGE(ID) + * CREATE INDEX SQL100727182411780 ON PROPERTY(MESSAGE_ID) + * ALTER TABLE PROPERTY ADD CONSTRAINT SQL100727182411780 FOREIGN KEY (MESSAGE_ID) REFERENCES MESSAGE(ID) + * + * 4. Drop the MESSAGE_HEADER and MESSAGE_PROPERY tables + * DROP TABLE MESSAGE_HEADER + * DROP TABLE MESSAGE_PROPERTY + * + * @link https://issues.apache.org/jira/browse/IMAP-180 + * + */ +public class IMAP180JpaMigrateCommand implements JpaMigrateCommand { + + @Override + public void migrate(EntityManager em) throws JpaMigrateException { + em.getTransaction().commit(); + migrateHeaders(em); + // Commit after header migration. + migrateProperties(em); + em.getTransaction().begin(); + } + + /** + * Migrate the headers. + */ + @SuppressWarnings("rawtypes") + private static void migrateHeaders(EntityManager em) { + + em.getTransaction().begin(); + Query headerCountQuery = em.createNativeQuery("SELECT COUNT(MESSAGE_ID) FROM MESSAGE_HEADER", Integer.class); + Integer headerCount = (Integer) headerCountQuery.getResultList().get(0); + System.out.println("Number of headers=" + headerCount); + + JpaMigrateQuery.executeUpdate(em, "ALTER TABLE HEADER ADD COLUMN MESSAGE_ID BIGINT"); + + Query headerQuery = em.createNativeQuery("SELECT MESSAGE_ID, HEADERS_ID FROM MESSAGE_HEADER"); + em.getTransaction().commit(); + + DelegatingResultList headerNameList = (DelegatingResultList) headerQuery.getResultList(); + ResultList rl = headerNameList.getDelegate(); + for (int i = 0; i < rl.size(); i++) { + Object[] results = (Object[]) rl.get(i); + Long messageId = (Long) results[0]; + Long headerId = (Long) results[1]; + em.getTransaction().begin(); + Query update = em.createNativeQuery("UPDATE HEADER SET MESSAGE_ID = ? WHERE ID = ?"); + update.setParameter(1, messageId); + update.setParameter(2, headerId); + int result = update.executeUpdate(); + System.out.printf("ExecuteUpdate returned a result=" + result + " for header %d of %d\n", i + 1, headerCount); + em.getTransaction().commit(); + } + + em.getTransaction().begin(); + System.out.println("Creating index."); + JpaMigrateQuery.executeUpdate(em, "CREATE INDEX SQL100727182411700 ON HEADER(MESSAGE_ID)"); + em.getTransaction().commit(); + + em.getTransaction().begin(); + System.out.println("Creating foreign key."); + JpaMigrateQuery.executeUpdate(em, "ALTER TABLE HEADER ADD CONSTRAINT SQL100727182411700 FOREIGN KEY (MESSAGE_ID) REFERENCES MESSAGE(ID)"); + em.getTransaction().commit(); + + em.getTransaction().begin(); + System.out.println("Dropping table."); + JpaMigrateQuery.executeUpdate(em, "DROP TABLE MESSAGE_HEADER"); + em.getTransaction().commit(); + + } + + /** + * Migrate the properties. + */ + @SuppressWarnings("rawtypes") + private static void migrateProperties(EntityManager em) { + + em.getTransaction().begin(); + Query propertyCountQuery = em.createNativeQuery("SELECT COUNT(MESSAGE_ID) FROM MESSAGE_PROPERTY", Integer.class); + Integer propertyCount = (Integer) propertyCountQuery.getResultList().get(0); + System.out.println("Number of headers=" + propertyCount); + + JpaMigrateQuery.executeUpdate(em, "ALTER TABLE PROPERTY ADD COLUMN MESSAGE_ID BIGINT"); + + Query propertyQuery = em.createNativeQuery("SELECT MESSAGE_ID, PROPERTIES_ID FROM MESSAGE_PROPERTY"); + em.getTransaction().commit(); + + DelegatingResultList propertyNameList = (DelegatingResultList) propertyQuery.getResultList(); + ResultList rl = propertyNameList.getDelegate(); + for (int i = 0; i < rl.size(); i++) { + Object[] results = (Object[]) rl.get(i); + Long messageId = (Long) results[0]; + Long propertyId = (Long) results[1]; + em.getTransaction().begin(); + Query update = em.createNativeQuery("UPDATE PROPERTY SET MESSAGE_ID = ? WHERE ID = ?"); + update.setParameter(1, messageId); + update.setParameter(2, propertyId); + int result = update.executeUpdate(); + System.out.printf("ExecuteUpdate returned a result=" + result + " for property %d of %d\n", i + 1, propertyCount); + em.getTransaction().commit(); + } + + em.getTransaction().begin(); + System.out.println("Creating index."); + JpaMigrateQuery.executeUpdate(em, "CREATE INDEX SQL100727182411780 ON PROPERTY(MESSAGE_ID)"); + em.getTransaction().commit(); + + em.getTransaction().begin(); + System.out.println("Creating foreign key."); + JpaMigrateQuery.executeUpdate(em, "ALTER TABLE PROPERTY ADD CONSTRAINT SQL100727182411780 FOREIGN KEY (MESSAGE_ID) REFERENCES MESSAGE(ID)"); + em.getTransaction().commit(); + + em.getTransaction().begin(); + System.out.println("Dropping table."); + JpaMigrateQuery.executeUpdate(em, "DROP TABLE MESSAGE_PROPERTY"); + em.getTransaction().commit(); + + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP184JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP184JpaMigrateCommand.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP184JpaMigrateCommand.java new file mode 100644 index 0000000..0a7e7e2 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP184JpaMigrateCommand.java @@ -0,0 +1,40 @@ +/**************************************************************** + * 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.tools.jpa.migrator.command; + +import javax.persistence.EntityManager; + +import org.apache.james.mailbox.tools.jpa.migrator.exception.JpaMigrateException; + +/** + * JIRA IMAP-184 is "Remove size of MailboxMembership". + * + * Simply drop the MAILBOXMEMBERSHIP.SIZE column. + * + * @link https://issues.apache.org/jira/browse/IMAP-184 + * + */ +public class IMAP184JpaMigrateCommand implements JpaMigrateCommand { + + @Override + public void migrate(EntityManager em) throws JpaMigrateException { + JpaMigrateQuery.executeUpdate(em, "ALTER TABLE MAILBOXMEMBERSHIP DROP COLUMN SIZE"); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateCommand.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateCommand.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateCommand.java new file mode 100644 index 0000000..73a64e4 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateCommand.java @@ -0,0 +1,41 @@ +/**************************************************************** + * 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.tools.jpa.migrator.command; + +import javax.persistence.EntityManager; + +import org.apache.james.mailbox.tools.jpa.migrator.exception.JpaMigrateException; + +/** + * A command that apply to James database the needed updates. + */ +public interface JpaMigrateCommand { + + /** + * Executes the needed SQL commands on the database via the provided JPA entity manager. + * A transaction on the provided entity manager must be begun by the caller. + * It is also the reponsibility of the caller to commit the opened transaction after + * calling the migrate method. + * + * @param em the provided Entity Manager + * @throws JpaMigrateException + */ + void migrate(EntityManager em) throws JpaMigrateException; + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateQuery.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateQuery.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateQuery.java new file mode 100644 index 0000000..4aa98f6 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateQuery.java @@ -0,0 +1,39 @@ +/**************************************************************** + * 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.tools.jpa.migrator.command; + +import javax.persistence.EntityManager; +import javax.persistence.Query; + +/** + * + */ +public class JpaMigrateQuery { + + /** + * @param em + * @param update + */ + public static void executeUpdate(EntityManager em, String update) { + Query query = em.createNativeQuery(update); + int result = query.executeUpdate(); + System.out.println("ExecuteUpdate returned a result=" + result); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/exception/JpaMigrateException.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/exception/JpaMigrateException.java b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/exception/JpaMigrateException.java new file mode 100644 index 0000000..9f454b4 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/exception/JpaMigrateException.java @@ -0,0 +1,47 @@ +/**************************************************************** + * 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.tools.jpa.migrator.exception; + +/** + * Exception to be thrown when a problem occurs in the migration process. + * + */ +public class JpaMigrateException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public JpaMigrateException() { + } + + public JpaMigrateException(String message) { + super(message); + } + + public JpaMigrateException(Throwable cause) { + super(cause); + } + + public JpaMigrateException(String message, Throwable cause) { + super(message, cause); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/jpa-migrator/src/test/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigratorTest.java ---------------------------------------------------------------------- diff --git a/mailbox/tools/jpa-migrator/src/test/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigratorTest.java b/mailbox/tools/jpa-migrator/src/test/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigratorTest.java new file mode 100644 index 0000000..cc8bb94 --- /dev/null +++ b/mailbox/tools/jpa-migrator/src/test/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigratorTest.java @@ -0,0 +1,55 @@ +/**************************************************************** + * 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.tools.jpa.migrator; + +import org.junit.Ignore; +import org.junit.Test; + +@Ignore("This class needs to be reviewed") +public class JpaMigratorTest { + @Test + public void testImap165() throws Exception { + JpaMigrator.main(new String[]{"IMAP165"}); + } + + @Test + public void testImap168() throws Exception { + JpaMigrator.main(new String[]{"IMAP168"}); + } + + @Test + public void testImap172() throws Exception { + JpaMigrator.main(new String[]{"IMAP172"}); + } + + @Test + public void testImap176() throws Exception { + JpaMigrator.main(new String[]{"IMAP176"}); + } + + @Test + public void testImap180() throws Exception { + JpaMigrator.main(new String[]{"IMAP180"}); + } + + @Test + public void testImap184() throws Exception { + JpaMigrator.main(new String[]{"IMAP184"}); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/mailbox/tools/pom.xml ---------------------------------------------------------------------- diff --git a/mailbox/tools/pom.xml b/mailbox/tools/pom.xml index 64c3fb7..978e9a3 100644 --- a/mailbox/tools/pom.xml +++ b/mailbox/tools/pom.xml @@ -32,6 +32,7 @@ <name>Apache James :: Mailbox :: Tools</name> <modules> + <module>jpa-migrator</module> <module>maildir-utils</module> </modules> </project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/a937a334/server/container/spring/pom.xml ---------------------------------------------------------------------- diff --git a/server/container/spring/pom.xml b/server/container/spring/pom.xml index a4cf595..cb430c4 100644 --- a/server/container/spring/pom.xml +++ b/server/container/spring/pom.xml @@ -35,6 +35,10 @@ <dependencies> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>apache-james-backends-jpa</artifactId> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-api</artifactId> </dependency> <dependency> --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
