ref #8096: move cache updater and service methods return updateResult
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / util / CacheUpdater.java
1 package eu.etaxonomy.cdm.api.service.util;
2
3 import java.io.Serializable;
4 import java.util.Arrays;
5 import java.util.List;
6
7 import org.apache.log4j.Logger;
8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.stereotype.Component;
10
11 import eu.etaxonomy.cdm.api.service.IAgentService;
12 import eu.etaxonomy.cdm.api.service.IClassificationService;
13 import eu.etaxonomy.cdm.api.service.ICollectionService;
14 import eu.etaxonomy.cdm.api.service.IDescriptionService;
15 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
16 import eu.etaxonomy.cdm.api.service.IMediaService;
17 import eu.etaxonomy.cdm.api.service.INameService;
18 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
19 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
20 import eu.etaxonomy.cdm.api.service.IProgressMonitorService;
21 import eu.etaxonomy.cdm.api.service.IReferenceService;
22 import eu.etaxonomy.cdm.api.service.ITaxonService;
23 import eu.etaxonomy.cdm.api.service.ITermService;
24 import eu.etaxonomy.cdm.api.service.IVocabularyService;
25 import eu.etaxonomy.cdm.api.service.UpdateResult;
26 import eu.etaxonomy.cdm.api.service.config.CacheUpdaterConfigurator;
27 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
28 import eu.etaxonomy.cdm.model.agent.AgentBase;
29 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
30 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
31 import eu.etaxonomy.cdm.model.common.TermBase;
32 import eu.etaxonomy.cdm.model.common.TermVocabulary;
33 import eu.etaxonomy.cdm.model.description.DescriptionBase;
34 import eu.etaxonomy.cdm.model.description.FeatureTree;
35 import eu.etaxonomy.cdm.model.description.PolytomousKey;
36 import eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity;
37 import eu.etaxonomy.cdm.model.media.Media;
38 import eu.etaxonomy.cdm.model.molecular.Sequence;
39 import eu.etaxonomy.cdm.model.name.TaxonName;
40 import eu.etaxonomy.cdm.model.occurrence.Collection;
41 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
42 import eu.etaxonomy.cdm.model.reference.Reference;
43 import eu.etaxonomy.cdm.model.taxon.Classification;
44 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
45
46
47 @Component
48 public class CacheUpdater implements Serializable {
49
50 private static final long serialVersionUID = -1410600568024821771L;
51
52 private static final Logger logger = Logger.getLogger(CacheUpdater.class);
53
54 @Autowired
55 protected INameService nameService;
56
57 @Autowired
58 protected ITaxonService taxonService;
59
60 @Autowired
61 protected IClassificationService classificationService;
62
63 @Autowired
64 protected IReferenceService referenceService;
65
66 @Autowired
67 protected IAgentService agentService;
68
69
70 @Autowired
71 protected IOccurrenceService occurrenceService;
72
73 @Autowired
74 protected ITermService termService;
75 @Autowired
76 protected IDescriptionService descriptionService;
77
78 @Autowired
79 protected ICollectionService collectionService;
80 @Autowired
81 protected IFeatureTreeService featureTreeService;
82
83 @Autowired
84 protected IVocabularyService vocabularyService;
85
86 @Autowired
87 protected IPolytomousKeyService polytomousKeyService;
88 @Autowired
89 protected IMediaService mediaService;
90 @Autowired
91 protected IProgressMonitorService progressMonitorService;
92
93 public UpdateResult doInvoke(CacheUpdaterConfigurator config) {
94 UpdateResult result = new UpdateResult();
95 if (config.getClassList() == null || config.getClassList().isEmpty()){
96 //!! not yet implemented
97 logger.warn("Create class list from boolean values is not yet implemented for cache updater");
98 createClassListFromBoolean();
99 }
100
101 //handle class list
102 result = handleClassList(config.getClassList(), config.getMonitor());
103
104 return result;
105 }
106
107
108 private UpdateResult handleClassList(List<Class<? extends IdentifiableEntity>> classList, IProgressMonitor monitor) {
109 UpdateResult result = new UpdateResult();
110 for (Class<? extends IdentifiableEntity> clazz : classList){
111 //WE need to separate classes , because hibernate
112 //returns multiple values for service.count() for e.g. IdentifableEntity.class
113 //which leads to an exception
114 UpdateResult multipleResult = handleMultiTableClasses(clazz, monitor);
115
116 if (multipleResult == null){
117 result.includeResult(this.handleSingleTableClass(clazz, monitor));
118 }else{
119 result.includeResult(multipleResult);
120 }
121 }
122 return result;
123 }
124
125 private UpdateResult handleMultiTableClasses(Class<? extends IdentifiableEntity> clazz, IProgressMonitor monitor) {
126 if (clazz.isAssignableFrom(IdentifiableEntity.class)){
127 @SuppressWarnings("rawtypes")
128 List list = Arrays.asList(new Class[]{
129 DescriptionBase.class, IdentifiableMediaEntity.class,
130 Media.class, Sequence.class,
131 TaxonBase.class, TaxonName.class,
132 Classification.class, TermBase.class
133 });
134 return handleClassList(list, monitor);
135 }else if (clazz.isAssignableFrom(IdentifiableMediaEntity.class)){
136 @SuppressWarnings("rawtypes")
137 List list = Arrays.asList(new Class[]{AgentBase.class, Collection.class, Reference.class, SpecimenOrObservationBase.class});
138 return handleClassList(list, monitor);
139 }else if (clazz.isAssignableFrom(TermBase.class)){
140 @SuppressWarnings("rawtypes")
141 List list = Arrays.asList(new Class[]{DefinedTermBase.class, FeatureTree.class, TermVocabulary.class });
142 return handleClassList(list, monitor);
143 }else{
144 return null;
145 }
146
147 }
148
149 private UpdateResult handleSingleTableClass(Class<? extends IdentifiableEntity> clazz, IProgressMonitor monitor) {
150
151 UpdateResult result = new UpdateResult();
152 if (clazz == null){
153 return result;
154 }
155 logger.info("Updating class " + clazz.getSimpleName() + " ...");
156 try {
157 //TermBase
158 if (DefinedTermBase.class.isAssignableFrom(clazz)){
159
160 result.includeResult(termService.updateCaches((Class) clazz, null, null, monitor));
161 }else if (FeatureTree.class.isAssignableFrom(clazz)){
162 result.includeResult(featureTreeService.updateCaches((Class) clazz, null, null, monitor));
163 }else if (TermVocabulary.class.isAssignableFrom(clazz)){
164 result.includeResult(vocabularyService.updateCaches((Class) clazz, null, null, monitor));
165 }
166 //DescriptionBase
167 else if (DescriptionBase.class.isAssignableFrom(clazz)){
168 result.includeResult(descriptionService.updateCaches((Class) clazz, null, null, monitor));
169 }
170 //Media
171 else if (Media.class.isAssignableFrom(clazz)){
172 result.includeResult(mediaService.updateCaches((Class) clazz, null, null, monitor));
173 }//TaxonBase
174 else if (TaxonBase.class.isAssignableFrom(clazz)){
175 result.includeResult(taxonService.updateCaches((Class) clazz, null, null, monitor));
176 }
177 //IdentifiableMediaEntity
178 else if (AgentBase.class.isAssignableFrom(clazz)){
179 result.includeResult(agentService.updateCaches((Class) clazz, null, null, monitor));
180 }else if (Collection.class.isAssignableFrom(clazz)){
181 result.includeResult(collectionService.updateCaches((Class) clazz, null, null, monitor));
182 }else if (Reference.class.isAssignableFrom(clazz)){
183 result.includeResult(referenceService.updateCaches((Class) clazz, null, null, monitor));
184 }else if (SpecimenOrObservationBase.class.isAssignableFrom(clazz)){
185 result.includeResult(occurrenceService.updateCaches((Class) clazz, null, null, monitor));
186
187 }
188 // //Sequence //currently not identifiable and therefore has not caches
189 // else if (Sequence.class.isAssignableFrom(clazz)){
190 // //TODO misuse TaxonService for sequence update, use sequence service when it exists
191 // getTaxonService().updateTitleCache((Class) clazz, null, null, null);
192 // }
193 //TaxonName
194 else if (TaxonName.class.isAssignableFrom(clazz)){
195
196 result.includeResult(nameService.updateCaches((Class) clazz, null, null, null));
197 }
198 //Classification
199 else if (Classification.class.isAssignableFrom(clazz)){
200 result.includeResult(classificationService.updateCaches((Class) clazz, null, null, null));
201 }
202 //Polytomous Key
203 else if (PolytomousKey.class.isAssignableFrom(clazz)){
204 result.includeResult(polytomousKeyService.updateCaches((Class) clazz, null, null, null));
205
206 }
207
208 //unknown class
209 else {
210 String warning = "Unknown identifable entity subclass + " + clazz.getName();
211 logger.error(warning);
212 result.setAbort();
213 result.addException(new Exception(warning));
214
215 }
216 return result;
217 } catch (Exception e) {
218 String warning = "Exception occurred when trying to update class + " + clazz.getName();
219 warning += " Exception was: " + e.getMessage();
220 logger.error(warning);
221 e.printStackTrace();
222 result.setAbort();
223 result.addException(e);
224 return result;
225 }
226 }
227
228 private void createClassListFromBoolean() {
229 logger.warn("Create class list from boolean not yet implemented. Can't run cache updater");
230 }
231
232
233
234
235
236 }