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
<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>
<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>
CATALOGNUMBER VARCHAR(255),
COLLECTORSNUMBER VARCHAR(255),
EXSICCATUM VARCHAR(255),
+ ORIGINALLABELINFO CLOB,
FIELDNOTES VARCHAR(255),
FIELDNUMBER VARCHAR(255),
CREATEDBY_ID INTEGER,
CATALOGNUMBER VARCHAR(255),
COLLECTORSNUMBER VARCHAR(255),
EXSICCATUM VARCHAR(255),
+ ORIGINALLABELINFO CLOB,
FIELDNOTES VARCHAR(255),
FIELDNUMBER VARCHAR(255),
CREATEDBY_ID INTEGER,
<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>
CATALOGNUMBER VARCHAR(255),
COLLECTORSNUMBER VARCHAR(255),
EXSICCATUM VARCHAR(255),
+ ORIGINALLABELINFO CLOB,
FIELDNOTES VARCHAR(255),
FIELDNUMBER VARCHAR(255),
CREATEDBY_ID INTEGER,
CATALOGNUMBER VARCHAR(255),
COLLECTORSNUMBER VARCHAR(255),
EXSICCATUM VARCHAR(255),
+ ORIGINALLABELINFO CLOB,
FIELDNOTES VARCHAR(255),
FIELDNUMBER VARCHAR(255),
CREATEDBY_ID INTEGER,
<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>
\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
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
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
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
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
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
@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
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
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
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
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
@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
* 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
* \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
import javax.persistence.Entity;
import javax.persistence.FetchType;
+import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Transient;
"barcode",
"preservation",
"exsiccatum",
+ "originalLabelInfo",
"specimenTypeDesignations"
})
@XmlRootElement(name = "DerivedUnit")
@Cascade(CascadeType.SAVE_UPDATE)
@IndexedEmbedded(depth = 4)
private DerivationEvent derivedFrom;
+
+ @XmlElement(name = "OriginalLabelInfo")
+ @Lob
+ private String originalLabelInfo;
@XmlElementWrapper(name = "SpecimenTypeDesignations")
@XmlElement(name = "SpecimenTypeDesignation")
this.collection = collection;
}
-
public String getCatalogNumber() {
return catalogNumber;
}
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.
}
+
}
"synonymRelations",
"relationsFromThisTaxon",
"relationsToThisTaxon",
- "descriptions",
- "publish"
+ "descriptions"
})
@XmlRootElement(name = "Taxon")
@Entity
@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);
@Deprecated //will be removed in future versions. Use Classification/TaxonNode instead
private int taxonomicChildrenCount;
-
- @XmlAttribute(name = "publish")
- private boolean publish = true;
-
// ************************* FACTORY METHODS ********************************/
/**
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.
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;
"sec",
"doubtful",
"appendedPhrase",
- "useNameCache"
+ "useNameCache",
+ "publish"
})
@Entity
@Audited
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);
@XmlAttribute(name= "UseNameCache")
private boolean useNameCache = false;
+
+ @XmlAttribute(name = "publish")
+ private boolean publish = true;
// ************* CONSTRUCTORS *************/
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.
<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>
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
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
\r
\r
private ITermUpdater getCurrentTermUpdater() {\r
- return TermUpdater_31_33.NewInstance();\r
+ return TermUpdater_33_34.NewInstance();\r
}\r
\r
/**\r
* @return\r
*/\r
private ISchemaUpdater getCurrentSchemaUpdater() {\r
- return SchemaUpdater_33_331.NewInstance();\r
+ return SchemaUpdater_331_34.NewInstance();\r
}\r
\r
/**\r
}\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
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
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
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
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
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
\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
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
@Override
public ISchemaUpdater getNextUpdater() {
- return null;
+ return SchemaUpdater_331_34.NewInstance();
}
@Override
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
\r
@Override\r
public ITermUpdater getNextUpdater() {\r
- return null;\r
+ return TermUpdater_33_34.NewInstance();\r
}\r
\r
@Override\r
--- /dev/null
+// $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();
+ }
+
+}
--- /dev/null
+// $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
--- /dev/null
+// $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
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
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
CATALOGNUMBER VARCHAR(255),
COLLECTORSNUMBER VARCHAR(255),
EXSICCATUM VARCHAR(255),
+ ORIGINALLABELINFO CLOB,
FIELDNOTES VARCHAR(255),
FIELDNUMBER VARCHAR(255),
CREATEDBY_ID INTEGER,
CATALOGNUMBER VARCHAR(255),
COLLECTORSNUMBER VARCHAR(255),
EXSICCATUM VARCHAR(255),
+ ORIGINALLABELINFO CLOB,
FIELDNOTES VARCHAR(255),
FIELDNUMBER VARCHAR(255),
CREATEDBY_ID INTEGER,
<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>
<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>
<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>
CATALOGNUMBER VARCHAR(255),
COLLECTORSNUMBER VARCHAR(255),
EXSICCATUM VARCHAR(255),
+ ORIGINALLABELINFO CLOB,
FIELDNOTES VARCHAR(255),
FIELDNUMBER VARCHAR(255),
CREATEDBY_ID INTEGER,
CATALOGNUMBER VARCHAR(255),
COLLECTORSNUMBER VARCHAR(255),
EXSICCATUM VARCHAR(255),
+ ORIGINALLABELINFO CLOB,
FIELDNOTES VARCHAR(255),
FIELDNUMBER VARCHAR(255),
CREATEDBY_ID INTEGER,
<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>