Project

General

Profile

Download (8.69 KB) Statistics
| Branch: | Tag: | Revision:
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.IdentifiableEntity;
30
import eu.etaxonomy.cdm.model.description.DescriptionBase;
31
import eu.etaxonomy.cdm.model.description.FeatureTree;
32
import eu.etaxonomy.cdm.model.description.PolytomousKey;
33
import eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity;
34
import eu.etaxonomy.cdm.model.media.Media;
35
import eu.etaxonomy.cdm.model.molecular.Sequence;
36
import eu.etaxonomy.cdm.model.name.TaxonName;
37
import eu.etaxonomy.cdm.model.occurrence.Collection;
38
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
39
import eu.etaxonomy.cdm.model.reference.Reference;
40
import eu.etaxonomy.cdm.model.taxon.Classification;
41
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
42
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
43
import eu.etaxonomy.cdm.model.term.TermBase;
44
import eu.etaxonomy.cdm.model.term.TermVocabulary;
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
}
(2-2/5)