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     ****************************************************************/
019    package org.apache.james.mailbox.jpa.user.model;
020    
021    import javax.persistence.Basic;
022    import javax.persistence.Column;
023    import javax.persistence.Entity;
024    import javax.persistence.GeneratedValue;
025    import javax.persistence.Id;
026    import javax.persistence.NamedQueries;
027    import javax.persistence.NamedQuery;
028    import javax.persistence.Table;
029    import javax.persistence.UniqueConstraint;
030    
031    import org.apache.james.mailbox.store.user.model.Subscription;
032    
033    /**
034     * A subscription to a mailbox by a user.
035     */
036    @Entity(name = "Subscription")
037    @Table(
038        name = "JAMES_SUBSCRIPTION",
039        uniqueConstraints = 
040            @UniqueConstraint(
041                    columnNames={
042                            "USER_NAME", 
043                            "MAILBOX_NAME"})
044    )
045    @NamedQueries({
046        @NamedQuery(name = "findFindMailboxSubscriptionForUser",
047            query = "SELECT subscription FROM Subscription subscription WHERE subscription.username = :userParam AND subscription.mailbox = :mailboxParam"),          
048        @NamedQuery(name = "findSubscriptionsForUser",
049            query = "SELECT subscription FROM Subscription subscription WHERE subscription.username = :userParam")                  
050    })
051    public class JPASubscription implements Subscription {
052    
053        private static final String TO_STRING_SEPARATOR = "  ";
054        
055        /** Primary key */
056        @GeneratedValue
057        @Id 
058        @Column(name = "SUBSCRIPTION_ID")
059        private long id;
060        
061        /** Name of the subscribed user */
062        @Basic(optional = false)
063        @Column(name = "USER_NAME", nullable = false, length = 100)
064        private String username;
065        
066        /** Subscribed mailbox */
067        @Basic(optional = false) 
068        @Column(name = "MAILBOX_NAME", nullable = false, length = 100)
069        private String mailbox;
070        
071        /**
072         * Used by JPA
073         */
074        @Deprecated
075        public JPASubscription() {}
076        
077        /**
078         * Constructs a user subscription.
079         * @param username not null
080         * @param mailbox not null
081         */
082        public JPASubscription(String username, String mailbox) {
083            super();
084            this.username = username;
085            this.mailbox = mailbox;
086        }
087    
088        /**
089         * @see org.apache.james.mailbox.store.user.model.Subscription#getMailbox()
090         */
091        public String getMailbox() {
092            return mailbox;
093        }
094        
095        /**
096         * @see org.apache.james.mailbox.store.user.model.Subscription#getUser()
097         */
098        public String getUser() {
099            return username;
100        }
101    
102        @Override
103        public int hashCode() {
104            final int PRIME = 31;
105            int result = 1;
106            result = PRIME * result + (int) (id ^ (id >>> 32));
107            return result;
108        }
109    
110        @Override
111        public boolean equals(Object obj) {
112            if (this == obj)
113                return true;
114            if (obj == null)
115                return false;
116            if (getClass() != obj.getClass())
117                return false;
118            final JPASubscription other = (JPASubscription) obj;
119            if (id != other.id)
120                return false;
121            return true;
122        }
123    
124        /**
125         * Renders output suitable for debugging.
126         *
127         * @return output suitable for debugging
128         */
129        public String toString() {
130            final String result = "Subscription ( "
131                + "id = " + this.id + TO_STRING_SEPARATOR
132                + "user = " + this.username + TO_STRING_SEPARATOR
133                + "mailbox = " + this.mailbox + TO_STRING_SEPARATOR
134                + " )";
135            return result;
136        }
137        
138    }