001 /*
002 * ----------------------------------------------------------------------
003 * Copyright (C) 2009 Enrique Lara (k957@68k.org)
004 *
005 * TinLizard is free software; you can redistribute it and/or
006 * modify it under the terms of the GNU Lesser General Public License
007 * as published by the Free Software Foundation; either version 3.0
008 * of the License, or (at your option) any later version.
009 *
010 * TinLizard is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Lesser General Public License for more details.
014 *
015 * You should have received a copy of the GNU Lesser General Public License
016 * along with TinLizard. If not, see http://www.gnu.org/licenses/.
017 * ----------------------------------------------------------------------
018 */
019 package tinlizard.model;
020
021 import tinlizard.dao.jpa.JpaDao;
022 import tinlizard.dao.jpa.Persistable;
023
024 import tinlizard.util.Messages;
025
026 import java.util.Collection;
027 import java.util.Date;
028
029 import javax.persistence.Column;
030 import javax.persistence.Entity;
031 import javax.persistence.GeneratedValue;
032 import javax.persistence.GenerationType;
033 import javax.persistence.Id;
034 import javax.persistence.NamedQueries;
035 import javax.persistence.NamedQuery;
036 import javax.persistence.Table;
037 import javax.persistence.UniqueConstraint;
038 import javax.persistence.Version;
039
040 import org.apache.log4j.Logger;
041
042 import org.codehaus.plexus.util.StringUtils;
043
044 import org.hibernate.search.annotations.DateBridge;
045 import org.hibernate.search.annotations.Field;
046 import org.hibernate.search.annotations.Index;
047 import org.hibernate.search.annotations.Indexed;
048 import org.hibernate.search.annotations.Resolution;
049 import org.hibernate.search.annotations.Store;
050
051 /**
052 * A User that can log in and/or own a Codeline.
053 */
054 @Entity(name = "User")
055 @Table(name = "TL_USER", uniqueConstraints = {
056 @UniqueConstraint(columnNames = {
057 "NAME"}
058 )
059 }
060 )
061 @NamedQueries({@NamedQuery(name = QueryNames.USER_BY_NAME,query = "select o from User o where o.name = ?" + User.ORDER_BY)
062 })
063 @Indexed
064 public final class User implements Persistable {
065 static final String ORDER_BY = " order by o.name";
066 private static final Class<User> CLASS = User.class;
067 private static final Logger LOG = Logger.getLogger(CLASS);
068 @Id
069 @GeneratedValue(strategy = GenerationType.AUTO)
070 @Column(name = "ID")
071 private Integer id;
072 @Column(name = "NAME", nullable = false)
073 @Field(index = Index.TOKENIZED, store = Store.NO)
074 private String name;
075 @Column(name = "CREATED", nullable = false)
076 @Field(index = Index.UN_TOKENIZED, store = Store.YES)
077 @DateBridge(resolution = Resolution.SECOND)
078 private Date created;
079 @Column(name = "CREATED_BY", nullable = false)
080 @Field(index = Index.TOKENIZED, store = Store.NO)
081 private String createdBy;
082 @Version
083 @Column(name = "LAST_MODIFIED")
084 @Field(index = Index.UN_TOKENIZED, store = Store.YES)
085 @DateBridge(resolution = Resolution.SECOND)
086 private Date lastModified;
087 @Column(name = "LAST_MODIFIED_BY")
088 @Field(index = Index.TOKENIZED, store = Store.NO)
089 private String lastModifiedBy;
090 @Column(name = "EMAIL")
091 @Field(index = Index.TOKENIZED, store = Store.NO)
092 private String email;
093
094 public Integer getId() {
095 return this.id;
096 }
097
098 public String getName() {
099 return this.name;
100 }
101
102 public Date getCreated() {
103 return this.created;
104 }
105
106 public String getCreatedBy() {
107 return this.createdBy;
108 }
109
110 public Date getLastModified() {
111 return this.lastModified;
112 }
113
114 public String getLastModifiedBy() {
115 return this.lastModifiedBy;
116 }
117
118 public void setId(final Integer id) {
119 this.id = id;
120 }
121
122 public void setName(final String name) {
123 this.name = name;
124 }
125
126 public void setCreated(final Date created) {
127 this.created = created;
128 }
129
130 public void setCreatedBy(final String createdBy) {
131 this.createdBy = createdBy;
132 }
133
134 public void setLastModified(final Date lastModified) {
135 this.lastModified = lastModified;
136 }
137
138 public void setLastModifiedBy(final String lastModifiedBy) {
139 this.lastModifiedBy = lastModifiedBy;
140 }
141
142 public String getEmail() {
143 return this.email;
144 }
145
146 public void setEmail(final String email) {
147 this.email = email;
148 }
149
150 public Collection<Codeline> getCodelines() {
151 Object[] params = {
152 this
153 };
154
155 return JpaDao.getInstance().findByNamedQuery(Codeline.class, QueryNames.CODELINES_BY_USER, params);
156 }
157
158 public void add() {
159 JpaDao.getInstance().add(this);
160 }
161
162 public void update() {
163 JpaDao.getInstance().update(this);
164 }
165
166 public void delete() {
167 JpaDao.getInstance().delete(CLASS, getId());
168 }
169
170 public void index() {
171 JpaDao.getInstance().index(this);
172 }
173
174 public static Collection<User> findAll() {
175 return JpaDao.getInstance().findAll(CLASS);
176 }
177
178 public static User findByName(final String name) {
179 Object[] params = {
180 name
181 };
182
183 return JpaDao.getInstance().findSingleByNamedQuery(CLASS, QueryNames.USER_BY_NAME, params);
184 }
185
186 public static User getUserByName(final String name, final boolean createIfNotExist) {
187 User user = User.findByName(name);
188
189 if ((user == null) && createIfNotExist) {
190 user = add(name);
191 } else {
192 if (LOG.isDebugEnabled()) {
193 LOG.debug(Messages.debug_5000(name));
194 }
195 }
196
197 return user;
198 }
199
200 public static User getSystemUser() {
201 return User.getUserByName("SYSTEM", true);
202 }
203
204 public static User add(final String name) {
205 if (StringUtils.isBlank(name)) {
206 throw new IllegalArgumentException(Messages.error_0105());
207 }
208
209 User user = new User();
210 user.setName(name);
211 user.add();
212
213 return user;
214 }
215
216 public static Collection<User> search(final String query) {
217 String[] fields = {
218 "name",
219 "created",
220 "createdBy",
221 "lastModified",
222 "lastModifiedBy",
223 "email"
224 };
225
226 return JpaDao.getInstance().findByTextSearch(CLASS, query, fields);
227 }
228
229 public static void indexAll() {
230 JpaDao.getInstance().indexAll(CLASS);
231 }
232 }