001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2009 SonarSource SA
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.api.database.model;
021
022 import org.apache.commons.lang.builder.EqualsBuilder;
023 import org.apache.commons.lang.builder.HashCodeBuilder;
024 import org.apache.commons.lang.builder.ToStringBuilder;
025 import org.hibernate.annotations.Cache;
026 import org.hibernate.annotations.CacheConcurrencyStrategy;
027 import org.sonar.api.database.BaseIdentifiable;
028 import org.sonar.api.database.DatabaseSession;
029
030 import java.util.Date;
031 import javax.persistence.*;
032
033 @Entity
034 @Table(name = "snapshots")
035 public class Snapshot extends BaseIdentifiable {
036
037 public final static String STATUS_UNPROCESSED = "U";
038 public final static String STATUS_PROCESSED = "P";
039
040 @ManyToOne(fetch = FetchType.LAZY)
041 @JoinColumn(name = "project_id", updatable = true, nullable = true)
042 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
043 private ResourceModel resource;
044
045 @Temporal(TemporalType.TIMESTAMP)
046 @Column(name = "created_at", updatable = true, nullable = true)
047 private Date createdAt;
048
049 @Column(name = "version", updatable = true, nullable = true, length = 32)
050 private String version;
051
052 @Column(name = "islast")
053 private Boolean last = Boolean.FALSE;
054
055 @Column(name = "status")
056 private String status = STATUS_UNPROCESSED;
057
058 @Column(name = "scope", updatable = true, nullable = true, length = 3)
059 private String scope;
060
061 @Column(name = "path", updatable = true, nullable = true, length = 96)
062 private String path;
063
064 @Column(name = "depth", updatable = true, nullable = true)
065 private Integer depth;
066
067 @Column(name = "qualifier", updatable = true, nullable = true, length = 3)
068 private String qualifier;
069
070 @Column(name = "root_snapshot_id", updatable = true, nullable = true)
071 private Integer rootId;
072
073 @Column(name = "parent_snapshot_id", updatable = true, nullable = true)
074 private Integer parentId;
075
076 public Snapshot() {
077
078 }
079
080 /*
081 root is not updated
082 */
083 public Snapshot(ResourceModel resource, Snapshot parent) {
084 this.resource = resource;
085 if (resource != null) {
086 this.qualifier = resource.getQualifier();
087 this.scope = resource.getScope();
088 }
089 if (parent != null) {
090 this.parentId = parent.getId();
091 if (parent.getRootId() == null) {
092 this.rootId = parent.getId();
093 } else {
094 this.rootId = parent.getRootId();
095 }
096 this.createdAt = parent.getCreatedAt();
097 this.depth = parent.getDepth() + 1;
098 this.path = new StringBuilder()
099 .append(parent.getPath())
100 .append(parent.getId())
101 .append(".")
102 .toString();
103
104 } else {
105 path = "";
106 depth = 0;
107 }
108 }
109
110 public Snapshot save(DatabaseSession session) {
111 if (resource != null && resource.getId() != null) {
112 resource = session.reattach(ResourceModel.class, resource.getId());
113 }
114 return session.save(this);
115 }
116
117 public Snapshot(ResourceModel resource, boolean last, String status, Date date) {
118 this();
119 setResource(resource);
120 this.status = status;
121 this.last = last;
122 this.createdAt = date;
123 }
124
125 public Date getCreatedAt() {
126 return createdAt;
127 }
128
129 public void setCreatedAt(Date createdAt) {
130 this.createdAt = createdAt;
131 }
132
133 public ResourceModel getResource() {
134 return resource;
135 }
136
137 public Integer getResourceId() {
138 if (resource != null) {
139 return resource.getId();
140 }
141 return null;
142 }
143
144 public final void setResource(ResourceModel resource) {
145 this.resource = resource;
146 this.scope = resource.getScope();
147 this.qualifier = resource.getQualifier();
148 }
149
150 public String getVersion() {
151 return version;
152 }
153
154 public void setVersion(String version) {
155 this.version = version;
156 }
157
158 public Integer getParentId() {
159 return parentId;
160 }
161
162 public void setParentId(Integer i) {
163 this.parentId = i;
164 }
165
166 public Boolean getLast() {
167 return last;
168 }
169
170 public void setLast(Boolean last) {
171 this.last = last;
172 }
173
174 public String getStatus() {
175 return status;
176 }
177
178 public void setStatus(String status) {
179 this.status = status;
180 }
181
182 public String getScope() {
183 return scope;
184 }
185
186 public void setScope(String scope) {
187 this.scope = scope;
188 }
189
190 public String getQualifier() {
191 return qualifier;
192 }
193
194 public void setQualifier(String qualifier) {
195 this.qualifier = qualifier;
196 }
197
198 public Integer getRootId() {
199 return rootId;
200 }
201
202 public void setRootId(Integer i) {
203 this.rootId = i;
204 }
205
206 public String getPath() {
207 return path;
208 }
209
210 public void setPath(String path) {
211 this.path = path;
212 }
213
214 public Integer getDepth() {
215 return depth;
216 }
217
218 public void setDepth(Integer depth) {
219 if (depth != null && depth < 0) {
220 throw new IllegalArgumentException("depth can not be negative : " + depth);
221 }
222 this.depth = depth;
223 }
224
225
226 @Override
227 public boolean equals(Object obj) {
228 if (!(obj instanceof Snapshot)) {
229 return false;
230 }
231 if (this == obj) {
232 return true;
233 }
234 Snapshot other = (Snapshot) obj;
235 return new EqualsBuilder()
236 .append(resource, other.getResource())
237 .append(createdAt, other.getCreatedAt())
238 .isEquals();
239 }
240
241 @Override
242 public int hashCode() {
243 return new HashCodeBuilder(17, 37)
244 .append(resource)
245 .append(createdAt)
246 .toHashCode();
247 }
248
249 @Override
250 public String toString() {
251 return new ToStringBuilder(this)
252 .append("id", getId())
253 .append("scope", scope)
254 .append("qualifier", qualifier)
255 .append("version", version)
256 .append("last", last)
257 .append("createdAt", createdAt)
258 .append("status", status)
259 .append("path", path)
260 .append("rootId", rootId)
261 .append("parentId", parentId)
262 .toString();
263 }
264 }