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 java.util.ArrayList;
025    import java.util.Collection;
026    import java.util.Date;
027    import java.util.Iterator;
028    
029    import javax.persistence.Column;
030    import javax.persistence.Entity;
031    import javax.persistence.EntityManager;
032    import javax.persistence.EntityTransaction;
033    import javax.persistence.GeneratedValue;
034    import javax.persistence.GenerationType;
035    import javax.persistence.Id;
036    import javax.persistence.JoinColumn;
037    import javax.persistence.ManyToOne;
038    import javax.persistence.NamedQueries;
039    import javax.persistence.NamedQuery;
040    import javax.persistence.Table;
041    import javax.persistence.Version;
042    
043    import org.hibernate.search.annotations.DateBridge;
044    import org.hibernate.search.annotations.Field;
045    import org.hibernate.search.annotations.Index;
046    import org.hibernate.search.annotations.Indexed;
047    import org.hibernate.search.annotations.Resolution;
048    import org.hibernate.search.annotations.Store;
049    
050    /**
051     * A Dependency declared as such in the pom.xml of any Codeline in TinLizard.
052     */
053    @Entity(name = "Dependency")
054    @Table(name = "TL_DEPENDENCY")
055    @NamedQueries({@NamedQuery(name = QueryNames.DEPENDENCIES_BY_CODELINE,query = "select o from Dependency o left join o.codeline pb where pb = ?" + Dependency.ORDER_BY)
056    })
057    @Indexed
058    public final class Dependency implements Persistable {
059        static final String ORDER_BY = " order by o.groupId, o.artifactId";
060        private static final Class<Dependency> CLASS = Dependency.class;
061        @Id
062        @GeneratedValue(strategy = GenerationType.AUTO)
063        @Column(name = "ID")
064        private Integer id;
065        @Column(name = "NAME", nullable = false)
066        @Field(index = Index.TOKENIZED, store = Store.NO)
067        private String name;
068        @Column(name = "CREATED", nullable = false)
069        @Field(index = Index.UN_TOKENIZED, store = Store.YES)
070        @DateBridge(resolution = Resolution.SECOND)
071        private Date created;
072        @Column(name = "CREATED_BY", nullable = false)
073        @Field(index = Index.TOKENIZED, store = Store.NO)
074        private String createdBy;
075        @Version
076        @Column(name = "LAST_MODIFIED")
077        @Field(index = Index.UN_TOKENIZED, store = Store.YES)
078        @DateBridge(resolution = Resolution.SECOND)
079        private Date lastModified;
080        @Column(name = "LAST_MODIFIED_BY")
081        @Field(index = Index.TOKENIZED, store = Store.NO)
082        private String lastModifiedBy;
083        @Column(name = "GROUP_ID", nullable = false)
084        @Field(index = Index.TOKENIZED, store = Store.NO)
085        private String groupId;
086        @Column(name = "ARTIFACT_ID", nullable = false)
087        @Field(index = Index.TOKENIZED, store = Store.NO)
088        private String artifactId;
089        @Column(name = "CLASSIFIER")
090        @Field(index = Index.TOKENIZED, store = Store.NO)
091        private String classifier;
092        @Column(name = "VERSION")
093        @Field(index = Index.TOKENIZED, store = Store.NO)
094        private String version;
095        @ManyToOne
096        @JoinColumn(name = "CODELINE_ID") //XXX, nullable = false)
097    
098        private Codeline codeline;
099    
100        public Integer getId() {
101            return this.id;
102        }
103    
104        public String getName() {
105            return this.name;
106        }
107    
108        public Date getCreated() {
109            return this.created;
110        }
111    
112        public String getCreatedBy() {
113            return this.createdBy;
114        }
115    
116        public Date getLastModified() {
117            return this.lastModified;
118        }
119    
120        public String getLastModifiedBy() {
121            return this.lastModifiedBy;
122        }
123    
124        public void setId(final Integer id) {
125            this.id = id;
126        }
127    
128        public void setName(final String name) {
129            this.name = name;
130        }
131    
132        public void setCreated(final Date created) {
133            this.created = created;
134        }
135    
136        public void setCreatedBy(final String createdBy) {
137            this.createdBy = createdBy;
138        }
139    
140        public void setLastModified(final Date lastModified) {
141            this.lastModified = lastModified;
142        }
143    
144        public void setLastModifiedBy(final String lastModifiedBy) {
145            this.lastModifiedBy = lastModifiedBy;
146        }
147    
148        public String getGroupId() {
149            return this.groupId;
150        }
151    
152        public String getArtifactId() {
153            return artifactId;
154        }
155    
156        public String getClassifier() {
157            return this.classifier;
158        }
159    
160        public String getVersion() {
161            return this.version;
162        }
163    
164        public Codeline getCodeline() {
165            return this.codeline;
166        }
167    
168        void setName() {
169            setName(groupId + "." + artifactId);
170        }
171    
172        public void setGroupId(final String groupId) {
173            this.groupId = groupId;
174            setName();
175        }
176    
177        public void setArtifactId(final String artifactId) {
178            this.artifactId = artifactId;
179            setName();
180        }
181    
182        public void setClassifier(final String classifier) {
183            this.classifier = classifier;
184            setName();
185        }
186    
187        public void setVersion(final String version) {
188            this.version = version;
189        }
190    
191        public void setCodeline(final Codeline codeline) {
192            this.codeline = codeline;
193            setName();
194        }
195    
196        public Collection<Codeline> findAllConsumers(final boolean useVersion) {
197            if (useVersion) {
198                Object[] params = {
199                                      getGroupId(),
200                                      getArtifactId(),
201                                      getVersion()
202                };
203    
204                return JpaDao.getInstance().findByNamedQuery(Codeline.class, QueryNames.CODELINES_DEPENDENT_ON_ARTIFACT, params);
205            } else {
206                Object[] params = {
207                                      getGroupId(),
208                                      getArtifactId()
209                };
210    
211                return JpaDao.getInstance().findByNamedQuery(Codeline.class, QueryNames.CODELINES_DEPENDENT_ON_ARTIFACT_ANY_VERSION, params);
212            }
213        }
214    
215        public Collection<Codeline> findAllDefiningDependency(final boolean useVersion) {
216            if (useVersion) {
217                Object[] params = {
218                                      getGroupId(),
219                                      getArtifactId(),
220                                      getVersion()
221                };
222    
223                return JpaDao.getInstance().findByNamedQuery(Codeline.class, QueryNames.CODELINES_DEFINING_ARTIFACT, params);
224            } else {
225                Object[] params = {
226                                      getGroupId(),
227                                      getArtifactId()
228                };
229    
230                return JpaDao.getInstance().findByNamedQuery(Codeline.class, QueryNames.CODELINES_DEFINING_ARTIFACT_ANY_VERSION, params);
231            }
232        }
233    
234        public void add() {
235            JpaDao.getInstance().add(this);
236        }
237    
238        public void update() {
239            JpaDao.getInstance().update(this);
240        }
241    
242        public void delete() {
243            JpaDao.getInstance().delete(CLASS, getId());
244        }
245    
246        public void index() {
247            JpaDao.getInstance().index(this);
248        }
249    
250        @SuppressWarnings("unchecked")
251        public static Collection<String> findAllGroupIds() {
252            EntityManager em = JpaDao.getInstance().getEm();
253            EntityTransaction tx = em.getTransaction();
254            tx.begin();
255    
256            Collection<String> groupIds = null;
257    
258            try {
259                groupIds = new ArrayList<String>();
260    
261                Collection results = em.createQuery("select distinct o.groupId from Dependency o").getResultList();
262    
263                for (Iterator it = results.iterator(); it.hasNext();) {
264                    Object obj = it.next();
265                    groupIds.add(obj.toString());
266                }
267    
268                tx.commit();
269            } catch (Exception e) {
270                JpaDao.getInstance().handleError(tx, "Delete Error", e);
271            }
272    
273            return groupIds;
274        }
275    
276        @SuppressWarnings("unchecked")
277        public static Collection<String> findAllArtifactIds(final String groupId) {
278            EntityManager em = JpaDao.getInstance().getEm();
279            EntityTransaction tx = em.getTransaction();
280            tx.begin();
281    
282            Collection<String> artifactIds = null;
283    
284            try {
285                artifactIds = new ArrayList<String>();
286    
287                Collection results = em.createQuery("select distinct o.artifactId from Dependency o where groupId = ?").setParameter(1, groupId).getResultList();
288    
289                for (Iterator it = results.iterator(); it.hasNext();) {
290                    Object obj = it.next();
291                    artifactIds.add(obj.toString());
292                }
293    
294                tx.commit();
295            } catch (Exception e) {
296                JpaDao.getInstance().handleError(tx, "Delete Error", e);
297            }
298    
299            return artifactIds;
300        }
301    
302        public static Collection<Dependency> search(final String query) {
303            String[] fields = {
304                                  "name",
305                                  "created",
306                                  "createdBy",
307                                  "lastModified",
308                                  "lastModifiedBy",
309                                  "groupId",
310                                  "artifactId",
311                                  "classifier",
312                                  "version"
313            };
314    
315            return JpaDao.getInstance().findByTextSearch(CLASS, query, fields);
316        }
317    
318        public static void indexAll() {
319            JpaDao.getInstance().indexAll(CLASS);
320        }
321    }