Project

General

Profile

Download (101 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 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

    
10
package eu.etaxonomy.cdm.database.update.v31_33;
11

    
12
import java.util.ArrayList;
13
import java.util.List;
14
import java.util.UUID;
15

    
16
import org.apache.log4j.Logger;
17

    
18
import eu.etaxonomy.cdm.database.update.ClassChanger;
19
import eu.etaxonomy.cdm.database.update.ColumnAdder;
20
import eu.etaxonomy.cdm.database.update.ColumnNameChanger;
21
import eu.etaxonomy.cdm.database.update.ColumnRemover;
22
import eu.etaxonomy.cdm.database.update.ColumnTypeChanger;
23
import eu.etaxonomy.cdm.database.update.ISchemaUpdater;
24
import eu.etaxonomy.cdm.database.update.ISchemaUpdaterStep;
25
import eu.etaxonomy.cdm.database.update.MnTableCreator;
26
import eu.etaxonomy.cdm.database.update.SchemaUpdaterBase;
27
import eu.etaxonomy.cdm.database.update.SimpleSchemaUpdaterStep;
28
import eu.etaxonomy.cdm.database.update.SingleTermRemover;
29
import eu.etaxonomy.cdm.database.update.SortIndexUpdater;
30
import eu.etaxonomy.cdm.database.update.TableCreator;
31
import eu.etaxonomy.cdm.database.update.TableDroper;
32
import eu.etaxonomy.cdm.database.update.TableNameChanger;
33
import eu.etaxonomy.cdm.database.update.TermMover;
34
import eu.etaxonomy.cdm.database.update.TreeIndexUpdater;
35
import eu.etaxonomy.cdm.database.update.VocabularyCreator;
36
import eu.etaxonomy.cdm.database.update.v30_31.SchemaUpdater_30_301;
37
import eu.etaxonomy.cdm.model.common.AnnotationType;
38
import eu.etaxonomy.cdm.model.common.ExtensionType;
39
import eu.etaxonomy.cdm.model.common.Language;
40
import eu.etaxonomy.cdm.model.common.MarkerType;
41
import eu.etaxonomy.cdm.model.description.Feature;
42
import eu.etaxonomy.cdm.model.description.MeasurementUnit;
43
import eu.etaxonomy.cdm.model.description.NaturalLanguageTerm;
44
import eu.etaxonomy.cdm.model.description.State;
45
import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
46
import eu.etaxonomy.cdm.model.description.TextFormat;
47
import eu.etaxonomy.cdm.model.location.Country;
48
import eu.etaxonomy.cdm.model.location.NamedArea;
49
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
50
import eu.etaxonomy.cdm.model.location.NamedAreaType;
51
import eu.etaxonomy.cdm.model.location.ReferenceSystem;
52
import eu.etaxonomy.cdm.model.molecular.Sequence;
53
import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
54
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
55
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
56
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
57
import eu.etaxonomy.cdm.model.name.Rank;
58
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
59
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
60
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
61
import eu.etaxonomy.cdm.model.occurrence.MaterialOrMethodEvent;
62
import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;
63
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
64
import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
65
import eu.etaxonomy.cdm.model.reference.Reference;
66
import eu.etaxonomy.cdm.model.reference.ReferenceType;
67
import eu.etaxonomy.cdm.model.taxon.SynonymType;
68
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
69
import eu.etaxonomy.cdm.model.term.TermType;
70

    
71
/**
72
 * @author a.mueller
73
 * @since Jun 06, 2013
74
 */
75
public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
76

    
77
	private static final Logger logger = Logger
78
			.getLogger(SchemaUpdater_31_33.class);
79
	private static final String startSchemaVersion = "3.0.1.0.201104190000";
80
	private static final String endSchemaVersion = "3.3.0.0.201309240000";
81

    
82
	// ********************** FACTORY METHOD*************************************
83

    
84
	public static SchemaUpdater_31_33 NewInstance() {
85
		return new SchemaUpdater_31_33();
86
	}
87

    
88
	/**
89
	 * @param startSchemaVersion
90
	 * @param endSchemaVersion
91
	 */
92
	protected SchemaUpdater_31_33() {
93
		super(startSchemaVersion, endSchemaVersion);
94
	}
95

    
96
	@Override
97
	protected List<ISchemaUpdaterStep> getUpdaterList() {
98

    
99
		String stepName;
100
		String tableName;
101
		ISchemaUpdaterStep step;
102
		String columnName;
103

    
104
		// CHECKS
105

    
106
		// remove SpecimenOrObservationBase_Media #3597
107
		// TODO check if Description -Specimen Relation has M:M data
108
		if (false) {
109
			throw new RuntimeException(
110
					"Required check for SpecimenOrObservationBase_Media");
111
		} else {
112
			logger.warn("CHECKS for inconsistent data not running !!!!");
113
		}
114

    
115
		List<ISchemaUpdaterStep> stepList = new ArrayList<ISchemaUpdaterStep>();
116

    
117
		// Was in Schemaupdater_301_31 which was never used and later deleted
118
		// (r18331).
119
		// drop TypeDesignationBase_TaxonNameBase //from schemaUpdater 301_31
120
		stepName = "Drop duplicate TypeDesignation-TaxonName table";
121
		tableName = "TypeDesignationBase_TaxonNameBase";
122
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
123
		stepList.add(step);
124

    
125
		// create original source type column
126
		stepName = "Create original source type column";
127
		tableName = "OriginalSourceBase";
128
		columnName = "sourceType";
129
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
130
				4, INCLUDE_AUDIT);
131
		((ColumnAdder) step).setNotNull(true);
132
		stepList.add(step);
133

    
134
		// update original source type
135
		updateOriginalSourceType(stepList);
136

    
137
		// create and update elevenation max, remove error column
138
		updateElevationMax(stepList);
139

    
140
		// create TaxonNode tree index
141
		stepName = "Create taxon node tree index";
142
		tableName = "TaxonNode";
143
		columnName = "treeIndex";
144
		// TODO NOT NULL unclear //see also columnTypeChanger
145
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
146
				255, INCLUDE_AUDIT);
147
		stepList.add(step);
148

    
149
		// update treeindex for taxon nodes
150
		stepName = "Update TaxonNode treeindex";
151
		tableName = "TaxonNode";
152
		String treeIdColumnName = "classification_id";
153
		step = TreeIndexUpdater.NewInstance(stepName, tableName,
154
				treeIdColumnName, columnName, ! INCLUDE_AUDIT);   //update does no yet wok for ANSI SQL (e.g. PosGres / H2 with multiple entries for same id in AUD table)
155
		stepList.add(step);
156

    
157
		// create TaxonNode sort index column
158
		stepName = "Create taxon node sort index column";
159
		tableName = "TaxonNode";
160
		columnName = "sortIndex";
161
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
162
				INCLUDE_AUDIT, false, null);
163
		stepList.add(step);
164

    
165
		// update sortindex
166
		stepName = "Update sort index on TaxonNode children";
167
		tableName = "TaxonNode";
168
		String parentIdColumn = "parent_id";
169
		String sortIndexColumn = "sortIndex";
170
		SortIndexUpdater updateSortIndex = SortIndexUpdater.NewInstance(
171
				stepName, tableName, parentIdColumn, sortIndexColumn,
172
				INCLUDE_AUDIT);
173
		stepList.add(updateSortIndex);
174

    
175
		// Classification root nodes sort index
176
		stepName = "Create classification root node sort index column";
177
		tableName = "Classification_TaxonNode";
178
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
179
				INCLUDE_AUDIT, false, null);
180
		stepList.add(step);
181

    
182
		stepName = "Update sort index on classification child nodes";
183
		parentIdColumn = "Classification_id";
184
		String idColumn = "rootnodes_id";
185
		updateSortIndex = SortIndexUpdater.NewInstance(stepName, tableName,
186
				parentIdColumn, sortIndexColumn, idColumn, INCLUDE_AUDIT);
187
		stepList.add(updateSortIndex);
188

    
189
		// create feature node tree index
190
		stepName = "Create feature node tree index";
191
		tableName = "FeatureNode";
192
		columnName = "treeIndex";
193
		// TODO NOT NULL unclear
194
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
195
				255, INCLUDE_AUDIT);
196
		stepList.add(step);
197

    
198
		// update tree index for feature node
199
		stepName = "Update FeatureNode treeindex";
200
		tableName = "FeatureNode";
201
		treeIdColumnName = "featuretree_id";
202
		step = TreeIndexUpdater.NewInstance(stepName, tableName,
203
				treeIdColumnName, columnName, ! INCLUDE_AUDIT);  // see comment for TaxonTree
204
		stepList.add(step);
205

    
206
		// update introduced: adventitious (casual) label
207
		// #3540
208
		stepName = "Update introduced: adventitious (casual) label";
209
		String query = " UPDATE @@Representation@@ "
210
				+ " SET abbreviatedlabel = 'ia' "
211
				+ " WHERE abbreviatedlabel = 'id' AND label = 'introduced: adventitious (casual)' ";
212
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
213
				.setDefaultAuditing("Representation");
214
		stepList.add(step);
215

    
216
		// termType for DefinedTerms and TermVocabulary, no type must be null
217
		stepName = "Create termType column in DefinedTermBase";
218
		tableName = "DefinedTermBase";
219
		columnName = "termType";
220
		// TODO NOT NULL unclear
221
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
222
				255, INCLUDE_AUDIT);
223
		stepList.add(step);
224

    
225
		stepName = "Create termType column in TermVocabulary";
226
		tableName = "TermVocabulary";
227
		columnName = "termType";
228
		// TODO NOT NULL unclear
229
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
230
				4, INCLUDE_AUDIT);
231
		stepList.add(step);
232

    
233
		// update termType for DefinedTerms, no type must be null
234
		updateTermTypesForTerms(stepList);
235

    
236
		// update termType for TermVocabulary, no type must be null
237
		updateTermTypesForVocabularies(stepList);
238

    
239
		// update DTYPE of DefinedTerms
240
		updateDtypeOfDefinedTerms(stepList);
241

    
242
		// idInVocabulary for DefinedTerms
243
		stepName = "Create idInVocabulary column in DefinedTermBase";
244
		tableName = "DefinedTermBase";
245
		columnName = "idInVocabulary";
246
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
247
				255, INCLUDE_AUDIT);
248
		stepList.add(step);
249

    
250
		// update idInVocabulary
251
		updateIdInVocabulary(stepList);
252

    
253
		// rankClass (#3521)
254
		stepName = "Create rankClass column in DefinedTermBase";
255
		tableName = "DefinedTermBase";
256
		columnName = "rankClass";
257
		// TODO NOT NULL unclear
258
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
259
				255, INCLUDE_AUDIT);
260
		stepList.add(step);
261

    
262
		// update rankClass (#3521)
263
		step = RankClassUpdater.NewInstance();
264
		stepList.add(step);
265

    
266
		// update datatype->CLOB for URIs. (DefinedTerms, TermVocabulary,
267
		// Reference, Rights, MediaRepresentationPart )
268
		// #3345, TODO2 adapt type to <65k -> see #3954
269
		// sequence.sequence has been changed #3360
270
		changeUriType(stepList);
271

    
272
		// Annotation.linkbackUri change name #3374
273
		stepName = "Update url to uri (->clob) for Annotation.linkbackUri";
274
		columnName = "linkbackUrl";
275
		String newColumnName = "linkbackUri";
276
		tableName = "Annotation";
277
		// TODO check non MySQL and with existing data (probably does not exist)
278
		step = ColumnNameChanger.NewClobInstance(stepName, tableName,
279
				columnName, newColumnName, INCLUDE_AUDIT);
280
		stepList.add(step);
281

    
282
		// update Sicilia -> Sicily
283
		// #3540
284
		stepName = "Update Sicilia -> Sicily";
285
		query = " UPDATE @@Representation@@ "
286
				+ " SET label = 'Sicily', text = 'Sicily' "
287
				+ " WHERE (abbreviatedlabel = 'SIC-SI'  OR abbreviatedlabel = 'SIC')  AND label = 'Sicilia' ";
288
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
289
				.setDefaultAuditing("Representation");
290
		stepList.add(step);
291

    
292
		// remove homotypical group form type designation base
293
		stepName = "Remove column homotypical group in type designation base";
294
		tableName = "TypeDesignationBase";
295
		String oldColumnName = "homotypicalgroup_id";
296
		step = ColumnRemover.NewInstance(stepName, tableName, oldColumnName,
297
				INCLUDE_AUDIT);
298
		stepList.add(step);
299

    
300
		// add publish flag #1780
301
		addPublishFlag(stepList);
302

    
303
		// add columns abbrevTitle, abbrevTitleCache and
304
		// protectedAbbrevTitleCache to Reference
305
		stepName = "Add abbrevTitle to Reference";
306
		tableName = "Reference";
307
		columnName = "abbrevTitle";
308
		int length = 255;
309
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
310
				length, INCLUDE_AUDIT);
311
		stepList.add(step);
312

    
313
		stepName = "Add abbrevTitleCache to Reference";
314
		tableName = "Reference";
315
		columnName = "abbrevTitleCache";
316
		length = 1023;
317
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
318
				length, INCLUDE_AUDIT);
319
		stepList.add(step);
320

    
321
		stepName = "Add protectedAbbrevTitleCache to Reference";
322
		tableName = "Reference";
323
		columnName = "protectedAbbrevTitleCache";
324
		step = ColumnAdder.NewBooleanInstance(stepName, tableName, columnName,
325
				INCLUDE_AUDIT, false);
326
		stepList.add(step);
327

    
328
		// update abbrevTitle, protectedAbbrevTitle and abbrevTitleCache in
329
		// Reference
330
		updateAbbrevTitle(stepList);
331

    
332
		//remove figure #2539
333
		stepName = "Remove Figure class";
334
		query = "UPDATE @@Media@@ SET DTYPE = 'Media' WHERE DTYPE = 'Figure'";
335
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "Media", 99);
336
		stepList .add(step);
337

    
338
		// add doi to reference
339
		stepName = "Add doi to Reference";
340
		tableName = "Reference";
341
		columnName = "doi";
342
		length = 255;
343
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
344
				length, INCLUDE_AUDIT);
345
		stepList.add(step);
346

    
347
		// add start number to PolytomousKey
348
		stepName = "Add start number column to PolytomousKey";
349
		tableName = "PolytomousKey";
350
		columnName = "startNumber";
351
		Integer defaultValue = 1;
352
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
353
				INCLUDE_AUDIT, defaultValue, true);
354
		stepList.add(step);
355

    
356
		// add recordBasis to specimenOrObservationBase
357
		stepName = "Add recordBasis to SpecimenOrObservationBase";
358
		tableName = "SpecimenOrObservationBase";
359
		columnName = "recordBasis";
360
		length = 4; // TODO needed?
361
		// TODO NOT NULL
362
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
363
				length, INCLUDE_AUDIT);
364
		stepList.add(step);
365

    
366
		// update recordBasis
367
		updateRecordBasis(stepList);
