Project

General

Profile

Download (16 KB) Statistics
| Branch: | Tag: | Revision:
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.SynonymRelationship;
124
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
125
import eu.etaxonomy.cdm.model.taxon.Taxon;
126
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
127
import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation;
128
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
129
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
130

    
131

    
132
/**
133
 * @author a.mueller
134
 * @date 25.04.2016
135
 */
136
public class ReferencedObjTypeUpdater extends SchemaUpdaterStepBase<ReferencedObjTypeUpdater> implements ITermUpdaterStep{
137
	private static final Logger logger = Logger.getLogger(ReferencedObjTypeUpdater.class);
138

    
139
	private static final String stepName = "Update referenced obj_type";
140

    
141
// **************************** STATIC METHODS ********************************/
142

    
143
	public static final ReferencedObjTypeUpdater NewInstance(){
144
		return new ReferencedObjTypeUpdater(stepName);
145
	}
146

    
147
	protected ReferencedObjTypeUpdater(String stepName) {
148
		super(stepName);
149
	}
150

    
151
	@Override
152
	public Integer invoke(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType) throws SQLException {
153

    
154
	    //TODO should better be read from eu.etaxonomy.cdm.model.common.package-info @AnyMetaDef
155
		try {
156
			Class<AnnotatableEntity>[] annotatableClasses = new Class[]{
157
			    Institution.class,
158
			    Person.class,
159
			    Team.class,
160
			    CategoricalData.class,
161
			    CommonTaxonName.class,
162
			    DescriptionElementSource.class,
163
			    Distribution.class,
164
			    Feature.class,
165
			    FeatureTree.class,
166
			    IndividualsAssociation.class,
167
			    MeasurementUnit.class,
168
			    MediaKey.class,
169
			    MultiAccessKey.class,
170
			    NaturalLanguageTerm.class,
171
			    PolytomousKey.class,
172
			    PresenceAbsenceTerm.class,
173
			    QuantitativeData.class,
174
			    SpecimenDescription.class,
175
			    State.class,
176
			    StatisticalMeasure.class,
177
			    TaxonDescription.class,
178
			    TaxonInteraction.class,
179
			    TaxonNameDescription.class,
180
			    TextData.class,
181
			    TextFormat.class,
182
			    WorkingSet.class,
183
			    Country.class,
184
			    NamedArea.class,
185
			    NamedAreaLevel.class,
186
			    NamedAreaType.class,
187
			    ReferenceSystem.class,
188
			    Media.class,
189
			    Rights.class,
190
			    RightsType.class,
191
			    Amplification.class,
192
			    AmplificationResult.class,
193
			    Cloning.class,
194
			    DnaSample.class,
195
			    PhylogeneticTree.class,
196
			    Primer.class,
197
			    Sequence.class,
198
			    SingleRead.class,
199
			    BacterialName.class,
200
			    BotanicalName.class,
201
			    CultivarPlantName.class,
202
			    HomotypicalGroup.class,
203
			    HybridRelationship.class,
204
			    HybridRelationshipType.class,
205
			    NameRelationship.class,
206
			    NameRelationshipType.class,
207
			    NameTypeDesignationStatus.class,
208
                NameTypeDesignation.class,
209
			    NomenclaturalStatus.class,
210
			    NomenclaturalStatusType.class,
211
			    NonViralName.class,
212
			    Rank.class,
213
			    SpecimenTypeDesignationStatus.class,
214
                SpecimenTypeDesignation.class,
215
                ViralName.class,
216
			    ZoologicalName.class,
217
			    Collection.class,
218
			    DerivationEvent.class,
219
			    DerivationEventType.class,
220
			    DerivedUnit.class,
221
			    DeterminationEvent.class,
222
			    FieldUnit.class,
223
			    GatheringEvent.class,
224
			    MaterialOrMethodEvent.class,
225
			    MediaSpecimen.class,
226
			    PreservationMethod.class,
227
			    Reference.class,
228
			    Classification.class,
229
			    Synonym.class,
230
			    SynonymRelationship.class,
231
			    SynonymRelationshipType.class,
232
			    Taxon.class,
233
			    TaxonNode.class,
234
			    TaxonNodeAgentRelation.class,
235
			    TaxonRelationship.class,
236
			    TaxonRelationshipType.class,
237

    
238
			    TermVocabulary.class,
239
			    OrderedTermVocabulary.class,
240
			    AnnotationType.class,
241
			    DefinedTermBase.class,
242
			    ExtensionType.class,
243
			    Language.class,
244
			    MarkerType.class,
245
			    OrderedTerm.class,
246
			    Annotation.class,
247
			    Identifier.class,
248
			    Credit.class,
249
			    LanguageString.class,
250
			    Representation.class,
251
			    IdentifiableSource.class
252

    
253
			};
254

    
255
			for (Class<AnnotatableEntity> annotatableClass : annotatableClasses){
256
			    updateSingleClass(datasource, monitor, caseType, annotatableClass);
257
			}
258

    
259
			return 0;
260

    
261
		} catch (Exception e) {
262
			monitor.warning(e.getMessage(), e);
263
			logger.warn(e.getMessage());
264
			return null;
265
		}
266
	}
267

    
268
    /**
269
     * @param datasource
270
     * @param monitor
271
     * @param caseType
272
     * @param annotatableClass2
273
     * @throws SQLException
274
     */
275
    private void updateSingleClass(ICdmDataSource datasource, IProgressMonitor monitor,
276
            CaseType caseType, Class<? extends AnnotatableEntity> annotatableClass) throws SQLException {
277
        if (IdentifiableEntity.class.isAssignableFrom(annotatableClass)){
278
            updateIdentifableEntitiy(datasource, monitor, caseType, (Class<IdentifiableEntity>)annotatableClass);
279
        }
280
        updateAnnotatableEntitiy(datasource, monitor, caseType, annotatableClass);
281
    }
282

    
283
    /**
284
     * @param datasource
285
     * @param monitor
286
     * @param caseType
287
     * @param annotatableClass
288
     * @throws SQLException
289
     */
290
    private void updateAnnotatableEntitiy(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType,
291
            Class<? extends AnnotatableEntity> annotatableClass) throws SQLException {
292
        String sql, table;
293

    
294
        table = "Annotation";
295
        sql = "UPDATE @table SET annotatedObj_type = '@simpleClassName' WHERE id IN (SELECT annotations_id FROM @MnTable)";
296
        sql = setParameters(caseType, sql, table, annotatableClass);
297
        datasource.executeUpdate(sql);
298
        replaceAndExecute(datasource, caseType, annotatableClass, sql, table);
299

    
300
        table = "Marker";
301
        sql = "UPDATE @table SET markedObj_type = '@simpleClassName' WHERE id IN (SELECT markers_id FROM @MnTable)";
302
        sql = setParameters(caseType, sql, table, annotatableClass);
303
        datasource.executeUpdate(sql);
304

    
305
    }
306

    
307
    /**
308
     * @param caseType
309
     * @param sql
310
     * @param table
311
     * @param identifiableClass
312
     * @param isAudit
313
     * @return
314
     */
315
    private String setParameters(CaseType caseType, String sql, String table, Class<?> identifiableClass) {
316
        String simpleName = identifiableClass.getSimpleName();
317
        Class<?> tableClass = getTable(identifiableClass);
318
        String tableName = tableClass.getSimpleName();
319
        if (tableName.equals("Rights")){
320
            tableName = "RightsInfo";
321
        }
322
        String casedTable = caseType.transformTo(table);
323
        String mnTable = caseType.transformTo(tableName + "_" + table);
324
        return sql.replace("@table", casedTable)
325
                .replace("@simpleClassName", simpleName)
326
                .replace("@MnTable", mnTable);
327

    
328
    }
329

    
330
    /**
331
     * @param datasource
332
     * @param monitor
333
     * @param caseType
334
     * @param annotatableClass
335
     * @throws SQLException
336
     */
337
    private void updateIdentifableEntitiy(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType,
338
            Class<? extends IdentifiableEntity> identifiableClass) throws SQLException {
339
        String sql, table;
340

    
341
        //credits, rights => do not have xxxObj_type field
342
        //, extensions, identifiers, sources
343

    
344
        //Extensions
345
        table = "Extension";
346
        sql = "UPDATE @table SET extendedObj_type = '@simpleClassName' WHERE id IN (SELECT extensions_id FROM @MnTable)";
347
        replaceAndExecute(datasource, caseType, identifiableClass, sql, table);
348

    
349
        //Identifier
350
        table = "Identifier";
351
        sql = "UPDATE @table SET identifiedObj_type = '@simpleClassName' WHERE id IN (SELECT identifiers_id FROM @MnTable)";
352
        replaceAndExecute(datasource, caseType, identifiableClass, sql, table);
353

    
354
        //OriginalSourceBase
355
        table = "OriginalSourceBase";
356
        sql = "UPDATE @table SET sourcedObj_type = '@simpleClassName' WHERE id IN (SELECT sources_id FROM @MnTable)";
357
        replaceAndExecute(datasource, caseType, identifiableClass, sql, table);
358

    
359
    }
360

    
361
    /**
362
     * @param datasource
363
     * @param caseType
364
     * @param annotatableClass
365
     * @param sql
366
     * @param table
367
     * @throws SQLException
368
     */
369
    private void replaceAndExecute(ICdmDataSource datasource, CaseType caseType,
370
            Class<? extends AnnotatableEntity> annotatableClass, String sql, String table) throws SQLException {
371
        sql = setParameters(caseType, sql, table, annotatableClass);
372
        datasource.executeUpdate(sql);
373
    }
374

    
375
    /**
376
     * @param identifiableClass
377
     */
378
    private Class<?> getTable(Class<?> clazz) {
379
        Class<?> spezificClass = specificClasses.get(clazz);
380
        if (spezificClass != null){
381
            return spezificClass;
382
        }else{
383
            boolean isAbstract = Modifier.isAbstract(clazz.getModifiers());
384
            if (isAbstract){
385
                return clazz;
386
            }else{
387
                Class<?> superClass = clazz.getSuperclass();
388
                //MappedSuperClasses
389
                if (superClass == EventBase.class
390
                        || superClass == AnnotatableEntity.class
391
                        || superClass == IdentifiableEntity.class
392
                        || superClass == RelationshipBase.class
393
                        || superClass == ReferencedEntityBase.class
394
                        || superClass == IdentifiableMediaEntity.class
395
                        || superClass == LanguageStringBase.class
396
                         ) {
397
                    return clazz;
398
                }
399
                return getTable(superClass);
400
            }
401
        }
402
    }
403

    
404
    private static Map<Class, Class> specificClasses = new HashMap<Class, Class>();
405
    static{
406
        specificClasses.put(TeamOrPersonBase.class, AgentBase.class);
407
        specificClasses.put(TermVocabulary.class, TermVocabulary.class);
408
        specificClasses.put(TypeDesignationStatusBase.class, DefinedTermBase.class);
409
        specificClasses.put(OrderedTermBase.class, DefinedTermBase.class);
410
        specificClasses.put(OrderedTermVocabulary.class, TermVocabulary.class);
411
        specificClasses.put(Rights.class, Rights.class);
412
        specificClasses.put(RelationshipTermBase.class, DefinedTermBase.class);
413

    
414

    
415

    
416

    
417
    }
418

    
419
}
(1-1/3)