1 package eu
.etaxonomy
.cdm
.api
.service
.util
;
3 import java
.io
.Serializable
;
4 import java
.util
.Arrays
;
7 import org
.apache
.log4j
.Logger
;
8 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
9 import org
.springframework
.stereotype
.Component
;
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
;
48 public class CacheUpdater
implements Serializable
{
50 private static final long serialVersionUID
= -1410600568024821771L;
52 private static final Logger logger
= Logger
.getLogger(CacheUpdater
.class);
55 protected INameService nameService
;
58 protected ITaxonService taxonService
;
61 protected IClassificationService classificationService
;
64 protected IReferenceService referenceService
;
67 protected IAgentService agentService
;
71 protected IOccurrenceService occurrenceService
;
74 protected ITermService termService
;
76 protected IDescriptionService descriptionService
;
79 protected ICollectionService collectionService
;
81 protected IFeatureTreeService featureTreeService
;
84 protected IVocabularyService vocabularyService
;
87 protected IPolytomousKeyService polytomousKeyService
;
89 protected IMediaService mediaService
;
91 protected IProgressMonitorService progressMonitorService
;
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();
102 result
= handleClassList(config
.getClassList(), config
.getMonitor());
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
);
116 if (multipleResult
== null){
117 result
.includeResult(this.handleSingleTableClass(clazz
, monitor
));
119 result
.includeResult(multipleResult
);
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
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
);
149 private UpdateResult
handleSingleTableClass(Class
<?
extends IdentifiableEntity
> clazz
, IProgressMonitor monitor
) {
151 UpdateResult result
= new UpdateResult();
155 logger
.info("Updating class " + clazz
.getSimpleName() + " ...");
158 if (DefinedTermBase
.class.isAssignableFrom(clazz
)){
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
));
167 else if (DescriptionBase
.class.isAssignableFrom(clazz
)){
168 result
.includeResult(descriptionService
.updateCaches((Class
) clazz
, null, null, monitor
));
171 else if (Media
.class.isAssignableFrom(clazz
)){
172 result
.includeResult(mediaService
.updateCaches((Class
) clazz
, null, null, monitor
));
174 else if (TaxonBase
.class.isAssignableFrom(clazz
)){
175 result
.includeResult(taxonService
.updateCaches((Class
) clazz
, null, null, monitor
));
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
));
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);
194 else if (TaxonName
.class.isAssignableFrom(clazz
)){
196 result
.includeResult(nameService
.updateCaches((Class
) clazz
, null, null, null));
199 else if (Classification
.class.isAssignableFrom(clazz
)){
200 result
.includeResult(classificationService
.updateCaches((Class
) clazz
, null, null, null));
203 else if (PolytomousKey
.class.isAssignableFrom(clazz
)){
204 result
.includeResult(polytomousKeyService
.updateCaches((Class
) clazz
, null, null, null));
210 String warning
= "Unknown identifable entity subclass + " + clazz
.getName();
211 logger
.error(warning
);
213 result
.addException(new Exception(warning
));
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
);
223 result
.addException(e
);
228 private void createClassListFromBoolean() {
229 logger
.warn("Create class list from boolean not yet implemented. Can't run cache updater");