368

    
369
		// update specimenOrObservationBase DTYPE with DerivedUnit where
370
		// necessary
371
		stepName = "Update Specimen -> DerivedUnit";
372
		query = " UPDATE @@SpecimenOrObservationBase@@ "
373
				+ " SET DTYPE = 'DerivedUnit' "
374
				+ " WHERE DTYPE = 'Specimen' OR DTYPE = 'Fossil' OR DTYPE = 'LivingBeing' OR DTYPE = 'Observation' ";
375
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
376
				.setDefaultAuditing("SpecimenOrObservationBase");
377
		stepList.add(step);
378

    
379
		stepName = "Update Specimen -> DerivedUnit";
380
		String newClass = "eu.etaxonomy.cdm.model.occurrence.DerivedUnit";
381
		String[] oldClassPaths = new String[] {
382
				"eu.etaxonomy.cdm.model.occurrence.Specimen",
383
				"eu.etaxonomy.cdm.model.occurrence.Fossil",
384
				"eu.etaxonomy.cdm.model.occurrence.LivingBeing",
385
				"eu.etaxonomy.cdm.model.occurrence.Observation" };
386
		step = ClassChanger.NewIdentifiableInstance(stepName, tableName,
387
				newClass, oldClassPaths, INCLUDE_AUDIT);
388
		stepList.add(step);
389

    
390
		// update DTYPE FieldObservation -> FieldUnit #3351
391
		stepName = "Update FieldObservation -> FieldUnit";
392
		query = " UPDATE @@SpecimenOrObservationBase@@ "
393
				+ " SET DTYPE = 'FieldUnit' "
394
				+ " WHERE DTYPE = 'FieldObservation' ";
395
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
396
				.setDefaultAuditing("SpecimenOrObservationBase");
397
		stepList.add(step);
398

    
399
		stepName = "Update Specimen -> DerivedUnit";
400
		newClass = "eu.etaxonomy.cdm.model.occurrence.FieldUnit";
401
		oldClassPaths = new String[] { "eu.etaxonomy.cdm.model.occurrence.FieldObservation" };
402
		step = ClassChanger.NewIdentifiableInstance(stepName, tableName,
403
				newClass, oldClassPaths, INCLUDE_AUDIT);
404
		stepList.add(step);
405

    
406
		// add kindOfUnit to SpecimenOrObservationBase
407
		stepName = "Add kindOfUnit column to SpecimenOrObservationBase";
408
		tableName = "SpecimenOrObservationBase";
409
		columnName = "kindOfUnit_id";
410
		String relatedTable = "DefinedTermBase";
411
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
412
				INCLUDE_AUDIT, false, relatedTable);
413
		stepList.add(step);
414

    
415
		// remove citation_id and citation micro-reference columns from Media
416
		// table #2541
417
		// FIXME first check if columns are always empty
418
		stepName = "Remove citation column from Media";
419
		tableName = "Media";
420
		columnName = "citation_id";
421
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
422
				INCLUDE_AUDIT);
423
		stepList.add(step);
424

    
425
		stepName = "Remove citation microreference column from Media";
426
		tableName = "Media";
427
		columnName = "citationMicroReference";
428
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
429
				INCLUDE_AUDIT);
430
		stepList.add(step);
431

    
432
		// update length of all title caches and full title cache in names #1592
433
		updateTitleCacheLength(stepList);
434

    
435
		// rename FK column states_id -> stateData_id in
436
		// DescriptionElementBase_StateData(+AUD) #2923
437
		stepName = "Update states_id to stateData_id in DescriptionElementBase_StateData";
438
		tableName = "DescriptionElementBase_StateData";
439
		oldColumnName = "states_id";
440
		newColumnName = "stateData_id";
441
		step = ColumnNameChanger.NewIntegerInstance(stepName, tableName,
442
				oldColumnName, newColumnName, INCLUDE_AUDIT);
443
		stepList.add(step);
444

    
445
		// specimen descriptions #3571
446
		// add column DescriptionBase.Specimen_ID #3571
447
		stepName = "Add specimen_id column to DescriptionBase";
448
		tableName = "DescriptionBase";
449
		columnName = "specimen_id";
450
		boolean notNull = false;
451
		String referencedTable = "SpecimenOrObservationBase";
452
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
453
				INCLUDE_AUDIT, notNull, referencedTable);
454
		stepList.add(step);
455

    
456
		// update DescriptionBase.Specimen_ID data #3571
457
		updateDescriptionSpecimenRelation(stepList);
458

    
459
		// remove tables DescriptionBase_SpecimenOrObservationBase(_AUD) #3571
460
		stepName = "Remove table DescriptionBase_SpecimenOrObservationBase";
461
		tableName = "DescriptionBase_SpecimenOrObservationBase";
462
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
463
		stepList.add(step);
464

    
465
		// change column type for reference type
466
		stepName = "Change column type for Reference.type";
467
		tableName = "Reference";
468
		columnName = "refType";
469
		Integer defaultValueStr = -1;
470
		notNull = true;
471
		int size = 3;
472
		step = ColumnTypeChanger.NewInt2StringInstance(stepName, tableName,
473
				columnName, size, true, defaultValueStr, notNull);
474
		stepList.add(step);
475

    
476
		// update reference type
477
		updateReferenceType(stepList);
478

    
479
		// create table CdmPreference #3555
480
		stepName = "Create table 'CdmPreference'";
481
		tableName = "CdmPreference";
482
		TableCreator stepPref = TableCreator.NewInstance(stepName, tableName,
483
				new String[] { "key_subject", "key_predicate", "value" }, // colNames
484
				new String[] { "string_100", "string_100", "string_1023", }, // columnTypes
485
				new String[] { null, "DefinedTermBase", null }, // referencedTables
486
				!INCLUDE_AUDIT, false);
487
		stepPref.setPrimaryKeyParams("key_subject, key_predicate", null);
488
		stepList.add(stepPref);
489

    
490
		// update RightsTerm to RightsType #1306
491
		stepName = "Update RightsTerm -> RightsType";
492
		String updateSql = "UPDATE @@DefinedTermBase@@ SET DTYPE = 'RightsType'  WHERE DTYPE = 'RightsTerm'";
493
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, updateSql, 99)
494
				.setDefaultAuditing("DefinedTermBase");
495
		stepList.add(step);
496

    
497
		// update Rights table to RightsInfo
498
		updateRights2RightsInfo(stepList);
499

    
500
		// Remove column isDescriptionSeparated from FeatureTree #3678
501
		stepName = "Remove column isDescriptionSeparated from FeatureTree";
502
		tableName = "FeatureTree";
503
		columnName = "descriptionSeparated";
504
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
505
				INCLUDE_AUDIT);
506
		stepList.add(step);
507

    
508
		// remove table Sequence_GenBankAccession #3552
509
		stepName = "Remove table Sequence_GenBankAccession";
510
		tableName = "Sequence_GenBankAccession";
511
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
512
		stepList.add(step);
513

    
514
		// remove table GenBankAccession #3552
515
		stepName = "Remove table GenBankAccession";
516
		tableName = "GenBankAccession";
517
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
518
		stepList.add(step);
519

    
520
		// remove table Sequence_Credit #3360
521
		stepName = "Remove table Sequence_Credit";
522
		tableName = "Sequence_Credit";
523
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
524
		stepList.add(step);
525

    
526
		// remove table Sequence_Extension #3360
527
		stepName = "Remove table Sequence_Extension";
528
		tableName = "Sequence_Extension";
529
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
530
		stepList.add(step);
531

    
532
		//remove table Sequence_Media #3360
533
		stepName = "Remove table Sequence_Media";
534
		tableName = "Sequence_Media";
535
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
536
		stepList.add(step);
537

    
538
		// remove table Sequence_OriginalSourceBase #3360
539
		stepName = "Remove table Sequence_OriginalSourceBase";
540
		tableName = "Sequence_OriginalSourceBase";
541
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
542
		stepList.add(step);
543

    
544
		// remove table Sequence_OriginalSourceBase #3360
545
		stepName = "Remove table Sequence_Rights";
546
		tableName = "Sequence_Rights";
547
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
548
		stepList.add(step);
549

    
550
		// remove old sequence columns
551
		removeOldSequenceColumns(stepList);
552

    
553
		// add MediaSpecimen column #3614
554
		stepName = "Add mediaSpecimen column to SpecimenOrObservationBase";
555
		tableName = "SpecimenOrObservationBase";
556
		columnName = "mediaSpecimen_id";
557
		notNull = false;
558
		referencedTable = "Media";
559
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
560
				INCLUDE_AUDIT, notNull, referencedTable);
561
		stepList.add(step);
562

    
563
		// remove DescriptionBase_Feature #2202
564
		stepName = "Remove table DescriptionBase_Feature";
565
		tableName = "DescriptionBase_Feature";
566
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
567
		stepList.add(step);
568

    
569
		// add timeperiod to columns to description element base #3312
570
		addTimeperiodToDescriptionElement(stepList);
571

    
572
		// move specimen images
573
		stepName = "Move images from SpecimenOrObservationBase_Media to image gallery";
574
		step = SpecimenMediaMoverUpdater.NewInstance();
575
		stepList.add(step);
576

    
577
		// SpecimenOrObservationBase_Media #3597
578
		stepName = "Remove table SpecimenOrObservationBase_Media";
579
		tableName = "SpecimenOrObservationBase_Media";
580
		step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
581
		stepList.add(step);
582

    
583
		// all molecular (#3360) and related updates
584
		updateMolecularAndRelated(stepList);
585

    
586
		// update vocabulary representaitons
587
		step = TermVocabularyRepresentationUpdater.NewInstance();
588
		stepList.add(step);
589

    
590
		return stepList;
591
	}
592

    
593
	private void updateMolecularAndRelated(List<ISchemaUpdaterStep> stepList) {
594
		String stepName;
595
		String tableName;
596
		ISchemaUpdaterStep step;
597
		String columnName;
598
		int length;
599
		Integer defaultValue;
600
		String referencedTable;
601

    
602
		// Primer #3360
603
		stepName = "Create table 'Primer'";
604
		tableName = "Primer";
605
		step = TableCreator.NewAnnotatableInstance(stepName, tableName,
606
				new String[] { "label", "sequence_id", "publishedIn_id" }, // colNames
607
				new String[] { "string_255", "int", "int" }, // columnTypes
608
				new String[] { null, Sequence.class.getSimpleName(),
609
						Reference.class.getSimpleName() }, // referencedTables
610
				INCLUDE_AUDIT);
611
		stepList.add(step);
612

    
613
		// MaterialOrMethod #3360
614
		stepName = "Create table 'MaterialOrMethodEvent'";
615
		tableName = MaterialOrMethodEvent.class.getSimpleName();
616
		step = TableCreator.NewEventInstance(stepName, tableName, new String[] {
617
				"DTYPE", "strain", "temperature", "definedMaterialOrMethod_id",
618
				"forwardPrimer_id", "reversePrimer_id", "medium_id" }, // colNames
619
				new String[] { "string_255", "string_255", "double", "int",
620
						"int", "int", "int" }, // columnTypes
621
				new String[] { null, null, null, "DefinedTermBase", "Primer",
622
						"Primer", "DefinedTermBase" }, // referencedTables
623
				INCLUDE_AUDIT);
624
		stepList.add(step);
625

    
626
		stepName = "Remove preservation column from SpecimenOrObservationBase";
627
		// to fully remove all foreign keys, maybe there is a better way to do so
628
		// we don't expect any preservation information to exist in any CDM
629
		// database
630
		tableName = "SpecimenOrObservationBase";
631
		String oldColumnName = "preservation_id";
632
		step = ColumnRemover.NewInstance(stepName, tableName, oldColumnName,
633
				INCLUDE_AUDIT);
634
		stepList.add(step);
635

    
636
		stepName = "Add new preservation column to SpecimenOrObservationBase";
637
		tableName = "SpecimenOrObservationBase";
638
		String newColumnName = "preservation_id";
639
		boolean notNull = false;
640
		step = ColumnAdder.NewIntegerInstance(stepName, tableName,
641
				newColumnName, INCLUDE_AUDIT, notNull, "MaterialOrMethodEvent");
642
		stepList.add(step);
643

    
644
		// Amplification #3360
645
		stepName = "Create table 'Amplification'";
646
		tableName = "Amplification";
647
		step = TableCreator.NewEventInstance(stepName, tableName,
648
				new String[] { "dnaSample_id", "dnaMarker_id",
649
						"forwardPrimer_id", "reversePrimer_id",
650
						"purification_id", "cloning_id", "gelPhoto_id",
651
						"successful", "successText", "ladderUsed",
652
						"electrophoresisVoltage", "gelRunningTime",
653
						"gelConcentration" }, // colNames
654
				new String[] { "int", "int", "int", "int", "int", "int", "int",
655
						"bit", "string_255", "string_255", "double", "double",
656
						"double" }, // columnTypes
657
				new String[] { "SpecimenOrObservationBase", "DefinedTermBase",
658
						"Primer", "Primer", "MaterialOrMethodEvent",
659
						"MaterialOrMethodEvent", "Media", null, null, null,
660
						null, null, null }, // referencedTables
661
				INCLUDE_AUDIT);
662
		stepList.add(step);
663

    
664
		// SingleRead #3360
665
		stepName = "Create table 'SingleRead'";
666
		tableName = "SingleRead";
667
		step = TableCreator.NewEventInstance(stepName, tableName, new String[] {
668
				"amplification_id", "materialOrMethod_id", "primer_id",
669
				"pherogram_id", "direction", "sequence_length" }, // colNames
670
				new String[] { "int", "int", "int", "int", "string_3", "int" }, // columnTypes
671
				new String[] { "Amplification", "MaterialOrMethodEvent",
672
						"Primer", "Media", null, null }, // referencedTables
673
				INCLUDE_AUDIT);
674
		stepList.add(step);
675

    
676
		// sequence - consensussequence_string #3360
677
		stepName = "Add sequence_string to single read";
678
		columnName = "sequence_string";
679
		step = ColumnAdder.NewClobInstance(stepName, tableName, columnName,
680
				INCLUDE_AUDIT);
681
		stepList.add(step);
682

    
683
		// amplification - single reads #3360
684
		stepName = "Add single reads to amplification";
685
		String firstTable = "Amplification";
686
		String secondTable = "SingleRead";
687
		step = MnTableCreator
688
				.NewMnInstance(stepName, firstTable, null, secondTable, null, null,
689
						SchemaUpdaterBase.INCLUDE_AUDIT, !IS_LIST, IS_1_TO_M);
690
		stepList.add(step);
691

    
692
		// sequence - single reads #3360
693
		stepName = "Add single reads to sequence";
694
		firstTable = "Sequence";
695
		secondTable = "SingleRead";
696
		step = MnTableCreator
697
				.NewMnInstance(stepName, firstTable, null, secondTable, null, null,
698
						SchemaUpdaterBase.INCLUDE_AUDIT, !IS_LIST, IS_1_TO_M);
699
		stepList.add(step);
700

    
701
		// sequence - barcode #3360
702
		stepName = "Add barcodesequencepart_length to sequence";
703
		tableName = "Sequence";
704
		columnName = "barcodeSequencePart_length";
705
		defaultValue = null;
706
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
707
				INCLUDE_AUDIT, defaultValue, false);
