Merge branch 'develop' of ssh://dev.e-taxonomy.eu/var/git/cdmlib into develop
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / UpdateResult.java
1
2 //$Id$
3 /**
4 * Copyright (C) 2009 EDIT
5 * European Distributed Institute of Taxonomy
6 * http://www.e-taxonomy.eu
7 *
8 * The contents of this file are subject to the Mozilla Public License Version 1.1
9 * See LICENSE.TXT at the top of this package for the full license terms.
10 */
11 package eu.etaxonomy.cdm.api.service;
12
13 import java.io.Serializable;
14 import java.util.Collection;
15 import java.util.HashSet;
16 import java.util.Set;
17
18 import org.apache.commons.collections.buffer.CircularFifoBuffer;
19 import org.apache.log4j.Logger;
20
21 import eu.etaxonomy.cdm.api.service.dto.CdmEntityIdentifier;
22 import eu.etaxonomy.cdm.model.common.CdmBase;
23 import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;
24
25 /**
26 * This class represents the result of an update action.
27 *
28 * @author k.luther
29 * @since 11.02.2015
30 *
31 */
32 public class UpdateResult implements Serializable{
33
34 private static final long serialVersionUID = -7040027587709706700L;
35
36 @SuppressWarnings("unused")
37 private static final Logger logger = Logger.getLogger(UpdateResult.class);
38
39 private Status status = Status.OK;
40
41 @SuppressWarnings("unchecked")
42 private final Collection<Exception> exceptions = new CircularFifoBuffer(10);
43
44 private Set<CdmBase> updatedObjects = new HashSet<>();
45
46 private final Set<CdmEntityIdentifier> updatedCdmIds = new HashSet<>();
47
48 private final Set<CdmBase> unchangedObjects = new HashSet<>();
49
50 private CdmBase cdmEntity;
51
52
53 // private Set<PersistPair> objectsToDelete = new HashSet<>();
54 //
55 // private Set<PersistPair> objectsToSave = new HashSet<>();
56
57 // protected class PersistPair{
58 // protected CdmBase objectToPersist;
59 // protected ICdmEntityDao<CdmBase> dao;
60 // }
61
62 public enum Status {
63 OK(0),
64 ABORT(1),
65 ERROR(3),
66 ;
67
68 protected Integer severity;
69 private Status(int severity){
70 this.severity = severity;
71 }
72
73 public int compareSeverity(Status other){
74 return this.severity.compareTo(other.severity);
75 }
76 }
77
78 //***************************** GETTER /SETTER /ADDER *************************/
79 /**
80 * The resulting status of an update action.
81 *
82 * @see UpdateStatus
83 * @return
84 */
85 public Status getStatus() {
86 return status;
87 }
88 public void setStatus(Status status) {
89 this.status = status;
90 }
91
92 /**
93 * The highest exception that occurred during delete (if any).
94 * @return
95 */
96 public Collection<Exception> getExceptions() {
97 return exceptions;
98 }
99 public void addException(Exception exception) {
100 this.exceptions.add(exception);
101 }
102 public void addExceptions(Collection<Exception> exceptions) {
103 this.exceptions.addAll(exceptions);
104 }
105
106 /**
107 * Related objects that prevent the delete action to take place.
108 * @return
109 */
110 public Set<CdmEntityIdentifier> getUpdatedCdmIds() {
111 return updatedCdmIds;
112 }
113 public void addUpdatedCdmId(CdmEntityIdentifier cdmId) {
114 this.updatedCdmIds.add(cdmId);
115 }
116 public void addUpdatedCdmIds(Set<CdmEntityIdentifier> updatedCdmIds) {
117 this.updatedCdmIds.addAll(updatedCdmIds);
118 }
119
120
121 public Set<CdmBase> getUpdatedObjects() {
122 return updatedObjects;
123 }
124 public void addUpdatedObject(CdmBase relatedObject) {
125 this.updatedObjects.add(relatedObject);
126 }
127 public void addUpdatedObjects(Set<? extends CdmBase> updatedObjects) {
128 this.updatedObjects.addAll(updatedObjects);
129 }
130
131 // /**
132 // * @return
133 // */
134 // public Set<PersistPair> getObjectsToDelete() {
135 // return objectsToDelete;
136 // }
137 // public void setObjectsToDelete(Set<PersistPair> objectsToDelete) {
138 // this.objectsToDelete = objectsToDelete;
139 // }
140 //
141 // /**
142 // * @return
143 // */
144 // public Set<PersistPair> getObjectsToSave() {
145 // return objectsToSave;
146 // }
147 // public void setObjectsToSave(Set<PersistPair> objectsToSave) {
148 // this.objectsToSave = objectsToSave;
149 // }
150
151
152 //****************** CONVENIENCE *********************************************/
153
154 /**
155 * Sets the status to {@link DeleteStatus#ERROR} if not yet set to a more serious
156 * status.
157 */
158 public void setError(){
159 setMaxStatus(Status.ERROR);
160 }
161
162 /**
163 * Sets the status to {@link DeleteStatus#ABORT} if not yet set to a more serious
164 * status.
165 */
166 public void setAbort(){
167 setMaxStatus(Status.ABORT);
168 }
169
170 /**
171 * Sets status to most severe status. If maxStatus is more severe then existing status
172 * existing status is set to maxStatus. Otherwise nothing changes.
173 * If minStatus is more severe then given status minStatus will be the new status.
174 * @param maxStatus
175 */
176 public void setMaxStatus(Status maxStatus) {
177 if (this.status.compareSeverity(maxStatus) < 0){
178 this.status = maxStatus;
179 }
180 }
181
182 public void includeResult(UpdateResult includedResult){
183
184 this.setMaxStatus(includedResult.getStatus());
185 this.addExceptions(includedResult.getExceptions());
186 this.addUpdatedObjects(includedResult.getUpdatedObjects());
187 this.addUpdatedCdmIds(includedResult.getUpdatedCdmIds());
188 //also add cdm entity of included result to updated objects
189 if(includedResult.getCdmEntity()!=null){
190 this.getUpdatedObjects().add(includedResult.getCdmEntity());
191 }
192 }
193
194 public boolean isOk(){
195 return this.status == Status.OK;
196 }
197
198 public boolean isAbort(){
199 return this.status == Status.ABORT;
200 }
201
202 public boolean isError(){
203 return this.status == Status.ERROR;
204 }
205
206
207
208 @Override
209 public String toString(){
210 String separator = ", ";
211 String exceptionString = "";
212 for (Exception exception : exceptions) {
213 exceptionString += exception.getLocalizedMessage()+separator;
214 }
215 if(exceptionString.endsWith(separator)){
216 exceptionString = exceptionString.substring(0, exceptionString.length()-separator.length());
217 }
218 String relatedObjectString = "";
219 for (CdmBase upatedObject: updatedObjects) {
220 if(upatedObject instanceof IIdentifiableEntity){
221 relatedObjectString += ((IIdentifiableEntity) upatedObject).getTitleCache()+separator;
222 }
223 else{
224 relatedObjectString += upatedObject.toString()+separator;
225 }
226 }
227 if(relatedObjectString.endsWith(separator)){
228 relatedObjectString = relatedObjectString.substring(0, relatedObjectString.length()-separator.length());
229 }
230 return "[UpdateResult]\n" +
231 "Status: " + status.toString()+"\n" +
232 "Exceptions: " + exceptionString+"\n" +
233 "Related Objects: "+relatedObjectString;
234 }
235 public void setCdmEntity(CdmBase cdmBase) {
236 this.cdmEntity = cdmBase;
237
238 }
239
240
241 public CdmBase getCdmEntity(){
242 return cdmEntity;
243 }
244
245 public Set<CdmBase> getUnchangedObjects() {
246 return unchangedObjects;
247 }
248
249 public void addUnchangedObjects(Set<? extends CdmBase> unchangedObjects) {
250 this.unchangedObjects.addAll(unchangedObjects);
251 }
252 public void addUnChangedObject(CdmBase unchangedObject) {
253 this.unchangedObjects.add(unchangedObject);
254 }
255
256
257
258 }