update update script such that no validation errors exist anymore
authorAndreas Müller <a.mueller@bgbm.org>
Tue, 23 Jul 2013 00:46:16 +0000 (00:46 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Tue, 23 Jul 2013 00:46:16 +0000 (00:46 +0000)
.gitattributes
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/MaterialAndMethod.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OriginalSourceBase.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/molecular/Cloning.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/Reference.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ColumnAdder.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ColumnTypeChanger.java [new file with mode: 0644]
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/TableCreator.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v31_33/SchemaUpdater_31_33.java

index edfa647385b5d4dc4f910a8fa976795fb2c59e74..a83d59b8586705ab9af5126d0a03d6b911ada000 100644 (file)
@@ -1251,6 +1251,7 @@ cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/CdmUpdater.jav
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ColumnAdder.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ColumnNameChanger.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ColumnRemover.java -text
+cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ColumnTypeChanger.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/DatabaseTypeNotSupportedException.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ISchemaUpdater.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ISchemaUpdaterStep.java -text
index b46be84546be1512d263b5072b98f4ea66e03508..892c7be3470bcaa5e5936daf8f6ae1de6d0e1c2e 100644 (file)
@@ -9,9 +9,14 @@
 package eu.etaxonomy.cdm.model.common;\r
 \r
 import javax.persistence.Entity;\r
+import javax.persistence.FetchType;\r
+import javax.persistence.ManyToOne;\r
 import javax.xml.bind.annotation.XmlAccessType;\r
 import javax.xml.bind.annotation.XmlAccessorType;\r
+import javax.xml.bind.annotation.XmlElement;\r
+import javax.xml.bind.annotation.XmlIDREF;\r
 import javax.xml.bind.annotation.XmlRootElement;\r
+import javax.xml.bind.annotation.XmlSchemaType;\r
 import javax.xml.bind.annotation.XmlType;\r
 \r
 import org.apache.log4j.Logger;\r
@@ -39,9 +44,14 @@ public class MaterialAndMethod extends AnnotatableEntity {
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(MaterialAndMethod.class);\r
        \r
+    @XmlElement(name = "MaterialMethodTerm")\r
+    @XmlIDREF\r
+    @XmlSchemaType(name = "IDREF")\r
+    @ManyToOne(fetch=FetchType.LAZY)\r
        private DefinedTerm materialMethodTerm;\r
        \r
-       private String materialMethodText;\r
+    @XmlElement(name = "MaterialMethodText")\r
+    private String materialMethodText;\r
 \r
        \r
        \r
index 476d27e1e8ebe26cf12d6839ddc423d4115bdeee..89c561adff896e33b2cf60ff11978f92b4812b25 100644 (file)
@@ -27,6 +27,7 @@ import org.apache.log4j.Logger;
 import org.hibernate.annotations.Table;
 import org.hibernate.annotations.Type;
 import org.hibernate.envers.Audited;
+import org.hibernate.validator.constraints.Length;
 import org.springframework.util.Assert;
 
 import eu.etaxonomy.cdm.common.CdmUtils;
@@ -64,6 +65,7 @@ public abstract class OriginalSourceBase<T extends ISourceable> extends Referenc
        @XmlAttribute(name ="type")
        @Column(name="sourceType")
        @NotNull
+       @Length(max=4)
     @Type(type = "eu.etaxonomy.cdm.hibernate.EnumUserType",
        parameters = {@org.hibernate.annotations.Parameter(name="enumClass", value="eu.etaxonomy.cdm.model.common.OriginalSourceType")}
     )
index 2098744d9d758530ef163f60748235037586fbeb..a576b3165025debefdade28cc2c46eec8d036fc9 100644 (file)
@@ -61,7 +61,11 @@ public class Cloning extends EventBase implements Cloneable{
        private String strain;\r
        \r
        /** @see #getMethod()*/\r
-       private MaterialAndMethod method;\r
+    @XmlElement(name = "Cloning")\r
+    @XmlIDREF\r
+    @XmlSchemaType(name = "IDREF")\r
+    @ManyToOne(fetch=FetchType.LAZY)\r
+    private MaterialAndMethod method;\r
        \r
     /** @see #getForwardPrimer() */\r
     @XmlElement(name = "ForwardPrimer")\r
index 05dd68ae7ef54faf4410a28196bc0bb18ee0bfad..21f20cb697a3da791506dbf206d94fa9b6c506fb 100644 (file)
@@ -140,18 +140,15 @@ public class Reference<S extends IReferenceBaseCacheStrategy> extends Identifiab
        \r
        //Title of the reference\r
        @XmlElement(name ="AbbrevTitle" )\r
-       @Column(length=256, name="abbrevTitle")\r
        @Field\r
        @Match(MatchMode.EQUAL)  //TODO check if this is correct\r
        @NullOrNotEmpty\r
-       @Length(max = 256)\r
+       @Length(max = 255)\r
        private String abbrevTitle;\r
        \r
        //Title of the reference\r
        @XmlElement(name ="AbbrevTitleCache" )\r
-       @Column(length=256, name="abbrevTitleCache")\r
        @Field\r
-       @Lob\r
        @Match(MatchMode.CACHE)\r
     //TODO Val #3379\r
 //     @NotNull\r
index b0eff9a2bbc036f9ad03d16c6d9aa81ded36bd3c..775a5a90bd6b996f9c89b6311e775f43bf8e8530 100644 (file)
@@ -31,6 +31,7 @@ public class ColumnAdder extends SchemaUpdaterStepBase<ColumnAdder> implements I
        private boolean includeAudTable;\r
        private Object defaultValue;\r
        private boolean isNotNull;\r
+\r
        private String referencedTable;\r
 \r
        public static final ColumnAdder NewIntegerInstance(String stepName, String tableName, String newColumnName, boolean includeAudTable, boolean notNull, String referencedTable){\r
@@ -44,6 +45,10 @@ public class ColumnAdder extends SchemaUpdaterStepBase<ColumnAdder> implements I
        public static final ColumnAdder NewTinyIntegerInstance(String stepName, String tableName, String newColumnName, boolean includeAudTable, boolean notNull){\r
                return new ColumnAdder(stepName, tableName, newColumnName, "tinyint", includeAudTable, null, notNull, null);\r
        }\r
+       \r
+       public static final ColumnAdder NewDoubleInstance(String stepName, String tableName, String newColumnName, boolean includeAudTable, boolean notNull){\r
+               return new ColumnAdder(stepName, tableName, newColumnName, "double", includeAudTable, null, notNull, null);\r
+       }\r
 \r
        public static final ColumnAdder NewBooleanInstance(String stepName, String tableName, String newColumnName, boolean includeAudTable, Boolean defaultValue){\r
                return new ColumnAdder(stepName, tableName, newColumnName, "bit", includeAudTable, defaultValue, false, null);\r
@@ -56,6 +61,10 @@ public class ColumnAdder extends SchemaUpdaterStepBase<ColumnAdder> implements I
        public static final ColumnAdder NewStringInstance(String stepName, String tableName, String newColumnName, int length, boolean includeAudTable){\r
                return new ColumnAdder(stepName, tableName, newColumnName, "nvarchar("+length+")", includeAudTable, null, false, null);\r
        }\r
+\r
+       public static final ColumnAdder NewClobInstance(String stepName, String tableName, String newColumnName, boolean includeAudTable){\r
+               return new ColumnAdder(stepName, tableName, newColumnName, "clob", includeAudTable, null, false, null);\r
+       }\r
        \r
        public static final ColumnAdder NewDateTimeInstance(String stepName, String tableName, String newColumnName, boolean includeAudTable){\r
                return new ColumnAdder(stepName, tableName, newColumnName, "datetime", includeAudTable, null, false, null);\r
@@ -72,6 +81,10 @@ public class ColumnAdder extends SchemaUpdaterStepBase<ColumnAdder> implements I
                this.referencedTable = referencedTable;\r
        }\r
 \r
+       public ColumnAdder setNotNull(boolean isNotNull) {\r
+               this.isNotNull = isNotNull;\r
+               return this;\r
+       }\r
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.database.update.SchemaUpdaterStepBase#invoke(eu.etaxonomy.cdm.database.ICdmDataSource, eu.etaxonomy.cdm.common.IProgressMonitor)\r
@@ -146,11 +159,26 @@ public class ColumnAdder extends SchemaUpdaterStepBase<ColumnAdder> implements I
                return updateQuery;\r
        }\r
 \r
-       private String getDatabaseColumnType(ICdmDataSource datasource, String columnType) {\r
+       protected static String getDatabaseColumnType(ICdmDataSource datasource, String columnType) {\r
                String result = columnType;\r
-               if (datasource.getDatabaseType().equals(DatabaseTypeEnum.PostgreSQL)){\r
+               DatabaseTypeEnum dbType = datasource.getDatabaseType();\r
+               //nvarchar\r
+               if (dbType.equals(DatabaseTypeEnum.PostgreSQL)){\r
                        result = result.replace("nvarchar", "varchar");\r
                }\r
+               //CLOB\r
+               if (columnType.equalsIgnoreCase("clob")){\r
+                       //TODO use hibernate dialects\r
+                       if (dbType.equals(DatabaseTypeEnum.MySQL)){\r
+                               result = "longtext";\r
+                       }else if (dbType.equals(DatabaseTypeEnum.H2)){\r
+                               result = "CLOB";  //or NVARCHAR\r
+                       }else if (dbType.equals(DatabaseTypeEnum.PostgreSQL)){\r
+                               result = "text";\r
+                       }else if (dbType.equals(DatabaseTypeEnum.SqlServer2005)){\r
+                               result = "NVARCHAR(MAX)";\r
+                       }\r
+               }\r
                return result;\r
        }\r
        \r
diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ColumnTypeChanger.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ColumnTypeChanger.java
new file mode 100644 (file)
index 0000000..9b890f0
--- /dev/null
@@ -0,0 +1,148 @@
+// $Id$\r
+/**\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.cdm.database.update;\r
+\r
+import java.sql.SQLException;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;\r
+import eu.etaxonomy.cdm.database.DatabaseTypeEnum;\r
+import eu.etaxonomy.cdm.database.ICdmDataSource;\r
+\r
+/**\r
+ * @author a.mueller\r
+ * @date 16.09.2010\r
+ *\r
+ */\r
+public class ColumnTypeChanger extends SchemaUpdaterStepBase<ColumnTypeChanger> implements ISchemaUpdaterStep {\r
+       private static final Logger logger = Logger.getLogger(ColumnTypeChanger.class);\r
+       \r
+       private String tableName;\r
+       private String newColumnName;\r
+       private String oldColumnName;\r
+       private String newColumnType;\r
+       private boolean includeAudTable;\r
+       private Object defaultValue;\r
+       private boolean isNotNull;\r
+       private String referencedTable;\r
+\r
+       \r
+       public static final ColumnTypeChanger NewClobInstance(String stepName, String tableName, String oldColumnName, String newColumnName, boolean includeAudTable){\r
+               return new ColumnTypeChanger(stepName, tableName, oldColumnName, newColumnName, "clob", includeAudTable, null, false, null);\r
+       }\r
+       \r
+       public static final ColumnTypeChanger NewInt2DoubleInstance(String stepName, String tableName, String oldColumnName, String newColumnName, boolean includeAudTable){\r
+               return new ColumnTypeChanger(stepName, tableName, oldColumnName, newColumnName, "double", includeAudTable, null, false, null);\r
+       }\r
+       \r
+       protected ColumnTypeChanger(String stepName, String tableName, String oldColumnName, String newColumnName, String newColumnType, boolean includeAudTable, Object defaultValue, boolean notNull, String referencedTable) {\r
+               super(stepName);\r
+               this.tableName = tableName;\r
+               this.newColumnName = newColumnName;\r
+               this.newColumnType = newColumnType;\r
+               this.oldColumnName =oldColumnName;\r
+               this.includeAudTable = includeAudTable;\r
+               this.defaultValue = defaultValue;\r
+               this.isNotNull = notNull;\r
+               this.referencedTable = referencedTable;\r
+       }\r
+\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.database.update.SchemaUpdaterStepBase#invoke(eu.etaxonomy.cdm.database.ICdmDataSource, eu.etaxonomy.cdm.common.IProgressMonitor)\r
+        */\r
+       @Override\r
+       public Integer invoke(ICdmDataSource datasource, IProgressMonitor monitor) throws SQLException {\r
+               boolean result = true;\r
+               result &= changeColumn(tableName, datasource, monitor);\r
+               if (includeAudTable){\r
+                       String aud = "_AUD";\r
+                       result &= changeColumn(tableName + aud, datasource, monitor);\r
+               }\r
+               return (result == true )? 0 : null;\r
+       }\r
+\r
+       private boolean changeColumn(String tableName, ICdmDataSource datasource, IProgressMonitor monitor) {\r
+               boolean result = true;\r
+               try {\r
+                       String updateQuery = getUpdateQueryString(tableName, datasource, monitor);\r
+                       try {\r
+                               datasource.executeUpdate(updateQuery);\r
+                       } catch (SQLException e) {\r
+                               logger.error(e);\r
+                               result = false;\r
+                       }\r
+                       \r
+                       if (defaultValue instanceof Boolean){\r
+                               updateQuery = "UPDATE @tableName SET @columnName = " + (defaultValue == null ? "null" : getBoolean((Boolean) defaultValue, datasource));\r
+                               updateQuery = updateQuery.replace("@tableName", tableName);\r
+                               updateQuery = updateQuery.replace("@columnName", newColumnName);\r
+                               try {\r
+                                       datasource.executeUpdate(updateQuery);\r
+                               } catch (SQLException e) {\r
+                                       logger.error(e);\r
+                                       result = false;\r
+                               }\r
+                       }\r
+                       if (referencedTable != null){\r
+                               result &= TableCreator.makeForeignKey(tableName, datasource, newColumnName, referencedTable);\r
+                       }\r
+                       \r
+                       return result;\r
+               } catch ( DatabaseTypeNotSupportedException e) {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       public String getUpdateQueryString(String tableName, ICdmDataSource datasource, IProgressMonitor monitor) throws DatabaseTypeNotSupportedException {\r
+               String updateQuery;\r
+               DatabaseTypeEnum type = datasource.getDatabaseType();\r
+               String databaseColumnType = getDatabaseColumnType(datasource, this.newColumnType);\r
+\r
+               if (type.equals(DatabaseTypeEnum.SqlServer2005)){\r
+                       //MySQL allows both syntaxes\r
+                       updateQuery = "ALTER TABLE @tableName ALTER COLUMN @columnName @columnType";\r
+               }else if (type.equals(DatabaseTypeEnum.H2)){\r
+                       updateQuery = "ALTER TABLE @tableName ALTER COLUMN @columnName @columnType";\r
+               }else if (type.equals(DatabaseTypeEnum.PostgreSQL)){\r
+                       updateQuery = "ALTER TABLE @tableName ALTER COLUMN @columnName TYPE @columnType";\r
+               }else if (type.equals(DatabaseTypeEnum.MySQL)){\r
+                       updateQuery = "ALTER TABLE @tableName MODIFY COLUMN @columnName @columnType";\r
+               }else{\r
+                       updateQuery = null;\r
+                       String warning = "Update step '" + this.getStepName() + "' is not supported by " + type.getName();\r
+                       monitor.warning(warning);\r
+                       throw new DatabaseTypeNotSupportedException(warning);\r
+               }\r
+               if (isNotNull){\r
+                       updateQuery += " NOT NULL";\r
+               }\r
+               updateQuery = updateQuery.replace("@tableName", tableName);\r
+               updateQuery = updateQuery.replace("@columnName", newColumnName);\r
+               updateQuery = updateQuery.replace("@columnType", databaseColumnType);\r
+//             updateQuery = updateQuery.replace("@addSeparator", getAddColumnSeperator(datasource));\r
+               \r
+               return updateQuery;\r
+       }\r
+\r
+       private String getDatabaseColumnType(ICdmDataSource datasource, String columnType) {\r
+               return ColumnAdder.getDatabaseColumnType(datasource, columnType);\r
+       }\r
+       \r
+       public String getReferencedTable() {\r
+               return referencedTable;\r
+       }\r
+\r
+       public String getNewColumnName() {\r
+               return newColumnName;\r
+       }\r
+\r
+}\r
index 494cc7d6ced564377b43a3c278e1bc5805908e6e..0308f8b085d75874cebe6700df8aecdbedba3ab1 100644 (file)
@@ -103,7 +103,8 @@ public class TableCreator extends SchemaUpdaterStepBase<TableCreator> implements
                                ColumnAdder adder = ColumnAdder.NewIntegerInstance(this.getStepName(), this.tableName, this.columnNames.get(i), includeAudTable, isNotNull, referencedTable);\r
                                this.columnAdders.add(adder);\r
                        }else if ("boolean".equals(columnTypes.get(i)) || "bit".equals(columnTypes.get(i))){\r
-                               ColumnAdder adder = ColumnAdder.NewBooleanInstance(getStepName(), this.tableName,  this.columnNames.get(i), includeAudTable, Boolean.valueOf(this.defaultValues.get(i).toString()));\r
+                               String defaultValue = this.defaultValues == null ? null : this.defaultValues.get(i).toString();\r
+                               ColumnAdder adder = ColumnAdder.NewBooleanInstance(getStepName(), this.tableName,  this.columnNames.get(i), includeAudTable, Boolean.valueOf(defaultValue));\r
                                this.columnAdders.add(adder);\r
                        }else if (columnTypes.get(i).startsWith("string")){\r
                                Integer length = Integer.valueOf(columnTypes.get(i).substring("string_".length()));\r
@@ -112,6 +113,9 @@ public class TableCreator extends SchemaUpdaterStepBase<TableCreator> implements
                        }else if ("tinyint".equals(columnTypes.get(i)) ){\r
                                ColumnAdder adder = ColumnAdder.NewTinyIntegerInstance(this.getStepName(), this.tableName, this.columnNames.get(i), includeAudTable, isNotNull);\r
                                this.columnAdders.add(adder);\r
+                       }else if ("double".equals(columnTypes.get(i)) ){\r
+                               ColumnAdder adder = ColumnAdder.NewDoubleInstance(this.getStepName(), this.tableName, this.columnNames.get(i), includeAudTable, isNotNull);\r
+                               this.columnAdders.add(adder);\r
                        }\r
                }\r
        }\r
@@ -171,7 +175,7 @@ public class TableCreator extends SchemaUpdaterStepBase<TableCreator> implements
                }\r
                if (this.includeEventBase){\r
                        //TODO handle as column adder\r
-                       updateQuery += "timeperiod_start, timeperiod_end, timeperiod_freetext, actor_id, description varchar(255),";\r
+                       updateQuery += "timeperiod_start varchar(255), timeperiod_end varchar(255), timeperiod_freetext varchar(255), actor_id int, description varchar(255),";\r
                        logger.warn("ForeignKey for actor not yet handled");\r
                }\r
                \r
index b8002e676e86410818332d2dd6ec94d4e7b9f9cf..404114097d838cbe16ad9584ea709eaf3134cbb1 100644 (file)
@@ -18,9 +18,12 @@ import org.apache.log4j.Logger;
 import com.sun.tools.xjc.reader.gbind.Sequence;
 
 import eu.etaxonomy.cdm.database.update.ColumnAdder;
+import eu.etaxonomy.cdm.database.update.ColumnNameChanger;
 import eu.etaxonomy.cdm.database.update.ColumnRemover;
+import eu.etaxonomy.cdm.database.update.ColumnTypeChanger;
 import eu.etaxonomy.cdm.database.update.ISchemaUpdater;
 import eu.etaxonomy.cdm.database.update.ISchemaUpdaterStep;
+import eu.etaxonomy.cdm.database.update.MnTableCreator;
 import eu.etaxonomy.cdm.database.update.SchemaUpdaterBase;
 import eu.etaxonomy.cdm.database.update.SimpleSchemaUpdaterStep;
 import eu.etaxonomy.cdm.database.update.TableCreator;
@@ -38,8 +41,6 @@ import eu.etaxonomy.cdm.model.reference.Reference;
  */
 public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
 
-
-       @SuppressWarnings("unused")
        private static final Logger logger = Logger.getLogger(SchemaUpdater_31_33.class);
        private static final String startSchemaVersion = "3.0.1.0.201104190000";
        private static final String endSchemaVersion = "3.3.0.0.201308010000";
@@ -89,8 +90,8 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                stepName = "Create original source type column";
                tableName = "OriginalSourceBase";
                String columnName = "sourceType";
-               //TODO NOT NULL unclear
-               step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName, INCLUDE_AUDIT, true, null);
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, 4, INCLUDE_AUDIT);
+               ((ColumnAdder)step).setNotNull(true);
                stepList.add(step);
                
                //TODO ?? update original source type
@@ -154,6 +155,15 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                //TODO NOT NULL unclear
                step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, 255, INCLUDE_AUDIT);
                stepList.add(step);
+               
+               stepName = "Create termType column in TermVocabulary";
+               tableName = "TermVocabulary";
+               columnName = "termType";
+               //TODO NOT NULL unclear
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, 4, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               
                //TODO update termType for DefinedTerms and TermVocabulary, no type must be null
                
                
@@ -175,11 +185,12 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                
                //TODO add column for DistanceToWaterSurfaceMax/Text und DistanceToGroundMax/Text
                
-               //TODO update datatype of sequence.sequence => CLOB (keeping data not necessary #3325)
-               //NOTE: column has been changed: #3360
+               
+               //update datatype->CLOB for URIs. (DefinedTerms, TermVocabulary, Reference, Rights, MediaRepresentationPart ) 
+               //#3345,    TODO adapt type to <65k
+               //TODO sequence.sequence has been changed #3360
+               changeUriType(stepList);
 
-               //TODO update datatype->CLOB for URIs. (DefinedTerms, TermVocabulary, Reference
-               //Rights, MediaRepresentationPart ) #3345
                                
                //update Sicilia -> Sicily
                //#3540
@@ -212,6 +223,33 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                stepList.add(step);
                
                //TODO add columns abbrevTitle, abbrevTitleCache and protectedAbbrevTitleCache to Reference
+               stepName = "Add abbrevTitle to Reference";
+               tableName = "Reference";
+               columnName = "abbrevTitle";
+               int length = 255;
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, length, INCLUDE_AUDIT);
+               stepList.add(step);
+
+               stepName = "Add abbrevTitleCache to Reference";
+               tableName = "Reference";
+               columnName = "abbrevTitleCache";
+               length = 1023;
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, length, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               stepName = "Add protectedAbbrevTitleCache to Reference";
+               tableName = "Reference";
+               columnName = "protectedAbbrevTitleCache";
+               step = ColumnAdder.NewBooleanInstance(stepName, tableName, columnName, INCLUDE_AUDIT, false); 
+               stepList.add(step);
+               
+               //add doi to reference
+               stepName = "Add doi to Reference";
+               tableName = "Reference";
+               columnName = "doi";
+               length = 255;
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, length, INCLUDE_AUDIT);
+               stepList.add(step);
                
                
                //add start number to PolytomousKey