708
		stepList.add(step);
709

    
710
		// sequence - barcode #3360
711
		stepName = "Add barcodesequencepart_string to sequence";
712
		tableName = "Sequence";
713
		columnName = "barcodeSequencePart_string";
714
		step = ColumnAdder.NewClobInstance(stepName, tableName, columnName,
715
				INCLUDE_AUDIT);
716
		stepList.add(step);
717

    
718
		// sequence - consensussequence_length #3360
719
		stepName = "Add consensusSequence_length to sequence";
720
		tableName = "Sequence";
721
		columnName = "consensusSequence_length";
722
		defaultValue = null;
723
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
724
				INCLUDE_AUDIT, defaultValue, false);
725
		stepList.add(step);
726

    
727
		// sequence - consensussequence_string #3360
728
		stepName = "Add consensusSequence_string to sequence";
729
		tableName = "Sequence";
730
		columnName = "consensusSequence_string";
731
		step = ColumnAdder.NewClobInstance(stepName, tableName, columnName,
732
				INCLUDE_AUDIT);
733
		stepList.add(step);
734

    
735
		// sequence - contigFile #3360
736
		stepName = "Add contigFile to sequence";
737
		tableName = "Sequence";
738
		columnName = "contigFile_id";
739
		referencedTable = "Media";
740
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
741
				INCLUDE_AUDIT, false, referencedTable);
742
		stepList.add(step);
743

    
744
		// sequence - boldprocessid #3360
745
		stepName = "Add boldprocessId to sequence";
746
		tableName = "Sequence";
747
		columnName = "boldProcessId";
748
		length = 20;
749
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
750
				length, INCLUDE_AUDIT);
751
		stepList.add(step);
752

    
753
		// sequence - boldprocessid #3360
754
		stepName = "Add geneticAccessionNumber to sequence";
755
		tableName = "Sequence";
756
		columnName = "geneticAccessionNumber";
757
		length = 20;
758
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
759
				length, INCLUDE_AUDIT);
760
		stepList.add(step);
761

    
762
		// sequence - haplotype #3360
763
		stepName = "Add haplotype to sequence";
764
		tableName = "Sequence";
765
		columnName = "haplotype";
766
		length = 100;
767
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
768
				length, INCLUDE_AUDIT);
769
		stepList.add(step);
770

    
771
		// sequence - isBarcode #3360
772
		stepName = "Add isBarcode to sequence";
773
		tableName = "Sequence";
774
		columnName = "isBarcode";
775
		step = ColumnAdder.NewBooleanInstance(stepName, tableName, columnName,
776
				INCLUDE_AUDIT, false);
777
		stepList.add(step);
778

    
779
		// sequence - dnaMarker #3360
780
		stepName = "Add dnaMarker to sequence";
781
		tableName = "Sequence";
782
		columnName = "dnaMarker_id";
783
		referencedTable = "DefinedTermBase";
784
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
785
				INCLUDE_AUDIT, false, referencedTable);
786
		stepList.add(step);
787

    
788
		// sequence - dnaSample #3360
789
		stepName = "Add dnaSample to sequence";
790
		tableName = "Sequence";
791
		columnName = "dnaSample_id";
792
		referencedTable = "SpecimenOrObservationBase";
793
		step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName,
794
				INCLUDE_AUDIT, false, referencedTable);
795
		stepList.add(step);
796
	}
797

    
798
	private void addPublishFlag(List<ISchemaUpdaterStep> stepList) {
799
		String stepName;
800
		String tableName;
801
		ISchemaUpdaterStep step;
802
		String columnName;
803
		String query;
804

    
805
		// TaxonBase
806

    
807
		// add publish flag to taxon
808
		stepName = "Add publish flag column to taxon base";
809
		tableName = "TaxonBase";
810
		columnName = "publish";
811
		step = ColumnAdder.NewBooleanInstance(stepName, tableName, columnName,
812
				INCLUDE_AUDIT, true);
813
		stepList.add(step);
814

    
815
		// update publish with existing publish false markers
816
		stepName = "update TaxonBase publish if publish false markers exist";
817
		query = " UPDATE @@TaxonBase@@ "
818
				+ " SET publish = @FALSE@ "
819
				+ " WHERE id IN ( "
820
				 + " SELECT DISTINCT MN.TaxonBase_id "
821
				 + " FROM @@Marker@@ m INNER JOIN @@TaxonBase_Marker@@ MN ON MN.markers_id = m.id "
822
				 + " INNER JOIN @@DefinedTermBase@@ markerType ON m.markertype_id = markerType.id "
823
				 + " WHERE m.flag = @FALSE@ AND markerType.uuid = '0522c2b3-b21c-400c-80fc-a251c3501dbc' "
824
				+ ")";
825
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "TaxonBase", 99);
826
		stepList.add(step);
827

    
828
		// remove publish marker MN table
829
		stepName = "Remove existing TaxonBase publish markers MN";
830
		query = " DELETE "
831
				+ " FROM @@TaxonBase_Marker@@ "
832
				+ " WHERE markers_id IN ( "
833
				 + " SELECT m.id "
834
				 + " FROM @@Marker@@ m INNER JOIN @@DefinedTermBase@@ mType ON m.markertype_id = mType.id "
835
				 + " WHERE mType.uuid = '0522c2b3-b21c-400c-80fc-a251c3501dbc'  "
836
				+ ")";
837
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "TaxonBase_Marker", 99);
838
		stepList.add(step);
839

    
840
		// update publish with existing publish false markers
841
		stepName = "Remove existing TaxonBase publish markers";
842
		query = " DELETE "
843
				+ " FROM @@Marker@@ "
844
				+ " WHERE id NOT IN "
845
				+ " (SELECT MN.markers_id FROM @@TaxonBase_Marker@@ MN) "
846
				+ " AND (markedObj_type = 'eu.etaxonomy.cdm.model.taxon.Synonym' OR markedObj_type = 'eu.etaxonomy.cdm.model.taxon.Taxon') "
847
				+ " AND markertype_id IN ( "
848
				+ "SELECT id FROM @@DefinedTermBase@@ WHERE uuid = '0522c2b3-b21c-400c-80fc-a251c3501dbc' "
849
				+ ")";
850
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99); // AUD does not have markedObj_type
851
		stepList.add(step);
852

    
853
		// SpecimenOrObservationBase
854

    
855
		// add publish flag to specimen
856
		stepName = "Add publish flag column to SpecimenOrObservationBase";
857
		tableName = "SpecimenOrObservationBase";
858
		columnName = "publish";
859
		step = ColumnAdder.NewBooleanInstance(stepName, tableName, columnName,
860
				INCLUDE_AUDIT, true);
861
		stepList.add(step);
862

    
863
		// update publish with existing publish false markers
864
		stepName = "update SpecimenOrObservationBase publish if publish false markers exist";
865
		query = " UPDATE @@SpecimenOrObservationBase@@ "
866
				+ " SET publish = @FALSE@ "
867
				+ " WHERE id IN ( "
868
				+ " SELECT DISTINCT MN.SpecimenOrObservationBase_id "
869
				+ " FROM @@Marker@@ m INNER JOIN @@SpecimenOrObservationBase_Marker@@ MN ON MN.markers_id = m.id "
870
				+ " INNER JOIN @@DefinedTermBase@@ markerType ON m.markertype_id = markerType.id "
871
				+ " WHERE m.flag = @FALSE@ AND markerType.uuid = '0522c2b3-b21c-400c-80fc-a251c3501dbc' "
872
				+ ")";
873
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "SpecimenOrObservationBase", 99);
874
		stepList.add(step);
875

    
876
		// remove publish marker MN table
877
		stepName = "Remove existing SpecimenOrObservationBase publish markers MN";
878
		query = " DELETE "
879
				+ " FROM @@SpecimenOrObservationBase_Marker@@ "
880
				+ " WHERE markers_id IN ( "
881
				+ " SELECT m.id "
882
				+ " FROM @@Marker@@ m INNER JOIN @@DefinedTermBase@@ mType ON m.markertype_id = mType.id "
883
				+ " WHERE mType.uuid = '0522c2b3-b21c-400c-80fc-a251c3501dbc'  "
884
				+ ")";
885
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "SpecimenOrObservationBase_Marker", 99);
886
		stepList.add(step);
887

    
888
		// update publish with existing publish false markers
889
		stepName = "Remove existing SpecimenOrObservationBase publish markers";
890
		query = " DELETE "
891
				+ " FROM @@Marker@@ "
892
				+ " WHERE id NOT IN "
893
				+ " (SELECT MN.markers_id FROM @@SpecimenOrObservationBase_Marker@@ MN) "
894
				+ " AND (markedObj_type = 'eu.etaxonomy.cdm.model.occurrence.DerivedUnit' "
895
				+ "OR markedObj_type = 'eu.etaxonomy.cdm.model.occurrence.FieldObservation' "
896
				+ "OR markedObj_type = 'eu.etaxonomy.cdm.model.occurrence.FieldUnit' "
897
				+ "OR markedObj_type = 'eu.etaxonomy.cdm.model.occurrence.Specimen' "
898
				+ "OR markedObj_type = 'eu.etaxonomy.cdm.model.occurrence.Fossil' "
899
				+ "OR markedObj_type = 'eu.etaxonomy.cdm.model.occurrence.LivingBeing' "
900
				+ "OR markedObj_type = 'eu.etaxonomy.cdm.model.occurrence.Observation' "
901
				+ "OR markedObj_type = 'eu.etaxonomy.cdm.model.occurrence.MediaSpecimen' "
902
				+ "OR markedObj_type = 'eu.etaxonomy.cdm.model.occurrence.TissueSample' "
903
				+ "OR markedObj_type = 'eu.etaxonomy.cdm.model.molecular.DnaSample') "
904
				+ " AND markertype_id IN ( "
905
				+ "SELECT id FROM @@DefinedTermBase@@ WHERE uuid = '0522c2b3-b21c-400c-80fc-a251c3501dbc' "
906
				+ ")";
907
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99);
908
		stepList.add(step);
909

    
910
		// remove all audited markers if no current markers exist
911
		// this may remove more audited markers then expected but we do accept
912
		// this here
913
		stepName = "Remove all audited markers if no current markers exist";
914
		query = " DELETE "
915
				+ " FROM @@Marker_AUD@@ "
916
				+ " WHERE id NOT IN (SELECT id FROM @@Marker@@ ) "
917
				+ " AND markertype_id IN ( "
918
				+ "SELECT id FROM @@DefinedTermBase@@ WHERE uuid = '0522c2b3-b21c-400c-80fc-a251c3501dbc' "
919
				+ ")";
920
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99);
921
		stepList.add(step);
922

    
923
	}
924

    
925
	private void updateRights2RightsInfo(List<ISchemaUpdaterStep> stepList) {
926
		// #2945
927
		String stepName = "Update Rights to RightsInfo";
928
		String tableName = "Rights";
929
		String newTableName = "RightsInfo";
930
		ISchemaUpdaterStep step = TableNameChanger.NewInstance(stepName,
931
				tableName, newTableName, INCLUDE_AUDIT);
932
		stepList.add(step);
933

    
934
		stepName = "Update AgentBase_Rights to RightsInfo";
935
		tableName = "AgentBase_Rights";
936
		newTableName = "AgentBase_RightsInfo";
937
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
938
				INCLUDE_AUDIT);
939
		stepList.add(step);
940

    
941
		stepName = "Update Rights_Annotation to RightsInfo";
942
		tableName = "Rights_Annotation";
943
		newTableName = "RightsInfo_Annotation";
944
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
945
				INCLUDE_AUDIT);
946
		stepList.add(step);
947

    
948
		stepName = "Update Rights_id column in RightsInfo_Annotation";
949
		tableName = "RightsInfo_Annotation";
950
		String columnName = "Rights_Id";
951
		String newColumnName = "RightsInfo_id";
952
		step = ColumnNameChanger.NewIntegerInstance(stepName, tableName,
953
				columnName, newColumnName, INCLUDE_AUDIT);
954
		stepList.add(step);
955

    
956
		stepName = "Update Rights_Marker to RightsInfo";
957
		tableName = "Rights_Marker";
958
		newTableName = "RightsInfo_Marker";
959
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
960
				INCLUDE_AUDIT);
961
		stepList.add(step);
962

    
963
		stepName = "Update Rights_id column in RightsInfo_Marker";
964
		tableName = "RightsInfo_Marker";
965
		columnName = "Rights_Id";
966
		newColumnName = "RightsInfo_id";
967
		step = ColumnNameChanger.NewIntegerInstance(stepName, tableName,
968
				columnName, newColumnName, INCLUDE_AUDIT);
969
		stepList.add(step);
970

    
971
		stepName = "Update Classification_Rights to RightsInfo";
972
		tableName = "Classification_Rights";
973
		newTableName = "Classification_RightsInfo";
974
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
975
				INCLUDE_AUDIT);
976
		stepList.add(step);
977

    
978
		stepName = "Update Collection_Rights to RightsInfo";
979
		tableName = "Collection_Rights";
980
		newTableName = "Collection_RightsInfo";
981
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
982
				INCLUDE_AUDIT);
983
		stepList.add(step);
984

    
985
		stepName = "Update DefinedTermBase_Rights to RightsInfo";
986
		tableName = "DefinedTermBase_Rights";
987
		newTableName = "DefinedTermBase_RightsInfo";
988
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
989
				INCLUDE_AUDIT);
990
		stepList.add(step);
991

    
992
		stepName = "Update DescriptionBase_Rights to RightsInfo";
993
		tableName = "DescriptionBase_Rights";
994
		newTableName = "DescriptionBase_RightsInfo";
995
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
996
				INCLUDE_AUDIT);
997
		stepList.add(step);
998

    
999
		stepName = "Update FeatureTree_Rights to RightsInfo";
1000
		tableName = "FeatureTree_Rights";
1001
		newTableName = "FeatureTree_RightsInfo";
1002
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
1003
				INCLUDE_AUDIT);
1004
		stepList.add(step);
1005

    
1006
		stepName = "Update Media_Rights to RightsInfo";
1007
		tableName = "Media_Rights";
1008
		newTableName = "Media_RightsInfo";
1009
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
1010
				INCLUDE_AUDIT);
1011
		stepList.add(step);
1012

    
1013
		stepName = "Update PolytomousKey_Rights to RightsInfo";
1014
		tableName = "PolytomousKey_Rights";
1015
		newTableName = "PolytomousKey_RightsInfo";
1016
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
1017
				INCLUDE_AUDIT);
1018
		stepList.add(step);
1019

    
1020
		stepName = "Update Reference_Rights to RightsInfo";
1021
		tableName = "Reference_Rights";
1022
		newTableName = "Reference_RightsInfo";
