Project

General

Profile

Download (15.8 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.database.update.v36_40;
10

    
11
import java.lang.reflect.Modifier;
12
import java.sql.SQLException;
13
import java.util.HashMap;
14
import java.util.Map;
15

    
16
import org.apache.log4j.Logger;
17

    
18
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
19
import eu.etaxonomy.cdm.database.ICdmDataSource;
20
import eu.etaxonomy.cdm.database.update.CaseType;
21
import eu.etaxonomy.cdm.database.update.ITermUpdaterStep;
22
import eu.etaxonomy.cdm.database.update.SchemaUpdaterStepBase;
23
import eu.etaxonomy.cdm.model.agent.AgentBase;
24
import eu.etaxonomy.cdm.model.agent.Institution;
25
import eu.etaxonomy.cdm.model.agent.Person;
26
import eu.etaxonomy.cdm.model.agent.Team;
27
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
28
import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
29
import eu.etaxonomy.cdm.model.common.Annotation;
30
import eu.etaxonomy.cdm.model.common.AnnotationType;
31
import eu.etaxonomy.cdm.model.common.Credit;
32
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
33
import eu.etaxonomy.cdm.model.common.EventBase;
34
import eu.etaxonomy.cdm.model.common.ExtensionType;
35
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
36
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
37
import eu.etaxonomy.cdm.model.common.Identifier;
38
import eu.etaxonomy.cdm.model.common.Language;
39
import eu.etaxonomy.cdm.model.common.LanguageString;
40
import eu.etaxonomy.cdm.model.common.LanguageStringBase;
41
import eu.etaxonomy.cdm.model.common.MarkerType;
42
import eu.etaxonomy.cdm.model.common.OrderedTerm;
43
import eu.etaxonomy.cdm.model.common.OrderedTermBase;
44
import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;
45
import eu.etaxonomy.cdm.model.common.ReferencedEntityBase;
46
import eu.etaxonomy.cdm.model.common.RelationshipBase;
47
import eu.etaxonomy.cdm.model.common.RelationshipTermBase;
48
import eu.etaxonomy.cdm.model.common.Representation;
49
import eu.etaxonomy.cdm.model.common.TermVocabulary;
50
import eu.etaxonomy.cdm.model.description.CategoricalData;
51
import eu.etaxonomy.cdm.model.description.CommonTaxonName;
52
import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
53
import eu.etaxonomy.cdm.model.description.Distribution;
54
import eu.etaxonomy.cdm.model.description.Feature;
55
import eu.etaxonomy.cdm.model.description.FeatureTree;
56
import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
57
import eu.etaxonomy.cdm.model.description.MeasurementUnit;
58
import eu.etaxonomy.cdm.model.description.MediaKey;
59
import eu.etaxonomy.cdm.model.description.MultiAccessKey;
60
import eu.etaxonomy.cdm.model.description.NaturalLanguageTerm;
61
import eu.etaxonomy.cdm.model.description.PolytomousKey;
62
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
63
import eu.etaxonomy.cdm.model.description.QuantitativeData;
64
import eu.etaxonomy.cdm.model.description.SpecimenDescription;
65
import eu.etaxonomy.cdm.model.description.State;
66
import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
67
import eu.etaxonomy.cdm.model.description.TaxonDescription;
68
import eu.etaxonomy.cdm.model.description.TaxonInteraction;
69
import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
70
import eu.etaxonomy.cdm.model.description.TextData;
71
import eu.etaxonomy.cdm.model.description.TextFormat;
72
import eu.etaxonomy.cdm.model.description.WorkingSet;
73
import eu.etaxonomy.cdm.model.location.Country;
74
import eu.etaxonomy.cdm.model.location.NamedArea;
75
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
76
import eu.etaxonomy.cdm.model.location.NamedAreaType;
77
import eu.etaxonomy.cdm.model.location.ReferenceSystem;
78
import eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity;
79
import eu.etaxonomy.cdm.model.media.Media;
80
import eu.etaxonomy.cdm.model.media.Rights;
81
import eu.etaxonomy.cdm.model.media.RightsType;
82
import eu.etaxonomy.cdm.model.molecular.Amplification;
83
import eu.etaxonomy.cdm.model.molecular.AmplificationResult;
84
import eu.etaxonomy.cdm.model.molecular.Cloning;
85
import eu.etaxonomy.cdm.model.molecular.DnaSample;
86
import eu.etaxonomy.cdm.model.molecular.PhylogeneticTree;
87
import eu.etaxonomy.cdm.model.molecular.Primer;
88
import eu.etaxonomy.cdm.model.molecular.Sequence;
89
import eu.etaxonomy.cdm.model.molecular.SingleRead;
90
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
91
import eu.etaxonomy.cdm.model.name.HybridRelationship;
92
import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
93
import eu.etaxonomy.cdm.model.name.NameRelationship;
94
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
95
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
96
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
97
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
98
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
99
import eu.etaxonomy.cdm.model.name.Rank;
100
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
101
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
102
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
103
import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase;
104
import eu.etaxonomy.cdm.model.occurrence.Collection;
105
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
106
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
107
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
108
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
109
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
110
import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
111
import eu.etaxonomy.cdm.model.occurrence.MaterialOrMethodEvent;
112
import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
113
import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;
114
import eu.etaxonomy.cdm.model.reference.Reference;
115
import eu.etaxonomy.cdm.model.taxon.Classification;
116
import eu.etaxonomy.cdm.model.taxon.Synonym;
117
import eu.etaxonomy.cdm.model.taxon.SynonymType;
118
import eu.etaxonomy.cdm.model.taxon.Taxon;
119
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
120
import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation;
121
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
122
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
123

    
124

    
125
/**
126
 * Updates the xxxObj_type field in Annotations, Markers, Extensions, Identifiers.
127
 * Not needed anymore as long as we gave up bidirectionality #5743
128
 *
129
 * @author a.mueller
130
 * @date 25.04.2016
131
 */
132
public class ReferencedObjTypeUpdater extends SchemaUpdaterStepBase<ReferencedObjTypeUpdater> implements ITermUpdaterStep{
133
	private static final Logger logger = Logger.getLogger(ReferencedObjTypeUpdater.class);
134

    
135
	private static final String stepName = "Update referenced obj_type";
136

    
137
// **************************** STATIC METHODS ********************************/
138

    
139
	public static final ReferencedObjTypeUpdater NewInstance(){
140
		return new ReferencedObjTypeUpdater(stepName);
141
	}
142

    
143
	protected ReferencedObjTypeUpdater(String stepName) {
144
		super(stepName);
145
	}
146

    
147
	@Override
148
	public Integer invoke(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType) throws SQLException {
149

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

    
234
			    TermVocabulary.class,
235
			    OrderedTermVocabulary.class,
236
			    AnnotationType.class,
237
			    DefinedTermBase.class,
238
			    ExtensionType.class,
239
			    Language.class,
240
			    MarkerType.class,
241
			    OrderedTerm.class,
242
			    Annotation.class,
243
			    Identifier.class,
244
			    Credit.class,
245
			    LanguageString.class,
246
			    Representation.class,
247
			    IdentifiableSource.class
248

    
249
			};
250

    
251
			for (Class<AnnotatableEntity> annotatableClass : annotatableClasses){
252
			    updateSingleClass(datasource, monitor, caseType, annotatableClass);
253
			}
254

    
255
			return 0;
256

    
257
		} catch (Exception e) {
258
			monitor.warning(e.getMessage(), e);
259
			logger.warn(e.getMessage());
260
			return null;
261
		}
262
	}
