001/****************************************************************
002 * Licensed to the Apache Software Foundation (ASF) under one   *
003 * or more contributor license agreements.  See the NOTICE file *
004 * distributed with this work for additional information        *
005 * regarding copyright ownership.  The ASF licenses this file   *
006 * to you under the Apache License, Version 2.0 (the            *
007 * "License"); you may not use this file except in compliance   *
008 * with the License.  You may obtain a copy of the License at   *
009 *                                                              *
010 *   http://www.apache.org/licenses/LICENSE-2.0                 *
011 *                                                              *
012 * Unless required by applicable law or agreed to in writing,   *
013 * software distributed under the License is distributed on an  *
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
015 * KIND, either express or implied.  See the License for the    *
016 * specific language governing permissions and limitations      *
017 * under the License.                                           *
018 ****************************************************************/
019package org.apache.james.mailbox.jpa.mail.model;
020
021import javax.persistence.Basic;
022import javax.persistence.Column;
023import javax.persistence.Entity;
024import javax.persistence.GeneratedValue;
025import javax.persistence.Id;
026import javax.persistence.NamedQueries;
027import javax.persistence.NamedQuery;
028import javax.persistence.Table;
029
030import org.apache.james.mailbox.model.MailboxACL;
031import org.apache.james.mailbox.model.MailboxPath;
032import org.apache.james.mailbox.model.SimpleMailboxACL;
033import org.apache.james.mailbox.store.mail.model.Mailbox;
034
035@Entity(name="Mailbox")
036@Table(name="JAMES_MAILBOX")
037@NamedQueries({
038    @NamedQuery(name="findMailboxById",
039        query="SELECT mailbox FROM Mailbox mailbox WHERE mailbox.mailbox.mailboxId = :idParam"),
040    @NamedQuery(name="findMailboxByName",
041        query="SELECT mailbox FROM Mailbox mailbox WHERE mailbox.name = :nameParam and mailbox.user is NULL and mailbox.namespace= :namespaceParam"),
042    @NamedQuery(name="findMailboxByNameWithUser",
043        query="SELECT mailbox FROM Mailbox mailbox WHERE mailbox.name = :nameParam and mailbox.user= :userParam and mailbox.namespace= :namespaceParam"),
044    @NamedQuery(name="deleteAllMailboxes",
045        query="DELETE FROM Mailbox mailbox"),
046    @NamedQuery(name="findMailboxWithNameLikeWithUser",
047        query="SELECT mailbox FROM Mailbox mailbox WHERE mailbox.name LIKE :nameParam and mailbox.user= :userParam and mailbox.namespace= :namespaceParam"),
048    @NamedQuery(name="findMailboxWithNameLike",
049        query="SELECT mailbox FROM Mailbox mailbox WHERE mailbox.name LIKE :nameParam and mailbox.user is NULL and mailbox.namespace= :namespaceParam"),
050    @NamedQuery(name="countMailboxesWithNameLikeWithUser",
051        query="SELECT COUNT(mailbox) FROM Mailbox mailbox WHERE mailbox.name LIKE :nameParam and mailbox.user= :userParam and mailbox.namespace= :namespaceParam"),
052    @NamedQuery(name="countMailboxesWithNameLike",
053        query="SELECT COUNT(mailbox) FROM Mailbox mailbox WHERE mailbox.name LIKE :nameParam and mailbox.user is NULL and mailbox.namespace= :namespaceParam"),
054    @NamedQuery(name="listMailboxes",
055        query="SELECT mailbox FROM Mailbox mailbox"),
056    @NamedQuery(name="findHighestModSeq",
057        query="SELECT mailbox.highestModSeq FROM Mailbox mailbox WHERE mailbox.mailboxId = :idParam"),
058    @NamedQuery(name="findLastUid",
059        query="SELECT mailbox.lastUid FROM Mailbox mailbox WHERE mailbox.mailboxId = :idParam")
060})
061public class JPAMailbox implements Mailbox<Long> {
062    
063    private static final String TAB = " ";
064
065    /** The value for the mailboxId field */
066    @Id
067    @GeneratedValue
068    @Column(name = "MAILBOX_ID")
069    private long mailboxId;
070    
071    /** The value for the name field */
072    @Basic(optional = false)
073    @Column(name = "MAILBOX_NAME", nullable = false, length = 200)
074    private String name;
075
076    /** The value for the uidValidity field */
077    @Basic(optional = false)
078    @Column(name = "MAILBOX_UID_VALIDITY", nullable = false)
079    private long uidValidity;
080
081    @Basic(optional = false)
082    @Column(name = "USER_NAME", nullable = false, length = 200)
083    private String user;
084    
085    @Basic(optional = false)
086    @Column(name = "MAILBOX_NAMESPACE", nullable = false, length = 200)
087    private String namespace;
088
089    @Basic(optional = false)
090    @Column(name = "MAILBOX_LAST_UID", nullable = false)
091    private long lastUid;
092    
093    @Basic(optional = false)
094    @Column(name = "MAILBOX_HIGHEST_MODSEQ", nullable = false)
095    private long highestModSeq;
096    
097    /**
098     * JPA only
099     */
100    @Deprecated
101    public JPAMailbox() {
102        super();
103    }
104    
105    public JPAMailbox(MailboxPath path, int uidValidity) {
106        this();
107        this.name = path.getName();
108        this.user = path.getUser();
109        this.namespace = path.getNamespace();
110        this.uidValidity = uidValidity;
111    }
112
113    /**
114     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getMailboxId()
115     */
116    public Long getMailboxId() {
117        return mailboxId;
118    }
119
120    /**
121     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getName()
122     */
123    public String getName() {
124        return name;
125    }
126
127    /**
128     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getUidValidity()
129     */
130    public long getUidValidity() {
131        return uidValidity;
132    }
133    
134    /**
135     * @see org.apache.james.mailbox.store.mail.model.Mailbox#setName(java.lang.String)
136     */
137    public void setName(String name) {
138        this.name = name;
139    }
140
141    @Override
142    public String toString() {
143        final String retValue = "Mailbox ( "
144            + "mailboxId = " + this.mailboxId + TAB
145            + "name = " + this.name + TAB
146            + "uidValidity = " + this.uidValidity + TAB
147            + " )";
148        return retValue;
149    }
150
151    @Override
152    public int hashCode() {
153        final int PRIME = 31;
154        int result = 1;
155        result = PRIME * result + (int) (mailboxId ^ (mailboxId >>> 32));
156        return result;
157    }
158
159    @Override
160    public boolean equals(Object obj) {
161        if (this == obj)
162            return true;
163        if (obj == null)
164            return false;
165        if (getClass() != obj.getClass())
166            return false;
167        final JPAMailbox other = (JPAMailbox) obj;
168        if (mailboxId != other.mailboxId)
169            return false;
170        return true;
171    }
172
173    /**
174     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getNamespace()
175     */
176    public String getNamespace() {
177        return namespace;
178    }
179
180    /**
181     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getUser()
182     */
183    public String getUser() {
184        return user;
185    }
186
187    /**
188     * @see org.apache.james.mailbox.store.mail.model.Mailbox#setNamespace(java.lang.String)
189     */
190    public void setNamespace(String namespace) {
191        this.namespace = namespace;
192    }
193
194    /**
195     * @see org.apache.james.mailbox.store.mail.model.Mailbox#setUser(java.lang.String)
196     */
197    public void setUser(String user) {
198        this.user = user;
199    }
200
201    
202    public long getLastUid() {
203        return lastUid;
204    }
205
206    public long getHighestModSeq() {
207        return highestModSeq;
208    }
209    
210    public long consumeUid() {
211        return ++lastUid;
212    }
213    
214    public long consumeModSeq() {
215        return ++highestModSeq;
216    }
217    
218    /* (non-Javadoc)
219     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getACL()
220     */
221    @Override
222    public MailboxACL getACL() {
223        // TODO ACL support
224        return SimpleMailboxACL.OWNER_FULL_ACL;
225    }
226
227    /* (non-Javadoc)
228     * @see org.apache.james.mailbox.store.mail.model.Mailbox#setACL(org.apache.james.mailbox.MailboxACL)
229     */
230    @Override
231    public void setACL(MailboxACL acl) {
232        // TODO ACL support
233    }
234    
235}