Project

General

Profile

Download (16.1 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
 * Updates the xxxObj_type field in Annotations, Markers, Extensions, Identifiers.
134
 * Not needed anymore as long as we gave up bidirectionality #5743
135
 *
136
 * @author a.mueller
137
 * @date 25.04.2016
138
 */
139
public class ReferencedObjTypeUpdater extends SchemaUpdaterStepBase<ReferencedObjTypeUpdater> implements ITermUpdaterStep{
140
	private static final Logger logger = Logger.getLogger(ReferencedObjTypeUpdater.class);
141

    
142
	private static final String stepName = "Update referenced obj_type";
143

    
144
// **************************** STATIC METHODS ********************************/
145

    
146
	public static final ReferencedObjTypeUpdater NewInstance(){
147
		return new ReferencedObjTypeUpdater(stepName);
148
	}
149

    
150
	protected ReferencedObjTypeUpdater(String stepName) {
151
		super(stepName);
152
	}
153

    
154
	@Override
155
	public Integer invoke(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType) throws SQLException {
156

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

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

    
256
			};
257

    
258
			for (Class<AnnotatableEntity> annotatableClass : annotatableClasses){
259
			    updateSingleClass(datasource, monitor, caseType, annotatableClass);
260
			}
261

    
262
			return 0;
263

    
264
		} catch (Exception e) {
265
			monitor.warning(e.getMessage(), e);
266
			logger.warn(e.getMessage());
267
			return null;
268
		}
269
	}
270

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

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

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

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

    
308
    }
309

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

    
331
    }
332

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

    
344
        //credits, rights => do not have xxxObj_type field
345
        //, extensions, identifiers, sources
346

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

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

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

    
362
    }
363

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

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

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

    
417

    
418

    
419

    
420
    }
421

    
422
}
(1-1/3)