1023
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
1024
				INCLUDE_AUDIT);
1025
		stepList.add(step);
1026

    
1027
		stepName = "Update SpecimenOrObservationBase_Rights to RightsInfo";
1028
		tableName = "SpecimenOrObservationBase_Rights";
1029
		newTableName = "SpecimenOrObservationBase_RightsInfo";
1030
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
1031
				INCLUDE_AUDIT);
1032
		stepList.add(step);
1033

    
1034
		stepName = "Update TaxonBase_Rights to RightsInfo";
1035
		tableName = "TaxonBase_Rights";
1036
		newTableName = "TaxonBase_RightsInfo";
1037
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
1038
				INCLUDE_AUDIT);
1039
		stepList.add(step);
1040

    
1041
		stepName = "Update TaxonNameBase_Rights to RightsInfo";
1042
		tableName = "TaxonNameBase_Rights";
1043
		newTableName = "TaxonNameBase_RightsInfo";
1044
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
1045
				INCLUDE_AUDIT);
1046
		stepList.add(step);
1047

    
1048
		stepName = "Update TermVocabulary_Rights to RightsInfo";
1049
		tableName = "TermVocabulary_Rights";
1050
		newTableName = "TermVocabulary_RightsInfo";
1051
		step = TableNameChanger.NewInstance(stepName, tableName, newTableName,
1052
				INCLUDE_AUDIT);
1053
		stepList.add(step);
1054
	}
1055

    
1056
	private void updateReferenceType(List<ISchemaUpdaterStep> stepList) {
1057

    
1058
		String baseQuery = " UPDATE @@Reference@@ " + " SET refType = '%s' "
1059
				+ " WHERE refType = '%s' ";
1060
		Integer index = 0;
1061
		String tableName = "Reference";
1062

    
1063
		// 0-Article
1064
		String stepName = "Update reference refType for Article";
1065
		String query = String.format(baseQuery, ReferenceType.Article.getKey(),
1066
				String.valueOf(index++));
1067
		ISchemaUpdaterStep step = SimpleSchemaUpdaterStep
1068
				.NewNonAuditedInstance(stepName, query, 99).setDefaultAuditing(tableName);
1069
		stepList.add(step);
1070

    
1071
		// 1-Book
1072
		stepName = "Update reference refType for Book";
1073
		query = String.format(baseQuery, ReferenceType.Book.getKey(),
1074
				String.valueOf(index++));
1075
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1076
				.setDefaultAuditing(tableName);
1077
		stepList.add(step);
1078

    
1079
		// 2-Book Section
1080
		stepName = "Update reference refType for Book Section";
1081
		query = String.format(baseQuery, ReferenceType.BookSection.getKey(),
1082
				String.valueOf(index++));
1083
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1084
				.setDefaultAuditing(tableName);
1085
		stepList.add(step);
1086

    
1087
		// 3-CD / DVD
1088
		stepName = "Update reference refType for CD";
1089
		query = String.format(baseQuery, ReferenceType.CdDvd.getKey(),
1090
				String.valueOf(index++));
1091
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1092
				.setDefaultAuditing(tableName);
1093
		stepList.add(step);
1094

    
1095
		// 4-Database
1096
		stepName = "Update reference refType for Database";
1097
		query = String.format(baseQuery, ReferenceType.Database.getKey(),
1098
				String.valueOf(index++));
1099
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1100
				.setDefaultAuditing(tableName);
1101
		stepList.add(step);
1102

    
1103
		// 5-Generic
1104
		stepName = "Update reference refType for Generic";
1105
		query = String.format(baseQuery, ReferenceType.Generic.getKey(),
1106
				String.valueOf(index++));
1107
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1108
				.setDefaultAuditing(tableName);
1109
		stepList.add(step);
1110

    
1111
		// 6-InProceedings
1112
		stepName = "Update reference refType for InProceedings";
1113
		query = String.format(baseQuery, ReferenceType.InProceedings.getKey(),
1114
				String.valueOf(index++));
1115
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1116
				.setDefaultAuditing(tableName);
1117
		stepList.add(step);
1118

    
1119
		// 7-Journal
1120
		stepName = "Update reference refType for Journal";
1121
		query = String.format(baseQuery, ReferenceType.Journal.getKey(),
1122
				String.valueOf(index++));
1123
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1124
				.setDefaultAuditing(tableName);
1125
		stepList.add(step);
1126

    
1127
		// 8-Map
1128
		stepName = "Update reference refType for Map";
1129
		query = String.format(baseQuery, ReferenceType.Map.getKey(),
1130
				String.valueOf(index++));
1131
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1132
				.setDefaultAuditing(tableName);
1133
		stepList.add(step);
1134

    
1135
		// 9-Patent
1136
		stepName = "Update reference refType for Patent";
1137
		query = String.format(baseQuery, ReferenceType.Patent.getKey(),
1138
				String.valueOf(index++));
1139
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1140
				.setDefaultAuditing(tableName);
1141
		stepList.add(step);
1142

    
1143
		// 10-Personal Communication
1144
		stepName = "Update reference refType for Personal Communication";
1145
		query = String.format(baseQuery,
1146
				ReferenceType.PersonalCommunication.getKey(),
1147
				String.valueOf(index++));
1148
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1149
				.setDefaultAuditing(tableName);
1150
		stepList.add(step);
1151

    
1152
		// 11-PrintSeries
1153
		stepName = "Update reference refType for PrintSeries";
1154
		query = String.format(baseQuery, ReferenceType.PrintSeries.getKey(),
1155
				String.valueOf(index++));
1156
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1157
				.setDefaultAuditing(tableName);
1158
		stepList.add(step);
1159

    
1160
		// 12-Proceedings
1161
		stepName = "Update reference refType for Proceedings";
1162
		query = String.format(baseQuery, ReferenceType.Proceedings.getKey(),
1163
				String.valueOf(index++));
1164
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1165
				.setDefaultAuditing(tableName);
1166
		;
1167
		stepList.add(step);
1168

    
1169
		// 13-Report
1170
		stepName = "Update reference refType for Report";
1171
		query = String.format(baseQuery, ReferenceType.Report.getKey(),
1172
				String.valueOf(index++));
1173
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1174
				.setDefaultAuditing(tableName);
1175
		;
1176
		stepList.add(step);
1177

    
1178
		// 14-Thesis
1179
		stepName = "Update reference refType for Thesis";
1180
		query = String.format(baseQuery, ReferenceType.Thesis.getKey(),
1181
				String.valueOf(index++));
1182
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1183
				.setDefaultAuditing(tableName);
1184
		;
1185
		stepList.add(step);
1186

    
1187
		// 15-WebPage
1188
		stepName = "Update reference refType for WebPage";
1189
		query = String.format(baseQuery, ReferenceType.WebPage.getKey(),
1190
				String.valueOf(index++));
1191
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1192
				.setDefaultAuditing(tableName);
1193
		;
1194
		stepList.add(step);
1195
	}
1196

    
1197
	private void updateRecordBasis(List<ISchemaUpdaterStep> stepList) {
1198
		String stepName = "Update recordBasis for SpecimenOrObservationBase";
1199
		String tableName = "@@SpecimenOrObservationBase@@";
1200

    
1201
		// Field Unit
1202
		String query = " UPDATE " + tableName + " SET recordBasis = '"
1203
				+ SpecimenOrObservationType.FieldUnit.getKey() + "' "
1204
				+ " WHERE DTYPE = 'FieldUnit' OR DTYPE = 'FieldObservation'";
1205
		ISchemaUpdaterStep step = SimpleSchemaUpdaterStep
1206
				.NewNonAuditedInstance(stepName, query, 99)
1207
					.setDefaultAuditing(tableName);
1208
		stepList.add(step);
1209

    
1210
		// DerivedUnit
1211
		query = " UPDATE " + tableName + " SET recordBasis = '"
1212
				+ SpecimenOrObservationType.DerivedUnit.getKey() + "' "
1213
				+ " WHERE DTYPE = '" + DerivedUnit.class.getSimpleName() + "'";
1214
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1215
				.setDefaultAuditing(tableName);
1216
		stepList.add(step);
1217

    
1218
		// Living Being
1219
		query = " UPDATE " + tableName + " SET recordBasis = '"
1220
				+ SpecimenOrObservationType.LivingSpecimen.getKey() + "' "
1221
				+ " WHERE DTYPE = 'LivingBeing'";
1222
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1223
				.setDefaultAuditing(tableName);
1224
		stepList.add(step);
1225

    
1226
		// Observation
1227
		query = " UPDATE " + tableName + " SET recordBasis = '"
1228
				+ SpecimenOrObservationType.Observation.getKey() + "' "
1229
				+ " WHERE DTYPE = 'Observation'";
1230
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1231
				.setDefaultAuditing(tableName);
1232
		stepList.add(step);
1233

    
1234
		// Preserved Specimen
1235
		query = " UPDATE " + tableName + " SET recordBasis = '"
1236
				+ SpecimenOrObservationType.PreservedSpecimen.getKey() + "' "
1237
				+ " WHERE DTYPE = 'Specimen'";
1238
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1239
				.setDefaultAuditing(tableName);
1240
		stepList.add(step);
1241

    
1242
		// Fossil
1243
		query = " UPDATE " + tableName + " SET recordBasis = '"
1244
				+ SpecimenOrObservationType.Fossil.getKey() + "' "
1245
				+ " WHERE DTYPE = 'Fossil'";
1246
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1247
				.setDefaultAuditing(tableName);
1248
		stepList.add(step);
1249

    
1250
		// DnaSample
1251
		query = " UPDATE " + tableName + " SET recordBasis = '"
1252
				+ SpecimenOrObservationType.DnaSample.getKey() + "' "
1253
				+ " WHERE DTYPE = 'DnaSample'";
1254
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1255
				.setDefaultAuditing(tableName);
1256
		stepList.add(step);
1257

    
1258
		// Unknown as default (if not yet handled before)
1259
		query = " UPDATE " + tableName + " SET recordBasis = '"
1260
				+ SpecimenOrObservationType.Unknown.getKey() + "' "
1261
				+ " WHERE recordBasis IS NULL ";
1262
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1263
				.setDefaultAuditing(tableName);
1264
		stepList.add(step);
1265
	}
1266

    
1267
	// update length of all title caches and full title cache in names
1268
	// TODO test for H2, Postgres, SqlServer
1269
	// https://dev.e-taxonomy.eu/trac/ticket/1592
1270
	private void updateTitleCacheLength(List<ISchemaUpdaterStep> stepList) {
1271
		String stepName;
1272
		String tableName;
1273
		ISchemaUpdaterStep step;
1274
		String columnName;
1275
		int size = 800;
1276

    
1277
		stepName = "Change length of TaxonName fullTitleCache";
1278
		tableName = "TaxonNameBase";
1279
		columnName = "fullTitleCache";
1280
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1281
				columnName, size, INCLUDE_AUDIT);
1282
		stepList.add(step);
1283

    
1284
		stepName = "Change length of TaxonName title cache";
1285
		tableName = "TaxonNameBase";
1286
		columnName = "titleCache";
1287
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1288
				columnName, size, INCLUDE_AUDIT);
1289
		stepList.add(step);
1290

    
1291
		stepName = "Change length of TaxonBase title cache";
1292
		tableName = "TaxonBase";
1293
		columnName = "titleCache";
1294
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1295
				columnName, size, INCLUDE_AUDIT);
1296
		stepList.add(step);
1297

    
1298
		stepName = "Change length of Classification title cache";
1299
		tableName = "Classification";
1300
		columnName = "titleCache";
1301
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1302
				columnName, size, INCLUDE_AUDIT);
1303
		stepList.add(step);
1304

    
1305
		stepName = "Change length of DescriptionBase title cache";
1306
		tableName = "DescriptionBase";
1307
		columnName = "titleCache";
1308
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1309
				columnName, size, INCLUDE_AUDIT);
1310
		stepList.add(step);
1311

    
1312
		stepName = "Change length of FeatureTree title cache";
1313
		tableName = "FeatureTree";
1314
		columnName = "titleCache";
1315
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1316
				columnName, size, INCLUDE_AUDIT);
1317
		stepList.add(step);
1318

    
1319
		stepName = "Change length of Collection title cache";
1320
		tableName = "Collection";
1321
		columnName = "titleCache";
1322
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1323
				columnName, size, INCLUDE_AUDIT);
1324
		stepList.add(step);
1325

    
1326
		stepName = "Change length of Reference title cache";
1327
		tableName = "Reference";
1328
		columnName = "titleCache";
1329
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1330
				columnName, size, INCLUDE_AUDIT);
1331
		stepList.add(step);
1332

    
1333
		stepName = "Change length of Media title cache";
1334
		tableName = "Media";
1335
		columnName = "titleCache";
1336
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1337
				columnName, size, INCLUDE_AUDIT);
1338
		stepList.add(step);
1339

    
1340
		stepName = "Change length of PolytomousKey title cache";
1341
		tableName = "PolytomousKey";
1342
		columnName = "titleCache";
1343
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1344
				columnName, size, INCLUDE_AUDIT);
1345
		stepList.add(step);
1346

    
1347
		stepName = "Change length of SpecimenOrObservationBase title cache";
1348
		tableName = "SpecimenOrObservationBase";
1349
		columnName = "titleCache";
1350
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1351
				columnName, size, INCLUDE_AUDIT);
1352
		stepList.add(step);
1353

    
1354
		stepName = "Change length of DefinedTermBase title cache";
1355
		tableName = "DefinedTermBase";
1356
		columnName = "titleCache";
1357
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1358
				columnName, size, INCLUDE_AUDIT);
1359
		stepList.add(step);
1360

    
1361
		stepName = "Change length of TermVocabulary title cache";
1362
		tableName = "TermVocabulary";
1363
		columnName = "titleCache";
1364
		step = ColumnTypeChanger.NewStringSizeInstance(stepName, tableName,
1365
				columnName, size, INCLUDE_AUDIT);
1366
		stepList.add(step);
1367

    
1368
	}
1369

    
1370
	private void updateDescriptionSpecimenRelation(
1371
			List<ISchemaUpdaterStep> stepList) {
1372
		// TODO warn if multiple entries for 1 description exists -> won't do, as this is currently not expected
1373
		String sqlCount = " SELECT count(*) as n "
1374
				+ " FROM DescriptionBase_SpecimenOrObservationBase MN "
1375
				+ " GROUP BY MN.descriptions_id "
1376
				+ " HAVING count(*) > 1 "
1377
				+ " ORDER BY MN.descriptions_id, MN.describedspecimenorobservations_id ";
1378

    
1379
		// TODO ... and log the concrete records
1380
		// FROM DescriptionBase_SpecimenOrObservationBase ds
1381
		// WHERE ds.descriptions_id IN (
1382
		// SELECT MN.descriptions_id
1383
		// FROM DescriptionBase_SpecimenOrObservationBase MN
1384
		// GROUP BY MN.descriptions_id
1385
		// HAVING count(*) > 1
1386
		// )
1387
		// ORDER BY descriptions_id, describedspecimenorobservations_id
1388

    
1389
		// TODO test for H2, Postgresql AND SQLServer (later will need TOP 1)
1390
		String stepName = "UPDATE Description - Specimen relation data  ";
1391
		String sql = " UPDATE @@DescriptionBase@@ " + " SET specimen_id =  "
1392
				+ " (SELECT  MN.describedspecimenorobservations_id "
1393
				+ " FROM @@DescriptionBase_SpecimenOrObservationBase@@ MN "
1394
				+ " WHERE MN.descriptions_id = @@DescriptionBase@@.id " + " LIMIT 1 " + ")";
1395
		ISchemaUpdaterStep step = SimpleSchemaUpdaterStep
1396
				.NewNonAuditedInstance(stepName, sql, 99);
1397
		stepList.add(step);
1398

    
1399
	}
