Merge branch 'develop' of ssh://dev.e-taxonomy.eu/var/git/cdmlib into develop
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / database / update / v36_40 / ReferencedObjTypeUpdater.java
1 // $Id$
2 /**
3 * Copyright (C) 2009 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.cdm.database.update.v36_40;
11
12 import java.lang.reflect.Modifier;
13 import java.sql.SQLException;
14 import java.util.HashMap;
15 import java.util.Map;
16
17 import org.apache.log4j.Logger;
18
19 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
20 import eu.etaxonomy.cdm.database.ICdmDataSource;
21 import eu.etaxonomy.cdm.database.update.CaseType;
22 import eu.etaxonomy.cdm.database.update.ITermUpdaterStep;
23 import eu.etaxonomy.cdm.database.update.SchemaUpdaterStepBase;
24 import eu.etaxonomy.cdm.model.agent.AgentBase;
25 import eu.etaxonomy.cdm.model.agent.Institution;
26 import eu.etaxonomy.cdm.model.agent.Person;
27 import eu.etaxonomy.cdm.model.agent.Team;
28 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
29 import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
30 import eu.etaxonomy.cdm.model.common.Annotation;
31 import eu.etaxonomy.cdm.model.common.AnnotationType;
32 import eu.etaxonomy.cdm.model.common.Credit;
33 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
34 import eu.etaxonomy.cdm.model.common.EventBase;
35 import eu.etaxonomy.cdm.model.common.ExtensionType;
36 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
37 import eu.etaxonomy.cdm.model.common.IdentifiableSource;
38 import eu.etaxonomy.cdm.model.common.Identifier;
39 import eu.etaxonomy.cdm.model.common.Language;
40 import eu.etaxonomy.cdm.model.common.LanguageString;
41 import eu.etaxonomy.cdm.model.common.LanguageStringBase;
42 import eu.etaxonomy.cdm.model.common.MarkerType;
43 import eu.etaxonomy.cdm.model.common.OrderedTerm;
44 import eu.etaxonomy.cdm.model.common.OrderedTermBase;
45 import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;
46 import eu.etaxonomy.cdm.model.common.ReferencedEntityBase;
47 import eu.etaxonomy.cdm.model.common.RelationshipBase;
48 import eu.etaxonomy.cdm.model.common.RelationshipTermBase;
49 import eu.etaxonomy.cdm.model.common.Representation;
50 import eu.etaxonomy.cdm.model.common.TermVocabulary;
51 import eu.etaxonomy.cdm.model.description.CategoricalData;
52 import eu.etaxonomy.cdm.model.description.CommonTaxonName;
53 import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
54 import eu.etaxonomy.cdm.model.description.Distribution;
55 import eu.etaxonomy.cdm.model.description.Feature;
56 import eu.etaxonomy.cdm.model.description.FeatureTree;
57 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
58 import eu.etaxonomy.cdm.model.description.MeasurementUnit;
59 import eu.etaxonomy.cdm.model.description.MediaKey;
60 import eu.etaxonomy.cdm.model.description.MultiAccessKey;
61 import eu.etaxonomy.cdm.model.description.NaturalLanguageTerm;
62 import eu.etaxonomy.cdm.model.description.PolytomousKey;
63 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
64 import eu.etaxonomy.cdm.model.description.QuantitativeData;
65 import eu.etaxonomy.cdm.model.description.SpecimenDescription;
66 import eu.etaxonomy.cdm.model.description.State;
67 import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
68 import eu.etaxonomy.cdm.model.description.TaxonDescription;
69 import eu.etaxonomy.cdm.model.description.TaxonInteraction;
70 import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
71 import eu.etaxonomy.cdm.model.description.TextData;
72 import eu.etaxonomy.cdm.model.description.TextFormat;
73 import eu.etaxonomy.cdm.model.description.WorkingSet;
74 import eu.etaxonomy.cdm.model.location.Country;
75 import eu.etaxonomy.cdm.model.location.NamedArea;
76 import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
77 import eu.etaxonomy.cdm.model.location.NamedAreaType;
78 import eu.etaxonomy.cdm.model.location.ReferenceSystem;
79 import eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity;
80 import eu.etaxonomy.cdm.model.media.Media;
81 import eu.etaxonomy.cdm.model.media.Rights;
82 import eu.etaxonomy.cdm.model.media.RightsType;
83 import eu.etaxonomy.cdm.model.molecular.Amplification;
84 import eu.etaxonomy.cdm.model.molecular.AmplificationResult;
85 import eu.etaxonomy.cdm.model.molecular.Cloning;
86 import eu.etaxonomy.cdm.model.molecular.DnaSample;
87 import eu.etaxonomy.cdm.model.molecular.PhylogeneticTree;
88 import eu.etaxonomy.cdm.model.molecular.Primer;
89 import eu.etaxonomy.cdm.model.molecular.Sequence;
90 import eu.etaxonomy.cdm.model.molecular.SingleRead;
91 import eu.etaxonomy.cdm.model.name.BacterialName;
92 import eu.etaxonomy.cdm.model.name.BotanicalName;
93 import eu.etaxonomy.cdm.model.name.CultivarPlantName;
94 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
95 import eu.etaxonomy.cdm.model.name.HybridRelationship;
96 import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
97 import eu.etaxonomy.cdm.model.name.NameRelationship;
98 import eu.etaxonomy.cdm.model.name.NameRelationshipType;
99 import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
100 import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
101 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
102 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
103 import eu.etaxonomy.cdm.model.name.NonViralName;
104 import eu.etaxonomy.cdm.model.name.Rank;
105 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
106 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
107 import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase;
108 import eu.etaxonomy.cdm.model.name.ViralName;
109 import eu.etaxonomy.cdm.model.name.ZoologicalName;
110 import eu.etaxonomy.cdm.model.occurrence.Collection;
111 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
112 import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
113 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
114 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
115 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
116 import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
117 import eu.etaxonomy.cdm.model.occurrence.MaterialOrMethodEvent;
118 import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
119 import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;
120 import eu.etaxonomy.cdm.model.reference.Reference;
121 import eu.etaxonomy.cdm.model.taxon.Classification;
122 import eu.etaxonomy.cdm.model.taxon.Synonym;
123 import eu.etaxonomy.cdm.model.taxon.SynonymType;
124 import eu.etaxonomy.cdm.model.taxon.Taxon;
125 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
126 import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation;
127 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
128 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
129
130
131 /**
132 * Updates the xxxObj_type field in Annotations, Markers, Extensions, Identifiers.
133 * Not needed anymore as long as we gave up bidirectionality #5743
134 *
135 * @author a.mueller
136 * @date 25.04.2016
137 */
138 public class ReferencedObjTypeUpdater extends SchemaUpdaterStepBase<ReferencedObjTypeUpdater> implements ITermUpdaterStep{
139 private static final Logger logger = Logger.getLogger(ReferencedObjTypeUpdater.class);
140
141 private static final String stepName = "Update referenced obj_type";
142
143 // **************************** STATIC METHODS ********************************/
144
145 public static final ReferencedObjTypeUpdater NewInstance(){
146 return new ReferencedObjTypeUpdater(stepName);
147 }
148
149 protected ReferencedObjTypeUpdater(String stepName) {
150 super(stepName);
151 }
152
153 @Override
154 public Integer invoke(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType) throws SQLException {
155
156 //TODO should better be read from eu.etaxonomy.cdm.model.common.package-info @AnyMetaDef
157 try {
158 Class<AnnotatableEntity>[] annotatableClasses = new Class[]{
159 Institution.class,
160 Person.class,
161 Team.class,
162 CategoricalData.class,
163 CommonTaxonName.class,
164 DescriptionElementSource.class,
165 Distribution.class,
166 Feature.class,
167 FeatureTree.class,
168 IndividualsAssociation.class,
169 MeasurementUnit.class,
170 MediaKey.class,
171 MultiAccessKey.class,
172 NaturalLanguageTerm.class,
173 PolytomousKey.class,
174 PresenceAbsenceTerm.class,
175 QuantitativeData.class,
176 SpecimenDescription.class,
177 State.class,
178 StatisticalMeasure.class,
179 TaxonDescription.class,
180 TaxonInteraction.class,
181 TaxonNameDescription.class,
182 TextData.class,
183 TextFormat.class,
184 WorkingSet.class,
185 Country.class,
186 NamedArea.class,
187 NamedAreaLevel.class,
188 NamedAreaType.class,
189 ReferenceSystem.class,
190 Media.class,
191 Rights.class,
192 RightsType.class,
193 Amplification.class,
194 AmplificationResult.class,
195 Cloning.class,
196 DnaSample.class,
197 PhylogeneticTree.class,
198 Primer.class,
199 Sequence.class,
200 SingleRead.class,
201 BacterialName.class,
202 BotanicalName.class,
203 CultivarPlantName.class,
204 HomotypicalGroup.class,
205 HybridRelationship.class,
206 HybridRelationshipType.class,
207 NameRelationship.class,
208 NameRelationshipType.class,
209 NameTypeDesignationStatus.class,
210 NameTypeDesignation.class,
211 NomenclaturalStatus.class,
212 NomenclaturalStatusType.class,
213 NonViralName.class,
214 Rank.class,
215 SpecimenTypeDesignationStatus.class,
216 SpecimenTypeDesignation.class,
217 ViralName.class,
218 ZoologicalName.class,
219 Collection.class,
220 DerivationEvent.class,
221 DerivationEventType.class,
222 DerivedUnit.class,
223 DeterminationEvent.class,
224 FieldUnit.class,
225 GatheringEvent.class,
226 MaterialOrMethodEvent.class,
227 MediaSpecimen.class,
228 PreservationMethod.class,
229 Reference.class,
230 Classification.class,
231 Synonym.class,
232 SynonymType.class,
233 Taxon.class,
234 TaxonNode.class,
235 TaxonNodeAgentRelation.class,
236 TaxonRelationship.class,
237 TaxonRelationshipType.class,
238
239 TermVocabulary.class,
240 OrderedTermVocabulary.class,
241 AnnotationType.class,
242 DefinedTermBase.class,
243 ExtensionType.class,
244 Language.class,
245 MarkerType.class,
246 OrderedTerm.class,
247 Annotation.class,
248 Identifier.class,
249 Credit.class,
250 LanguageString.class,
251 Representation.class,
252 IdentifiableSource.class
253
254 };
255
256 for (Class<AnnotatableEntity> annotatableClass : annotatableClasses){
257 updateSingleClass(datasource, monitor, caseType, annotatableClass);
258 }
259
260 return 0;
261
262 } catch (Exception e) {
263 monitor.warning(e.getMessage(), e);
264 logger.warn(e.getMessage());
265 return null;
266 }
267 }
268
269 /**
270 * @param datasource
271 * @param monitor
272 * @param caseType
273 * @param annotatableClass2
274 * @throws SQLException
275 */
276 private void updateSingleClass(ICdmDataSource datasource, IProgressMonitor monitor,
277 CaseType caseType, Class<? extends AnnotatableEntity> annotatableClass) throws SQLException {
278 if (IdentifiableEntity.class.isAssignableFrom(annotatableClass)){
279 updateIdentifableEntitiy(datasource, monitor, caseType, (Class<IdentifiableEntity>)annotatableClass);
280 }
281 updateAnnotatableEntitiy(datasource, monitor, caseType, annotatableClass);
282 }
283
284 /**
285 * @param datasource
286 * @param monitor
287 * @param caseType
288 * @param annotatableClass
289 * @throws SQLException
290 */
291 private void updateAnnotatableEntitiy(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType,
292 Class<? extends AnnotatableEntity> annotatableClass) throws SQLException {
293 String sql, table;
294
295 table = "Annotation";
296 sql = "UPDATE @table SET annotatedObj_type = '@simpleClassName' WHERE id IN (SELECT annotations_id FROM @MnTable)";
297 sql = setParameters(caseType, sql, table, annotatableClass);
298 datasource.executeUpdate(sql);
299 replaceAndExecute(datasource, caseType, annotatableClass, sql, table);
300
301 table = "Marker";
302 sql = "UPDATE @table SET markedObj_type = '@simpleClassName' WHERE id IN (SELECT markers_id FROM @MnTable)";
303 sql = setParameters(caseType, sql, table, annotatableClass);
304 datasource.executeUpdate(sql);
305
306 }
307
308 /**
309 * @param caseType
310 * @param sql
311 * @param table
312 * @param identifiableClass
313 * @param isAudit
314 * @return
315 */
316 private String setParameters(CaseType caseType, String sql, String table, Class<?> identifiableClass) {
317 String simpleName = identifiableClass.getSimpleName();
318 Class<?> tableClass = getTable(identifiableClass);
319 String tableName = tableClass.getSimpleName();
320 if (tableName.equals("Rights")){
321 tableName = "RightsInfo";
322 }
323 String casedTable = caseType.transformTo(table);
324 String mnTable = caseType.transformTo(tableName + "_" + table);
325 return sql.replace("@table", casedTable)
326 .replace("@simpleClassName", simpleName)
327 .replace("@MnTable", mnTable);
328
329 }
330
331 /**
332 * @param datasource
333 * @param monitor
334 * @param caseType
335 * @param annotatableClass
336 * @throws SQLException
337 */
338 private void updateIdentifableEntitiy(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType,
339 Class<? extends IdentifiableEntity> identifiableClass) throws SQLException {
340 String sql, table;
341
342 //credits, rights => do not have xxxObj_type field
343 //, extensions, identifiers, sources
344
345 //Extensions
346 table = "Extension";
347 sql = "UPDATE @table SET extendedObj_type = '@simpleClassName' WHERE id IN (SELECT extensions_id FROM @MnTable)";
348 replaceAndExecute(datasource, caseType, identifiableClass, sql, table);
349
350 //Identifier
351 table = "Identifier";
352 sql = "UPDATE @table SET identifiedObj_type = '@simpleClassName' WHERE id IN (SELECT identifiers_id FROM @MnTable)";
353 replaceAndExecute(datasource, caseType, identifiableClass, sql, table);
354
355 //OriginalSourceBase
356 table = "OriginalSourceBase";
357 sql = "UPDATE @table SET sourcedObj_type = '@simpleClassName' WHERE id IN (SELECT sources_id FROM @MnTable)";
358 replaceAndExecute(datasource, caseType, identifiableClass, sql, table);
359
360 }
361
362 /**
363 * @param datasource
364 * @param caseType
365 * @param annotatableClass
366 * @param sql
367 * @param table
368 * @throws SQLException
369 */
370 private void replaceAndExecute(ICdmDataSource datasource, CaseType caseType,
371 Class<? extends AnnotatableEntity> annotatableClass, String sql, String table) throws SQLException {
372 sql = setParameters(caseType, sql, table, annotatableClass);
373 datasource.executeUpdate(sql);
374 }
375
376 /**
377 * @param identifiableClass
378 */
379 private Class<?> getTable(Class<?> clazz) {
380 Class<?> spezificClass = specificClasses.get(clazz);
381 if (spezificClass != null){
382 return spezificClass;
383 }else{
384 boolean isAbstract = Modifier.isAbstract(clazz.getModifiers());
385 if (isAbstract){
386 return clazz;
387 }else{
388 Class<?> superClass = clazz.getSuperclass();
389 //MappedSuperClasses
390 if (superClass == EventBase.class
391 || superClass == AnnotatableEntity.class
392 || superClass == IdentifiableEntity.class
393 || superClass == RelationshipBase.class
394 || superClass == ReferencedEntityBase.class
395 || superClass == IdentifiableMediaEntity.class
396 || superClass == LanguageStringBase.class
397 ) {
398 return clazz;
399 }
400 return getTable(superClass);
401 }
402 }
403 }
404
405 private static Map<Class, Class> specificClasses = new HashMap<Class, Class>();
406 static{
407 specificClasses.put(TeamOrPersonBase.class, AgentBase.class);
408 specificClasses.put(TermVocabulary.class, TermVocabulary.class);
409 specificClasses.put(TypeDesignationStatusBase.class, DefinedTermBase.class);
410 specificClasses.put(OrderedTermBase.class, DefinedTermBase.class);
411 specificClasses.put(OrderedTermVocabulary.class, TermVocabulary.class);
412 specificClasses.put(Rights.class, Rights.class);
413 specificClasses.put(RelationshipTermBase.class, DefinedTermBase.class);
414
415
416
417
418 }
419
420 }