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 no...@apache.org on 2011/04/29 15:41:33 UTC

svn commit: r1097818 - in /james/mailbox/trunk/jpa: ./ src/main/java/org/apache/james/mailbox/jpa/ src/main/java/org/apache/james/mailbox/jpa/mail/model/ src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/ src/test/java/org/apache/james/mail...

Author: norman
Date: Fri Apr 29 13:41:32 2011
New Revision: 1097818

URL: http://svn.apache.org/viewvc?rev=1097818&view=rev
Log:
JPA mailbox now support user flags as permanent flags. Related to MAILBOX-63

Added:
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAUserFlag.java
Modified:
    james/mailbox/trunk/jpa/pom.xml
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java
    james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
    james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java
    james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java

Modified: james/mailbox/trunk/jpa/pom.xml
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/pom.xml?rev=1097818&r1=1097817&r2=1097818&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/pom.xml (original)
+++ james/mailbox/trunk/jpa/pom.xml Fri Apr 29 13:41:32 2011
@@ -104,7 +104,7 @@
             </property>   
             <property>
               <name>metaDataFactory</name>
-              <value>jpa(Types=org.apache.james.mailbox.jpa.mail.model.JPAHeader;org.apache.james.mailbox.jpa.mail.model.JPAMailbox;org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;org.apache.james.mailbox.jpa.mail.model.JPAProperty;org.apache.james.mailbox.jpa.user.model.JPASubscription)</value>
+              <value>jpa(Types=org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;org.apache.james.mailbox.jpa.mail.model.JPAHeader;org.apache.james.mailbox.jpa.mail.model.JPAMailbox;org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;org.apache.james.mailbox.jpa.mail.model.JPAProperty;org.apache.james.mailbox.jpa.user.model.JPASubscription)</value>
             </property>           
           </toolProperties>
         </configuration>

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java?rev=1097818&r1=1097817&r2=1097818&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java Fri Apr 29 13:41:32 2011
@@ -26,6 +26,7 @@ import java.util.List;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;
@@ -63,5 +64,15 @@ public class JPAMessageManager extends S
         final Header header = new JPAHeader(lineNumber, name, value);
         return header;
     }
+
+    /**
+     * Support user flags
+     */
+    @Override
+    protected Flags getPermanentFlags(MailboxSession session) {
+        Flags flags =  super.getPermanentFlags(session);
+        flags.add(Flags.Flag.USER);
+        return flags;
+    }
     
 }

Added: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAUserFlag.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAUserFlag.java?rev=1097818&view=auto
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAUserFlag.java (added)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAUserFlag.java Fri Apr 29 13:41:32 2011
@@ -0,0 +1,116 @@
+/****************************************************************
+ * 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.mail.model;
+
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity(name="UserFlag")
+@Table(name="JAMES_MAIL_USERFLAG")
+public class JPAUserFlag {
+
+
+    /** The system unique key */
+    @Id
+    @GeneratedValue
+    @Column(name = "USERFLAG_ID", nullable = true)
+    private long id;
+    
+    /** Local part of the name of this property */
+    @Basic(optional = false)
+    @Column(name = "USERFLAG_NAME", nullable = false, length = 500)
+    private String name;
+    
+    
+    /**
+     * @deprecated enhancement only
+     */
+    @Deprecated 
+    public JPAUserFlag() {}
+    
+    /**
+     * Constructs a User Flag.
+     * @param name not null
+     */
+    public JPAUserFlag(String name) {
+        super();
+        this.name = name;
+    }
+
+    /**
+     * Constructs a User Flag. cloned from the given.
+     * @param property not null
+     */
+    public JPAUserFlag(JPAUserFlag flag) {
+        this(flag.getName());
+    }
+
+  
+    
+    /**
+     * Gets the name.
+     * @return not null
+     */
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + (int) (id ^ (id >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final JPAUserFlag other = (JPAUserFlag) obj;
+        if (id != other.id)
+            return false;
+        return true;
+    }
+
+    /**
+     * Constructs a <code>String</code> with all attributes
+     * in name = value format.
+     *
+     * @return a <code>String</code> representation 
+     * of this object.
+     */
+    public String toString() {
+        final String result = "JPAUserFlag ( "
+            + "id = " + this.id + " "
+            + "name = " + this.name
+            + " )";
+    
+        return result;
+    }
+    
+}

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java?rev=1097818&r1=1097817&r2=1097818&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java Fri Apr 29 13:41:32 2011
@@ -20,6 +20,7 @@ package org.apache.james.mailbox.jpa.mai
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
@@ -41,6 +42,7 @@ import org.apache.james.mailbox.MailboxE
 import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
+import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
 import org.apache.james.mailbox.store.mail.model.AbstractMessage;
 import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Message;
@@ -235,6 +237,11 @@ public abstract class AbstractJPAMessage
                 @ElementJoinColumn(name="MAIL_UID", referencedColumnName="MAIL_UID")})
     private List<JPAProperty> properties;
 
+    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
+    @ElementJoinColumns({@ElementJoinColumn(name="MAILBOX_ID", referencedColumnName="MAILBOX_ID"),
+    @ElementJoinColumn(name="MAIL_UID", referencedColumnName="MAIL_UID")})
+    private List<JPAUserFlag> userFlags;
+    
     @Deprecated
     public AbstractJPAMessage() {}
 
