merge-update from trunk
authorPatric Plitzner <p.plitzner@bgbm.org>
Tue, 1 Jul 2014 13:23:23 +0000 (13:23 +0000)
committerPatric Plitzner <p.plitzner@bgbm.org>
Tue, 1 Jul 2014 13:23:23 +0000 (13:23 +0000)
35 files changed:
.gitattributes
cdmlib-commons/pom.xml
cdmlib-ext/pom.xml
cdmlib-ext/src/test/resources/dbscripts/001-cdm.h2.sql
cdmlib-io/pom.xml
cdmlib-io/src/test/resources/dbscripts/001-cdm.h2.sql
cdmlib-model/pom.xml
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/GrantedAuthorityImpl.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/Group.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/User.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/metadata/CdmMetaData.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/DerivedUnit.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/Taxon.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonBase.java
cdmlib-persistence/pom.xml
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/AuditedSchemaUpdaterStepBase.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/CdmUpdater.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ISchemaUpdater.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ISchemaUpdaterStep.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ITermUpdater.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/ITermUpdaterStep.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/IUpdater.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/UpdaterBase.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v31_33/SchemaUpdater_33_331.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v31_33/TermUpdater_31_33.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/SchemaUpdater_331_34.java [new file with mode: 0644]
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/TermUpdater_33_34.java [new file with mode: 0644]
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/UsernameConstraintUpdater.java [new file with mode: 0644]
cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImplTest.java
cdmlib-persistence/src/test/resources/dbscripts/001-cdm.h2.sql
cdmlib-print/pom.xml
cdmlib-remote/pom.xml
cdmlib-services/pom.xml
cdmlib-services/src/test/resources/dbscripts/001-cdm.h2.sql
pom.xml

index 8d075c2a054734a8c8ce9c0233c1dc5ddfc96d03..2fda846643567f4695321c063f0dca009ddaf137 100644 (file)
@@ -1307,6 +1307,9 @@ cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v31_33/SchemaU
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v31_33/SpecimenMediaMoverUpdater.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v31_33/TermUpdater_31_33.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v31_33/TermVocabularyRepresentationUpdater.java -text
+cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/SchemaUpdater_331_34.java -text
+cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/TermUpdater_33_34.java -text
+cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/UsernameConstraintUpdater.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/IAlternativeSpellingSuggestionParser.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/IMethodCache.java -text
 cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/MethodCacheImpl.java -text
index c6737c9bcac7b17387ba545bad61a02340dac946..4519ba9f38574578530378bc3fb34c4ffbe2eedb 100644 (file)
@@ -6,7 +6,7 @@
   <parent>
     <groupId>eu.etaxonomy</groupId>
     <artifactId>cdmlib-parent</artifactId>
-    <version>3.3.6-SNAPSHOT</version>
+    <version>3.4.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
   </parent>
   
index 1e9c577d1a2a45456ab6a004b74bc7c3fcfe2566..3aab66aac79670497f8b1eb191c56621ad5dc2bf 100644 (file)
@@ -6,7 +6,7 @@
        <parent>
                <groupId>eu.etaxonomy</groupId>
                <artifactId>cdmlib-parent</artifactId>
-           <version>3.3.6-SNAPSHOT</version>
+           <version>3.4.0-SNAPSHOT</version>
                <relativePath>../pom.xml</relativePath>
        </parent>
 
