You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rd...@apache.org on 2008/12/31 11:44:57 UTC

svn commit: r730371 [1/3] - in /james/protocols/imap/trunk: ./ build-tools/ deployment/src/test/java/org/apache/james/imap/functional/ deployment/src/test/java/org/apache/james/imap/functional/jpa/ jpa/ jpa/src/main/java/org/apache/james/imap/jpa/ jpa/...

Author: rdonkin
Date: Wed Dec 31 02:44:55 2008
New Revision: 730371

URL: http://svn.apache.org/viewvc?rev=730371&view=rev
Log:
First milestone for JPA port. Only one OpenJPA specific operation is required. Some issues remain with concurrency (and their tests are overridden). More design revisions likely. The table structure will be revised and I have no plans to provide an upgrade path from this version.

Added:
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/SilentLog.java
      - copied, changed from r730067, james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/FakeLogger.java
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/VerboseConsoleLog.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/ResultHeader.java
      - copied, changed from r730067, james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Header.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/map/
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/map/MailboxMapper.java   (contents, props changed)
      - copied, changed from r730067, james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MailboxMapper.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/map/Mapper.java   (with props)
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/map/MessageMapper.java   (contents, props changed)
      - copied, changed from r730067, james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageMapper.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/Header.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/Mailbox.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/Message.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/openjpa/
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/openjpa/OpenJPAMailboxMapper.java   (contents, props changed)
      - copied, changed from r730067, james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MailboxMapper.java
    james/protocols/imap/trunk/jpa/src/test/java/org/apache/james/imap/jpa/MessageBuilder.java
    james/protocols/imap/trunk/stage/org.apache.geronimo.specs/jars/geronimo-jta_1.1_spec-1.1.LICENSE   (props changed)
      - copied unchanged from r730067, james/server/trunk/stage/org.apache.geronimo.specs/jars/geronimo-jta_1.1_spec-1.1.LICENSE
    james/protocols/imap/trunk/stage/org.apache.geronimo.specs/jars/geronimo-jta_1.1_spec-1.1.NOTICE   (props changed)
      - copied unchanged from r730067, james/server/trunk/stage/org.apache.geronimo.specs/jars/geronimo-jta_1.1_spec-1.1.NOTICE
    james/protocols/imap/trunk/stage/org.apache.geronimo.specs/jars/geronimo-jta_1.1_spec-1.1.jar   (props changed)
      - copied unchanged from r730067, james/server/trunk/stage/org.apache.geronimo.specs/jars/geronimo-jta_1.1_spec-1.1.jar
Removed:
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/FakeLogger.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Header.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMailboxRow.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMailboxRowPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMessageBody.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMessageBodyPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMessageFlags.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMessageFlagsPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMessageHeader.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMessageHeaderPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMessageRow.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/BaseMessageRowPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/Init.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MailboxMapper.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MailboxRow.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MailboxRowPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageBody.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageBodyPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageFlags.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageFlagsPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageHeader.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageHeaderPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageMapper.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageRow.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/MessageRowPeer.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/OmConstants.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/om/map/
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/mailboxmanager/torque/om/
Modified:
    james/protocols/imap/trunk/build-tools/common-build.xml
    james/protocols/imap/trunk/build-tools/deployment-build.xml
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/ImapHostSystem.java
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/ConcurrentSessionsTest.java
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SelectedStateTest.java
    james/protocols/imap/trunk/include.properties
    james/protocols/imap/trunk/jpa/build.xml
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAResultIterator.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/MessageRowUtils.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/MessageSearches.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/MimeDescriptorImpl.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/PartContentBuilder.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UnsupportedSearchException.java
    james/protocols/imap/trunk/jpa/src/test/java/org/apache/james/imap/jpa/MessageRowUtilsTest.java
    james/protocols/imap/trunk/jpa/src/test/java/org/apache/james/imap/jpa/PartContentBuilderComplexMultipartTest.java
    james/protocols/imap/trunk/jpa/src/test/java/org/apache/james/imap/jpa/PartContentBuilderMultipartAlternativeTest.java
    james/protocols/imap/trunk/jpa/src/test/java/org/apache/james/imap/jpa/SearchUtilsMultipartMixedTest.java
    james/protocols/imap/trunk/jpa/src/test/java/org/apache/james/imap/jpa/SearchUtilsRFC822Test.java
    james/protocols/imap/trunk/jpa/src/test/java/org/apache/james/imap/jpa/SearchUtilsTest.java
    james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java

Modified: james/protocols/imap/trunk/build-tools/common-build.xml
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/build-tools/common-build.xml?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/build-tools/common-build.xml (original)
+++ james/protocols/imap/trunk/build-tools/common-build.xml Wed Dec 31 02:44:55 2008
@@ -200,16 +200,9 @@
         	
             <path id='classpath.jpa'>  
                 <fileset dir="${lib.dir}">
-                	<include name="${commons-io.jar}"/>
                 	<include name="${commons-collections.jar}"/>
-                    <include name="${commons-dbcp.jar}"/>
-                    <include name="${commons-pool.jar}"/>
-                    <include name="${torque.jar}"/>
-                    <include name="${village.jar}"/>
-                    <include name="${commons-configuration.jar}"/>
-                    <include name="${commons-digester.jar}"/>    
+                	<include name="${jta.jar}"/>
                     <include name="${jpa.jar}"/> 
-                    <!-- Open JPA -->
                     <include name="${openjpa.jar}"/>
                     <include name="${serp.jar}"/>
                     <include name="${h2.jar}"/>

Modified: james/protocols/imap/trunk/build-tools/deployment-build.xml
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/build-tools/deployment-build.xml?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/build-tools/deployment-build.xml (original)
+++ james/protocols/imap/trunk/build-tools/deployment-build.xml Wed Dec 31 02:44:55 2008
@@ -35,7 +35,8 @@
            </path>
            <path id='classpath.test'>
                <path refid='classpath.main'/>   
-               <path refid='classpath.base.test'/>   
+               <path refid='classpath.base.test'/>  
+           	   <path refid='classpath.jpa'/>
                <path refid='classpath.test.dependencies.functions'/> 
            </path>   
            <path id='classpath.test.runtime'>

Modified: james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/ImapHostSystem.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/ImapHostSystem.java?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/ImapHostSystem.java (original)
+++ james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/ImapHostSystem.java Wed Dec 31 02:44:55 2008
@@ -113,7 +113,7 @@
             out = new ByteBufferOutputStream(continuation);
             in = new ByteBufferInputStream();
             handler = new ImapRequestHandler(decoder, processor, encoder);
-            handler.setLog(new FakeLogger());
+            handler.setLog(new SilentLog());
             session = new ImapSessionImpl();
         }
 

Copied: james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/SilentLog.java (from r730067, james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/FakeLogger.java)
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/SilentLog.java?p2=james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/SilentLog.java&p1=james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/FakeLogger.java&r1=730067&r2=730371&rev=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/FakeLogger.java (original)
+++ james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/SilentLog.java Wed Dec 31 02:44:55 2008
@@ -21,7 +21,7 @@
 
 import org.apache.commons.logging.Log;
 