@@ -243,7 +250,9 @@ public abstract class AbstractJPAMessage
         this.mailbox = mailbox;
         this.internalDate = internalDate;
         this.uid = uid;
-        setFlags(flags);
+        userFlags = new ArrayList<JPAUserFlag>();
+
+        setFlags(flags);        
         this.contentOctets = contentOctets;
         this.bodyStartOctet = bodyStartOctet;
         this.headers = new ArrayList<JPAHeader>(headers);
@@ -256,6 +265,7 @@ public abstract class AbstractJPAMessage
         for (final Property property:properties) {
             this.properties.add(new JPAProperty(property, order++));
         }
+        
     }
 
     /**
@@ -270,13 +280,8 @@ public abstract class AbstractJPAMessage
         super();
         this.mailbox = mailbox;
         this.uid = uid;
-        this.internalDate = original.getInternalDate();
-        this.answered = original.isAnswered();
-        this.deleted = original.isDeleted();
-        this.draft = original.isDraft();
-        this.flagged = original.isFlagged();
-        this.recent = original.isRecent();
-        this.seen = original.isSeen();
+        userFlags = new ArrayList<JPAUserFlag>();
+        setFlags(original.createFlags());
         
 
         this.contentOctets = original.getFullContentOctets();
@@ -466,6 +471,31 @@ public abstract class AbstractJPAMessage
         flagged = flags.contains(Flags.Flag.FLAGGED);
         recent = flags.contains(Flags.Flag.RECENT);
         seen = flags.contains(Flags.Flag.SEEN);
+        
+        // Loop over the user flags and check which of them needs to get added / removed
+        List<String> uFlags = Arrays.asList(flags.getUserFlags());
+        for (int i = 0; i < userFlags.size(); i++) {
+            JPAUserFlag f = userFlags.get(i);
+            if (uFlags.contains(f.getName()) == false) {
+                userFlags.remove(f);
+                i++;
+            }
+        }
+        for (int i = 0; i < uFlags.size(); i++) {
+            boolean found = false;
+            String uFlag = uFlags.get(i);
+            for (int a = 0; a < userFlags.size(); a++) {
+                String userFlag = userFlags.get(a).getName();
+                if (userFlag.equals(uFlag)) {
+                    found = true;
+                    break;
+                }
+            }
+            if (found == false) {
+                userFlags.add(new JPAUserFlag(uFlag));
+            }
+            
+        }
     }
 
     /**
@@ -476,6 +506,20 @@ public abstract class AbstractJPAMessage
     }
 
     /**
+     * This implementation supports user flags
+     * 
+     * 
+     */
+    @Override
+    protected String[] createUserFlags() {
+        String[] flags = new String[userFlags.size()];
+        for (int i = 0; i < userFlags.size(); i++) {
+            flags[i] = userFlags.get(i).getName();
+        }
+        return flags;
+    }
+
+    /**
      * Utility setter on Mailbox.
      */
     public void setMailbox(JPAMailbox mailbox) {

Modified: james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java?rev=1097818&r1=1097817&r2=1097818&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java (original)
+++ james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java Fri Apr 29 13:41:32 2011
@@ -30,6 +30,7 @@ import org.apache.james.mailbox.jpa.mail
 import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
+import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
@@ -91,6 +92,7 @@ public class JPAMailboxManagerTest exten
                 AbstractJPAMessage.class.getName() + ";" +
                 JPAMessage.class.getName() + ";" +
                 JPAProperty.class.getName() + ";" +
+                JPAUserFlag.class.getName() + ";" +
                 JPASubscription.class.getName() + ")");
        
         entityManagerFactory = OpenJPAPersistence.getEntityManagerFactory(properties);

Modified: james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java?rev=1097818&r1=1097817&r2=1097818&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java (original)
+++ james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java Fri Apr 29 13:41:32 2011
@@ -31,6 +31,7 @@ import org.apache.james.mailbox.jpa.mail
 import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
+import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
@@ -66,6 +67,7 @@ public class JPAStressTest extends Abstr
                 AbstractJPAMessage.class.getName() + ";" +
                 JPAMessage.class.getName() + ";" +
                 JPAProperty.class.getName() + ";" +
+                JPAUserFlag.class.getName() + ";" +
                 JPASubscription.class.getName() + ")");
         properties.put("openjpa.LockTimeout", locktimeout + "");
        

Modified: james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java?rev=1097818&r1=1097817&r2=1097818&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java (original)
+++ james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java Fri Apr 29 13:41:32 2011
@@ -25,6 +25,7 @@ import org.apache.james.mailbox.Subscrip
 import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
+import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;
 import org.apache.james.mailbox.jpa.user.model.JPASubscription;
@@ -52,6 +53,7 @@ public class JPASubscriptionManagerTest 
                 AbstractJPAMessage.class.getName() + ";" +
                 JPAMessage.class.getName() + ";" +
                 JPAProperty.class.getName() + ";" +
+                JPAUserFlag.class.getName() + ";" +
                 JPASubscription.class.getName() + ")");
        
         entityManagerFactory = OpenJPAPersistence.getEntityManagerFactory(properties);



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