index bf373e815b6e838da50f045133f49503512122a6..8918572cadaf79a9a0fd517b3af0b28301b2d8c1 100644 (file)
@@ -3441,6 +3441,7 @@ CREATE CACHED TABLE PUBLIC.SPECIMENOROBSERVATIONBASE(
     CATALOGNUMBER VARCHAR(255),
     COLLECTORSNUMBER VARCHAR(255),
     EXSICCATUM VARCHAR(255),
+    ORIGINALLABELINFO CLOB,
     FIELDNOTES VARCHAR(255),
     FIELDNUMBER VARCHAR(255),
     CREATEDBY_ID INTEGER,
@@ -3481,6 +3482,7 @@ CREATE CACHED TABLE PUBLIC.SPECIMENOROBSERVATIONBASE_AUD(
     CATALOGNUMBER VARCHAR(255),
     COLLECTORSNUMBER VARCHAR(255),
     EXSICCATUM VARCHAR(255),
+    ORIGINALLABELINFO CLOB,
     FIELDNOTES VARCHAR(255),
     FIELDNUMBER VARCHAR(255),
     CREATEDBY_ID INTEGER,
index 71c74c610c690626b1e4cd83d2e654bb3c73ba90..42f8dd3c8856d1d99c93c958e2b9831aec3fd716 100644 (file)
@@ -4,7 +4,7 @@
        <parent>
                <groupId>eu.etaxonomy</groupId>
                <artifactId>cdmlib-parent</artifactId>
-               <version>3.3.6-SNAPSHOT</version>
+               <version>3.4.0-SNAPSHOT</version>
                <relativePath>../pom.xml</relativePath>
        </parent>
 
index bf373e815b6e838da50f045133f49503512122a6..8918572cadaf79a9a0fd517b3af0b28301b2d8c1 100644 (file)
@@ -3441,6 +3441,7 @@ CREATE CACHED TABLE PUBLIC.SPECIMENOROBSERVATIONBASE(
     CATALOGNUMBER VARCHAR(255),
     COLLECTORSNUMBER VARCHAR(255),
     EXSICCATUM VARCHAR(255),
+    ORIGINALLABELINFO CLOB,
     FIELDNOTES VARCHAR(255),
     FIELDNUMBER VARCHAR(255),
     CREATEDBY_ID INTEGER,
@@ -3481,6 +3482,7 @@ CREATE CACHED TABLE PUBLIC.SPECIMENOROBSERVATIONBASE_AUD(
     CATALOGNUMBER VARCHAR(255),
     COLLECTORSNUMBER VARCHAR(255),
     EXSICCATUM VARCHAR(255),
+    ORIGINALLABELINFO CLOB,
     FIELDNOTES VARCHAR(255),
     FIELDNUMBER VARCHAR(255),
     CREATEDBY_ID INTEGER,
index 996404a92c7f2a69324f04a66bc3ed10827bbbef..ad2c7c41ba9f27f3cc8444a3baed7583fadd1c60 100644 (file)
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>cdmlib-parent</artifactId>
     <groupId>eu.etaxonomy</groupId>
-    <version>3.3.6-SNAPSHOT</version>
+    <version>3.4.0-SNAPSHOT</version>
   <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
index 2d4b45806ada9765c5b9845b9249318587ba744c..eaaf07c3b02515071814f25edfa435b8078c4af1 100644 (file)
@@ -9,6 +9,7 @@
 \r
 package eu.etaxonomy.cdm.model.common;\r
 \r
+import javax.persistence.Column;\r
 import javax.persistence.Entity;\r
 import javax.xml.bind.annotation.XmlAccessType;\r
 import javax.xml.bind.annotation.XmlAccessorType;\r
@@ -17,7 +18,6 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.hibernate.annotations.NaturalId;\r
 import org.springframework.security.core.GrantedAuthority;\r
 \r
 @XmlAccessorType(XmlAccessType.FIELD)\r
@@ -27,11 +27,10 @@ import org.springframework.security.core.GrantedAuthority;
 public class GrantedAuthorityImpl extends CdmBase implements GrantedAuthority {\r
 \r
     private static final long serialVersionUID = 2651969425860655040L;\r
-    private static final Logger logger = Logger\r
-            .getLogger(GrantedAuthority.class);\r
+    private static final Logger logger = Logger.getLogger(GrantedAuthority.class);\r
 \r
     @XmlElement(name = "Authority")\r
-    @NaturalId\r
+    @Column(unique = true)\r
     private String authority;\r
 \r
     protected GrantedAuthorityImpl() {\r
index 37f5436dbcef2c126da4580a62d574e45edc60a9..3769c4845e09d5b2cb9fc9f8c928d068240e0f77 100644 (file)
@@ -12,6 +12,7 @@ import java.util.HashSet;
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
+import javax.persistence.Column;\r
 import javax.persistence.Entity;\r
 import javax.persistence.FetchType;\r
 import javax.persistence.ManyToMany;\r
@@ -28,7 +29,6 @@ import javax.xml.bind.annotation.XmlType;
 import org.apache.log4j.Logger;\r
 import org.hibernate.annotations.Cascade;\r
 import org.hibernate.annotations.CascadeType;\r
-import org.hibernate.annotations.NaturalId;\r
 import org.hibernate.search.annotations.Field;\r
 import org.hibernate.search.annotations.Indexed;\r
 import org.springframework.security.core.GrantedAuthority;\r
@@ -50,8 +50,22 @@ public class Group extends CdmBase {
     public final static UUID groupEditorUuid = UUID.fromString("22e5e8af-b99c-4884-a92f-71978efd3770");\r
     public final static UUID groupProjectManagerUuid = UUID.fromString("645191ae-32a4-4d4e-9b86-c90e0d41944a");\r
 \r
+//*********************** FACTORY *********************/\r
+\r
+    public static Group NewInstance(){\r
+        return new Group();\r
+    }\r
+\r
+    public static Group NewInstance(String name){\r
+        Group group = Group.NewInstance();\r
+        group.setName(name);\r
+        return group;\r
+    }\r
+    \r
+//**************** FIELDS ******************************/    \r
+    \r
     @XmlElement(name = "Name")\r
-    @NaturalId\r
+    @Column(unique = true)\r
     @Field\r
     protected String name;\r
 \r
@@ -71,19 +85,13 @@ public class Group extends CdmBase {
     @Cascade({CascadeType.SAVE_UPDATE})\r
     protected Set <GrantedAuthority> grantedAuthorities = new HashSet<GrantedAuthority>();\r
 \r
+// ********************* CONSTRUCTOR ************************/    \r
+    \r
     protected Group(){\r
         super();\r
     }\r
 \r
-    public static Group NewInstance(){\r
-        return new Group();\r
-    }\r
-\r
-    public static Group NewInstance(String name){\r
-        Group group = Group.NewInstance();\r
-        group.setName(name);\r
-        return group;\r
-    }\r
+// *************** METHODS ***********************************/    \r
 \r
     public Set<GrantedAuthority> getGrantedAuthorities() {\r
         return grantedAuthorities;\r
index 332f2012576b75a77f41ea001f5a6319a2b653d5..2e6ad25107d377bb31ef752a39eaa62e766a7524 100644 (file)
@@ -13,6 +13,7 @@ import java.util.Collection;
 import java.util.HashSet;\r
 import java.util.Set;\r
 \r
+import javax.persistence.Column;\r
 import javax.persistence.Entity;\r
 import javax.persistence.FetchType;\r
 import javax.persistence.ManyToMany;\r
@@ -32,7 +33,6 @@ import javax.xml.bind.annotation.XmlType;
 import org.apache.log4j.Logger;\r
 import org.hibernate.annotations.Cascade;\r
 import org.hibernate.annotations.CascadeType;\r
-import org.hibernate.annotations.NaturalId;\r
 import org.hibernate.envers.Audited;\r
 import org.hibernate.envers.NotAudited;\r
 import org.hibernate.search.annotations.Analyze;\r
@@ -66,10 +66,8 @@ public class User extends CdmBase implements UserDetails {
     private static final long serialVersionUID = 6582191171369439163L;\r
     private static final Logger logger = Logger.getLogger(User.class);\r
 \r
-    protected User(){\r
-        super();\r
-    }\r
-\r
+ // **************************** FACTORY *****************************************/   \r
+    \r
     public static User NewInstance(String username, String pwd){\r
         User user = new User();\r
         user.setUsername(username);\r
@@ -98,8 +96,10 @@ public class User extends CdmBase implements UserDetails {
         return user;\r
     }\r
 \r
+//***************************** Fields *********************** /\r
+    \r
     @XmlElement(name = "Username")\r
-    @NaturalId\r
+    @Column(unique = true)\r
     @Field(analyze = Analyze.NO)\r
     protected String username;\r
 \r
@@ -156,6 +156,14 @@ public class User extends CdmBase implements UserDetails {
     @Transient\r
     private Set<GrantedAuthority> authorities;  //authorities of this user and of all groups the user belongs to\r
 \r
+//***************************** Constructor *********************** /\r
+    \r
+    protected User(){\r
+        super();\r
+    }\r
+    \r
+// ***************************** METHODS ******************************/\r
+    \r
     /**\r
      * Initializes or refreshes the collection of authorities, See\r
      * {@link #getAuthorities()}\r
index 06fb85eefc1b0409a13b18666f4dcd8467b4557c..a6a089e1bfa758d29606608b99b586815054571a 100644 (file)
@@ -47,9 +47,9 @@ public class CdmMetaData extends CdmBase{
         * be handled by SCHEMA_VALIDATION.UPDATE\r
         * The last number represents the date of change.\r
         */\r
-//     private static final String dbSchemaVersion = "3.0.1.0.201104190000";   \r
-//     private static final String dbSchemaVersion = "3.3.0.0.201309240000";\r
-       private static final String dbSchemaVersion = "3.3.1.0.201401140000";\r
+//     private static final String dbSchemaVersion = "3.3.1.0.201401140000";\r
+       private static final String dbSchemaVersion = "3.4.0.0.201407010000";\r
+       \r
        \r
        \r
 \r
@@ -82,8 +82,9 @@ public class CdmMetaData extends CdmBase{
         * \r
         * The last number represents the date of change.\r
         */\r
-       private static final String termsVersion = "3.3.0.0.201309010000";\r
-       \r
+//     private static final String termsVersion = "3.3.0.0.201309010000";\r
+       private static final String termsVersion = "3.4.0.0.201407010000";\r
+\r
        \r
        public enum MetaDataPropertyName{\r
                DB_SCHEMA_VERSION,\r
index a8c1c695d1e72222abdba9e7e39219c43a615e25..977be7b68cbb12a15c1c4d2fa390fff3c2658c2d 100644 (file)
@@ -14,6 +14,7 @@ import java.util.Set;
 
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
+import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.Transient;
@@ -67,6 +68,7 @@ import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
     "barcode",
        "preservation",
        "exsiccatum",
+       "originalLabelInfo",
     "specimenTypeDesignations"
 })
 @XmlRootElement(name = "DerivedUnit")
@@ -131,6 +133,10 @@ public class DerivedUnit extends SpecimenOrObservationBase<IIdentifiableEntityCa
        @Cascade(CascadeType.SAVE_UPDATE)
        @IndexedEmbedded(depth = 4)
        private DerivationEvent derivedFrom;
+       
+       @XmlElement(name = "OriginalLabelInfo")
+       @Lob
+    private String originalLabelInfo;
 
        @XmlElementWrapper(name = "SpecimenTypeDesignations")
        @XmlElement(name = "SpecimenTypeDesignation")
@@ -250,7 +256,6 @@ public class DerivedUnit extends SpecimenOrObservationBase<IIdentifiableEntityCa
                this.collection = collection;
        }
 
-
        public String getCatalogNumber() {
                return catalogNumber;
        }
@@ -278,6 +283,23 @@ public class DerivedUnit extends SpecimenOrObservationBase<IIdentifiableEntityCa
        public void setAccessionNumber(String accessionNumber) {
                this.accessionNumber = accessionNumber;
        }
+       
+
+       /**
+        * Original label information may present the exact original text
+        * or any other text which fully or partly represents the text available
+        * on the specimens label. This information may differ from the information
+        * available in the derived unit itself.
+        * @return the original label information
+        */
+       //#4218
+       public String getOriginalLabelInfo() {
+               return originalLabelInfo;
+       }
+
+       public void setOriginalLabelInfo(String originalLabelInfo) {
+               this.originalLabelInfo = originalLabelInfo;
+       }
 
        /**
         * Will be removed in future versions as semantics is not clear.
@@ -383,4 +405,5 @@ public class DerivedUnit extends SpecimenOrObservationBase<IIdentifiableEntityCa
        }
 
 
+
 }
index a40930d4f10d0422feffcd336454f5697095a05e..852cf9eb915ff8992180986f8110155949a71b4c 100644 (file)
@@ -82,8 +82,7 @@ import eu.etaxonomy.cdm.strategy.cache.taxon.TaxonBaseDefaultCacheStrategy;
     "synonymRelations",
     "relationsFromThisTaxon",
     "relationsToThisTaxon",
-    "descriptions",
-    "publish"
+    "descriptions"
 })
 @XmlRootElement(name = "Taxon")
 @Entity
@@ -95,7 +94,7 @@ import eu.etaxonomy.cdm.strategy.cache.taxon.TaxonBaseDefaultCacheStrategy;
     @ClassBridge(impl = TaxonRelationshipClassBridge.class)
 })
 public class Taxon extends TaxonBase<IIdentifiableEntityCacheStrategy<Taxon>>
-            implements IRelated<RelationshipBase>, IDescribable<TaxonDescription>, IPublishable, Cloneable{
+            implements IRelated<RelationshipBase>, IDescribable<TaxonDescription>, Cloneable{
     private static final long serialVersionUID = -584946869762749006L;
     private static final Logger logger = Logger.getLogger(Taxon.class);
 
@@ -168,10 +167,6 @@ public class Taxon extends TaxonBase<IIdentifiableEntityCacheStrategy<Taxon>>
     @Deprecated //will be removed in future versions. Use Classification/TaxonNode instead
     private int taxonomicChildrenCount;
 
-
-    @XmlAttribute(name = "publish")
-    private boolean publish = true;
-
 // ************************* FACTORY METHODS ********************************/
 
     /**
@@ -1655,24 +1650,6 @@ public class Taxon extends TaxonBase<IIdentifiableEntityCacheStrategy<Taxon>>
         this.excluded = excluded;
     }
 
-
-    /**
-     * Returns the boolean value indicating if this taxon should be withheld (<code>publish=false</code>) or not
-     * (<code>publish=true</code>) during any publication process to the general public.
-     * This publish flag implementation is preliminary and may be replaced by a more general
-     * implementation of READ rights in future.<BR>
-     * The default value is <code>true</code>.
-     */
-    @Override
-    public boolean isPublish() {
-        return publish;
-    }
-
-    @Override
-    public void setPublish(boolean publish) {
-        this.publish = publish;
-    }
-
     /**
      * Returns the ordered list of all {@link eu.etaxonomy.cdm.model.name.HomotypicalGroup homotypical groups}
      * that contain {@link Synonym synonyms} that are heterotypic to <i>this</i> taxon.
index 29af0766fecef2716ba919291026caba71675ac4..87b5b5da63fdf5d3b079309ee4dd3ef2c4bf5b49 100644 (file)
@@ -37,6 +37,7 @@ import org.hibernate.search.annotations.Store;
 
 import eu.etaxonomy.cdm.hibernate.search.AcceptedTaxonBridge;
 import eu.etaxonomy.cdm.hibernate.search.ClassInfoBridge;
+import eu.etaxonomy.cdm.model.common.IPublishable;
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
@@ -69,7 +70,8 @@ import eu.etaxonomy.cdm.validation.annotation.TaxonNameCannotBeAcceptedAndSynony
     "sec",
     "doubtful",
     "appendedPhrase",
-    "useNameCache"
+    "useNameCache",
+    "publish"
 })
 @Entity
 @Audited
@@ -87,7 +89,7 @@ import eu.etaxonomy.cdm.validation.annotation.TaxonNameCannotBeAcceptedAndSynony
             impl = AcceptedTaxonBridge.class),
     @ClassBridge(impl = eu.etaxonomy.cdm.hibernate.search.NomenclaturalSortOrderBrigde.class)
 })
-public abstract class TaxonBase<S extends IIdentifiableEntityCacheStrategy> extends IdentifiableEntity<S> implements Cloneable {
+public abstract class TaxonBase<S extends IIdentifiableEntityCacheStrategy> extends IdentifiableEntity<S> implements  IPublishable, Cloneable {
     private static final long serialVersionUID = -3589185949928938529L;
     private static final Logger logger = Logger.getLogger(TaxonBase.class);
 
@@ -135,6 +137,9 @@ public abstract class TaxonBase<S extends IIdentifiableEntityCacheStrategy> exte
 
     @XmlAttribute(name= "UseNameCache")
     private boolean useNameCache = false;
+    
+    @XmlAttribute(name = "publish")
+    private boolean publish = true;
 
 
 // ************* CONSTRUCTORS *************/
@@ -245,6 +250,24 @@ public abstract class TaxonBase<S extends IIdentifiableEntityCacheStrategy> exte
     public void setDoubtful(boolean doubtful){
         this.doubtful = doubtful;
     }
+    
+
+    /**
+     * Returns the boolean value indicating if this taxon should be withheld (<code>publish=false</code>) or not
+     * (<code>publish=true</code>) during any publication process to the general public.
+     * This publish flag implementation is preliminary and may be replaced by a more general
+     * implementation of READ rights in future.<BR>
+     * The default value is <code>true</code>.
+     */
+    @Override
+    public boolean isPublish() {
+        return publish;
+    }
+
+    @Override
+    public void setPublish(boolean publish) {
+        this.publish = publish;
+    }
 
     /**
      * Returns the {@link eu.etaxonomy.cdm.model.reference.Reference reference} of <i>this</i> (abstract) taxon.
index e0e8eb65bb3b27f344d0c596aa6affd1aaf94b9b..dcdeb09a45361d08ccdb93069b69abc5b00eff15 100644 (file)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>eu.etaxonomy</groupId>
     <artifactId>cdmlib-parent</artifactId>
-               <version>3.3.6-SNAPSHOT</version>
+               <version>3.4.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
index 7c3eb87a696e28e02013e78ddbde502bc625738a..f37490816272302b63d818bdc30a9f63bf430ea2 100644 (file)
@@ -14,6 +14,12 @@ import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
 import eu.etaxonomy.cdm.database.ICdmDataSource;\r
 \r
 /**\r
+ * Base class for a {@link ISchemaUpdaterStep schema update step} which supports automated handling \r
+ * of auditing tables.\r
+ * \r
+ * @see CdmUpdater\r
+ * @see ISchemaUpdater\r
+ * \r
  * @author a.mueller\r
  *\r
  * @param <T>\r
index 476678df4d641e16b4e7e6a6c44c7df6d621af79..eade1961d534300cb3e9e8ec76a28941a9fc4253 100644 (file)
@@ -17,11 +17,52 @@ import eu.etaxonomy.cdm.common.monitor.DefaultProgressMonitor;
 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;\r
 import eu.etaxonomy.cdm.database.CdmDataSource;\r
 import eu.etaxonomy.cdm.database.ICdmDataSource;\r
-import eu.etaxonomy.cdm.database.update.v31_33.SchemaUpdater_31_33;\r
-import eu.etaxonomy.cdm.database.update.v31_33.SchemaUpdater_33_331;\r
-import eu.etaxonomy.cdm.database.update.v31_33.TermUpdater_31_33;\r
+import eu.etaxonomy.cdm.database.update.v33_34.SchemaUpdater_331_34;\r
+import eu.etaxonomy.cdm.database.update.v33_34.TermUpdater_33_34;\r
+import eu.etaxonomy.cdm.model.metadata.CdmMetaData;\r
 \r
 /**\r
+ * This class launches CDM model updates.\r
+ * Currently it splits the update in model updates and defined term related updates by\r
+ * using a {@link ISchemaUpdater schema updater} and a {@link ITermUpdater}. However, this \r
+ * architecture often results in problems and therefore will be replaced by only 1 schema updater.\r
+ * Term updates will be handled differently or also by using the schema updater.\r
+ * <BR>\r
+ * For each new schema version number there usually exists 1 {@link ISchemaUpdater} which is \r
+ * represents a list of schema update steps. {@link ISchemaUpdater schema updaters} are linked\r
+ * to previous updaters which are called, if relevant, previous to the latest updater.\r
+ * So it is possible to upgrade multiple schema version steps in one call.\r
+ * <BR><BR>\r
+ * As said before each {@link ISchemaUpdater schema updater} creates a list of \r
+ * {@link ISchemaUpdaterStep update steps}.\r
+ * <BR><BR>\r
+ * {@link ISchemaUpdater} support progression monitoring with each update step being one task.\r
+ * <BR><BR>\r
+ * ATTENTION: Some steps in the schema update are not transactional by nature. E.g. adding or removing a column\r
+ * to a table in a SQL database can not be handled in a transaction. Therefore failures in\r
+ * certain steps may not lead to a complete rollback of all steps covered by a {@link ISchemaUpdater}.\r
+ * This may lead to a situation where the database becomes inconsistent.\r
+ * <BR><BR>   \r
+ * <u>HOW TO ADD A NEW UPDATER?</u><BR>\r
+ * Adding a new updater currently still needs adjustment at multiple places.\r
+ * <BR>\r
+ * <BR>1.) Increment {@link CdmMetaData} schema version number and term version number.\r
+ * <BR>2.) Create a new class instance of {@link SchemaUpdaterBase} (e.g. by copying an old one). \r
+ * <BR>3.) Update startSchemaVersion and endSchemaVersion in this new class, where startSchemaVersion\r
+ * is the old schema version and endSchemaVersion is the new schema version.\r
+ * <BR>4.) Implement {@link ISchemaUpdater#getPreviousUpdater()} and {@link ISchemaUpdater#getNextUpdater()}\r
+ * in a way that the former returns an instance of the previous schema updater and the later returns null (for now).\r
+ * <BR>5.) Go to the previous schema updater class and adjust {@link ISchemaUpdater#getNextUpdater()}\r
+ * in a way that it returns an instance of the newly created updater.\r
+ * <BR>6.) Repeat steps 2.-5. for {@link ITermUpdater}\r
+ * <BR>7.) Adjust {@link #getCurrentSchemaUpdater()} and {@link #getCurrentTermUpdater()} to return\r
+ * instances of the newly created updaters.\r
+ *  \r
+ * @see ISchemaUpdater\r
+ * @see ITermUpdater\r
+ * @see ISchemaUpdaterStep\r
+ * @see ITermUpdaterStep\r
+ * \r
  * @author a.mueller\r
  * @date 10.09.2010\r
  *\r
@@ -172,7 +213,7 @@ public class CdmUpdater {
 \r
 \r
     private ITermUpdater getCurrentTermUpdater() {\r
-        return TermUpdater_31_33.NewInstance();\r
+        return TermUpdater_33_34.NewInstance();\r
     }\r
 \r
     /**\r
@@ -180,7 +221,7 @@ public class CdmUpdater {
      * @return\r
      */\r
     private ISchemaUpdater getCurrentSchemaUpdater() {\r
-        return SchemaUpdater_33_331.NewInstance();\r
+        return SchemaUpdater_331_34.NewInstance();\r
     }\r
 \r
     /**\r
@@ -206,7 +247,7 @@ public class CdmUpdater {
             }\r
         }\r
 \r
-        ICdmDataSource dataSource = CdmDataSource.NewMySqlInstance(server, database, 3306, username, password, null);\r
+        ICdmDataSource dataSource = CdmDataSource.NewMySqlInstance(server, database, port, username, password, null);\r
         boolean success = myUpdater.updateToCurrentVersion(dataSource, null);\r
         System.out.println("DONE " + (success ? "successfully" : "with ERRORS"));\r
     }\r
index f30baa623753a18415cf35502e51bb68da0ea64c..7d149c8bffff73eb3884590e40bdcd10b419a1b8 100644 (file)
@@ -13,9 +13,16 @@ import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
 import eu.etaxonomy.cdm.database.ICdmDataSource;\r
 \r
 /**\r
+ * Class which represents a CDM schema version step. See {@link CdmUpdater}\r
+ * for further documentation or implementing classes for examples.\r
+ *\r
+ * @see CdmUpdater\r
+ * @see ISchemaUpdaterStep\r
+ * @see ISchemaUpdater\r
+ * @see ITermUpdaterStep\r
+ * \r
  * @author a.mueller\r
  * @date 09.2010\r
- *\r
  */\r
 public interface ISchemaUpdater extends IUpdater<ISchemaUpdater>{\r
 \r
index b09343700575835fefd2934346fd5ad24a59d631..bf528f458087c10863175df1b49e43a94e60c627 100644 (file)
@@ -6,6 +6,19 @@ import java.util.List;
 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;\r
 import eu.etaxonomy.cdm.database.ICdmDataSource;\r
 \r
+/**\r
+ * Interface which represents a CDM model update step. See {@link CdmUpdater}\r
+ * for further documentation or implementing classes for examples.\r
+ * \r
+ * @see CdmUpdater\r
+ * @see ISchemaUpdater\r
+ * @see ISchemaUpdater\r
+ * @see ITermUpdaterStep\r
+ * \r
+ * @see CdmUpdater\r
+ * @author a.mueller\r
+ *\r
+ */\r
 public interface ISchemaUpdaterStep {\r
 \r
        /**\r
index cbafcb0098c6f660dd288a1e0331dc4b0acdb662..d4a483f4b2d443071ec61899a3839898b73b4469 100644 (file)
@@ -13,6 +13,14 @@ import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
 import eu.etaxonomy.cdm.database.ICdmDataSource;\r
 \r
 /**\r
+ * Class which represents a CDM term version step. See {@link CdmUpdater}\r
+ * for further documentation or implementing classes for examples.\r
+ * \r
+ * @see CdmUpdater\r
+ * @see ITermUpdaterStep\r
+ * @see ISchemaUpdaterStep\r
+ * @see ISchemaUpdater\r
+ * \r
  * @author a.mueller\r
  * @date 09.2010\r
  *\r
index 78b76920ffe86b0d7c5dffe3085b578f36d99595..260ce62ae42adc5d150831f4183d621196d46d5f 100644 (file)
 package eu.etaxonomy.cdm.database.update;\r
 \r
 /**\r
- * Interface for classes that represent a step in a term update.\r
+ * Interface which represents a CDM terms update step. See {@link CdmUpdater}\r
+ * for further documentation or implementing classes for examples.\r
+ * \r
+ * @see CdmUpdater\r
+ * @see ITermUpdater\r
+ * @see ISchemaUpdaterStep\r
+ * @see ISchemaUpdater\r
+ * \r
  * @author a.mueller\r
  * @date 24.11.2010\r
  *\r
index fc1b82a009c91c75cfed6d7e5c22a6a6728c609d..1950fa4e8138867de8f7978f598dbe55358a6221 100644 (file)
@@ -13,9 +13,10 @@ import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
 import eu.etaxonomy.cdm.database.ICdmDataSource;\r
 \r
 /**\r
+ * Common interface for {@link ISchemaUpdater} and {@link ITermUpdater}\r
+ * \r
  * @author a.mueller\r
  * @date 16.11.2010\r
- *\r
  */\r
 public interface IUpdater<U extends IUpdater<U>> {\r
        \r
index 1435dc4c63ee7cc6093fa543bdc8eb2d24864e42..de130df99da2c942f3854c8885a56f32aa1032c3 100644 (file)
@@ -21,6 +21,11 @@ import eu.etaxonomy.cdm.model.metadata.CdmMetaData;
 \r
 /**\r
  * Common updater base class for updating schema or terms.\r
+ * \r
+ * @see CdmUpdater\r
+ * @see ISchemaUpdater\r
+ * @see ITermUpdater\r
+ * \r
  * @author a.mueller\r
  * @date 16.11.2010\r
  *\r
index 2f4e894df57cb09f17d66f7135e56f7cacbb6a31..9cd121ffeae8f58c916c116f6802301d0788c5f9 100644 (file)
@@ -22,6 +22,7 @@ import eu.etaxonomy.cdm.database.update.SchemaUpdaterBase;
 import eu.etaxonomy.cdm.database.update.SimpleSchemaUpdaterStep;
 import eu.etaxonomy.cdm.database.update.TableDroper;
 import eu.etaxonomy.cdm.database.update.TreeIndexUpdater;
+import eu.etaxonomy.cdm.database.update.v33_34.SchemaUpdater_331_34;
 
 /**
  * @author a.mueller
@@ -109,7 +110,7 @@ public class SchemaUpdater_33_331 extends SchemaUpdaterBase {
 
        @Override
        public ISchemaUpdater getNextUpdater() {
-               return null;
+               return SchemaUpdater_331_34.NewInstance();
        }
 
        @Override
index c97eb26cc23038560722684c21be4d60bb13bcd2..f6d1f6d47131aa9fd92878578707ec159fef6df6 100644 (file)
@@ -20,6 +20,7 @@ import eu.etaxonomy.cdm.database.update.ITermUpdaterStep;
 import eu.etaxonomy.cdm.database.update.SingleTermUpdater;\r
 import eu.etaxonomy.cdm.database.update.TermUpdaterBase;\r
 import eu.etaxonomy.cdm.database.update.v30_31.TermUpdater_314_315;\r
+import eu.etaxonomy.cdm.database.update.v33_34.TermUpdater_33_34;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.TermType;\r
 import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
@@ -173,7 +174,7 @@ public class TermUpdater_31_33 extends TermUpdaterBase implements ITermUpdater {
        \r
        @Override\r
        public ITermUpdater getNextUpdater() {\r
-               return null;\r
+               return TermUpdater_33_34.NewInstance();\r
        }\r
 \r
        @Override\r
diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/SchemaUpdater_331_34.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/SchemaUpdater_331_34.java
new file mode 100644 (file)
index 0000000..bf3459a
--- /dev/null
@@ -0,0 +1,117 @@
+// $Id$
+/**
+ * Copyright (C) 2007 EDIT
+ * European Distributed Institute of Taxonomy 
+ * http://www.e-taxonomy.eu
+ * 
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+
+package eu.etaxonomy.cdm.database.update.v33_34;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import eu.etaxonomy.cdm.database.update.ColumnAdder;
+import eu.etaxonomy.cdm.database.update.ISchemaUpdater;
+import eu.etaxonomy.cdm.database.update.ISchemaUpdaterStep;
+import eu.etaxonomy.cdm.database.update.SchemaUpdaterBase;
+import eu.etaxonomy.cdm.database.update.SimpleSchemaUpdaterStep;
+import eu.etaxonomy.cdm.database.update.v31_33.SchemaUpdater_33_331;
+
+/**
+ * @author a.mueller
+ * @created Jan 14, 2014
+ */
+public class SchemaUpdater_331_34 extends SchemaUpdaterBase {
+
+       @SuppressWarnings("unused")
+       private static final Logger logger = Logger.getLogger(SchemaUpdater_331_34.class);
+       private static final String startSchemaVersion = "3.3.1.0.201401140000";
+       private static final String endSchemaVersion = "3.4.0.0.201407010000";
+
+       // ********************** FACTORY METHOD
+       // *******************************************
+
+       public static SchemaUpdater_331_34 NewInstance() {
+               return new SchemaUpdater_331_34();
+       }
+
+       /**
+        * @param startSchemaVersion
+        * @param endSchemaVersion
+        */
+       protected SchemaUpdater_331_34() {
+               super(startSchemaVersion, endSchemaVersion);
+       }
+
+       @Override
+       protected List<ISchemaUpdaterStep> getUpdaterList() {
+
+               String stepName;
+               String tableName;
+               ISchemaUpdaterStep step;
+               String columnName;
+
+               List<ISchemaUpdaterStep> stepList = new ArrayList<ISchemaUpdaterStep>();
+
+               //TODO test and PostGreSQL / SQL Server
+               //UserAccount unique
+               stepName = "Update User unique indexes";
+               tableName = "UserAccount";
+               columnName = "username";
+               step = UsernameConstraintUpdater.NewInstance(stepName, tableName, columnName);
+               stepList.add(step);
+               
+               //TODO test and PostGreSQL / SQL Server
+               //PermissionGroup unique
+               stepName = "Update Group unique indexes";
+               tableName = "PermissionGroup";
+               columnName = "name";
+               step = UsernameConstraintUpdater.NewInstance(stepName, tableName, columnName);
+               stepList.add(step);
+               
+               //TODO test and PostGreSQL / SQL Server
+               //GrantedAuthority unique
+               stepName = "Update User unique indexes";
+               tableName = "GrantedAuthorityImpl";
+               columnName = "authority";
+               step = UsernameConstraintUpdater.NewInstance(stepName, tableName, columnName);
+               stepList.add(step);
+               
+               //TODO test
+               stepName = "Add label column to derived unit";
+               tableName = "SpecimenOrObservationBase";
+               columnName = "originalLabelInfo";
+               step = ColumnAdder.NewClobInstance(stepName, tableName, columnName, INCLUDE_AUDIT);
+               stepList.add(step);
+               
+                       
+               //TODO test
+               //set default value to true where required
+               stepName = "Set publish to true if null";
+               String query = " UPDATE @@TaxonBase@@ " +
+                                       " SET publish = @TRUE@ " + 
+                                       " WHERE DTYPE IN ('Synonym') AND publish IS NULL ";
+               step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "TaxonBase", 99);
+               stepList.add(step);
+               
+               
+               return stepList;
+
+       }
+
+       @Override
+       public ISchemaUpdater getNextUpdater() {
+               return null;
+       }
+
+       @Override
+       public ISchemaUpdater getPreviousUpdater() {
+               return SchemaUpdater_33_331.NewInstance();
+       }
+
+}
diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/TermUpdater_33_34.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/TermUpdater_33_34.java
new file mode 100644 (file)
index 0000000..bfb6d3a
--- /dev/null
@@ -0,0 +1,82 @@
+// $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.v33_34;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.database.update.ITermUpdater;\r
+import eu.etaxonomy.cdm.database.update.ITermUpdaterStep;\r
+import eu.etaxonomy.cdm.database.update.TermUpdaterBase;\r
+import eu.etaxonomy.cdm.database.update.v31_33.TermUpdater_31_33;\r
+\r
+/**\r
+ * @author a.mueller\r
+ * @date 10.09.2010\r
+ *\r
+ */\r
+public class TermUpdater_33_34 extends TermUpdaterBase implements ITermUpdater {\r
+       @SuppressWarnings("unused")\r
+       private static final Logger logger = Logger.getLogger(TermUpdater_33_34.class);\r
+       \r
+       public static final String startTermVersion = "3.3.0.0.201309240000";\r
+       private static final String endTermVersion = "3.4.0.0.201407010000";\r
+       \r
+// *************************** FACTORY **************************************/\r
+       \r
+       public static TermUpdater_33_34 NewInstance(){\r
+               return new TermUpdater_33_34(startTermVersion, endTermVersion);\r
+       }\r
+       \r
+// *************************** CONSTRUCTOR ***********************************/        \r
+\r
+       protected TermUpdater_33_34(String startTermVersion, String endTermVersion) {\r
+               super(startTermVersion, endTermVersion);\r
+       }\r
+       \r
+       \r
+       @Override\r
+       protected List<ITermUpdaterStep> getUpdaterList() {\r
+               List<ITermUpdaterStep> list = new ArrayList<ITermUpdaterStep>();\r
+\r
+//             // proles, #2793\r
+//             UUID uuidTerm = UUID.fromString("8810d1ba-6a34-4ae3-a355-919ccd1cd1a5");\r
+//             String description = "Rank ''Proles''. Note: This rank is not compliant with the current nomenclatural codes";\r
+//             String label = "Proles";\r
+//             String abbrev = "prol.";\r
+//             String dtype = Rank.class.getSimpleName();\r
+//             boolean isOrdered = true;\r
+//             UUID uuidVocabulary = UUID.fromString("ef0d1ce1-26e3-4e83-b47b-ca74eed40b1b");\r
+//             UUID uuidAfterTerm = UUID.fromString("bff22f84-553a-4429-a4e7-c4b3796c3a18");\r
+//             UUID uuidLang = Language.uuidEnglish;\r
+//             RankClass rankClass = RankClass.Infraspecific;\r
+//             String stepName = "Add 'proles' rank to ranks";\r
+//             TermType termType = TermType.Rank;\r
+//             list.add( SingleTermUpdater.NewInstance(stepName, termType, uuidTerm, abbrev, description, label, abbrev, dtype, uuidVocabulary, uuidLang, isOrdered, uuidAfterTerm).setRankClass(rankClass));\r
+\r
+               //there are some more new vocabularies, but we trust that the term initializer will \r
+               //initialize and persist them correctly\r
+               \r
+               return list;\r
+       }\r
+       \r
+       @Override\r
+       public ITermUpdater getNextUpdater() {\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public ITermUpdater getPreviousUpdater() {\r
+               return TermUpdater_31_33.NewInstance();\r
+       }\r
+\r
+}\r
diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/UsernameConstraintUpdater.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v33_34/UsernameConstraintUpdater.java
new file mode 100644 (file)
index 0000000..b8260b2
--- /dev/null
@@ -0,0 +1,204 @@
+// $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.v33_34;\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
+import eu.etaxonomy.cdm.database.update.CaseType;\r
+import eu.etaxonomy.cdm.database.update.ISchemaUpdaterStep;\r
+import eu.etaxonomy.cdm.database.update.SchemaUpdaterStepBase;\r
+\r
+/**\r
+ * @author a.mueller\r
+ * @date 16.09.2010\r
+ *\r
+ */\r
+public class UsernameConstraintUpdater extends SchemaUpdaterStepBase<UsernameConstraintUpdater> implements ISchemaUpdaterStep {\r
+       private static final Logger logger = Logger.getLogger(UsernameConstraintUpdater.class);\r
+       \r
+       private String tableName;\r
+       \r
+       private String columnName;\r
+       \r
+       public static final UsernameConstraintUpdater NewInstance(String stepName, String tableName, String columnName){\r
+               return new UsernameConstraintUpdater(stepName, tableName, columnName);\r
+       }\r
+\r
+       \r
+       protected UsernameConstraintUpdater(String stepName, String tableName, String columnName) {\r
+               super(stepName);\r
+               this.tableName = tableName;\r
+               this.columnName = columnName;\r
+       }\r
+       \r
+\r
+       @Override\r
+       public Integer invoke(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType) throws SQLException {\r
+               //remove 2-fold constraint\r
+               removeExistingConstraint(datasource, caseType);\r
+               createColumnConstraint(datasource, caseType);\r
+               createUuidConstraint(datasource, caseType);\r
+               return null;\r
+       }\r
+       \r
+       private void createUuidConstraint(ICdmDataSource datasource, CaseType caseType) {\r
+               try {\r
+                       String updateQuery = getCreateQuery(datasource, caseType, tableName, "_UniqueKey", columnName);\r
+                       datasource.executeUpdate(updateQuery);\r
+               } catch (SQLException e) {\r
+                       logger.warn("Unique index for UserAccount.uuid could not be created");\r
+               }\r
+       }\r
+       \r
+       private void createColumnConstraint(ICdmDataSource datasource,\r
+                       CaseType caseType) {\r
+               try {\r
+                       String updateQuery = getCreateQuery(datasource, caseType, tableName, columnName + "_", columnName);\r
+                       datasource.executeUpdate(updateQuery);\r
+               } catch (SQLException e) {\r
+                       logger.warn("Unique index for username could not be created");\r
+               }\r
+       }\r
+       \r
+       private String getCreateQuery(ICdmDataSource datasource, CaseType caseType, String tableName, String constraintName, String columnName) {\r
+                       DatabaseTypeEnum type = datasource.getDatabaseType();\r
+                       String indexName = "_UniqueKey";\r
+                       String updateQuery;\r
+                       if (type.equals(DatabaseTypeEnum.MySQL)){\r
+                               //Maybe MySQL also works with the below syntax. Did not check yet.\r
+                               updateQuery = "ALTER TABLE @@"+ tableName + "@@ ADD UNIQUE INDEX " + constraintName + " ("+columnName+");";\r
+                       }else if (type.equals(DatabaseTypeEnum.H2) || type.equals(DatabaseTypeEnum.PostgreSQL) || type.equals(DatabaseTypeEnum.SqlServer2005)){\r
+                               updateQuery = "CREATE UNIQUE INDEX " + constraintName + " ON "+tableName+"(" + columnName + ")";\r
+                       }else{\r
+                               throw new IllegalArgumentException("Datasource type not supported: " + type.getName());\r
+                       }\r
+                       updateQuery = updateQuery.replace("@indexName", indexName);\r
+                       caseType.replaceTableNames("@@UserAccount@@");\r
+                       return updateQuery;\r
+       }\r
+\r
+\r
+       private void removeExistingConstraint(ICdmDataSource datasource, CaseType caseType) {\r
+               try {\r
+                       DatabaseTypeEnum type = datasource.getDatabaseType();\r
+                       String indexName = "_UniqueKey";\r
+                       String updateQuery;\r
+                       if (type.equals(DatabaseTypeEnum.MySQL)){\r
+                               updateQuery = "ALTER TABLE @@UserAccount@@ DROP INDEX @indexName";\r
+                       }else if (type.equals(DatabaseTypeEnum.H2)){\r
+                               updateQuery = "ALTER TABLE @@UserAccount@@ DROP CONSTRAINT IF EXISTS @indexName";\r
+                       }else if (type.equals(DatabaseTypeEnum.PostgreSQL)){\r
+                               updateQuery = "ALTER TABLE @@UserAccount@@ DROP CONSTRAINT @indexName";\r
+                       }else if (type.equals(DatabaseTypeEnum.SqlServer2005)){\r
+                               //TODO\r
+                               throw new RuntimeException("Remove index not yet supported for SQLServer");\r
+                       }else{\r
+                               throw new IllegalArgumentException("Datasource type not supported: " + type.getName());\r
+                       }\r
+                       updateQuery = updateQuery.replace("@indexName", indexName);\r
+                       updateQuery = caseType.replaceTableNames("@@UserAccount@@");\r
+                       datasource.executeUpdate(updateQuery);\r
+               } catch (SQLException e) {\r
+                       logger.warn("Old index could not be removed");\r
+               }\r
+       }\r
+\r
+//     private boolean checkExists(ICdmDataSource datasource) throws SQLException, DatabaseTypeNotSupportedException {\r
+//             DatabaseTypeEnum type = datasource.getDatabaseType();\r
+//             if (type.equals(DatabaseTypeEnum.MySQL)){\r
+//                     String sql = "SELECT count(*)   FROM information_schema.TABLE_CONSTRAINTS " + \r
+//                                     " WHERE table_name ='@tableName' AND CONSTRAINT_SCHEMA = '@dbName' AND CONSTRAINT_TYPE = 'UNIQUE' ";\r
+//                     sql = sql.replace("@tableName", tableName);\r
+//                     sql = sql.replace("@columnName", indexColumn);\r
+//                     sql = sql.replace("@dbName", datasource.getDatabase());\r
+//                     long count = (Long)datasource.getSingleValue(sql);\r
+//                     return count > 0;\r
+//             }else if (type.equals(DatabaseTypeEnum.PostgreSQL)){\r
+//                     logger.warn("checkExists not yet implemented for PostGreSQL" );\r
+//                     return true;\r
+//             }else if (type.equals(DatabaseTypeEnum.H2)){\r
+//                     String indexName = getIndexName(datasource);\r
+//                     return indexName != null;\r
+//             }else{\r
+//                     // not needed\r
+//                     return true;\r
+//             }\r
+//     }\r
+\r
+\r
+//     public String getUpdateQueryString(String tableName, ICdmDataSource datasource, IProgressMonitor monitor) throws DatabaseTypeNotSupportedException, SQLException {\r
+//             //NOTE: no caseType required here\r
+//             String updateQuery;\r
+//             DatabaseTypeEnum type = datasource.getDatabaseType();\r
+//             String indexName = getIndexName(datasource);\r
+//             \r
+////           if (type.equals(DatabaseTypeEnum.SqlServer2005)){\r
+//                     //MySQL allows both syntaxes\r
+////                   updateQuery = "ALTER TABLE @tableName ADD @columnName @columnType";\r
+////           }else\r
+//                     if (type.equals(DatabaseTypeEnum.H2)){\r
+//                     updateQuery = "ALTER TABLE @tableName DROP CONSTRAINT IF EXISTS @indexName";\r
+//             }else if (type.equals(DatabaseTypeEnum.PostgreSQL)){\r
+////                   updateQuery = "DROP INDEX IF EXISTS @indexName";  // does not work because index is used in the constraint\r
+////                   updateQuery = "ALTER TABLE @tableName DROP CONSTRAINT IF EXISTS @indexName"; //"if exists" does not work (version 8.4) \r
+//                     updateQuery = "ALTER TABLE @tableName DROP CONSTRAINT @indexName";\r
+//             }else if (type.equals(DatabaseTypeEnum.MySQL)){\r
+//                     updateQuery = "ALTER TABLE @tableName DROP INDEX @indexName";\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
+//             updateQuery = updateQuery.replace("@tableName", tableName);\r
+//             updateQuery = updateQuery.replace("@indexName", indexName);\r
+//             \r
+//             return updateQuery;\r
+//     }\r
+//\r
+//\r
+//     private String getIndexName(ICdmDataSource datasource) throws DatabaseTypeNotSupportedException, SQLException {\r
+//             String result = this.indexColumn;\r
+//             DatabaseTypeEnum type = datasource.getDatabaseType();\r
+//             if (type.equals(DatabaseTypeEnum.SqlServer2005)){\r
+//                     throw new DatabaseTypeNotSupportedException(type.toString());\r
+//             }else if (type.equals(DatabaseTypeEnum.MySQL)){\r
+//                     result = this.indexColumn;\r
+//             }else if (type.equals(DatabaseTypeEnum.H2) ){\r
+////                   String sql = "SELECT INDEX_NAME FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_NAME = @tableName AND INDEX_TYPE_NAME = 'UNIQUE INDEX'"; \r
+//                     String sql = "SELECT CONSTRAINT_NAME " + \r
+//                                     " FROM INFORMATION_SCHEMA.CONSTRAINTS "+\r
+//                                     " WHERE CONSTRAINT_CATALOG = '@dbName' AND "+\r
+//                                     " TABLE_NAME = '@tableName' AND CONSTRAINT_TYPE = 'UNIQUE' AND "+ \r
+//                                     " COLUMN_LIST = '@columnName'"; \r
+//                     sql = sql.replace("@tableName", tableName.toUpperCase());\r
+//                     sql = sql.replace("@columnName", indexColumn.toUpperCase());\r
+//                     sql = sql.replace("@dbName", datasource.getDatabase().toUpperCase());\r
+//                     String constraintName = (String)datasource.getSingleValue(sql);\r
+//                     result = constraintName;\r
+//             }else if (type.equals(DatabaseTypeEnum.PostgreSQL)){\r
+//                     //TODO do we need this cased?\r
+//                     result = this.tableName + "_" + this.indexColumn + "_key";\r
+//             }else{\r
+//                     throw new DatabaseTypeNotSupportedException(type.toString());\r
+//             }\r
+//             return result;\r
+//             \r
+//     }\r
+\r
+\r
+\r
+\r
+}\r
index 40465fac426c47188ddd801c7542e9fc8f000f43..2e024cc881a95f2662fd96886b0fc191f99e483d 100644 (file)
@@ -1,15 +1,23 @@
 package eu.etaxonomy.cdm.persistence.dao.hibernate.occurrence;\r
 \r
-import static org.junit.Assert.*;\r
-\r
+import org.h2.util.StringUtils;\r
+import org.junit.Assert;\r
 import org.junit.Before;\r
 import org.junit.BeforeClass;\r
 import org.junit.Test;\r
+import org.unitils.spring.annotation.SpringBeanByType;\r
 \r
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;\r
+import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;\r
 import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest;\r
 \r
 public class OccurrenceDaoHibernateImplTest  extends CdmIntegrationTest {\r
 \r
+       @SpringBeanByType\r
+       private IOccurrenceDao dao;\r
+       \r
+       \r
        @BeforeClass\r
        public static void setUpBeforeClass() throws Exception {\r
        }\r
@@ -84,5 +92,16 @@ public class OccurrenceDaoHibernateImplTest  extends CdmIntegrationTest {
        public void testListByAnyAssociation() {\r
                logger.warn("Not yet implemented");\r
        }\r
+       \r
+       @Test\r
+       public void testSaveOriginalLabelData(){\r
+               DerivedUnit unit = DerivedUnit.NewInstance(SpecimenOrObservationType.DerivedUnit);\r
+               String originalLabelInfo = StringUtils.pad("my original info", 10000, "x", false);\r
+               Assert.assertEquals(Integer.valueOf(10000),  (Integer)originalLabelInfo.length());\r
+               unit.setOriginalLabelInfo(originalLabelInfo);\r
+               //test that lob is supported\r
+               dao.save(unit);\r
+               //assert no exception\r
+       }\r
 \r
 }\r
index bf373e815b6e838da50f045133f49503512122a6..8918572cadaf79a9a0fd517b3af0b28301b2d8c1 100644 (file)
@@ -3441,6 +3441,7 @@ CREATE CACHED TABLE PUBLIC.SPECIMENOROBSERVATIONBASE(
     CATALOGNUMBER VARCHAR(255),
     COLLECTORSNUMBER VARCHAR(255),
     EXSICCATUM VARCHAR(255),
+    ORIGINALLABELINFO CLOB,
     FIELDNOTES VARCHAR(255),
     FIELDNUMBER VARCHAR(255),
     CREATEDBY_ID INTEGER,
@@ -3481,6 +3482,7 @@ CREATE CACHED TABLE PUBLIC.SPECIMENOROBSERVATIONBASE_AUD(
     CATALOGNUMBER VARCHAR(255),
     COLLECTORSNUMBER VARCHAR(255),
     EXSICCATUM VARCHAR(255),
+    ORIGINALLABELINFO CLOB,
     FIELDNOTES VARCHAR(255),
     FIELDNUMBER VARCHAR(255),
     CREATEDBY_ID INTEGER,
index 1c6082cd88e8a19af5eef8abefda54cef796f8a1..c567e8f3586b45e085c2368473f4da27c67c7d6e 100644 (file)
@@ -3,7 +3,7 @@
        <parent>
                <artifactId>cdmlib-parent</artifactId>
                <groupId>eu.etaxonomy</groupId>
-               <version>3.3.6-SNAPSHOT</version>
+               <version>3.4.0-SNAPSHOT</version>
                <relativePath>../pom.xml</relativePath>
        </parent>
        <modelVersion>4.0.0</modelVersion>
index 7f00a417c438bc31fa18f02fbe946382a6064878..9ddf0e3a657856ee945c02effd55a1de8e7557e1 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>eu.etaxonomy</groupId>
     <artifactId>cdmlib-parent</artifactId>
-    <version>3.3.6-SNAPSHOT</version>
+    <version>3.4.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
index 2bb3ceb321ea869bffad8c39d8ee3dd8bf388fe2..c780fbeb08bbe8f230e12576ef9143456d51aa04 100644 (file)
@@ -6,7 +6,7 @@
   <parent>
     <groupId>eu.etaxonomy</groupId>
     <artifactId>cdmlib-parent</artifactId>
-    <version>3.3.6-SNAPSHOT</version>
+    <version>3.4.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
index bf373e815b6e838da50f045133f49503512122a6..8918572cadaf79a9a0fd517b3af0b28301b2d8c1 100644 (file)
@@ -3441,6 +3441,7 @@ CREATE CACHED TABLE PUBLIC.SPECIMENOROBSERVATIONBASE(
     CATALOGNUMBER VARCHAR(255),
     COLLECTORSNUMBER VARCHAR(255),
     EXSICCATUM VARCHAR(255),
+    ORIGINALLABELINFO CLOB,
     FIELDNOTES VARCHAR(255),
     FIELDNUMBER VARCHAR(255),
     CREATEDBY_ID INTEGER,
@@ -3481,6 +3482,7 @@ CREATE CACHED TABLE PUBLIC.SPECIMENOROBSERVATIONBASE_AUD(
     CATALOGNUMBER VARCHAR(255),
     COLLECTORSNUMBER VARCHAR(255),
     EXSICCATUM VARCHAR(255),
+    ORIGINALLABELINFO CLOB,
     FIELDNOTES VARCHAR(255),
     FIELDNUMBER VARCHAR(255),
     CREATEDBY_ID INTEGER,
diff --git a/pom.xml b/pom.xml
index 7d4050c314ea0fe03b60707fea9bef2c05389110..4fdac26108664983181944e49ee401a0fcd1db53 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>eu.etaxonomy</groupId>
     <artifactId>cdmlib-parent</artifactId>
-       <version>3.3.6-SNAPSHOT</version>
+       <version>3.4.0-SNAPSHOT</version>
     <name>CDM Library</name>
     <description>The Java implementation of the Common Data Model (CDM), the data model for EDIT's internet platform for cybertaxonomy.</description>
     <url>http://cybertaxonomy.eu/cdmlib/</url>