263

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

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

    
290
        table = "Annotation";
291
        sql = "UPDATE @table SET annotatedObj_type = '@simpleClassName' WHERE id IN (SELECT annotations_id FROM @MnTable)";
292
        sql = setParameters(caseType, sql, table, annotatableClass);
293
        datasource.executeUpdate(sql);
294
        replaceAndExecute(datasource, caseType, annotatableClass, sql, table);
295

    
296
        table = "Marker";
297
        sql = "UPDATE @table SET markedObj_type = '@simpleClassName' WHERE id IN (SELECT markers_id FROM @MnTable)";
298
        sql = setParameters(caseType, sql, table, annotatableClass);
299
        datasource.executeUpdate(sql);
300

    
301
    }
302

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

    
324
    }
325

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

    
337
        //credits, rights => do not have xxxObj_type field
338
        //, extensions, identifiers, sources
339

    
340
        //Extensions
341
        table = "Extension";
342
        sql = "UPDATE @table SET extendedObj_type = '@simpleClassName' WHERE id IN (SELECT extensions_id FROM @MnTable)";
343
        replaceAndExecute(datasource, caseType, identifiableClass, sql, table);
344

    
345
        //Identifier
346
        table = "Identifier";
347
        sql = "UPDATE @table SET identifiedObj_type = '@simpleClassName' WHERE id IN (SELECT identifiers_id FROM @MnTable)";
348
        replaceAndExecute(datasource, caseType, identifiableClass, sql, table);
349

    
350
        //OriginalSourceBase
351
        table = "OriginalSourceBase";
352
        sql = "UPDATE @table SET sourcedObj_type = '@simpleClassName' WHERE id IN (SELECT sources_id FROM @MnTable)";
353
        replaceAndExecute(datasource, caseType, identifiableClass, sql, table);
354

    
355
    }
356

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

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

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

    
410

    
411

    
412

    
413
    }
414

    
415
}
(1-1/4)