1400

    
1401
	private void updateAbbrevTitle(List<ISchemaUpdaterStep> stepList) {
1402
		String tableName = "Reference";
1403

    
1404
		String stepName = "Update abbrevTitleCache for protected title caches with title";
1405
		String query = " UPDATE @@Reference@@ "
1406
				+ " SET abbrevTitle = left(title, 255), abbrevTitleCache = titleCache, protectedAbbrevTitleCache = protectedTitleCache";
1407
		// + " WHERE r.title IS NOT NULL AND r.protectedTitleCache = 1 ";
1408
		ISchemaUpdaterStep step = SimpleSchemaUpdaterStep
1409
				.NewNonAuditedInstance(stepName, query, 99)
1410
					.setDefaultAuditing(tableName);
1411
		stepList.add(step);
1412

    
1413
		// stepName =
1414
		// "Update abbrevTitleCache for protected title caches with no title";
1415
		// query = " UPDATE Reference r " +
1416
		// " SET r.abbrevTitleCache = r.titleCache, r.protectedAbbrevTitleCache = r.protectedTitleCache"
1417
		// +
1418
		// " WHERE r.title IS NULL AND r.protectedTitleCache = 1 ";
1419
		// step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1420
		// query).setAuditing("Reference");
1421
		// stepList.add(step);
1422

    
1423
		// stepName =
1424
		// "Update abbrevTitleCache for protected title caches with title";
1425
		// query = " UPDATE Reference r " +
1426
		// " SET r.abbrevTitle = r.title, r.abbrevTitleCache = r.titleCache, r.protectedAbbrevTitleCache = r.protectedTitleCache"
1427
		// +
1428
		// " WHERE r.title IS NOT NULL AND r.protectedTitleCache = 0 ";
1429
		// step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1430
		// query).setAuditing("Reference");
1431
		// stepList.add(step);
1432

    
1433
		stepName = "Update reference title, set null where abbrev title very likely";
1434
		query = " UPDATE @@Reference@@ "
1435
				+ " SET title = NULL "
1436
				+ " WHERE title IS NOT NULL AND protectedTitleCache = @FALSE@ AND "
1437
				+ " ( LENGTH(title) <= 15 AND title like '%.%.%' OR LENGTH(title) < 30 AND title like '%.%.%.%' OR LENGTH(title) < 45 AND title like '%.%.%.%.%' OR LENGTH(title) < 60 AND title like '%.%.%.%.%.%' "
1438
				+ ")";
1439
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1440
				.setDefaultAuditing(tableName);
1441
		stepList.add(step);
1442

    
1443
		stepName = "Update reference abbrevTitle, set null where abbrev title very unlikely";
1444
		query = " UPDATE @@Reference@@ "
1445
				+ " SET abbrevTitle = NULL "
1446
				+ " WHERE title IS NOT NULL AND protectedTitleCache = @FALSE@ AND "
1447
				+ " ( title NOT like '%.%' OR LENGTH(title) > 30 AND title NOT like '%.%.%' "
1448
				+ ")";
1449
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1450
				.setDefaultAuditing(tableName);
1451
		stepList.add(step);
1452

    
1453
	}
1454

    
1455
	private void removeOldSequenceColumns(List<ISchemaUpdaterStep> stepList) {
1456

    
1457
		// remove citation microreference
1458
		String stepName = "Remove citationmicroreference column";
1459
		String tableName = "Sequence";
1460
		String columnName = "citationMicroReference";
1461
		ISchemaUpdaterStep step = ColumnRemover.NewInstance(stepName,
1462
				tableName, columnName, INCLUDE_AUDIT);
1463
		stepList.add(step);
1464

    
1465
		// remove datesequenced
1466
		stepName = "Remove datesequenced column";
1467
		columnName = "datesequenced";
1468
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1469
				INCLUDE_AUDIT);
1470
		stepList.add(step);
1471

    
1472
		// remove length
1473
		stepName = "Remove length column";
1474
		columnName = "length";
1475
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1476
				INCLUDE_AUDIT);
1477
		stepList.add(step);
1478

    
1479
		// remove sequence
1480
		stepName = "Remove sequence column";
1481
		columnName = "sequence";
1482
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1483
				INCLUDE_AUDIT);
1484
		stepList.add(step);
1485

    
1486
		// remove locus_id
1487
		stepName = "Remove locus_id column";
1488
		columnName = "locus_id";
1489
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1490
				INCLUDE_AUDIT);
1491
		stepList.add(step);
1492

    
1493
		// remove publishedin_id
1494
		stepName = "Remove publishedin_id column";
1495
		columnName = "publishedin_id";
1496
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1497
				INCLUDE_AUDIT);
1498
		stepList.add(step);
1499

    
1500
		// remove barcode
1501
		stepName = "Remove barcode column";
1502
		columnName = "barcode";
1503
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1504
				INCLUDE_AUDIT);
1505
		stepList.add(step);
1506

    
1507
		// identifiable columns
1508
		// remove lsid_authority
1509
		stepName = "Remove lsid_authority";
1510
		columnName = "lsid_authority";
1511
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1512
				INCLUDE_AUDIT);
1513
		stepList.add(step);
1514

    
1515
		// remove lsid_lsid
1516
		stepName = "Remove lsid_lsid";
1517
		columnName = "lsid_lsid";
1518
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1519
				INCLUDE_AUDIT);
1520
		stepList.add(step);
1521

    
1522
		// remove lsid_namespace
1523
		stepName = "Remove lsid_namespace";
1524
		columnName = "lsid_namespace";
1525
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1526
				INCLUDE_AUDIT);
1527
		stepList.add(step);
1528

    
1529
		// remove lsid_object
1530
		stepName = "Remove lsid_object";
1531
		columnName = "lsid_object";
1532
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1533
				INCLUDE_AUDIT);
1534
		stepList.add(step);
1535

    
1536
		// remove lsid_revision
1537
		stepName = "Remove lsid_revision";
1538
		columnName = "lsid_revision";
1539
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1540
				INCLUDE_AUDIT);
1541
		stepList.add(step);
1542

    
1543
		// remove protectedTitleCache
1544
		stepName = "Remove protectedTitleCache";
1545
		columnName = "protectedTitleCache";
1546
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1547
				INCLUDE_AUDIT);
1548
		stepList.add(step);
1549

    
1550
		// remove titleCache
1551
		stepName = "Remove titleCache";
1552
		columnName = "titleCache";
1553
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
1554
				INCLUDE_AUDIT);
1555
		stepList.add(step);
1556

    
1557
	}
1558

    
1559
	private void updateIdInVocabulary(List<ISchemaUpdaterStep> stepList) {
1560
		String tableName = "DefinedTermBase";
1561

    
1562
		//NOT ANSI  - works with MySQL http://stackoverflow.com/questions/1293330/how-can-i-do-an-update-statement-with-join-in-sql
1563
//		String queryVocUuid = " UPDATE @@DefinedTermBase@@ dtb INNER JOIN @@TermVocabulary@@ voc ON voc.id = dtb.vocabulary_id"
1564
//				+ " SET dtb.idInVocabulary = (SELECT abbreviatedlabel "
1565
//				+ " FROM @@DefinedTermBase_Representation@@ MN "
1566
//				+ " INNER JOIN @@Representation@@ r ON r.id = MN.representations_id "
1567
//				+ " WHERE MN.DefinedTermBase_id = dtb.id) "
1568
//				+ " WHERE voc.uuid = '%s'";
1569

    
1570
		//ANSI - SQL
1571
		String queryVocUuid = " UPDATE @@DefinedTermBase@@ "
1572
				+ " SET idInVocabulary = " +
1573
					" (SELECT abbreviatedlabel "
1574
					+ " FROM @@DefinedTermBase_Representation@@ MN "
1575
					+ " INNER JOIN @@Representation@@ r ON r.id = MN.representations_id "
1576
					+ " WHERE MN.DefinedTermBase_id = @@DefinedTermBase@@.id) "
1577
				+ " WHERE EXISTS (SELECT * FROM @@TermVocabulary@@ voc WHERE voc.id = @@DefinedTermBase@@.vocabulary_id " +
1578
						" AND voc.uuid = '%s') ";
1579

    
1580

    
1581
		// Languages (ISO)
1582
		String stepName = "Update idInVocabulary for Languages ";
1583
//		String query = "UPDATE @@DefinedTermBase@@ dtb INNER JOIN @@TermVocabulary@@ voc ON voc.id = dtb.vocabulary_id "
1584
//				+ " SET dtb.idInVocabulary = dtb.iso639_2 "
1585
//				+ " WHERE voc.uuid = '45ac7043-7f5e-4f37-92f2-3874aaaef2de' ";
1586
		String query = "UPDATE @@DefinedTermBase@@ "
1587
				+ " SET idInVocabulary = iso639_2 "
1588
				+ " WHERE EXISTS (SELECT * FROM @@TermVocabulary@@ voc WHERE voc.id = @@DefinedTermBase@@.vocabulary_id " +
1589
						" AND voc.uuid = '45ac7043-7f5e-4f37-92f2-3874aaaef2de') ";
1590
		ISchemaUpdaterStep step = SimpleSchemaUpdaterStep
1591
				.NewNonAuditedInstance(stepName, query, 99).setDefaultAuditing(
1592
						tableName); // not fully correct as we should join with
1593
									// TermVoc_AUD but good enough for this usecase
1594
		stepList.add(step);
1595

    
1596
		// Undefined Languages => all
1597
		stepName = "Update idInVocabulary for undefined languages";
1598
		String uuid = "7fd1e6d0-2e76-4dfa-bad9-2673dd042c28";
1599
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1600
				String.format(queryVocUuid, uuid), 99)
1601
				.setDefaultAuditing(tableName);
1602
		stepList.add(step);
1603

    
1604
		// Waterbody & Country => all
1605
		stepName = "Update idInVocabulary for WaterbodyOrCountries";
1606
		uuid = "006b1870-7347-4624-990f-e5ed78484a1a";
1607
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1608
				String.format(queryVocUuid, uuid), 99)
1609
				.setDefaultAuditing(tableName);
1610
		stepList.add(step);
1611

    
1612
		// TdwgAreas => all
1613
		stepName = "Update idInVocabulary for TDWG areas";
1614
		uuid = NamedArea.uuidTdwgAreaVocabulary.toString();
1615
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1616
				String.format(queryVocUuid, uuid), 99)
1617
				.setDefaultAuditing(tableName);
1618
		stepList.add(step);
1619

    
1620
		// Rank => some
1621
		stepName = "Update idInVocabulary for ranks";
1622
		uuid = "ef0d1ce1-26e3-4e83-b47b-ca74eed40b1b";
1623
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1624
				String.format(queryVocUuid, uuid), 99)
1625
				.setDefaultAuditing(tableName);
1626
		stepList.add(step);
1627

    
1628
		// avoid duplicate for section (bot.)
1629
		stepName = "Update idInVoc for section (bot.)";
1630
		String sql = " UPDATE @@DefinedTermBase@@ " +
1631
				" SET idInVocabulary = 'sect.(bot.)' " +
1632
				" WHERE uuid = '3edff68f-8527-49b5-bf91-7e4398bb975c'";
1633
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1634
				"DefinedTermBase", 99);
1635
		stepList.add(step);
1636

    
1637
		// avoid duplicate for subsection (bot.)
1638
		stepName = "Update idInVoc for subsection (bot.)";
1639
		sql = " UPDATE @@DefinedTermBase@@ " +
1640
				" SET idInVocabulary = 'subsect.(bot.)' " +
1641
				" WHERE uuid = 'd20f5b61-d463-4448-8f8a-c1ff1f262f59'";
1642
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1643
				"DefinedTermBase", 99);
1644
		stepList.add(step);
1645

    
1646
		// avoid duplicate for section (zool.)
1647
		stepName = "Update idInVoc for section (zool.)";
1648
		sql = " UPDATE @@DefinedTermBase@@ SET idInVocabulary = 'sect.(zool.)' WHERE uuid = '691d371e-10d7-43f0-93db-3d7fa1a62c54'";
1649
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1650
				"DefinedTermBase", 99);
1651
		stepList.add(step);
1652

    
1653
		// avoid duplicate for subsection (zool.)
1654
		stepName = "Update idInVoc for subsection (zool.)";
1655
		sql = " UPDATE @@DefinedTermBase@@ SET idInVocabulary = 'subsect.(zool.)' WHERE uuid = '0ed32d28-adc4-4303-a9ca-68e2acd67e33'";
1656
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1657
				"DefinedTermBase", 99);
1658
		stepList.add(step);
1659

    
1660
		// SpecimenTypeDesignationStatus => all
1661
		stepName = "Update idInVocabulary for SpecimenTypeDesignationStatus";
1662
		uuid = "ab177bd7-d3c8-4e58-a388-226fff6ba3c2";
1663
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1664
				String.format(queryVocUuid, uuid), 99)
1665
				.setDefaultAuditing(tableName);
1666
		stepList.add(step);
1667

    
1668
		// avoid duplicate for PT
1669
		stepName = "Update idInVoc for Phototype (PhT) to avoid duplicate for PT";
1670
		sql = " UPDATE @@DefinedTermBase@@ SET idInVocabulary = 'PhT' WHERE uuid = 'b7807acc-f559-474e-ad4a-e7a41e085e34'";
1671
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1672
				"DefinedTermBase", 99);
1673
		stepList.add(step);
1674

    
1675
		// NameTypeDesignationStatus => all
1676
		stepName = "Update idInVocabulary for NameTypeDesignationStatus";
1677
		uuid = "ab60e738-4d09-4c24-a1b3-9466b01f9f55";
1678
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1679
				String.format(queryVocUuid, uuid), 99)
1680
				.setDefaultAuditing(tableName);
1681
		stepList.add(step);
1682

    
1683
		// NomenclaturalStatusType => all, abbrevs.
1684
		stepName = "Update idInVocabulary for NomenclaturalStatusType";
1685
		uuid = "bb28cdca-2f8a-4f11-9c21-517e9ae87f1f";
1686
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1687
				String.format(queryVocUuid, uuid), 99)
1688
				.setDefaultAuditing(tableName);
1689
		stepList.add(step);
1690

    
1691
		// TaxonRelationshipType, all but 2 (Invalid Designation for, Misapplied