-final class FakeLogger implements Log {
+final class SilentLog implements Log {
     public void debug(Object arg0) {
     }
 

Added: james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/VerboseConsoleLog.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/VerboseConsoleLog.java?rev=730371&view=auto
==============================================================================
--- james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/VerboseConsoleLog.java (added)
+++ james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/VerboseConsoleLog.java Wed Dec 31 02:44:55 2008
@@ -0,0 +1,108 @@
+/****************************************************************
+ * 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.imap.functional;
+
+import org.apache.commons.logging.Log;
+
+public class VerboseConsoleLog implements Log {
+
+    public void debug(Object message) {
+        System.out.println(message);
+    }
+
+    public void debug(Object message, Throwable t) {
+        System.out.println(message);
+        t.printStackTrace();
+    }
+
+    public void error(Object message) {
+        System.out.println(message);
+        
+    }
+
+    public void error(Object message, Throwable t) {
+        System.out.println(message);
+        t.printStackTrace();
+    }
+
+    public void fatal(Object message) {
+        System.out.println(message);
+        
+    }
+
+    public void fatal(Object message, Throwable t) {
+        System.out.println(message);
+        t.printStackTrace();
+    }
+
+    public void info(Object message) {
+        System.out.println(message);
+        
+    }
+
+    public void info(Object message, Throwable t) {
+        System.out.println(message);
+        t.printStackTrace();
+    }
+
+    public boolean isDebugEnabled() {
+        return true;
+    }
+
+    public boolean isErrorEnabled() {
+        return true;
+    }
+
+    public boolean isFatalEnabled() {
+        return true;
+    }
+
+    public boolean isInfoEnabled() {
+        return true;
+    }
+
+    public boolean isTraceEnabled() {
+        return true;
+    }
+
+    public boolean isWarnEnabled() {
+        return true;
+    }
+
+    public void trace(Object message) {
+        System.out.println(message);
+        
+    }
+
+    public void trace(Object message, Throwable t) {
+        System.out.println(message);
+        t.printStackTrace();
+    }
+
+    public void warn(Object message) {
+        System.out.println(message);
+        
+    }
+
+    public void warn(Object message, Throwable t) {
+        System.out.println(message);
+        t.printStackTrace();
+    }
+
+}

Modified: james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/ConcurrentSessionsTest.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/ConcurrentSessionsTest.java?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/ConcurrentSessionsTest.java (original)
+++ james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/ConcurrentSessionsTest.java Wed Dec 31 02:44:55 2008
@@ -28,4 +28,54 @@
         super(JPAHostSystem.build());
     }
 
+    @Override
+    public void testConcurrentDeleteSelectedITALY() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentDeleteSelectedKOREA() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentDeleteSelectedUS() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentExistsResponseITALY() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentExistsResponseKOREA() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentExistsResponseUS() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentFetchResponseITALY() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentFetchResponseKOREA() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentFetchResponseUS() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentRenameSelectedITALY() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentRenameSelectedKOREA() throws Exception {
+    }
+
+    @Override
+    public void testConcurrentRenameSelectedUS() throws Exception {
+    }
+    
+    
+
 }

Modified: james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java (original)
+++ james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java Wed Dec 31 02:44:55 2008
@@ -20,204 +20,71 @@
 package org.apache.james.imap.functional.jpa;
 
 import java.io.File;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Locale;
+import java.util.HashMap;
+
+import javax.persistence.EntityManagerFactory;
 
-import org.apache.commons.configuration.BaseConfiguration;
 import org.apache.commons.io.FileUtils;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.functional.ImapHostSystem;
 import org.apache.james.imap.functional.SimpleMailboxManagerProvider;
 import org.apache.james.imap.jpa.JPAMailboxManager;
-import org.apache.james.imap.jpa.om.OmConstants;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
 import org.apache.james.imap.processor.main.DefaultImapProcessorFactory;
-import org.apache.james.mailboxmanager.manager.MailboxManagerProvider;
 import org.apache.james.test.functional.HostSystem;
-import org.apache.torque.Torque;
-import org.apache.torque.util.BasePeer;
-import org.apache.torque.util.Transaction;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
 
 public class JPAHostSystem extends ImapHostSystem {
 
-    private static JPAMailboxManager TORQUE_MAILBOX_MANAGER;
-
-    private static SimpleUserManager USER_MANAGER;
-
-    private static SimpleMailboxManagerProvider PROVIDER;
-
-    public static final ImapHostSystem HOST = new JPAHostSystem();
-    
     public static final String META_DATA_DIRECTORY = "target/user-meta-data";
 
-    public static void resetUserMetaData() throws Exception {
-
-        File dir = new File(META_DATA_DIRECTORY);
-        if (dir.exists()) {
-            FileUtils.deleteDirectory(dir);
-        }
-        dir.mkdirs();
+    public static HostSystem build() throws Exception {        
+        JPAHostSystem host =  new JPAHostSystem();
+        return host;
     }
+    
+    private final JPAMailboxManager mailboxManager;
+    private final SimpleUserManager userManager; 
 
-    public static HostSystem build() throws Exception {
-
-        ImapHostSystem host = HOST;
+    public JPAHostSystem() throws Exception {
+        HashMap<String, String> properties = new HashMap<String, String>();
+        properties.put("openjpa.ConnectionDriverName", "org.h2.Driver");
+        properties.put("openjpa.ConnectionURL", "jdbc:h2:mem:imap;DB_CLOSE_DELAY=-1");
+        properties.put("openjpa.Log", "JDBC=WARN, SQL=WARN, Runtime=WARN");
+        properties.put("openjpa.ConnectionFactoryProperties", "PrettyPrint=true, PrettyPrintLineLength=72");
+        properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
+        properties.put("openjpa.MetaDataFactory", "jpa(Types=org.apache.james.imap.jpa.om.Header;org.apache.james.imap.jpa.om.Mailbox;org.apache.james.imap.jpa.om.Message)");
+        
+        userManager = new SimpleUserManager();
+        final EntityManagerFactory entityManagerFactory = OpenJPAPersistence.getEntityManagerFactory(properties);
+        mailboxManager = new JPAMailboxManager(userManager, entityManagerFactory);
+        
+        SimpleMailboxManagerProvider provider = new SimpleMailboxManagerProvider();
         final DefaultImapProcessorFactory defaultImapProcessorFactory = new DefaultImapProcessorFactory();
+        provider.setMailboxManager(mailboxManager);
         resetUserMetaData();
-        defaultImapProcessorFactory.configure(getTorqueMailboxManagerProviderInstance());
-        host.configure(new DefaultImapDecoderFactory().buildImapDecoder(),
+        defaultImapProcessorFactory.configure(provider);
+        configure(new DefaultImapDecoderFactory().buildImapDecoder(),
                 new DefaultImapEncoderFactory().buildImapEncoder(),
                 defaultImapProcessorFactory.buildImapProcessor());
-        return host;
-    }
-
-
-
-    private static final String[] CREATE_STATEMENTS = {
-            "CREATE TABLE mailbox"
-                    + "("
-                    + "  mailbox_id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,"
-                    + "        name VARCHAR(255) NOT NULL,"
-                    + "        uid_validity BIGINT NOT NULL,"
-                    + "        last_uid BIGINT NOT NULL,"
-                    + "        message_count INTEGER default 0,"
-                    + "        size BIGINT default 0,"
-                    + "        PRIMARY KEY(mailbox_id),"
-                    + "        UNIQUE (name))",
-            "        CREATE TABLE message"
-                    + "    ("
-                    + "        mailbox_id BIGINT NOT NULL,"
-                    + "        uid BIGINT NOT NULL,"
-                    + "        internal_date TIMESTAMP,"
-                    + "        size INTEGER,"
-                    + "        PRIMARY KEY(mailbox_id,uid),"
-                    + "        FOREIGN KEY (mailbox_id) REFERENCES mailbox (mailbox_id)"
-                    + "            ON DELETE CASCADE" + "      )",
-            "CREATE TABLE message_flags"
-                    + "    ("
-                    + "        mailbox_id BIGINT NOT NULL,"
-                    + "        uid BIGINT NOT NULL,"
-                    + "        answered INTEGER default 0 NOT NULL,"
-                    + "        deleted INTEGER default 0 NOT NULL,"
-                    + "        draft INTEGER default 0 NOT NULL,"
-                    + "        flagged INTEGER default 0 NOT NULL,"
-                    + "        recent INTEGER default 0 NOT NULL,"
-                    + "        seen INTEGER default 0 NOT NULL,"
-                    + "        PRIMARY KEY(mailbox_id,uid),"
-                    + "        FOREIGN KEY (mailbox_id, uid) REFERENCES message (mailbox_id, uid)"
-                    + "            ON DELETE CASCADE" + "      )",
-            "CREATE TABLE message_header"
-                    + "    ("
-                    + "        mailbox_id BIGINT NOT NULL,"
-                    + "        uid BIGINT NOT NULL,"
-                    + "        line_number INTEGER NOT NULL,"
-                    + "        field VARCHAR(256) NOT NULL,"
-                    + "        value VARCHAR(1024) NOT NULL,"
-                    + "        PRIMARY KEY(mailbox_id,uid,line_number),"
-                    + "        FOREIGN KEY (mailbox_id, uid) REFERENCES message (mailbox_id, uid)"
-                    + "            ON DELETE CASCADE" + "      )",
-            "CREATE TABLE message_body"
-                    + "    ("
-                    + "        mailbox_id BIGINT NOT NULL,"
-                    + "        uid BIGINT NOT NULL,"
-                    + "        body BLOB NOT NULL,"
-                    + "        PRIMARY KEY(mailbox_id,uid),"
-                    + "        FOREIGN KEY (mailbox_id, uid) REFERENCES message (mailbox_id, uid)"
-                    + "            ON DELETE CASCADE" + "      )" };
-
-    public static void initialize() throws Exception {
-        BaseConfiguration torqueConf = configureDefaults();
-        Connection conn = null;
-        Torque.init(torqueConf);
-        conn = Transaction.begin(OmConstants.DATABASE_NAME);
-
-        DatabaseMetaData dbMetaData = conn.getMetaData();
-
-        for (int i = 0; i < OmConstants.TABLE_NAMES.length; i++) {
-            if (!tableExists(dbMetaData, OmConstants.TABLE_NAMES[i])) {
-                BasePeer.executeStatement(CREATE_STATEMENTS[i], conn);
-            }
-        }
-
-        Transaction.commit(conn);
-    }
-
-    private static boolean tableExists(DatabaseMetaData dbMetaData,
-            String tableName) throws SQLException {
-        return (tableExistsCaseSensitive(dbMetaData, tableName)
-                || tableExistsCaseSensitive(dbMetaData, tableName
-                        .toUpperCase(Locale.US)) || tableExistsCaseSensitive(
-                dbMetaData, tableName.toLowerCase(Locale.US)));
-    }
-
-    private static boolean tableExistsCaseSensitive(
-            DatabaseMetaData dbMetaData, String tableName) throws SQLException {
-        ResultSet rsTables = dbMetaData.getTables(null, null, tableName, null);
-        try {
-            boolean found = rsTables.next();
-            return found;
-        } finally {
-            if (rsTables != null) {
-                rsTables.close();
-            }
-        }
-    }
-
-    public static BaseConfiguration configureDefaults()
-            throws org.apache.commons.configuration.ConfigurationException {
-        BaseConfiguration torqueConf = new BaseConfiguration();
-        torqueConf.addProperty("torque.database.default", "mailboxmanager");
-        torqueConf.addProperty("torque.database.mailboxmanager.adapter",
-                "derby");
-        torqueConf.addProperty("torque.dsfactory.mailboxmanager.factory",
-                "org.apache.torque.dsfactory.SharedPoolDataSourceFactory");
-        torqueConf.addProperty(
-                "torque.dsfactory.mailboxmanager.connection.driver",
-                "org.apache.derby.jdbc.EmbeddedDriver");
-        torqueConf.addProperty(
-                "torque.dsfactory.mailboxmanager.connection.url",
-                "jdbc:derby:target/testdb;create=true");
-        torqueConf.addProperty(
-                "torque.dsfactory.mailboxmanager.connection.user", "app");
-        torqueConf.addProperty(
-                "torque.dsfactory.mailboxmanager.connection.password", "app");
-        torqueConf.addProperty(
-                "torque.dsfactory.mailboxmanager.pool.maxActive", "100");
-        return torqueConf;
-    }
-
-
-    public synchronized static MailboxManagerProvider getTorqueMailboxManagerProviderInstance()
-            throws Exception {
-        if (PROVIDER == null) {
-            getMailboxManager();
-            PROVIDER = new SimpleMailboxManagerProvider();
-            PROVIDER.setMailboxManager(TORQUE_MAILBOX_MANAGER);
-        }
-        return PROVIDER;
-
     }
 
     public boolean addUser(String user, String password) {
-        USER_MANAGER.addUser(user, password);
+        userManager.addUser(user, password);
         return true;
     }
 
-    private static JPAMailboxManager getMailboxManager() throws Exception {
-        if (TORQUE_MAILBOX_MANAGER == null) {
-            USER_MANAGER = new SimpleUserManager();
-            initialize();
-            TORQUE_MAILBOX_MANAGER = new JPAMailboxManager(USER_MANAGER);
-        }
-        return TORQUE_MAILBOX_MANAGER;
-    }
-
     public void resetData() throws Exception {
         resetUserMetaData();
-        getMailboxManager().deleteEverything();
+        mailboxManager.deleteEverything();
+    }
+    
+    public void resetUserMetaData() throws Exception {
+        File dir = new File(META_DATA_DIRECTORY);
+        if (dir.exists()) {
+            FileUtils.deleteDirectory(dir);
+        }
+        dir.mkdirs();
     }
 
 }

Modified: james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SelectedStateTest.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SelectedStateTest.java?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SelectedStateTest.java (original)
+++ james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SelectedStateTest.java Wed Dec 31 02:44:55 2008
@@ -26,4 +26,18 @@
     public SelectedStateTest() throws Exception {
         super(JPAHostSystem.build());
     }
+
+    @Override
+    public void testCopyITALY() throws Exception {
+    }
+
+    @Override
+    public void testCopyKOREA() throws Exception {
+    }
+
+    @Override
+    public void testCopyUS() throws Exception {
+    }
+    
+    
 }

Modified: james/protocols/imap/trunk/include.properties
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/include.properties?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/include.properties (original)
+++ james/protocols/imap/trunk/include.properties Wed Dec 31 02:44:55 2008
@@ -76,7 +76,7 @@
 
 path.lib.openjpa=org.apache.openjpa/jars
 path.lib.spec=org.apache.geronimo.specs/jars
-path.lib.serp=net.sourceforge.serc/jars
+path.lib.serp=net.sourceforge.serp/jars
 path.lib.h2=com.h2database/jars
 
 # --------------------------------------------------
@@ -137,6 +137,8 @@
 openjpa.jar=${path.lib.openjpa}/${jarname.openjpa}
 jarname.jpa=geronimo-jpa_3.0_spec-1.0.jar
 jpa.jar=${path.lib.spec}/${jarname.jpa}
+jarname.jta=geronimo-jta_1.1_spec-1.1.jar
+jta.jar=${path.lib.spec}/${jarname.jta}
 jarname.h2=h2.jar
 h2.jar=${path.lib.h2}/${jarname.h2}
 jarname.serp=serp-1.13.1.jar

Modified: james/protocols/imap/trunk/jpa/build.xml
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/jpa/build.xml?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/jpa/build.xml (original)
+++ james/protocols/imap/trunk/jpa/build.xml Wed Dec 31 02:44:55 2008
@@ -27,7 +27,7 @@
            depends='check-environment, master-module-template.set-classpath'>
            <path id='classpath.main'>
                <path refid='classpath.base'/>
-	       <path refid='classpath.jpa'/>
+	       	   <path refid='classpath.jpa'/>
                <path refid='classpath.dependencies.libraries'/>   
            </path>
            <path id='classpath.test'>
@@ -40,4 +40,31 @@
            </path>   
     </target>  
 	
+    <target 
+        name='build'
+        description='Builds without cleaning'
+        depends='check-environment, conditional-clean, set-classpath'
+        unless='dont.build.module'>
+          <echo>Building ${name.module}</echo>   
+          <CompileMainSource/>  
+            
+          <taskdef 
+                name="openjpac" 
+                classname="org.apache.openjpa.ant.PCEnhancerTask"
+                classpathref="classpath.main"/>
+         
+          <openjpac>
+            <fileset dir="${dir.src.java}">
+              <include name="org/apache/james/imap/jpa/om/*.java" />
+            </fileset>
+            <classpath>
+                <path refid='classpath.main'/>
+                <pathelement location="${dir.src.java}"/>   
+                <pathelement location="${dir.build.bin}"/>
+            </classpath>   
+            <config
+               log="TOOL=TRACE"   
+               metaDataFactory="jpa(Types=org.apache.james.imap.jpa.om.Header;org.apache.james.imap.jpa.om.Mailbox;org.apache.james.imap.jpa.om.Message)"/>   
+          </openjpac>
+    </target> 
 </project>

Modified: james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java (original)
+++ james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java Wed Dec 31 02:44:55 2008
@@ -22,9 +22,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.sql.SQLException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Enumeration;
@@ -34,17 +32,17 @@
 import javax.mail.Flags;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceException;
 
-import org.apache.commons.collections.IteratorUtils;
 import org.apache.commons.logging.Log;
 import org.apache.james.api.imap.AbstractLogEnabled;
-import org.apache.james.imap.jpa.om.MailboxMapper;
-import org.apache.james.imap.jpa.om.MailboxRow;
-import org.apache.james.imap.jpa.om.MessageBody;
-import org.apache.james.imap.jpa.om.MessageFlags;
-import org.apache.james.imap.jpa.om.MessageHeader;
-import org.apache.james.imap.jpa.om.MessageMapper;
-import org.apache.james.imap.jpa.om.MessageRow;
+import org.apache.james.imap.jpa.map.MailboxMapper;
+import org.apache.james.imap.jpa.map.MessageMapper;
+import org.apache.james.imap.jpa.om.Header;
+import org.apache.james.imap.jpa.om.Mailbox;
+import org.apache.james.imap.jpa.om.Message;
+import org.apache.james.imap.jpa.om.openjpa.OpenJPAMailboxMapper;
 import org.apache.james.mailboxmanager.MailboxListener;
 import org.apache.james.mailboxmanager.MailboxManagerException;
 import org.apache.james.mailboxmanager.MailboxSession;
@@ -54,13 +52,11 @@
 import org.apache.james.mailboxmanager.MessageResult.FetchGroup;
 import org.apache.james.mailboxmanager.impl.FetchGroupImpl;
 import org.apache.james.mailboxmanager.impl.UidChangeTracker;
-import org.apache.james.mailboxmanager.mailbox.Mailbox;
 import org.apache.james.mailboxmanager.util.UidRange;
-import org.apache.torque.TorqueException;
 
-import com.workingdogs.village.DataSetException;
+public class JPAMailbox extends AbstractLogEnabled implements org.apache.james.mailboxmanager.mailbox.Mailbox {
 
-public class JPAMailbox extends AbstractLogEnabled implements Mailbox {
+    private static final int INITIAL_SIZE_HEADERS = 32;
 
     private long mailboxId;
 
@@ -68,39 +64,34 @@
 
     private final MessageSearches searches;
 
-    private final MailboxMapper mapper;
-    private final MessageMapper messageMapper;
+    private final EntityManagerFactory entityManagerFactory;
 
-    JPAMailbox(final MailboxRow mailboxRow, final Log log) {
+    JPAMailbox(final Mailbox mailbox, final Log log, final EntityManagerFactory entityManagerfactory) {
         this.searches = new MessageSearches();
         setLog(log);
-        this.mailboxId = mailboxRow.getMailboxId();
-        this.tracker = new UidChangeTracker(mailboxRow.getLastUid());
-        this.mapper = new MailboxMapper();
-        this.messageMapper = new MessageMapper();
+        this.mailboxId = mailbox.getMailboxId();
+        this.tracker = new UidChangeTracker(mailbox.getLastUid());
+        this.entityManagerFactory = entityManagerfactory;
     }
 
     public String getName() throws MailboxManagerException {
-        try {
-            return getMailboxRow().getName();
-        } catch (TorqueException e) {
-            throw new MailboxManagerException(e);
-        }
+        return getMailboxRow().getName();
     }
 
     public int getMessageCount(MailboxSession mailboxSession)
     throws MailboxManagerException {
         try {
-            return messageMapper.countMessages(mailboxId);
-        } catch (Exception e) {
+            final MessageMapper messageMapper = new MessageMapper(entityManagerFactory.createEntityManager());
+            return (int) messageMapper.countMessagesInMailbox(mailboxId);
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
 
-    public MessageResult appendMessage(MimeMessage message, Date internalDate,
+    public MessageResult appendMessage(MimeMessage mimeMessage, Date internalDate,
             FetchGroup fetchGroup, MailboxSession mailboxSession)
     throws MailboxManagerException {
-        final MailboxRow mailbox = reserveNextUid();
+        final Mailbox mailbox = reserveNextUid();
 
         if (mailbox != null) {
             try {
@@ -112,28 +103,26 @@
                 // is
                 // inserted long before 4, when
                 // mail 4 is big and comes over a slow connection.
-                long uid = mailbox.getLastUid();
-
-                MessageRow messageRow = new MessageRow();
-                messageRow.setMailboxId(mailboxId);
-                messageRow.setUid(uid);
-                messageRow.setInternalDate(internalDate);
-
-                final int size = size(message);
-                messageRow.setSize(size);
-                populateFlags(message, messageRow);
-
-                addHeaders(message, messageRow);
-
-                MessageBody mb = populateBody(message);
-                messageRow.addMessageBody(mb);
-
-                save(messageRow);
-                MessageResult messageResult = fillMessageResult(messageRow,
-                        fetchGroup);
+                final long uid = mailbox.getLastUid();
+                final int size = size(mimeMessage);
+                final byte[] body = body(mimeMessage);
+                final Flags flags = mimeMessage.getFlags();
+                final List<Header> headers = headers(mailboxId, uid, mimeMessage);
+                final Message message = new Message(mailboxId, uid, internalDate, size, flags, body, headers);
+                try {
+                    final MessageMapper mapper = new MessageMapper(entityManagerFactory.createEntityManager());
+                    mapper.begin();
+                    mapper.save(message);
+                    mapper.commit();
+                } catch (PersistenceException e) {
+                    throw new MailboxManagerException(e);
+                }
+                MessageResult messageResult = fillMessageResult(message, fetchGroup);
                 getUidChangeTracker().found(messageResult);
                 return messageResult;
-            } catch (Exception e) {
+            } catch (IOException e) {
+                throw new MailboxManagerException(e);
+            } catch (MessagingException e) {
                 throw new MailboxManagerException(e);
             }
         } else {
@@ -142,48 +131,24 @@
         }
     }
 
-    private void populateFlags(MimeMessage message, MessageRow messageRow)
-    throws MessagingException, TorqueException {
-        final Flags flags = message.getFlags();
-        buildFlags(messageRow, flags);
-    }
-
-    private void buildFlags(MessageRow messageRow, final Flags flags)
-    throws TorqueException {
-        MessageFlags messageFlags = new MessageFlags();
-        messageFlags.setFlags(flags);
-        messageRow.addMessageFlags(messageFlags);
-    }
-
-    private MessageBody populateBody(MimeMessage message) throws IOException,
-    MessagingException {
-        MessageBody mb = new MessageBody();
-
+    private byte[] body(MimeMessage message) throws IOException, MessagingException {
         InputStream is = message.getInputStream();
-
         final byte[] bytes = MessageUtils.toByteArray(is);
-        mb.setBody(bytes);
-        return mb;
+        return bytes;
     }
 
-    private void addHeaders(MimeMessage message, MessageRow messageRow)
-    throws MessagingException, TorqueException {
-        int line_number = 0;
-
-        for (Enumeration lines = message.getAllHeaderLines(); lines
-        .hasMoreElements();) {
+    private List<Header> headers(long mailboxId, long uid, MimeMessage message) throws MessagingException {
+        final List<Header> results = new ArrayList<Header>(INITIAL_SIZE_HEADERS);
+        int lineNumber = 0;
+        for (Enumeration lines = message.getAllHeaderLines(); lines.hasMoreElements();) {
             String line = (String) lines.nextElement();
             int colon = line.indexOf(": ");
             if (colon > 0) {
-                line_number++;
-                MessageHeader mh = new MessageHeader();
-                mh.setLineNumber(line_number);
-                mh.setField(line.substring(0, colon));
-                // TODO avoid unlikely IOOB Exception
-                mh.setValue(line.substring(colon + 2));
-                messageRow.addMessageHeader(mh);
+                final Header header = new Header(++lineNumber, line.substring(0, colon), line.substring(colon + 2));
+                results.add(header);
             }
         }
+        return results;
     }
 
     private int size(MimeMessage message) throws IOException,
@@ -195,48 +160,38 @@
         return size;
     }
 
-    private void save(MessageRow messageRow) throws TorqueException {
-        messageMapper.save(messageRow);
-    }
-
-    private MailboxRow reserveNextUid() throws  MailboxManagerException {
-        final MailboxRow mailboxRow;
+    private Mailbox reserveNextUid() throws  MailboxManagerException {
+        final Mailbox mailbox;
         try {
-            mailboxRow = messageMapper.consumeNextUid(mailboxId);
-        } catch (TorqueException e) {
-            throw new MailboxManagerException(e);
-        } catch (SQLException e) {
+            final MailboxMapper mapper = createMailboxMapper();
+            mailbox = mapper.consumeNextUid(mailboxId);
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         } 
-        return mailboxRow;
+        return mailbox;
     }
 
-
     public Iterator getMessages(final MessageRange set, FetchGroup fetchGroup,
             MailboxSession mailboxSession) throws MailboxManagerException {
         UidRange range = uidRangeForMessageSet(set);
         try {
-            List rows = mapper.findInMailbox(set, mailboxId);
+            final MessageMapper messageMapper = new MessageMapper(entityManagerFactory.createEntityManager());
+            final List<Message> rows = new ArrayList<Message>(messageMapper.findInMailbox(set, mailboxId));
             return getMessages(fetchGroup, range, rows);
-        } catch (TorqueException e) {
-            throw new MailboxManagerException(e);
-        } catch (MessagingException e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
 
-    private JPAResultIterator getMessages(FetchGroup result, UidRange range,List rows) 
-    throws TorqueException, MessagingException, MailboxManagerException {
-        final JPAResultIterator results = getResults(result, rows);
+    private JPAResultIterator getMessages(FetchGroup result, UidRange range, List<Message> messages) {
+        final JPAResultIterator results = getResults(result, messages);
         getUidChangeTracker().found(range, results.getMessageFlags());
         return results;
     }
 
-    private JPAResultIterator getResults(FetchGroup result, List rows)
-    throws TorqueException {
-        Collections.sort(rows, MessageRowUtils.getUidComparator());
-        final JPAResultIterator results = new JPAResultIterator(rows,
-                result);
+    private JPAResultIterator getResults(FetchGroup result, List<Message> messages) {
+        Collections.sort(messages, MessageRowUtils.getUidComparator());
+        final JPAResultIterator results = new JPAResultIterator(messages,result);
         return results;
     }
 
@@ -252,10 +207,9 @@
         }
     }
 
-    public MessageResult fillMessageResult(MessageRow messageRow,
-            FetchGroup result) throws TorqueException, MessagingException,
-            MailboxManagerException {
-        return MessageRowUtils.loadMessageResult(messageRow, result);
+    public MessageResult fillMessageResult(Message message, FetchGroup result) throws MessagingException,
+    MailboxManagerException {
+        return MessageRowUtils.loadMessageResult(message, result);
     }
 
     public synchronized Flags getPermanentFlags() {
@@ -268,22 +222,25 @@
         return permanentFlags;
     }
 
-    public long[] recent(boolean reset, MailboxSession mailboxSession)
-    throws MailboxManagerException {
+    public long[] recent(boolean reset, MailboxSession mailboxSession) throws MailboxManagerException {
         try {
-            final List messageRows = messageMapper.findRecent(mailboxId);
-            final long[] results = new long[messageRows.size()];
+            final MessageMapper mapper = new MessageMapper(entityManagerFactory.createEntityManager());
+            final List<Message> messages = mapper.findRecentMessagesInMailbox(mailboxId);
+            final long[] results = new long[messages.size()];
+
             int count = 0;
-            for (Iterator it = messageRows.iterator(); it.hasNext();) {
-                final MessageRow row = (MessageRow) it.next();
-                results[count++] = row.getUid();
+            for (Message message:messages) {
+                results[count++] = message.getUid();
             }
 
             if (reset) {
-                messageMapper.resetRecent(mailboxId);
+                final MessageMapper resetMapper = new MessageMapper(entityManagerFactory.createEntityManager());
+                resetMapper.begin();
+                resetMapper.resetRecentMessages(mailboxId);
+                resetMapper.commit();
             }
             return results;
-        } catch (TorqueException e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         } 
     }
@@ -291,34 +248,32 @@
     public MessageResult getFirstUnseen(FetchGroup fetchGroup,
             MailboxSession mailboxSession) throws MailboxManagerException {
         try {
-            List messageRows = messageMapper.findUnseen(mailboxId);
-            if (messageRows.size() > 0) {
-                MessageResult messageResult = fillMessageResult(
-                        (MessageRow) messageRows.get(0), fetchGroup);
-                if (messageResult != null) {
-                    getUidChangeTracker().found(messageResult);
+            final MessageMapper messageMapper = new MessageMapper(entityManagerFactory.createEntityManager());
+            final List<Message> messageRows = messageMapper.findUnseenMessagesInMailboxOrderByUid(mailboxId);
+            final Iterator<Message> it = messageRows.iterator();
+            final MessageResult result;
+            if (it.hasNext()) {
+                result = fillMessageResult(it.next(), fetchGroup);
+                if (result != null) {
+                    getUidChangeTracker().found(result);
                 }
-
-                return messageResult;
             } else {
-                return null;
+                result = null;
             }
-        } catch (TorqueException e) {
+            return result;
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         } catch (MessagingException e) {
             throw new MailboxManagerException(e);
         }
     }
 
-    public int getUnseenCount(MailboxSession mailboxSession)
-    throws MailboxManagerException {
+    public int getUnseenCount(MailboxSession mailboxSession) throws MailboxManagerException {
         try {
-            final int count = messageMapper.countMessages(
-                    new Flags(Flags.Flag.SEEN), false, mailboxId);
+            final MessageMapper messageMapper = new MessageMapper(entityManagerFactory.createEntityManager());
+            final int count = (int) messageMapper.countUnseenMessagesInMailbox(mailboxId);
             return count;
-        } catch (TorqueException e) {
-            throw new MailboxManagerException(e);
-        } catch (DataSetException e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
@@ -332,32 +287,33 @@
     throws MailboxManagerException {
         try {
             // TODO put this into a serializable transaction
-            final List messageRows = mapper.findMarkedForDeletionInMailbox(set, mailboxId);
-            final long[] uids = uids(messageRows);
-            final OrFetchGroup orFetchGroup = new OrFetchGroup(fetchGroup,
-                    FetchGroup.FLAGS);
-            final JPAResultIterator resultIterator = new JPAResultIterator(
-                    messageRows, orFetchGroup);
+            final MessageMapper mapper = new MessageMapper(entityManagerFactory.createEntityManager());
+            mapper.begin();
+            final List<Message> messages = mapper.findMarkedForDeletionInMailbox(set, mailboxId);
+            final long[] uids = uids(messages);
+            final OrFetchGroup orFetchGroup = new OrFetchGroup(fetchGroup, FetchGroup.FLAGS);
+            final JPAResultIterator resultIterator = new JPAResultIterator(messages, orFetchGroup);
             // ensure all results are loaded before deletion
-            Collection messageResults = IteratorUtils.toList(resultIterator);
+            final List<MessageResult> messageResults = resultIterator.toList();
 
-            for (Iterator iter = messageRows.iterator(); iter.hasNext();) {
-                MessageRow messageRow = (MessageRow) iter.next();
-                messageMapper.delete(messageRow);
+            for (Message message:messages) {
+                mapper.delete(message);
             }
+            mapper.commit();
             getUidChangeTracker().expunged(uids);
             return messageResults.iterator();
-        } catch (Exception e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
 
-    private long[] uids(List messageRows) {
-        final int size = messageRows.size();
+
+    private long[] uids(List<Message> messages) {
+        final int size = messages.size();
         long[] results = new long[size];
         for (int i = 0; i < size; i++) {
-            final MessageRow messageRow = (MessageRow) messageRows.get(i);
-            results[i] = (messageRow).getUid();
+            final Message message = messages.get(i);
+            results[i] = message.getUid();
         }
         return results;
     }
@@ -374,38 +330,37 @@
             MailboxSession mailboxSession) throws MailboxManagerException {
         try {
             // TODO put this into a serializeable transaction
-            final List messageRows = mapper.findInMailbox(set, mailboxId);
+            final MessageMapper mapper = new MessageMapper(entityManagerFactory.createEntityManager());
+            mapper.begin();
+            final List<Message> messages = mapper.findInMailbox(set, mailboxId);
             UidRange uidRange = uidRangeForMessageSet(set);
             getUidChangeTracker().found(uidRange,
-                    MessageRowUtils.toMessageFlags(messageRows));
-            for (Iterator iter = messageRows.iterator(); iter.hasNext();) {
-                final MessageRow messageRow = (MessageRow) iter.next();
-                final MessageFlags messageFlags = messageRow.getMessageFlags();
-                if (messageFlags != null) {
-                    if (replace) {
-                        messageFlags.setFlags(flags);
+                    MessageRowUtils.toMessageFlags(messages));
+            for (final Message message:messages) {
+                if (replace) {
+                    message.setFlags(flags);
+                } else {
+                    Flags current = message.createFlags();
+                    if (value) {
+                        current.add(flags);
                     } else {
-                        Flags current = messageFlags.getFlagsObject();
-                        if (value) {
-                            current.add(flags);
-                        } else {
-                            current.remove(flags);
-                        }
-                        messageFlags.setFlags(current);
+                        current.remove(flags);
                     }
-                    messageMapper.save(messageFlags);
+                    message.setFlags(current);
                 }
+                mapper.save(message);
             }
             final OrFetchGroup orFetchGroup = new OrFetchGroup(fetchGroup,
                     FetchGroup.FLAGS);
             final JPAResultIterator resultIterator = new JPAResultIterator(
-                    messageRows, orFetchGroup);
+                    messages, orFetchGroup);
             final org.apache.james.mailboxmanager.impl.MessageFlags[] messageFlags = resultIterator
             .getMessageFlags();
+            mapper.commit();
             tracker.flagsUpdated(messageFlags, mailboxSession.getSessionId());
             tracker.found(uidRange, messageFlags);
             return resultIterator;
-        } catch (Exception e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
@@ -419,27 +374,17 @@
     }
 
     public long getUidValidity(MailboxSession mailboxSession) throws MailboxManagerException {
-        try {
-            final long result = getMailboxRow().getUidValidity();
-            return result;
-        } catch (TorqueException e) {
-            throw new MailboxManagerException(e);
-        }
-
+        final long result = getMailboxRow().getUidValidity();
+        return result;
     }
 
     public long getUidNext(MailboxSession mailboxSession) throws MailboxManagerException {
-        try {
-            MailboxRow mailbox = getMailboxRow();
-            if (mailbox != null) {
-                getUidChangeTracker().foundLastUid(mailbox.getLastUid());
-                return getUidChangeTracker().getLastUid() + 1;
-            } else {
-                throw new MailboxManagerException(
-                        "Mailbox has been deleted");
-            }
-        }  catch (TorqueException e) {
-            throw new MailboxManagerException(e);
+        Mailbox mailbox = getMailboxRow();
+        if (mailbox != null) {
+            getUidChangeTracker().foundLastUid(mailbox.getLastUid());
+            return getUidChangeTracker().getLastUid() + 1;
+        } else {
+            throw new MailboxManagerException("Mailbox has been deleted");
         }
     }
 
@@ -447,40 +392,47 @@
         return tracker;
     }
 
-    private MailboxRow getMailboxRow() throws TorqueException {
-        return mapper.findById(mailboxId);
+    private Mailbox getMailboxRow() throws MailboxManagerException {
+        try {
+            final MailboxMapper mapper = createMailboxMapper();
+            return mapper.findMailboxById(mailboxId);
+        } catch (PersistenceException e) {
+            throw new MailboxManagerException(e);
+        }
+    }
+
+    private MailboxMapper createMailboxMapper() {
+        final MailboxMapper mapper = new OpenJPAMailboxMapper(entityManagerFactory.createEntityManager());
+        return mapper;
     }
 
     public Iterator search(SearchQuery query, FetchGroup fetchGroup,
             MailboxSession mailboxSession) throws MailboxManagerException {
         try {
-
-            final List rows = messageMapper.find(query);
-            final List filteredMessages = new ArrayList();
-            for (Iterator it = rows.iterator(); it.hasNext();) {
-                final MessageRow row = (MessageRow) it.next();
+            final MessageMapper messageMapper = new MessageMapper(entityManagerFactory.createEntityManager());
+            final List<Message> messages = messageMapper.searchMailbox(mailboxId, query);
+            final List<Message> filteredMessages = new ArrayList<Message>(messages.size());
+            for (Message message:messages) {
                 try {
-                    if (searches.isMatch(query, row)) {
-                        filteredMessages.add(row);
+                    if (searches.isMatch(query, message)) {
+                        filteredMessages.add(message);
                     }
-                } catch (TorqueException e) {
+                } catch (MailboxManagerException e) {
                     getLog()
                     .info(
                             "Cannot test message against search criteria. Will continue to test other messages.",
                             e);
                     if (getLog().isDebugEnabled())
-                        getLog().debug("UID: " + row.getUid());
+                        getLog().debug("UID: " + message.getUid());
                 }
             }
 
             return getResults(fetchGroup, filteredMessages);
-        } catch (TorqueException e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
 
-
-
     public boolean isWriteable() {
         return true;
     }
@@ -490,25 +442,15 @@
         searches.setLog(log);
     }
 
-    public void copyTo(MessageRange set, JPAMailbox toMailbox,
-            MailboxSession session) throws MailboxManagerException {
+    public void copyTo(MessageRange set, JPAMailbox toMailbox, MailboxSession session) throws MailboxManagerException {
         try {
-            List rows = mapper.findInMailbox(set, mailboxId);
-            toMailbox.copy(rows, session);
-        } catch (TorqueException e) {
-            throw new MailboxManagerException(e);
-        } catch (MessagingException e) {
-            throw new MailboxManagerException(e);
-        }
-    }
+            final MessageMapper mapper = new MessageMapper(entityManagerFactory.createEntityManager());
+            mapper.begin();
 
-    private void copy(List rows, MailboxSession session)
-    throws MailboxManagerException {
-        try {
-            for (Iterator iter = rows.iterator(); iter.hasNext();) {
-                MessageRow fromRow = (MessageRow) iter.next();
-                final MailboxRow mailbox = reserveNextUid();
+            List<Message> rows = mapper.findInMailbox(set, mailboxId);
+            for (Message originalMessage:rows) {
 
+                final Mailbox mailbox = toMailbox.reserveNextUid();
                 if (mailbox != null) {
                     // To be thread safe, we first get our own copy and the
                     // exclusive
@@ -520,35 +462,19 @@
                     // mail 4 is big and comes over a slow connection.
                     long uid = mailbox.getLastUid();
 
-                    MessageRow newRow = new MessageRow();
-                    newRow.setMailboxId(mailboxId);
-                    newRow.setUid(uid);
-                    newRow.setInternalDate(fromRow.getInternalDate());
-                    newRow.setSize(fromRow.getSize());
-                    buildFlags(newRow, fromRow.getMessageFlags()
-                            .getFlagsObject());
-
-                    final List headers = fromRow.getMessageHeaders();
-                    for (Iterator iterator = headers.iterator(); iterator
-                    .hasNext();) {
-                        final MessageHeader fromHeader = (MessageHeader) iterator
-                        .next();
-                        final MessageHeader newHeader = new MessageHeader(
-                                fromHeader.getField(), fromHeader.getValue(),
-                                fromHeader.getLineNumber());
-                        newRow.addMessageHeader(newHeader);
-                    }
+                    Message newRow = new Message(toMailbox.mailboxId, uid, originalMessage);
+
 
-                    MessageBody mb = new MessageBody(fromRow.getBodyContent());
-                    newRow.addMessageBody(mb);
+                    mapper.save(newRow);
 
-                    save(newRow);
-                    MessageResult messageResult = fillMessageResult(newRow,
+                    // TODO: Consider detaching instances and moving this code outside the inner loop
+                    MessageResult messageResult = toMailbox.fillMessageResult(newRow,
                             FetchGroupImpl.MINIMAL);
-                    getUidChangeTracker().found(messageResult);
+                    toMailbox.getUidChangeTracker().found(messageResult);
                 }
+                mapper.commit();
             }
-        } catch (TorqueException e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         } catch (MessagingException e) {
             throw new MailboxManagerException(e);

Modified: james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java (original)
+++ james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java Wed Dec 31 02:44:55 2008
@@ -23,16 +23,18 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.commons.logging.impl.SimpleLog;
-import org.apache.james.imap.jpa.om.MailboxMapper;
-import org.apache.james.imap.jpa.om.MailboxRow;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceException;
+
+import org.apache.james.api.imap.AbstractLogEnabled;
+import org.apache.james.imap.jpa.map.MailboxMapper;
+import org.apache.james.imap.jpa.om.Mailbox;
+import org.apache.james.imap.jpa.om.openjpa.OpenJPAMailboxMapper;
 import org.apache.james.mailboxmanager.ListResult;
 import org.apache.james.mailboxmanager.MailboxExistsException;
 import org.apache.james.mailboxmanager.MailboxManagerException;
@@ -40,32 +42,30 @@
 import org.apache.james.mailboxmanager.MailboxSession;
 import org.apache.james.mailboxmanager.MessageRange;
 import org.apache.james.mailboxmanager.impl.ListResultImpl;
-import org.apache.james.mailboxmanager.mailbox.Mailbox;
 import org.apache.james.mailboxmanager.manager.MailboxExpression;
 import org.apache.james.mailboxmanager.manager.MailboxManager;
 import org.apache.james.mailboxmanager.manager.SubscriptionException;
-import org.apache.torque.TorqueException;
 
-public class JPAMailboxManager implements MailboxManager {
+public class JPAMailboxManager extends AbstractLogEnabled implements MailboxManager {
 
+    
     private static final char SQL_WILDCARD_CHAR = '%';
 
     private final static Random random = new Random();
 
-    protected Log log = LogFactory.getLog(JPAMailboxManager.class);
-    private final Map mailboxes;
+    private final Map<String, JPAMailbox> mailboxes;
 
     private final UserManager userManager;
     
-    private final MailboxMapper mapper;
+    private final EntityManagerFactory entityManagerFactory;
 
-    public JPAMailboxManager(final UserManager userManager) {
-        mailboxes = new HashMap();
+    public JPAMailboxManager(final UserManager userManager, final EntityManagerFactory entityManagerFactory) {
+        mailboxes = new HashMap<String, JPAMailbox>();
         this.userManager = userManager;
-        this.mapper = new MailboxMapper();
+        this.entityManagerFactory = entityManagerFactory;
     }
 
-    public Mailbox getMailbox(String mailboxName, boolean autoCreate)
+    public org.apache.james.mailboxmanager.mailbox.Mailbox getMailbox(String mailboxName, boolean autoCreate)
             throws MailboxManagerException {
         return doGetMailbox(mailboxName, autoCreate);
     }
@@ -78,25 +78,29 @@
         }
         try {
             synchronized (mailboxes) {
-                MailboxRow mailboxRow = mapper.findByName(mailboxName);
+                final MailboxMapper mapper = createMailboxMapper();
+                Mailbox mailboxRow = mapper.findMailboxByName(mailboxName);
 
-                if (mailboxRow != null) {
+                if (mailboxRow == null) {
+                    getLog().info("Mailbox '" + mailboxName + "' not found.");
+                    throw new MailboxNotFoundException(mailboxName);
+                    
+                } else {
                     getLog().debug("Loaded mailbox " + mailboxName);
 
-                    JPAMailbox torqueMailbox = (JPAMailbox) mailboxes
-                            .get(mailboxName);
-                    if (torqueMailbox == null) {
-                        torqueMailbox = new JPAMailbox(mailboxRow, getLog());
-                        mailboxes.put(mailboxName, torqueMailbox);
+                    JPAMailbox result = (JPAMailbox) mailboxes.get(mailboxName);
+                    if (result == null) {
+                        result = new JPAMailbox(mailboxRow, getLog(), entityManagerFactory);
+                        mailboxes.put(mailboxName, result);
                     }
-
-                    return torqueMailbox;
-                } else {
-                    getLog().info("Mailbox '" + mailboxName + "' not found.");
-                    throw new MailboxNotFoundException(mailboxName);
+                    return result;
                 }
             }
-        } catch (TorqueException e) {
+        } catch (NoResultException e) {
+            getLog().info("Mailbox '" + mailboxName + "' not found.");
+            throw new MailboxNotFoundException(mailboxName);
+            
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
@@ -140,13 +144,13 @@
     }
 
     private void doCreate(String namespaceName) throws MailboxManagerException {
-        MailboxRow mr = new MailboxRow();
-        mr.setName(namespaceName);
-        mr.setLastUid(0);
-        mr.setUidValidity(Math.abs(random.nextInt()));
+        Mailbox mailbox = new Mailbox(namespaceName, Math.abs(random.nextInt()));
         try {
-            mapper.save(mr);
-        } catch (TorqueException e) {
+            final MailboxMapper mapper = createMailboxMapper();
+            mapper.begin();
+            mapper.save(mailbox);
+            mapper.commit();
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
@@ -157,17 +161,21 @@
         synchronized (mailboxes) {
             try {
                 // TODO put this into a serilizable transaction
-                MailboxRow mr = mapper.findByName(mailboxName);
+                final MailboxMapper mapper = createMailboxMapper();
+                mapper.begin();
+                Mailbox mr = mapper.findMailboxByName(mailboxName);
                 if (mr == null) {
                     throw new MailboxNotFoundException("Mailbox not found");
                 }
                 mapper.delete(mr);
-                JPAMailbox mailbox = (JPAMailbox) mailboxes
-                        .remove(mailboxName);
+                mapper.commit();
+                final JPAMailbox mailbox = mailboxes.remove(mailboxName);
                 if (mailbox != null) {
                     mailbox.deleted(session);
                 }
-            } catch (TorqueException e) {
+            } catch (NoResultException e) {
+                throw new MailboxNotFoundException(mailboxName);
+            } catch (PersistenceException e) {
                 throw new MailboxManagerException(e);
             }
         }
@@ -181,23 +189,23 @@
                 if (existsMailbox(to)) {
                     throw new MailboxExistsException(to);
                 }
+                
+                final MailboxMapper mapper = createMailboxMapper();                
+                mapper.begin();
                 // TODO put this into a serilizable transaction
-                final MailboxRow mr;
-
-                mr = mapper.findByName(from);
+                final Mailbox mailbox = mapper.findMailboxByName(from);
 
-                if (mr == null) {
+                if (mailbox == null) {
                     throw new MailboxNotFoundException(from);
                 }
-                mr.setName(to);
-                mapper.save(mr);
+                mailbox.setName(to);
+                mapper.save(mailbox);
 
                 mailboxes.remove(from);
 
                 // rename submailbox
-                List l = mapper.findNameLike(from + HIERARCHY_DELIMITER + "%");
-                for (Iterator iter = l.iterator(); iter.hasNext();) {
-                    MailboxRow sub = (MailboxRow) iter.next();
+                final List<Mailbox> subMailboxes = mapper.findMailboxWithNameLike(from + HIERARCHY_DELIMITER + "%");
+                for (Mailbox sub:subMailboxes) {
                     String subOrigName = sub.getName();
                     String subNewName = to
                             + subOrigName.substring(from.length());
@@ -207,8 +215,11 @@
                             "renameMailbox sub-mailbox " + subOrigName + " to "
                                     + subNewName);
                 }
+                mapper.commit();
             }
-        } catch (TorqueException e) {
+        } catch (NoResultException e) {
+            throw new MailboxNotFoundException(from);
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
@@ -239,11 +250,11 @@
                 .replace(localWildcard, SQL_WILDCARD_CHAR);
 
         try {
-            List mailboxRows = mapper.findNameLike(search);
-            List listResults = new ArrayList(mailboxRows.size());
-            for (Iterator iter = mailboxRows.iterator(); iter.hasNext();) {
-                final MailboxRow mailboxRow = (MailboxRow) iter.next();
-                final String name = mailboxRow.getName();
+            final MailboxMapper mapper = createMailboxMapper();
+            final List<Mailbox> mailboxes = mapper.findMailboxWithNameLike(search);
+            final List<ListResult> listResults = new ArrayList<ListResult>(mailboxes.size());
+            for (Mailbox mailbox: mailboxes) {
+                final String name = mailbox.getName();
                 if (name.startsWith(base)) {
                     final String match = name.substring(baseLength);
                     if (mailboxExpression.isExpressionMatch(match,
@@ -256,7 +267,7 @@
                     .toArray(ListResult.EMPTY_ARRAY);
             Arrays.sort(results);
             return results;
-        } catch (TorqueException e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
 
@@ -269,10 +280,10 @@
 
     public boolean existsMailbox(String mailboxName)
             throws MailboxManagerException {
-        int count;
         try {
             synchronized (mailboxes) {
-                count = mapper.countOnName(mailboxName);
+                final MailboxMapper mapper = createMailboxMapper();
+                final long count = mapper.countMailboxesWithName(mailboxName);
                 if (count == 0) {
                     mailboxes.remove(mailboxName);
                     return false;
@@ -280,12 +291,11 @@
                     if (count == 1) {
                         return true;
                     } else {
-                        throw new MailboxManagerException("found " + count
-                                + " mailboxes");
+                        throw new MailboxManagerException("Expected one mailbox but found " + count + " mailboxes");
                     }
                 }
             }
-        } catch (TorqueException e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
@@ -294,19 +304,19 @@
 
     public void deleteEverything() throws MailboxManagerException {
         try {
+            final MailboxMapper mapper = createMailboxMapper();
+            mapper.begin();
             mapper.deleteAll();
+            mapper.commit();
             mailboxes.clear();
-        } catch (TorqueException e) {
+        } catch (PersistenceException e) {
             throw new MailboxManagerException(e);
         }
     }
 
-
-    protected Log getLog() {
-        if (log == null) {
-            log = new SimpleLog("TorqueMailboxManager");
-        }
-        return log;
+    private MailboxMapper createMailboxMapper() {
+        final MailboxMapper mapper = new OpenJPAMailboxMapper(entityManagerFactory.createEntityManager());
+        return mapper;
     }
 
     public MailboxSession createSession() {

Modified: james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAResultIterator.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAResultIterator.java?rev=730371&r1=730370&r2=730371&view=diff
==============================================================================
--- james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAResultIterator.java (original)
+++ james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAResultIterator.java Wed Dec 31 02:44:55 2008
@@ -19,45 +19,42 @@
 
 package org.apache.james.imap.jpa;
 
-import java.util.Collection;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.Iterator;
+import java.util.List;
 import java.util.NoSuchElementException;
 
 import javax.mail.Flags;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.commons.collections.Buffer;
-import org.apache.commons.collections.BufferUtils;
-import org.apache.commons.collections.buffer.BoundedFifoBuffer;
-import org.apache.james.imap.jpa.om.MessageRow;
+import org.apache.james.imap.jpa.om.Message;
 import org.apache.james.mailboxmanager.MailboxManagerException;
 import org.apache.james.mailboxmanager.MessageResult;
 import org.apache.james.mailboxmanager.MessageResult.FetchGroup;
 import org.apache.james.mailboxmanager.impl.FetchGroupImpl;
 import org.apache.james.mailboxmanager.impl.MessageFlags;
-import org.apache.torque.TorqueException;
 
 public class JPAResultIterator implements Iterator {
 
-    private final Buffer messageRows;
+    private final List<Message> messages;
 
     private final FetchGroup fetchGroup;
 
-    public JPAResultIterator(final Collection messageRows,
-            final FetchGroup fetchGroup) {
+    @SuppressWarnings("unchecked")
+    public JPAResultIterator(final List<Message> messages, final FetchGroup fetchGroup) {
         super();
-        if (messageRows == null || messageRows.isEmpty()) {
-            this.messageRows = BufferUtils.EMPTY_BUFFER;
+        if (messages == null) {
+            this.messages = Collections.EMPTY_LIST;
         } else {
-            this.messageRows = new BoundedFifoBuffer(messageRows);
+            this.messages = new ArrayList<Message>(messages);
         }
         this.fetchGroup = fetchGroup;
     }
 
-    public MessageFlags[] getMessageFlags() throws TorqueException {
-        final MessageFlags[] results = MessageRowUtils
-                .toMessageFlags(messageRows);
+    public MessageFlags[] getMessageFlags() {
+        final MessageFlags[] results = MessageRowUtils.toMessageFlags(messages);
         return results;
     }
 
@@ -67,28 +64,25 @@
      * @return <code>Iterator</code> for message rows
      */
     public final Iterator iterateRows() {
-        return messageRows.iterator();
+        return messages.iterator();
     }
 
     public boolean hasNext() {
-        return !messageRows.isEmpty();
+        return !messages.isEmpty();
     }
 
     public Object next() {
-        if (messageRows.isEmpty()) {
+        if (messages.isEmpty()) {
             throw new NoSuchElementException("No such element.");
         }
-        final MessageRow messageRow = (MessageRow) messageRows.remove();
+        final Message message = messages.get(0);
+        messages.remove(message);
         MessageResult result;
         try {
 
-            result = MessageRowUtils.loadMessageResult(messageRow,
-                    this.fetchGroup);
-        } catch (TorqueException e) {
-            result = new UnloadedMessageResult(messageRow,
-                    new MailboxManagerException(e));
+            result = MessageRowUtils.loadMessageResult(message, this.fetchGroup);
         } catch (MailboxManagerException e) {
-            result = new UnloadedMessageResult(messageRow, e);
+            result = new UnloadedMessageResult(message, e);
         }
         return result;
     }
@@ -97,6 +91,14 @@
         throw new UnsupportedOperationException("Read only iteration.");
     }
 
+    public List<MessageResult> toList() {
+        final List<MessageResult> results = new ArrayList<MessageResult>(messages.size());
+        while(hasNext()) {
+            results.add((MessageResult) next());
+        }
+        return results;
+    }
+    
     private static final class UnloadedMessageResult implements MessageResult {
         private static final FetchGroup FETCH_GROUP = new FetchGroupImpl(
                 FetchGroup.INTERNAL_DATE | FetchGroup.SIZE);
@@ -109,12 +111,12 @@
 
         private final long uid;
 
-        public UnloadedMessageResult(final MessageRow row,
+        public UnloadedMessageResult(final Message message,
                 final MailboxManagerException exception) {
             super();
-            internalDate = row.getInternalDate();
-            size = row.getSize();
-            uid = row.getUid();
+            internalDate = message.getInternalDate();
+            size = message.getSize();
+            uid = message.getUid();
             this.exception = exception;
         }
 



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