@@ -222,7 +260,15 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName, INCLUDE_AUDIT,  defaultValue, true); 
                stepList.add(step);
                
-               //TODO add specimenOrObservation basis of record to SpecimenOrObservationBase
+               //add recordBasis  to specimenOrObservationBase 
+               stepName = "Add recordBasis to SpecimenOrObservationBase";
+               tableName = "SpecimenOrObservationBase";
+               columnName = "recordBasis";
+               length = 4;
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, length, INCLUDE_AUDIT);
+               stepList.add(step);
+                               
+               
                
                //TODO update specimenOrObservationBase DTYPE with DefinedTerm where necessary
 
@@ -249,7 +295,14 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                //TODO update length of all title caches and full title cache in names
                //https://dev.e-taxonomy.eu/trac/ticket/1592
                
-               //TODO rename FK column states_id -> stateData_id in DescriptionElementBase_StateData(+AUD)  #2923
+               //rename FK column states_id -> stateData_id in DescriptionElementBase_StateData(+AUD)  #2923
+               stepName = "Update states_id to stateData_id in DescriptionElementBase_StateData";
+               tableName = "DescriptionElementBase_StateData";
+               oldColumnName = "states_id";
+               String newColumnName = "stateData_id";
+               step = ColumnNameChanger.NewIntegerInstance(stepName, tableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
                
                //TODO add sortIndex column to TaxonNode and fill with values (compare with FeatureNode filling, however, this
 //             had a bad performance
@@ -257,7 +310,7 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                //specimen descriptions #3571
                //TODO add column DescriptionBase.Specimen_ID  #3571
                stepName = "Add specimen_id column to DescriptionBase";
-               tableName = "SpecimenOrObservationBase";
+               tableName = "DescriptionBase";
                columnName = "specimen_id";
                boolean notNull = false;
                String referencedTable = "SpecimenOrObservationBase";
@@ -272,7 +325,17 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
                stepList.add(step);
                
-               //TODO create table CdmPreferences  #3555
+               //create table CdmPreferences  #3555
+               stepName = "Create table 'CdmPreferences'";
+               tableName = "CdmPreferences";
+               TableCreator stepPref = TableCreator.NewInstance(stepName, tableName, 
+                               new String[]{"key_subject", "key_predicate","value"},  //colNames 
+                               new String[]{"string_100", "string_200","string_1023",},  // columnTypes
+                               new String[]{null, "DefinedTermBase",null},  //referencedTables 
+                               ! INCLUDE_AUDIT, false);
+               stepPref.setPrimaryKeyParams("key_subject, key_predicate", null);
+               stepList.add(stepPref);
+               //TODO length of key >= 1000
                
                //TODO fill CdmPreferences with default values
                
@@ -320,18 +383,234 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
 
                //TODO add Marker vocabulary and terms #3591 => TermUpdater
                
-                 //SpecimenOrObservationBase_Media #3597
+               //SpecimenOrObservationBase_Media #3597
                stepName = "Remove table SpecimenOrObservationBase_Media";
                tableName = "SpecimenOrObservationBase_Media";
                step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
                stepList.add(step);
                
                
+               //Amplification #3360
+               stepName = "Create table 'Primer'";
+               tableName = "Primer";
+               step = TableCreator.NewAnnotatableInstance(stepName, tableName, 
+                               new String[]{"label","sequence_id","publishedIn_id"},  //colNames 
+                               new String[]{"string_255","int","int"},  // columnTypes
+                               new String[]{null,Sequence.class.getSimpleName(),Reference.class.getSimpleName()},  //referencedTables 
+                               INCLUDE_AUDIT);
+               stepList.add(step);
                
+               //MaterialAndMethod #3360
+               stepName = "Create table 'MaterialAndMethod'";
+               tableName = MaterialAndMethod.class.getSimpleName();
+               step = TableCreator.NewAnnotatableInstance(stepName, tableName, 
+                               new String[]{"DTYPE", "materialMethodTerm_id","materialMethodText"},  //colNames 
+                               new String[]{"string_255", "int","string_1000",},  // columnTypes
+                               new String[]{null, "DefinedTermBase",null},  //referencedTables 
+                               INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //Cloning #3360
+               stepName = "Create table 'Cloning'";
+               tableName = "Cloning";
+               String matMetName = MaterialAndMethod.class.getSimpleName();
+               step = TableCreator.NewEventInstance(stepName, tableName, 
+                               new String[]{"strain","method_id","forwardPrimer_id","reversePrimer_id"},  //colNames 
+                               new String[]{"string_255", "int","int","int"},  // columnTypes
+                               new String[]{null, matMetName,"Primer","Primer"},  //referencedTables 
+                               INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               
+               //Amplification #3360
+               stepName = "Create table 'Amplification'";
+               tableName = "Amplification";
+               step = TableCreator.NewEventInstance(stepName, tableName, 
+                               new String[]{"dnaSample_id","dnaMarker_id","forwardPrimer_id","reversePrimer_id","purification_id","cloning_id", "gelPhoto_id", "successful","successText","ladderUsed","electrophoresisVoltage","gelRunningTime","gelConcentration"},  //colNames 
+                               new String[]{"int","int","int","int","int","int","int", "bit","string_255","string_255","double","double","double"},  // columnTypes
+                               new String[]{"SpecimenOrObservationBase","DefinedTermBase","Primer","Primer",matMetName, matMetName, "Media", null, null, null, null, null, null},  //referencedTables 
+                               INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //SingleRead #3360
+               stepName = "Create table 'SingleRead'";
+               tableName = "SingleRead";
+               step = TableCreator.NewEventInstance(stepName, tableName, 
+                               new String[]{"amplification_id","materialAndMethod_id","primer_id","pherogram_id","direction","sequence_length"},  //colNames 
+                               new String[]{"int","int","int","int","int","int"},  // columnTypes
+                               new String[]{"Amplification",matMetName, "Primer","Media", null, null},  //referencedTables 
+                               INCLUDE_AUDIT);
+               //TODO length sequence_string
+               stepList.add(step);
+               
+               //sequence - consensussequence_string  #3360
+               stepName= "Add sequence_string to single read";
+               columnName = "sequence_string";
+               step = ColumnAdder.NewClobInstance(stepName, tableName, columnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //amplification - single reads  #3360
+               stepName= "Add single reads to amplification";
+               String firstTable =  "Amplification";
+               String secondTable =  "SingleRead";
+               step = MnTableCreator.NewMnInstance(stepName, firstTable, null, secondTable, null, SchemaUpdaterBase.INCLUDE_AUDIT, false, true);
+               stepList.add(step);
+               
+               //sequence - single reads  #3360
+               stepName= "Add single reads to sequence";
+               firstTable =  "Sequence";
+               secondTable =  "SingleRead";
+               step = MnTableCreator.NewMnInstance(stepName, firstTable, null, secondTable, null, SchemaUpdaterBase.INCLUDE_AUDIT, false, true);
+               stepList.add(step);
+               
+               //sequence - barcode  #3360
+               stepName= "Add barcodesequencepart_length to sequence";
+               tableName = "Sequence";
+               columnName = "barcodeSequencePart_length";
+               defaultValue = null;
+               step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName, INCLUDE_AUDIT, defaultValue, false);
+               stepList.add(step);
+
+               //sequence - barcode  #3360
+               stepName= "Add barcodesequencepart_string to sequence";
+               tableName = "Sequence";
+               columnName = "barcodeSequencePart_string";
+               step = ColumnAdder.NewClobInstance(stepName, tableName, columnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //sequence - consensussequence_length  #3360
+               stepName= "Add consensusSequence_length to sequence";
+               tableName = "Sequence";
+               columnName = "consensusSequence_length";
+               defaultValue = null;
+               step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName, INCLUDE_AUDIT, defaultValue, false);
+               stepList.add(step);
+
+               //sequence - consensussequence_string  #3360
+               stepName= "Add consensusSequence_string to sequence";
+               tableName = "Sequence";
+               columnName = "consensusSequence_string";
+               step = ColumnAdder.NewClobInstance(stepName, tableName, columnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //sequence - contigFile  #3360
+               stepName= "Add contigFile to sequence";
+               tableName = "Sequence";
+               columnName = "contigFile_id";
+               referencedTable = "Media";
+               step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName, INCLUDE_AUDIT, false, referencedTable);
+               stepList.add(step);
+               
+               //sequence - boldprocessid  #3360
+               stepName= "Add boldprocessId to sequence";
+               tableName = "Sequence";
+               columnName = "boldProcessId";
+               length = 20;
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, length, INCLUDE_AUDIT);
+               stepList.add(step);
+
+               //sequence - boldprocessid  #3360
+               stepName= "Add geneticAccessionNumber to sequence";
+               tableName = "Sequence";
+               columnName = "geneticAccessionNumber";
+               length = 20;
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, length, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //sequence - haplotype  #3360
+               stepName= "Add haplotype to sequence";
+               tableName = "Sequence";
+               columnName = "haplotype";
+               length = 100;
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, length, INCLUDE_AUDIT);
+               stepList.add(step);
+
+               //sequence - isBarcode  #3360
+               stepName= "Add isBarcode to sequence";
+               tableName = "Sequence";
+               columnName = "isBarcode";
+               step = ColumnAdder.NewBooleanInstance(stepName, tableName, columnName, INCLUDE_AUDIT, false);
+               stepList.add(step);
+               
+               //sequence - dnaMarker  #3360
+               stepName= "Add dnaMarker to sequence";
+               tableName = "Sequence";
+               columnName = "dnaMarker_id";
+               referencedTable = "DefinedTermBase";
+               step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName, INCLUDE_AUDIT, false, referencedTable);
+               stepList.add(step);
+               
+               //sequence - dnaSample  #3360
+               stepName= "Add dnaSample to sequence";
+               tableName = "Sequence";
+               columnName = "dnaSample_id";
+               referencedTable = "SpecimenOrObservationBase";
+               step = ColumnAdder.NewIntegerInstance(stepName, tableName, columnName, INCLUDE_AUDIT, false, referencedTable);
+               stepList.add(step);
                
                return stepList;
        }
 