1692
		// Name for)
1693
		stepName = "Update idInVocabulary for TaxonRelationshipType";
1694
		uuid = "15db0cf7-7afc-4a86-a7d4-221c73b0c9ac";
1695
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1696
				String.format(queryVocUuid, uuid), 99)
1697
				.setDefaultAuditing(tableName);
1698
		stepList.add(step);
1699

    
1700
		// avoid duplicate for Misapplied Name (remove '-')
1701
		stepName = "Update idInVoc for Misapplied Name Relationship";
1702
		sql = " UPDATE @@DefinedTermBase@@ SET idInVocabulary = NULL WHERE uuid = '1ed87175-59dd-437e-959e-0d71583d8417'";
1703
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1704
				"DefinedTermBase", 99);
1705
		stepList.add(step);
1706

    
1707
		// avoid duplicate for Invalid designation (remove '-')
1708
		stepName = "Update idInVoc for Invalid Designation";
1709
		sql = " UPDATE @@DefinedTermBase@@ SET idInVocabulary = NULL WHERE uuid = '605b1d01-f2b1-4544-b2e0-6f08def3d6ed'";
1710
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1711
				"DefinedTermBase", 99);
1712
		stepList.add(step);
1713

    
1714
		// PresenceTerm => all
1715
		stepName = "Update idInVocabulary for PresenceTerm";
1716
		uuid = "adbbbe15-c4d3-47b7-80a8-c7d104e53a05";
1717
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1718
				String.format(queryVocUuid, uuid), 99)
1719
				.setDefaultAuditing(tableName);
1720
		stepList.add(step);
1721

    
1722
		// AbsenceTerm => all
1723
		stepName = "Update idInVocabulary for AbsenceTerm";
1724
		uuid = "5cd438c8-a8a1-4958-842e-169e83e2ceee";
1725
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1726
				String.format(queryVocUuid, uuid), 99)
1727
				.setDefaultAuditing(tableName);
1728
		stepList.add(step);
1729

    
1730
		// Sex => all
1731
		stepName = "Update idInVocabulary for Sex";
1732
		uuid = "9718b7dd-8bc0-4cad-be57-3c54d4d432fe";
1733
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1734
				String.format(queryVocUuid, uuid), 99)
1735
				.setDefaultAuditing(tableName);
1736
		stepList.add(step);
1737

    
1738
		// ExtensionType => all
1739
		stepName = "Update idInVocabulary for ExtensionType";
1740
		uuid = "117cc307-5bd4-4b10-9b2f-2e14051b3b20";
1741
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1742
				String.format(queryVocUuid, uuid), 99)
1743
				.setDefaultAuditing(tableName);
1744
		stepList.add(step);
1745

    
1746
		// ReferenceSystem => all
1747
		stepName = "Update idInVocabulary for ReferenceSystem";
1748
		uuid = "ec6376e5-0c9c-4f5c-848b-b288e6c17a86";
1749
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1750
				String.format(queryVocUuid, uuid), 99)
1751
				.setDefaultAuditing(tableName);
1752
		stepList.add(step);
1753

    
1754
		// DeterminationModifier => all
1755
		stepName = "Update idInVocabulary for DeterminationModifier";
1756
		uuid = "fe87ea8d-6e0a-4e5d-b0da-0ab8ea67ca77";
1757
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName,
1758
				String.format(queryVocUuid, uuid), 99)
1759
				.setDefaultAuditing(tableName);
1760
		stepList.add(step);
1761

    
1762
		// InstitutionType, MeasurementUnit, Scope, Stage, State, TextFormat,
1763
		// Modifier, PreservationMethod => dummies
1764
		stepName = "Update idInVocabulary for dummy terms in several vocabularies";
1765
		query = " UPDATE @@DefinedTermBase@@ "
1766
				+ " SET idInVocabulary = (SELECT abbreviatedlabel "
1767
					+ " FROM @@DefinedTermBase_Representation@@ MN "
1768
					+ " INNER JOIN @@Representation@@ r ON r.id = MN.representations_id "
1769
					+ " WHERE MN.DefinedTermBase_id = @@DefinedTermBase@@.id) "
1770
				+ " WHERE termType IN ('%s','%s','%s','%s','%s','%s','%s','%s')";
1771
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(
1772
				stepName,
1773
				String.format(query, TermType.InstitutionType.getKey(),
1774
						TermType.MeasurementUnit.getKey(),
1775
						TermType.Scope.getKey(), TermType.Stage.getKey(),
1776
						TermType.State.getKey(), TermType.TextFormat.getKey(),
1777
						TermType.Modifier.getKey(), TermType.Method.getKey()), 99)
1778
				.setDefaultAuditing(tableName);
1779
		stepList.add(step);
1780

    
1781
		stepName = "Update idInVocabulary for dummy state";
1782
		query = " UPDATE @@DefinedTermBase@@ "
1783
				+ " SET idinvocabulary = 'std' "
1784
				+ " WHERE uuid = '881b9c80-626d-47a6-b308-a63ee5f4178f' ";
1785
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99);
1786
		stepList.add(step);
1787

    
1788
		stepName = "Update idInVocabulary for dummy stage";
1789
		query = " UPDATE @@DefinedTermBase@@ "
1790
				+ " SET idinvocabulary = 'sgd' "
1791
				+ " WHERE uuid = '48f8e8a7-a2ac-4974-9ce8-6944afc5095e' ";
1792
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99);
1793
		stepList.add(step);
1794

    
1795
		stepName = "Update idInVocabulary for dummy modifier";
1796
		query = " UPDATE @@DefinedTermBase@@ "
1797
				+ " SET idinvocabulary = 'md' "
1798
				+ " WHERE uuid = 'efc38dad-205c-4028-ad9d-ae509a14b37a' ";
1799
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99);
1800
		stepList.add(step);
1801

    
1802
		// Remove state dummy
1803
		stepName = "Remove state dummy if possible";
1804
		uuid = "881b9c80-626d-47a6-b308-a63ee5f4178f";
1805
		String checkUsed = " SELECT count(*) as n FROM @@StateData@@ sd "
1806
				+ " WHERE sd.state_id = %d ";
1807
		step = SingleTermRemover.NewInstance(stepName, uuid, checkUsed, 99);
1808
		stepList.add(step);
1809

    
1810
		// Remove institution type dummy
1811
		stepName = "Remove institution type dummy term";
1812
		uuid = "bea94a6c-472b-421c-abc1-52f797c51dbf";
1813
		checkUsed = " SELECT count(*) as n FROM @@AgentBase_DefinedTermBase@@ MN "
1814
				+ " WHERE MN.types_id = %d ";
1815
		step = SingleTermRemover.NewInstance(stepName, uuid, checkUsed, 99);
1816
		stepList.add(step);
1817

    
1818
		// Remove measurement unit dummy
1819
		stepName = "Remove measurement unit dummy term";
1820
		uuid = "e19dd590-5be8-4c93-978f-b78554116289";
1821
		checkUsed = " SELECT count(*) as n FROM @@DescriptionElementBase@@ deb "
1822
				+ " WHERE deb.unit_id = %d ";
1823
		step = SingleTermRemover.NewInstance(stepName, uuid, checkUsed, 99);
1824
		stepList.add(step);
1825

    
1826
		// Remove scope dummy
1827
		stepName = "Remove scope dummy term";
1828
		uuid = "2ace7f1f-4ce6-47e1-8a65-e3f6b724876c";
1829
		checkUsed = " SELECT count(*) as n FROM @@DescriptionBase_Scope@@ MN "
1830
				+ " WHERE MN.scopes_id = %d ";
1831
		step = SingleTermRemover.NewInstance(stepName, uuid, checkUsed, 99);
1832
		stepList.add(step);
1833

    
1834
		// Remove stage dummy
1835
		stepName = "Remove stage dummy term";
1836
		uuid = "48f8e8a7-a2ac-4974-9ce8-6944afc5095e";
1837
		checkUsed = " SELECT count(*) as n FROM @@DescriptionBase_Scope@@ MN "
1838
				+ " WHERE MN.scopes_id = %d ";
1839
		String checkUsed2 = " SELECT count(*) as n FROM @@SpecimenOrObservationBase@@ osb "
1840
				+ " WHERE osb.lifestage_id =  %d ";
1841
		step = SingleTermRemover.NewInstance(stepName, uuid, checkUsed, 99)
1842
				.addCheckUsedQuery(checkUsed2, 99);
1843
		stepList.add(step);
1844

    
1845
		// Remove text format dummy
1846
		stepName = "Remove text format dummy if possible";
1847
		uuid = "5d095782-d99c-46bc-a158-edb2e47c9b63";
1848
		checkUsed = " SELECT count(*) as n FROM @@DescriptionElementBase@@ deb "
1849
				+ " WHERE deb.format_id = %d ";
1850
		step = SingleTermRemover.NewInstance(stepName, uuid, checkUsed, 99);
1851
		stepList.add(step);
1852

    
1853
		// Remove modifier dummy
1854
		stepName = "Remove modifier dummy if possible";
1855
		uuid = "efc38dad-205c-4028-ad9d-ae509a14b37a";
1856
		checkUsed = " SELECT count(*) as n FROM @@DescriptionElementBase_Modifier@@ MN "
1857
				+ " WHERE MN.modifiers_id = %d ";
1858
		checkUsed2 = " SELECT count(*) as n FROM @@StateData_DefinedTermBase@@ MN "
1859
				+ " WHERE MN.modifiers_id = %d ";
1860
		String checkUsed3 = " SELECT count(*) as n FROM @@StatisticalMeasurementValue_DefinedTermBase@@ MN "
1861
				+ " WHERE MN.modifiers_id = %d ";
1862
		step = SingleTermRemover.NewInstance(stepName, uuid, checkUsed, 99)
1863
				.addCheckUsedQuery(checkUsed2, 99).addCheckUsedQuery(checkUsed3, 99);
1864
		stepList.add(step);
1865

    
1866
		// Remove text preservation method dummy
1867
		stepName = "Remove preservation method dummy if possible";
1868
		uuid = "3edc2633-365b-4a9b-bc3a-f3f85f59dbdf";
1869
		checkUsed = " SELECT count(*) as n FROM @@SpecimenOrObservationBase@@ osb "
1870
				+ " WHERE osb.preservation_id =  %d ";
1871
		step = SingleTermRemover.NewInstance(stepName, uuid, checkUsed, 99);
1872
		stepList.add(step);
1873

    
1874
		// Split Country Vocabulary #3700
1875
		stepName = "Create Waterbody vocabulary";
1876
		UUID uuidVocabulary = UUID
1877
				.fromString("35a62b25-f541-4f12-a7c7-17d90dec3e03");
1878
		String description = "Major Waterbodies of the World";
1879
		String label = "Waterbody";
1880
		String abbrev = null;
1881
		boolean isOrdered = false;
1882
		TermType termType = TermType.NamedArea;
1883
		Class<?> termClass = NamedArea.class;
1884
		step = VocabularyCreator.NewVocabularyInstance(uuidVocabulary,
1885
				description, label, abbrev, isOrdered, termClass, termType);
1886
		stepList.add(step);
1887

    
1888
		stepName = "Move waterbodies to new vocabulary";
1889
		UUID newVocabulary = UUID.fromString("35a62b25-f541-4f12-a7c7-17d90dec3e03");
1890
		step = TermMover
1891
				.NewInstance(stepName, newVocabulary,
1892
						"aa96ca19-46ab-6365-af29-e4842f13eb4c")
1893
				.addTermUuid(UUID.fromString("36aea55c-46ab-6365-af29-e4842f13eb4c"))
1894
				.addTermUuid(UUID.fromString("36aea55c-892c-6365-af29-e4842f13eb4c"))
1895
				.addTermUuid(UUID.fromString("36aea55c-892c-4114-af29-d4b287f76fab"))
1896
				.addTermUuid(UUID.fromString("aa96ca19-892c-4114-af29-d4b287f76fab"))
1897
				.addTermUuid(UUID.fromString("aa96ca19-892c-4114-a494-d4b287f76fab"))
1898
				.addTermUuid(UUID.fromString("d4cf6c57-892c-4114-bf57-96886eb7108a"))
1899
				.addTermUuid(UUID.fromString("d4cf6c57-892c-c953-a494-96886eb7108a"))
1900
				.addTermUuid(UUID.fromString("aa96ca19-46ab-c953-a494-96886eb7108a"))
1901
				.addTermUuid(UUID.fromString("aa96ca19-46ab-4114-a494-96886eb7108a"));
1902
		stepList.add(step);
1903

    
1904
		// update waterbody uuids #3705 AND waterbody DTYPE to NamedArea and
1905
		// sortindex new #3700
1906
		stepName = "Update waterbody uuids";
1907
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 1, uuid = 'af4271e5-8897-4e6f-9db7-54ea4f28cfc0' WHERE uuid = 'aa96ca19-46ab-6365-af29-e4842f13eb4c' ";
1908
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql, "DefinedTermBase", 99);
1909
		stepList.add(step);
1910
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 2, uuid = '77e79804-1b17-4c99-873b-933fe216e3da' WHERE uuid = '36aea55c-46ab-6365-af29-e4842f13eb4c' ";
1911
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1912
				"DefinedTermBase", 99);
1913
		stepList.add(step);
1914
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 3, uuid = '3d68a327-104c-49d5-a2d8-c71c6600181b' WHERE uuid = '36aea55c-892c-6365-af29-e4842f13eb4c' ";
1915
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1916
				"DefinedTermBase", 99);
1917
		stepList.add(step);
1918
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 4, uuid = 'ff744a37-5990-462c-9c20-1e85a9943851' WHERE uuid = '36aea55c-892c-4114-af29-d4b287f76fab' ";
1919
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1920
				"DefinedTermBase", 99);
1921
		stepList.add(step);
1922
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 5, uuid = 'ef04f363-f67f-4a2c-8d98-110de4c5f654' WHERE uuid = 'aa96ca19-892c-4114-af29-d4b287f76fab' ";
1923
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1924
				"DefinedTermBase", 99);
1925
		stepList.add(step);
1926
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 6, uuid = '8811a47e-29d6-4455-8f83-8916b78a692f' WHERE uuid = 'aa96ca19-892c-4114-a494-d4b287f76fab' ";
1927
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1928
				"DefinedTermBase", 99);
1929
		stepList.add(step);
1930
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 7, uuid = '4cb4bbae-9aab-426c-9025-e34f809165af' WHERE uuid = 'd4cf6c57-892c-4114-bf57-96886eb7108a' ";
1931
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1932
				"DefinedTermBase", 99);
1933
		stepList.add(step);
1934
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 8, uuid = '598fec0e-b93a-4947-a1f3-601e380797f7' WHERE uuid = 'd4cf6c57-892c-c953-a494-96886eb7108a' ";
1935
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1936
				"DefinedTermBase", 99);
1937
		stepList.add(step);
