3 * Copyright (C) 2009 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.database
.update
.v36_40
;
12 import java
.lang
.reflect
.Modifier
;
13 import java
.sql
.SQLException
;
14 import java
.util
.HashMap
;
17 import org
.apache
.log4j
.Logger
;
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
.SynonymRelationshipType
;
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
;
132 * Updates the xxxObj_type field in Annotations, Markers, Extensions, Identifiers.
133 * Not needed anymore as long as we gave up bidirectionality #5743
138 public class ReferencedObjTypeUpdater
extends SchemaUpdaterStepBase
<ReferencedObjTypeUpdater
> implements ITermUpdaterStep
{
139 private static final Logger logger
= Logger
.getLogger(ReferencedObjTypeUpdater
.class);
141 private static final String stepName
= "Update referenced obj_type";
143 // **************************** STATIC METHODS ********************************/
145 public static final ReferencedObjTypeUpdater
NewInstance(){
146 return new ReferencedObjTypeUpdater(stepName
);
149 protected ReferencedObjTypeUpdater(String stepName
) {
154 public Integer
invoke(ICdmDataSource datasource
, IProgressMonitor monitor
, CaseType caseType
) throws SQLException
{
156 //TODO should better be read from eu.etaxonomy.cdm.model.common.package-info @AnyMetaDef
158 Class
<AnnotatableEntity
>[] annotatableClasses
= new Class
[]{
162 CategoricalData
.class,
163 CommonTaxonName
.class,
164 DescriptionElementSource
.class,
168 IndividualsAssociation
.class,
169 MeasurementUnit
.class,
171 MultiAccessKey
.class,
172 NaturalLanguageTerm
.class,
174 PresenceAbsenceTerm
.class,
175 QuantitativeData
.class,
176 SpecimenDescription
.class,
178 StatisticalMeasure
.class,
179 TaxonDescription
.class,
180 TaxonInteraction
.class,
181 TaxonNameDescription
.class,
187 NamedAreaLevel
.class,
189 ReferenceSystem
.class,
194 AmplificationResult
.class,
197 PhylogeneticTree
.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,
215 SpecimenTypeDesignationStatus
.class,
216 SpecimenTypeDesignation
.class,
218 ZoologicalName
.class,
220 DerivationEvent
.class,
221 DerivationEventType
.class,
223 DeterminationEvent
.class,
225 GatheringEvent
.class,
226 MaterialOrMethodEvent
.class,
228 PreservationMethod
.class,
230 Classification
.class,
232 SynonymRelationshipType
.class,
235 TaxonNodeAgentRelation
.class,
236 TaxonRelationship
.class,
237 TaxonRelationshipType
.class,
239 TermVocabulary
.class,
240 OrderedTermVocabulary
.class,
241 AnnotationType
.class,
242 DefinedTermBase
.class,
250 LanguageString
.class,
251 Representation
.class,
252 IdentifiableSource
.class
256 for (Class
<AnnotatableEntity
> annotatableClass
: annotatableClasses
){
257 updateSingleClass(datasource
, monitor
, caseType
, annotatableClass
);
262 } catch (Exception e
) {
263 monitor
.warning(e
.getMessage(), e
);
264 logger
.warn(e
.getMessage());
273 * @param annotatableClass2
274 * @throws SQLException
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
);
281 updateAnnotatableEntitiy(datasource
, monitor
, caseType
, annotatableClass
);
288 * @param annotatableClass
289 * @throws SQLException
291 private void updateAnnotatableEntitiy(ICdmDataSource datasource
, IProgressMonitor monitor
, CaseType caseType
,
292 Class
<?
extends AnnotatableEntity
> annotatableClass
) throws SQLException
{
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
);
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
);
312 * @param identifiableClass
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";
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
);
335 * @param annotatableClass
336 * @throws SQLException
338 private void updateIdentifableEntitiy(ICdmDataSource datasource
, IProgressMonitor monitor
, CaseType caseType
,
339 Class
<?
extends IdentifiableEntity
> identifiableClass
) throws SQLException
{
342 //credits, rights => do not have xxxObj_type field
343 //, extensions, identifiers, sources
347 sql
= "UPDATE @table SET extendedObj_type = '@simpleClassName' WHERE id IN (SELECT extensions_id FROM @MnTable)";
348 replaceAndExecute(datasource
, caseType
, identifiableClass
, sql
, table
);
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
);
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
);
365 * @param annotatableClass
368 * @throws SQLException
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
);
377 * @param identifiableClass
379 private Class
<?
> getTable(Class
<?
> clazz
) {
380 Class
<?
> spezificClass
= specificClasses
.get(clazz
);
381 if (spezificClass
!= null){
382 return spezificClass
;
384 boolean isAbstract
= Modifier
.isAbstract(clazz
.getModifiers());
388 Class
<?
> superClass
= clazz
.getSuperclass();
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
400 return getTable(superClass
);
405 private static Map
<Class
, Class
> specificClasses
= new HashMap
<Class
, Class
>();
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);