+       /**
+        * @param stepList
+        */
+       private void changeUriType(List<ISchemaUpdaterStep> stepList) {
+               String stepName;
+               String tableName;
+               ISchemaUpdaterStep step;
+               stepName = "Update uri to clob for DefinedTermBase";
+               tableName = "DefinedTermBase";
+               String oldColumnName = "uri";
+               String newColumnName = oldColumnName;
+               step = ColumnTypeChanger.NewClobInstance(stepName, tableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               stepName = "Update uri to clob for TermVocabulary";
+               tableName = "TermVocabulary";
+               oldColumnName = "uri";
+               newColumnName = oldColumnName;
+               step = ColumnTypeChanger.NewClobInstance(stepName, tableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //TODO are uri and termsourceuri needed ???
+               stepName = "Update termsourceuri to clob for TermVocabulary";
+               tableName = "TermVocabulary";
+               oldColumnName = "termsourceuri";
+               newColumnName = oldColumnName;
+               step = ColumnTypeChanger.NewClobInstance(stepName, tableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               stepName = "Update uri to clob for Reference";
+               tableName = "Reference";
+               oldColumnName = "uri";
+               newColumnName = oldColumnName;
+               step = ColumnTypeChanger.NewClobInstance(stepName, tableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               stepName = "Update uri to clob for Rights";
+               tableName = "Rights";
+               oldColumnName = "uri";
+               newColumnName = oldColumnName;
+               step = ColumnTypeChanger.NewClobInstance(stepName, tableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+
+               stepName = "Update uri to clob for MediaRepresentationPart";
+               tableName = "MediaRepresentationPart";
+               oldColumnName = "uri";
+               newColumnName = oldColumnName;
+               step = ColumnTypeChanger.NewClobInstance(stepName, tableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //TODO still needed??
+               stepName = "Update uri to clob for FeatureTree";
+               tableName = "FeatureTree";
+               oldColumnName = "uri";
+               newColumnName = oldColumnName;
+               step = ColumnTypeChanger.NewClobInstance(stepName, tableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+
+       }
+
        /**
         * @param stepList
         * @return
@@ -363,48 +642,6 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, INCLUDE_AUDIT);
                stepList.add(step);
                
-               //Amplification #3360
-               stepName = "Create table 'Primer'";
-               tableName = "Primer";
-               step = TableCreator.NewAnnotatableInstance(stepName, tableName, 
-                               new String[]{"label","sequence_id","publishedIn_id"},  //colNames 
-                               new String[]{"string_255","int","int"},  // columnTypes
-                               new String[]{null,Sequence.class.getSimpleName(),Reference.class.getSimpleName()},  //referencedTables 
-                               INCLUDE_AUDIT);
-               stepList.add(step);
-               
-               //MaterialAndMethod #3360
-               stepName = "Create table 'MaterialAndMethod'";
-               tableName = MaterialAndMethod.class.getSimpleName();
-               step = TableCreator.NewAnnotatableInstance(stepName, tableName, 
-                               new String[]{"materialMethodTerm_id","materialMethodText"},  //colNames 
-                               new String[]{"int","string_1000",},  // columnTypes
-                               new String[]{"DefinedTermBase",null},  //referencedTables 
-                               INCLUDE_AUDIT);
-               stepList.add(step);
-               
-               //Amplification #3360
-               stepName = "Create table 'Amplification'";
-               tableName = "Amplification";
-               String matMetName = MaterialAndMethod.class.getSimpleName();
-               step = TableCreator.NewEventInstance(stepName, tableName, 
-                               new String[]{"dnaSample_id","dnaMarker_id","forwardPrimer_id","reversePrimer_id","purification_id","cloning_id"},  //colNames 
-                               new String[]{"int","int","int","int","int","int"},  // columnTypes
-                               new String[]{"SpecimenOrObservationBase","DefinedTermBase","Primer","Primer",matMetName, matMetName},  //referencedTables 
-                               INCLUDE_AUDIT);
-               stepList.add(step);
-               
-               //Amplification #3360
-               stepName = "Create table 'SingleRead'";
-               tableName = "SingleReadSingleRead";
-               step = TableCreator.NewEventInstance(stepName, tableName, 
-                               new String[]{"amplification_id","materialAndMethod_id","primer_id","pherogram_id","direction","sequenceString_length","sequenceString_sequence"},  //colNames 
-                               new String[]{"int","int","int","int","int","int","string_1000"},  // columnTypes
-                               new String[]{"Amplification",matMetName, "Primer","Media", null, null},  //referencedTables 
-                               INCLUDE_AUDIT);
-               stepList.add(step);
-       
-               
                return;
        }
 
@@ -435,7 +672,62 @@ public class SchemaUpdater_31_33 extends SchemaUpdaterBase {
                step = ColumnRemover.NewInstance(stepName, tableName, columnName, INCLUDE_AUDIT);
                stepList.add(step);
                
+               //create column absoluteElevationText
+               stepName = "Create absoluteElevationText column";
+               tableName = "GatheringEvent";
+               columnName = "absoluteElevationText";
+               //TODO size
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, 255, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //retype distanceToGround 
+               stepName = "Rname distanceToGround column";
+               tableName = "GatheringEvent";
+               String strNewColumnName = "distanceToGround";
+               String strOldColumnName = "distanceToGround";
+               step = ColumnTypeChanger.NewInt2DoubleInstance(stepName, tableName, strOldColumnName, strNewColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //create column distanceToGroundMax
+               stepName = "Create distanceToGroundMax column";
+               tableName = "GatheringEvent";
+               columnName = "distanceToGroundMax";
+               step = ColumnAdder.NewDoubleInstance(stepName, tableName, columnName, INCLUDE_AUDIT, false);
+               stepList.add(step);
+               
                
+               //create column distanceToGroundText
+               stepName = "Create distanceToGroundText column";
+               tableName = "GatheringEvent";
+               columnName = "distanceToGroundText";
+               //TODO size
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, 255, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //retype distanceToGround 
+               stepName = "Rname distanceToWaterSurface column";
+               tableName = "GatheringEvent";
+               strNewColumnName = "distanceToWaterSurface";
+               strOldColumnName = "distanceToWaterSurface";
+               step = ColumnTypeChanger.NewInt2DoubleInstance(stepName, tableName, strOldColumnName, strNewColumnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+               //create column distanceToWaterSurface
+               stepName = "Create distanceToWaterSurfaceMax column";
+               tableName = "GatheringEvent";
+               columnName = "distanceToWaterSurfaceMax";
+               step = ColumnAdder.NewDoubleInstance(stepName, tableName, columnName, INCLUDE_AUDIT, false);
+               stepList.add(step);
+               
+               
+               //create column distanceToGroundText
+               stepName = "Create distanceToWaterSurfaceText column";
+               tableName = "GatheringEvent";
+               columnName = "distanceToWaterSurfaceText";
+               //TODO size
+               step = ColumnAdder.NewStringInstance(stepName, tableName, columnName, 255, INCLUDE_AUDIT);
+               stepList.add(step);
+
        }
 
        /**