1938
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 9, uuid = 'ee69385e-6c80-405c-be6e-974e9fd1e297' WHERE uuid = 'aa96ca19-46ab-c953-a494-96886eb7108a' ";
1939
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1940
				"DefinedTermBase", 99);
1941
		stepList.add(step);
1942
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'NamedArea', orderindex = 10, uuid = '8dc16e70-74b8-4143-95cf-a659a319a854' WHERE uuid = 'aa96ca19-46ab-4114-a494-96886eb7108a' ";
1943
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1944
				"DefinedTermBase", 99);
1945
		stepList.add(step);
1946

    
1947
		// update DTYPE for country
1948
		stepName = "Update DTYPE for Countries";
1949
		sql = " UPDATE @@DefinedTermBase@@ SET DTYPE = 'Country' WHERE DTYPE = 'WaterbodyOrCountry' ";
1950
		step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, sql,
1951
				"DefinedTermBase", 99);
1952
		stepList.add(step);
1953

    
1954
		// Rename tables
1955
		stepName = "Rename DefinedTermBase_WaterbodyOrCountry";
1956
		String oldName = "DefinedTermBase_WaterbodyOrCountry";
1957
		String newName = "DefinedTermBase_Country";
1958
		step = TableNameChanger.NewInstance(stepName, oldName, newName,
1959
				INCLUDE_AUDIT);
1960
		stepList.add(step);
1961

    
1962
		// rename column
1963
		stepName = "Rename DefinedTermBase_Country.waterbodiesorcountries_id";
1964
		tableName = "DefinedTermBase_Country";
1965
		String oldColumnName = "waterbodiesorcountries_id";
1966
		String newColumnName = "countries_id";
1967
		step = ColumnNameChanger.NewIntegerInstance(stepName, tableName,
1968
				oldColumnName, newColumnName, INCLUDE_AUDIT);
1969
		stepList.add(step);
1970

    
1971
		// NULL for empty strings
1972
		stepName = "Update idInVocabulary, replace empty strings by null";
1973
		query = "Update @@DefinedTermBase@@ dtb SET idInVocabulary = NULL WHERE idInVocabulary = ''";
1974
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1975
				.setDefaultAuditing(tableName);
1976
		stepList.add(step);
1977

    
1978
		// MarkerType, AnnotationType, NamedAreaType, NamedAreaLevel, Feature,
1979
		// Continent, DerivationEventType, StatisticalMeasure,
1980
		// RightsType,SynonymType & HybridRelationshipType &
1981
		// NameRelationshipType
1982
		// => none
1983

    
1984
		// DnaMarker => yes but no entries
1985

    
1986
		// Clean up empty abbreviated labels in representations
1987
		stepName = "Update abbreviated label, replace empty strings by null";
1988
		query = "UPDATE @@Representation@@ SET abbreviatedLabel = NULL WHERE abbreviatedLabel = ''";
1989
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
1990
				.setDefaultAuditing("Representation"); // AUD not needed
1991
		stepList.add(step);
1992

    
1993
	}
1994

    
1995
	private void updateTermTypesForVocabularies(
1996
			List<ISchemaUpdaterStep> stepList) {
1997
		// vocabularies with terms
1998
		for (TermType termType : TermType.values()) {
1999
			updateTermTypeForVocabularies(stepList, termType);
2000
		}
2001

    
2002
		String tableName = "TermVocabulary";
2003
		// Natural Language Terms
2004
		String stepName = "Updater termType for NaturalLanguageTerms";
2005
		String query = "UPDATE @@TermVocabulary@@ " + " SET termType = '"
2006
				+ TermType.NaturalLanguageTerm.getKey() + "' "
2007
				+ " WHERE uuid = 'fdaba4b0-5c14-11df-a08a-0800200c9a66'";
2008
		ISchemaUpdaterStep step = SimpleSchemaUpdaterStep
2009
				.NewNonAuditedInstance(stepName, query, 99).setDefaultAuditing(
2010
						tableName);
2011
		stepList.add(step);
2012

    
2013
		// remaining vocabularies
2014
		stepName = "Updater termType for remaining vocabularies";
2015
		query = "UPDATE @@TermVocabulary@@ " + " SET termType = '"
2016
				+ TermType.Unknown.getKey() + "' "
2017
				+ " WHERE termType IS NULL";
2018
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2019
				.setDefaultAuditing(tableName);
2020
		stepList.add(step);
2021

    
2022
	}
2023

    
2024
	private void updateTermTypeForVocabularies(
2025
			List<ISchemaUpdaterStep> stepList, TermType termType) {
2026
		String stepName = "Updater vocabulary termType for "
2027
				+ termType.toString();
2028
		String query = "UPDATE @@TermVocabulary@@ "
2029
				+ " SET termType = '"
2030
				+ termType.getKey()
2031
				+ "' "
2032
				+ " WHERE Exists (SELECT * FROM @@DefinedTermBase@@ dtb WHERE dtb.termType = '"
2033
				+ termType.getKey() + "' AND dtb.vocabulary_id = @@TermVocabulary@@.id)";
2034
		ISchemaUpdaterStep step = SimpleSchemaUpdaterStep
2035
				.NewNonAuditedInstance(stepName, query, 99).setDefaultAuditing(
2036
						"TermVocabulary"); // AUD not fully correct as subselect
2037
							// should also work on AUD, good enough for our purposes
2038
		stepList.add(step);
2039
	}
2040

    
2041
	/**
2042
	 * @param stepList
2043
	 * @param stepName
2044
	 */
2045
	private void updateTermTypesForTerms(List<ISchemaUpdaterStep> stepList) {
2046
		String stepName = "Update termType for NamedAreas";
2047
		String tableName = "DefinedTermBase";
2048

    
2049
		//NamedArea
2050
		String query = " UPDATE @@DefinedTermBase@@ " +
2051
				" SET termType = '" + TermType.NamedArea.getKey() + "' " +
2052
				" WHERE DTYPE = '" + NamedArea.class.getSimpleName() + "' OR DTYPE = 'TdwgArea' " +
2053
						"OR DTYPE = 'WaterbodyOrCountry' OR DTYPE = '"+ Country.class.getSimpleName() + "' OR DTYPE = 'Continent' ";
2054
		ISchemaUpdaterStep step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99).setDefaultAuditing(tableName);
2055
		stepList.add(step);
2056

    
2057
		// Lanugage
2058
		stepName = "Update termType for Language";
2059
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2060
				+ TermType.Language.getKey() + "' " + " WHERE DTYPE = '"
2061
				+ Language.class.getSimpleName() + "' ";
2062
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2063
				.setDefaultAuditing(tableName);
2064
		stepList.add(step);
2065

    
2066
		// RANK
2067
		stepName = "Update termType for Rank";
2068
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2069
				+ TermType.Rank.getKey() + "' " + " WHERE DTYPE = '"
2070
				+ Rank.class.getSimpleName() + "' ";
2071
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2072
				.setDefaultAuditing(tableName);
2073
		stepList.add(step);
2074

    
2075
		// Feature
2076
		stepName = "Update termType for Feature";
2077
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2078
				+ TermType.Feature.getKey() + "' " + " WHERE DTYPE = '"
2079
				+ Feature.class.getSimpleName() + "' ";
2080
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2081
				.setDefaultAuditing(tableName);
2082
		stepList.add(step);
2083

    
2084
		// AnnotationType
2085
		stepName = "Update termType for Annotation Type";
2086
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2087
				+ TermType.AnnotationType.getKey() + "' " + " WHERE DTYPE = '"
2088
				+ AnnotationType.class.getSimpleName() + "' ";
2089
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2090
				.setDefaultAuditing(tableName);
2091
		stepList.add(step);
2092

    
2093
		// MarkerType
2094
		stepName = "Update termType for Marker Type";
2095
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2096
				+ TermType.MarkerType.getKey() + "' " + " WHERE DTYPE = '"
2097
				+ MarkerType.class.getSimpleName() + "' ";
2098
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2099
				.setDefaultAuditing(tableName);
2100
		stepList.add(step);
2101

    
2102
		// ExtensionType
2103
		stepName = "Update termType for Extension Type";
2104
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2105
				+ TermType.ExtensionType.getKey() + "' " + " WHERE DTYPE = '"
2106
				+ ExtensionType.class.getSimpleName() + "' ";
2107
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2108
				.setDefaultAuditing(tableName);
2109
		stepList.add(step);
2110

    
2111
		// DerivationEventType
2112
		stepName = "Update termType for DerivationEvent Type";
2113
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2114
				+ TermType.DerivationEventType.getKey() + "' "
2115
				+ " WHERE DTYPE = '"
2116
				+ DerivationEventType.class.getSimpleName() + "' ";
2117
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2118
				.setDefaultAuditing(tableName);
2119
		stepList.add(step);
2120

    
2121
		// PresenceAbsenceTerm
2122
		stepName = "Update termType for PresenceAbsence Term";
2123
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2124
				+ TermType.PresenceAbsenceTerm.getKey() + "' "
2125
				+ " WHERE DTYPE = 'PresenceTerm' OR DTYPE = 'AbsenceTerm'";
2126
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2127
				.setDefaultAuditing(tableName);
2128
		stepList.add(step);
2129

    
2130
		// NomenclaturalStatusType
2131
		stepName = "Update termType for NomenclaturalStatusType";
2132
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2133
				+ TermType.NomenclaturalStatusType.getKey() + "' "
2134
				+ " WHERE DTYPE = '"
2135
				+ NomenclaturalStatusType.class.getSimpleName() + "' ";
2136
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2137
				.setDefaultAuditing(tableName);
2138
		stepList.add(step);
2139

    
2140
		// NameRelationshipType
2141
		stepName = "Update termType for NameRelationship Type";
2142
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2143
				+ TermType.NameRelationshipType.getKey() + "' "
2144
				+ " WHERE DTYPE = '"
2145
				+ NameRelationshipType.class.getSimpleName() + "' ";
2146
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2147
				.setDefaultAuditing(tableName);
2148
		stepList.add(step);
2149

    
2150
		// HybridRelationshipType
2151
		stepName = "Update termType for HybridRelationship Type";
2152
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2153
				+ TermType.HybridRelationshipType.getKey() + "' "
2154
				+ " WHERE DTYPE = '"
2155
				+ HybridRelationshipType.class.getSimpleName() + "' ";
2156
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2157
				.setDefaultAuditing(tableName);
2158
		stepList.add(step);
2159

    
2160
		// SynonymType
2161
		stepName = "Update termType for SynonymRelationship Type";
2162
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2163
				+ TermType.SynonymType.getKey() + "' "
2164
				+ " WHERE DTYPE = '"
2165
				+ SynonymType.class.getSimpleName() + "' ";
2166
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2167
				.setDefaultAuditing(tableName);
2168
		stepList.add(step);
2169

    
2170
		// TaxonRelationshipType
2171
		stepName = "Update termType for TaxonRelationship Type";
2172
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2173
				+ TermType.TaxonRelationshipType.getKey() + "' "
2174
				+ " WHERE DTYPE = '"
2175
				+ TaxonRelationshipType.class.getSimpleName() + "' ";
2176
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2177
				.setDefaultAuditing(tableName);
2178
		stepList.add(step);
2179

    
2180
		// NameTypeDesignationStatus
2181
		stepName = "Update termType for NameTypeDesignationStatus";
2182
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2183
				+ TermType.NameTypeDesignationStatus.getKey() + "' "
2184
				+ " WHERE DTYPE = '"
2185
				+ NameTypeDesignationStatus.class.getSimpleName() + "' ";
2186
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2187
				.setDefaultAuditing(tableName);
2188
		stepList.add(step);
2189

    
2190
		// SpecimenTypeDesignationStatus
2191
		stepName = "Update termType for SpecimenTypeDesignationStatus";
2192
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2193
				+ TermType.SpecimenTypeDesignationStatus.getKey() + "' "
2194
				+ " WHERE DTYPE = '"
2195
				+ SpecimenTypeDesignationStatus.class.getSimpleName() + "' ";
2196
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2197
				.setDefaultAuditing(tableName);
2198
		stepList.add(step);
2199

    
2200
		// InstitutionType
2201
		stepName = "Update termType for Institution Type";
2202
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2203
				+ TermType.InstitutionType.getKey() + "' "
2204
				+ " WHERE DTYPE = 'InstitutionType' ";
2205
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2206
				.setDefaultAuditing(tableName);
2207
		stepList.add(step);
2208

    
2209
		// NamedAreaType
2210
		stepName = "Update termType for NamedArea Type";
2211
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2212
				+ TermType.NamedAreaType.getKey() + "' " + " WHERE DTYPE = '"
2213
				+ NamedAreaType.class.getSimpleName() + "' ";
2214
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2215
				.setDefaultAuditing(tableName);
2216
		stepList.add(step);
2217

    
2218
		// NamedAreaLevel
2219
		stepName = "Update termType for NamedArea Level";
2220
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2221
				+ TermType.NamedAreaLevel.getKey() + "' " + " WHERE DTYPE = '"
2222
				+ NamedAreaLevel.class.getSimpleName() + "' ";
2223
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2224
				.setDefaultAuditing(tableName);
2225
		stepList.add(step);
2226

    
2227
		// RightsType
2228
		stepName = "Update termType for Rights Type";
2229
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2230
				+ TermType.RightsType.getKey() + "' "
2231
				+ " WHERE DTYPE = 'RightsType' OR DTYPE = 'RightsTerm' ";
2232
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2233
				.setDefaultAuditing(tableName);
2234
		stepList.add(step);
2235

    
2236
		// MeasurementUnit
2237
		stepName = "Update termType for MeasurementUnit";
2238
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2239
				+ TermType.MeasurementUnit.getKey() + "' " + " WHERE DTYPE = '"
2240
				+ MeasurementUnit.class.getSimpleName() + "' ";
2241
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2242
				.setDefaultAuditing(tableName);
2243
		stepList.add(step);
2244

    
2245
		// StatisticalMeasure
2246
		stepName = "Update termType for Statistical Measure";
2247
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2248
				+ TermType.StatisticalMeasure.getKey() + "' "
2249
				+ " WHERE DTYPE = '" + StatisticalMeasure.class.getSimpleName()
2250
				+ "' ";
2251
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2252
				.setDefaultAuditing(tableName);
2253
		stepList.add(step);
2254

    
2255
		// PreservationMethod
2256
		stepName = "Update termType for Preservation Method";
2257
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2258
				+ TermType.Method.getKey() + "' " + " WHERE DTYPE = '"
2259
				+ PreservationMethod.class.getSimpleName() + "' ";
2260
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2261
				.setDefaultAuditing(tableName);
2262
		stepList.add(step);
2263

    
2264
		// Modifier
2265
		stepName = "Update termType for Modifier";
2266
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2267
				+ TermType.Modifier.getKey() + "' "
2268
				+ " WHERE DTYPE = 'Modifier' ";
2269
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2270
				.setDefaultAuditing(tableName);
2271
		stepList.add(step);
2272

    
2273
		// Scope
2274
		stepName = "Update termType for Scope";
2275
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2276
				+ TermType.Scope.getKey() + "' " + " WHERE DTYPE = 'Scope' ";
2277
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2278
				.setDefaultAuditing(tableName);
2279
		stepList.add(step);
2280

    
2281
		// Stage
2282
		stepName = "Update termType for Stage";
2283
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2284
				+ TermType.Stage.getKey() + "' " + " WHERE DTYPE = 'Stage' ";
2285
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2286
				.setDefaultAuditing(tableName);
2287
		stepList.add(step);
2288

    
2289
		// Sex
2290
		stepName = "Update termType for Sex";
2291
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2292
				+ TermType.Sex.getKey() + "' " + " WHERE DTYPE = 'Sex' ";
2293
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2294
				.setDefaultAuditing(tableName);
2295
		stepList.add(step);
2296

    
2297
		// ReferenceSystem
2298
		stepName = "Update termType for ReferenceSystem";
2299
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2300
				+ TermType.ReferenceSystem.getKey() + "' " + " WHERE DTYPE = '"
2301
				+ ReferenceSystem.class.getSimpleName() + "' ";
2302
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2303
				.setDefaultAuditing(tableName);
2304
		stepList.add(step);
2305

    
2306
		// State
2307
		stepName = "Update termType for State";
2308
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2309
				+ TermType.State.getKey() + "' " + " WHERE DTYPE = '"
2310
				+ State.class.getSimpleName() + "' ";
2311
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2312
				.setDefaultAuditing(tableName);
2313
		stepList.add(step);
2314

    
2315
		// NaturalLanguageTerm
2316
		stepName = "Update termType for NaturalLanguageTerm";
2317
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2318
				+ TermType.NaturalLanguageTerm.getKey() + "' "
2319
				+ " WHERE DTYPE = '"
2320
				+ NaturalLanguageTerm.class.getSimpleName() + "' ";
2321
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2322
				.setDefaultAuditing(tableName);
2323
		stepList.add(step);
2324

    
2325
		// TextFormat
2326
		stepName = "Update termType for TextFormat";
2327
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2328
				+ TermType.TextFormat.getKey() + "' " + " WHERE DTYPE = '"
2329
				+ TextFormat.class.getSimpleName() + "' ";
2330
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2331
				.setDefaultAuditing(tableName);
2332
		stepList.add(step);
2333

    
2334
		// DeterminationModifier
2335
		stepName = "Update termType for DeterminationModifier";
2336
		query = " UPDATE @@DefinedTermBase@@ " + " SET termType = '"
2337
				+ TermType.DeterminationModifier.getKey() + "' "
2338
				+ " WHERE DTYPE = 'DeterminationModifier' ";
2339
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2340
				.setDefaultAuditing(tableName);
2341
		stepList.add(step);
2342

    
2343
	}
2344

    
2345
	/**
2346
	 * @param stepList
2347
	 */
2348
	private void updateDtypeOfDefinedTerms(List<ISchemaUpdaterStep> stepList) {
2349
		String tableName = "DefinedTermBase";
2350

    
2351
		// update DTYPE for institution type and modifiers (Stage, Scope, Sex,
2352
		// DeterminationModifier, Modifier) -> DefinedTerm
2353
		String stepName = "Update DTYPE for TDWG Areas";
2354
		String query = " UPDATE @@DefinedTermBase@@ "
2355
				+ " SET DTYPE = 'DefinedTerm' "
2356
				+ " WHERE DTYPE = 'Stage' OR DTYPE = 'Scope' OR DTYPE = 'Sex' OR DTYPE = 'DeterminationModifier'  "
2357
				+ " OR DTYPE = 'Modifier' OR DTYPE = 'InstitutionType' ";
2358
		ISchemaUpdaterStep step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2359
				.setDefaultAuditing(tableName);
2360
		stepList.add(step);
2361

    
2362
		// update DTYPE for TDWG Areas and Continents -> NamedArea
2363
		stepName = "Update DTYPE for TDWG Areas and Continents";
2364
		query = " UPDATE @@DefinedTermBase@@ " + " SET DTYPE = 'NamedArea' "
2365
				+ " WHERE DTYPE = 'TdwgArea' OR DTYPE = 'Continent' ";
2366
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2367
				.setDefaultAuditing(tableName);
2368
		stepList.add(step);
2369

    
2370
	}
2371

    
2372
	/**
2373
	 * @param stepList
2374
	 */
2375
	private void changeUriType(List<ISchemaUpdaterStep> stepList) {
2376
		// #3345
2377
		String stepName;
2378
		String tableName;
2379
		ISchemaUpdaterStep step;
2380
		String columnName;
2381

    
2382
		stepName = "Update uri to clob for DefinedTermBase";
2383
		tableName = "DefinedTermBase";
2384
		columnName = "uri";
2385
		step = ColumnTypeChanger.NewClobInstance(stepName, tableName,
2386
				columnName, INCLUDE_AUDIT);
2387
		stepList.add(step);
2388

    
2389
		stepName = "Update uri to clob for TermVocabulary";
2390
		tableName = "TermVocabulary";
2391
		columnName = "uri";
2392
		step = ColumnTypeChanger.NewClobInstance(stepName, tableName,
2393
				columnName, INCLUDE_AUDIT);
2394
		stepList.add(step);
2395

    
2396
		// are uri and termsourceuri needed -> see #3955
2397
		stepName = "Update termsourceuri to clob for TermVocabulary";
2398
		tableName = "TermVocabulary";
2399
		columnName = "termsourceuri";
2400
		step = ColumnTypeChanger.NewClobInstance(stepName, tableName,
2401
				columnName, INCLUDE_AUDIT);
2402
		stepList.add(step);
2403

    
2404
		stepName = "Update uri to clob for Reference";
2405
		tableName = "Reference";
2406
		columnName = "uri";
2407
		step = ColumnTypeChanger.NewClobInstance(stepName, tableName,
2408
				columnName, INCLUDE_AUDIT);
2409
		stepList.add(step);
2410

    
2411
		stepName = "Update uri to clob for Rights";
2412
		tableName = "Rights";
2413
		columnName = "uri";
2414
		step = ColumnTypeChanger.NewClobInstance(stepName, tableName,
2415
				columnName, INCLUDE_AUDIT);
2416
		stepList.add(step);
2417

    
2418
		stepName = "Update uri to clob for MediaRepresentationPart";
2419
		tableName = "MediaRepresentationPart";
2420
		columnName = "uri";
2421
		step = ColumnTypeChanger.NewClobInstance(stepName, tableName,
2422
				columnName, INCLUDE_AUDIT);
2423
		stepList.add(step);
2424

    
2425
		// still needed??
2426
		stepName = "Update uri to clob for FeatureTree";
2427
		tableName = "FeatureTree";
2428
		columnName = "uri";
2429
		step = ColumnTypeChanger.NewClobInstance(stepName, tableName,
2430
				columnName, INCLUDE_AUDIT);
2431
		stepList.add(step);
2432

    
2433
		// Annotation.linkbackUri (change from URL to URI)
2434
		stepName = "Update url to uri (->clob) for Annotation.linkbackUri";
2435
		tableName = "Annotation";
2436
		columnName = "linkbackUrl";
2437
		step = ColumnTypeChanger.NewClobInstance(stepName, tableName,
2438
				columnName, INCLUDE_AUDIT);
2439
		stepList.add(step);
2440

    
2441
	}
2442

    
2443
	/**
2444
	 * @param stepList
2445
	 * @return
2446
	 */
2447
	private void addTimeperiodToDescriptionElement(
2448
			List<ISchemaUpdaterStep> stepList) {
2449
		String stepName;
2450
		String tableName;
2451
		ISchemaUpdaterStep step;
2452
		String columnName;
2453
		// start #3312
2454
		stepName = "Create time period start column in description element base";
2455
		tableName = "DescriptionElementBase";
2456
		columnName = "timeperiod_start";
2457
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
2458
				INCLUDE_AUDIT);
2459
		stepList.add(step);
2460

    
2461
		// end #3312
2462
		stepName = "Create time period end column in description element base";
2463
		tableName = "DescriptionElementBase";
2464
		columnName = "timeperiod_end";
2465
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
2466
				INCLUDE_AUDIT);
2467
		stepList.add(step);
2468

    
2469
		// freetext #3312
2470
		stepName = "Create time period freetext column in description element base";
2471
		tableName = "DescriptionElementBase";
2472
		columnName = "timeperiod_freetext";
2473
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
2474
				INCLUDE_AUDIT);
2475
		stepList.add(step);
2476

    
2477
		return;
2478
	}
2479

    
2480
	private void updateElevationMax(List<ISchemaUpdaterStep> stepList) {
2481
		// create column
2482
		String stepName = "Create absoluteElevationMax column";
2483
		String tableName = "GatheringEvent";
2484
		String columnName = "absoluteElevationMax";
2485
		ISchemaUpdaterStep step = ColumnAdder.NewIntegerInstance(stepName,
2486
				tableName, columnName, INCLUDE_AUDIT, false, null);
2487
		stepList.add(step);
2488

    
2489
		String audTableName = "GatheringEvent";
2490
		// update max
2491
		stepName = "Update gathering elevation max";
2492
		// all audits to unknown type
2493
		String query = " UPDATE @@GatheringEvent@@ "
2494
				+ " SET absoluteElevationMax = absoluteElevation + absoluteElevationError,  "
2495
				+ "     absoluteElevation =  absoluteElevation - absoluteElevationError"
2496
				+ " WHERE absoluteElevationError is not null ";
2497
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2498
				.setDefaultAuditing(audTableName);
2499
		stepList.add(step);
2500
		// TODO same for AUD
2501

    
2502
		// remove error column
2503
		stepName = "Remove elevationErrorRadius column";
2504
		tableName = "GatheringEvent";
2505
		columnName = "absoluteElevationError";
2506
		step = ColumnRemover.NewInstance(stepName, tableName, columnName,
2507
				INCLUDE_AUDIT);
2508
		stepList.add(step);
2509

    
2510
		// create column absoluteElevationText
2511
		stepName = "Create absoluteElevationText column";
2512
		tableName = "GatheringEvent";
2513
		columnName = "absoluteElevationText";
2514
		int size = 30;
2515
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
2516
				size, INCLUDE_AUDIT);
2517
		stepList.add(step);
2518

    
2519
		// retype distanceToGround
2520
		stepName = "Rname distanceToGround column";
2521
		tableName = "GatheringEvent";
2522
		String strOldColumnName = "distanceToGround";
2523
		step = ColumnTypeChanger.NewInt2DoubleInstance(stepName, tableName,
2524
				strOldColumnName, INCLUDE_AUDIT);
2525
		stepList.add(step);
2526

    
2527
		// create column distanceToGroundMax
2528
		stepName = "Create distanceToGroundMax column";
2529
		tableName = "GatheringEvent";
2530
		columnName = "distanceToGroundMax";
2531
		step = ColumnAdder.NewDoubleInstance(stepName, tableName, columnName,
2532
				INCLUDE_AUDIT, false);
2533
		stepList.add(step);
2534

    
2535
		// create column distanceToGroundText
2536
		stepName = "Create distanceToGroundText column";
2537
		tableName = "GatheringEvent";
2538
		columnName = "distanceToGroundText";
2539
		size = 30;
2540
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
2541
				size, INCLUDE_AUDIT);
2542
		stepList.add(step);
2543

    
2544
		// retype distanceToGround
2545
		stepName = "Rname distanceToWaterSurface column";
2546
		tableName = "GatheringEvent";
2547
		strOldColumnName = "distanceToWaterSurface";
2548
		step = ColumnTypeChanger.NewInt2DoubleInstance(stepName, tableName,
2549
				strOldColumnName, INCLUDE_AUDIT);
2550
		stepList.add(step);
2551

    
2552
		// create column distanceToWaterSurface
2553
		stepName = "Create distanceToWaterSurfaceMax column";
2554
		tableName = "GatheringEvent";
2555
		columnName = "distanceToWaterSurfaceMax";
2556
		step = ColumnAdder.NewDoubleInstance(stepName, tableName, columnName,
2557
				INCLUDE_AUDIT, false);
2558
		stepList.add(step);
2559

    
2560
		// create column distanceToGroundText
2561
		stepName = "Create distanceToWaterSurfaceText column";
2562
		tableName = "GatheringEvent";
2563
		columnName = "distanceToWaterSurfaceText";
2564
		size = 30;
2565
		step = ColumnAdder.NewStringInstance(stepName, tableName, columnName,
2566
				size, INCLUDE_AUDIT);
2567
		stepList.add(step);
2568

    
2569
	}
2570

    
2571
	/**
2572
	 * @param stepList
2573
	 */
2574
	private void updateOriginalSourceType(List<ISchemaUpdaterStep> stepList) {
2575
		String stepName;
2576
		String typeAttrName = "sourceType";
2577
		ISchemaUpdaterStep step;
2578
		String tableName = "OriginalSourceBase";
2579

    
2580
		// all data to unknown
2581
		stepName = "Update original source type column: set all to unknown";
2582
		String query = String.format("UPDATE @@OriginalSourceBase@@ "
2583
				+ " SET %s = '%s' ", typeAttrName,
2584
				OriginalSourceType.Unknown.getKey());
2585
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2586
				.setDefaultAuditing(tableName);
2587
		stepList.add(step);
2588

    
2589
		// all IMPORTS recognized by idInSOurce and by missing nameInSource
2590
		stepName = "Update original source type column: set to 'import' where possible";
2591
		query = String
2592
				.format("UPDATE @@OriginalSourceBase@@ "
2593
						+ " SET %s = '%s' "
2594
						+ " WHERE "
2595
						+ "((idInSource IS NOT NULL) OR (idNamespace IS NOT NULL))  AND "
2596
						+ "( nameUsedInSource_id IS NULL AND originalNameString IS NULL ) ",
2597
						typeAttrName, OriginalSourceType.Import.getKey());
2598
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2599
				.setDefaultAuditing(tableName);
2600
		stepList.add(step);
2601

    
2602
		// all PRIMARY TAXONOMIC SOURCES recognized by missing idInSource and
2603
		// namespace and by existing citation
2604
		stepName = "Update original source type column: set to 'primary taxonomic source' where possible";
2605
		query = String.format("UPDATE @@OriginalSourceBase@@ SET  %s = '%s' WHERE "
2606
				+ "(idInSource IS NULL AND idNamespace IS NULL) AND "
2607
				+ "( citation_id IS NOT NULL ) ", typeAttrName,
2608
				OriginalSourceType.PrimaryTaxonomicSource.getKey());
2609
		step = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, 99)
2610
				.setDefaultAuditing(tableName);
2611
		stepList.add(step);
2612
	}
2613

    
2614
	@Override
2615
	public ISchemaUpdater getNextUpdater() {
2616
		return SchemaUpdater_33_331.NewInstance();
2617
	}
2618

    
2619
	@Override
2620
	public ISchemaUpdater getPreviousUpdater() {
2621
		return SchemaUpdater_30_301.NewInstance();
2622
	}
2623

    
2624
}
(3-3/6)