cdmlibrary/src/main/java/eu/etaxonomy/cdm/persistence/dao/IEnumerationDAO.java -text
cdmlibrary/src/main/java/eu/etaxonomy/cdm/persistence/dao/ITaxonDao.java -text
cdmlibrary/src/main/java/eu/etaxonomy/cdm/persistence/dao/ITaxonNameDao.java -text
+cdmlibrary/src/main/java/eu/etaxonomy/cdm/persistence/dao/NoDefinedTermClassException.java -text
cdmlibrary/src/main/java/eu/etaxonomy/cdm/persistence/dao/TaxonDaoHibernateImpl.java -text
cdmlibrary/src/main/java/eu/etaxonomy/cdm/persistence/dao/TaxonNameDaoHibernateImpl.java -text
cdmlibrary/src/main/java/eu/etaxonomy/cdm/strategy/BotanicNameCacheStrategy.java -text
cdmlibrary/src/main/resources/cdm.datasource.xml -text
cdmlibrary/src/main/resources/log4j.properties -text
cdmlibrary/src/main/resources/sessionfactory.xml -text
+cdmlibrary/src/main/resources/terms/ConceptRelationshipType.csv -text
+cdmlibrary/src/main/resources/terms/HybridRelationshipType.csv -text
+cdmlibrary/src/main/resources/terms/NameRelationshipType.csv -text
+cdmlibrary/src/main/resources/terms/NomenclaturalStatusType.csv -text
+cdmlibrary/src/main/resources/terms/Rank.csv -text
+cdmlibrary/src/main/resources/terms/SynonymRelationshipType.csv -text
+cdmlibrary/src/main/resources/terms/TypeDesignationStatus.csv -text
cdmlibrary/src/site/site.xml -text
cdmlibrary/src/test/java/eu/etaxonomy/cdm/aspectj/PropertyChangeTest.java -text
cdmlibrary/src/test/java/eu/etaxonomy/cdm/database/DatabaseEnumTest.java -text
\r
import java.util.List;\r
\r
+import eu.etaxonomy.cdm.model.common.Enumeration;\r
import eu.etaxonomy.cdm.model.name.*;\r
\r
\r
\r
public abstract List<TaxonNameBase> getNamesByName(String name);\r
\r
+ public abstract Enumeration getRankEnumeration();\r
}
\ No newline at end of file
import org.springframework.stereotype.Repository;\r
import org.springframework.stereotype.Service;\r
\r
+import eu.etaxonomy.cdm.model.common.Enumeration;\r
import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
import eu.etaxonomy.cdm.model.name.*;\r
import eu.etaxonomy.cdm.persistence.dao.IAgentDao;\r
return dao.list(limit, start);\r
}\r
\r
+\r
+ public Enumeration getRankEnumeration() {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
}\r
//logger.setLevel(Level.DEBUG);
// get property that is set by setter method
Field property = getFieldOfSetter( thisJoinPointStaticPart.getSignature() );
- property.setAccessible(true);
- String propertyName = property.getName();
- //logger.debug("execSetter: The property is ["+propertyName+"]");
- try {
- // use property attribute directly, not through get method.
- // get method might modify things, like setting a UUID when called for the first time.
- // Also get methods for booleans start with "is" or "has"
- Object oldValue = property.get(cb);
- proceed( cb );
- cb.firePropertyChange( propertyName, oldValue, property.get(cb));
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- proceed( cb );
- }catch (IllegalArgumentException e) {
- e.printStackTrace();
- proceed( cb );
- }catch (IllegalAccessException e) {
- e.printStackTrace();
- proceed( cb );
- } catch (InvocationTargetException e) {
- e.printStackTrace();
+ if (property==null){
proceed( cb );
+ }else{
+ property.setAccessible(true);
+ String propertyName = property.getName();
+ //logger.debug("execSetter: The property is ["+propertyName+"]");
+ try {
+ // use property attribute directly, not through get method.
+ // get method might modify things, like setting a UUID when called for the first time.
+ // Also get methods for booleans start with "is" or "has"
+ Object oldValue = property.get(cb);
+ proceed( cb );
+ cb.firePropertyChange( propertyName, oldValue, property.get(cb));
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ proceed( cb );
+ }catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ proceed( cb );
+ }catch (IllegalAccessException e) {
+ e.printStackTrace();
+ proceed( cb );
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ proceed( cb );
+ }
}
}
/**
* @param signature
* Return the Field object that belongs to the signature of a setter method
+ * If no matching attribute can be found return null instead of throwing an NoSuchFieldException
* Removes first 3 characters of method name to find property name
*/
private Field getFieldOfSetter( Signature signature ){
propertyName = "is"+propertyName.substring(0, 1).toUpperCase()+ propertyName.substring(1);
field = signature.getDeclaringType().getDeclaredField( propertyName );
}catch( NoSuchFieldException nsfe ){
- nsfe.printStackTrace();
+ // cant find any matching attribute. catch error and return null
+ return null;
}
}
return field;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeEvent;
import java.io.Serializable;
+import java.util.Calendar;
+import java.util.UUID;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
+import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
import javax.persistence.Transient;
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.CascadeType;
+
+import eu.etaxonomy.cdm.model.agent.Person;
+
@MappedSuperclass
public abstract class CdmBase implements Serializable{
-
- public CdmBase() {
- // TODO Auto-generated constructor stub
- }
private PropertyChangeSupport support = new PropertyChangeSupport(this);
private int id;
+ private String uuid;
+ private Calendar created;
+ private Person createdBy;
+
+ public CdmBase() {
+ this.uuid = UUID.randomUUID().toString();
+ this.created = Calendar.getInstance();
+ }
+
public void addPropertyChangeListener(PropertyChangeListener listener) {
support.addPropertyChangeListener(listener);
}
public int getId() {
return this.id;
}
-
- /**
- *
- * @param id id
- */
public void setId(int id) {
this.id = id;
}
+
+ public String getUuid() {
+ return this.uuid;
+ }
+ protected void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+
+ @Temporal(TemporalType.TIMESTAMP)
+ public Calendar getCreated() {
+ return this.created;
+ }
+ public void setCreated(Calendar created) {
+ this.created = created;
+ }
+
+
+ @ManyToOne
+ @Cascade( { CascadeType.SAVE_UPDATE })
+ public Person getCreatedBy() {
+ return this.createdBy;
+ }
+ public void setCreatedBy(Person createdBy) {
+ this.createdBy = createdBy;
+ }
+
+
+ @Override
+ // equals if UUID and created timestamp are the same!
+ public boolean equals(Object obj) {
+ if (CdmBase.class.isAssignableFrom(obj.getClass())){
+ CdmBase cdmObj = (CdmBase)obj;
+ if (cdmObj.getUuid().equals(this.getUuid()) && cdmObj.getCreated().equals(this.getCreated())){
+ return true;
+ }
+ }
+ return false;
+ }
}
return this.getRepresentation(lang).getLabel();
}
+
+ @Override
+ // equals if UUIDs are the same, no matter where/when created!
+ public boolean equals(Object obj) {
+ if (DefinedTermBase.class.isAssignableFrom(obj.getClass())){
+ DefinedTermBase dtb = (DefinedTermBase)obj;
+ if (dtb.getUuid().equals(this.getUuid())){
+ return true;
+ }
+ }
+ return false;
+ }
+
}
\ No newline at end of file
public void removeTerm(EnumeratedTermBase term) {
term.setEnumeration(null);
}
-
+
+ public List<EnumeratedTermBase> getPrecedingTerms(EnumeratedTermBase etb) {
+ return terms.subList(0, terms.indexOf(etb));
+ }
+ public List<EnumeratedTermBase> getSucceedingTerms(EnumeratedTermBase etb) {
+ return terms.subList(terms.indexOf(etb), terms.size());
+ }
+ public EnumeratedTermBase getPreviousTerm(EnumeratedTermBase etb) {
+ int idx = terms.indexOf(etb)-1;
+ return terms.get(idx);
+ }
+ public EnumeratedTermBase getNextTerm(EnumeratedTermBase etb) {
+ int idx = terms.indexOf(etb)+1;
+ return terms.get(idx);
+ }
+
public String getEnumerationUri() {
return enumerationUri;
public void setEnumerationUri(String enumerationUri) {
this.enumerationUri = enumerationUri;
}
-
- /**
- * add new terms from a vocabulary to which uri points.
- *
- * @param uri uri
- */
- public void loadTerms(String uri){
-
- }
-
-
}
\ No newline at end of file
@MappedSuperclass
public abstract class VersionableEntity<T extends VersionableEntity> extends CdmBase {
static Logger logger = Logger.getLogger(VersionableEntity.class);
- //the globally unique identifier
- private String uuid;
- private Calendar created;
- private Person createdBy;
//time of last update for this object
private Calendar updated;
private Person updatedBy;
- private T nextVersion;
- private T previousVersion;
+ private CdmBase nextVersion;
+ private CdmBase previousVersion;
public VersionableEntity() {
super();
- this.uuid = UUID.randomUUID().toString();
- this.created = Calendar.getInstance();
}
//@OneToOne(mappedBy="previousVersion")
@Transient
- public T getNextVersion(){
+ public CdmBase getNextVersion(){
return this.nextVersion;
}
- public void setNextVersion(T nextVersion){
+ public void setNextVersion(CdmBase nextVersion){
this.nextVersion = nextVersion;
}
//@OneToOne
@Transient
- public T getPreviousVersion(){
+ public CdmBase getPreviousVersion(){
return this.previousVersion;
}
- public void setPreviousVersion(T previousVersion){
+ public void setPreviousVersion(CdmBase previousVersion){
this.previousVersion = previousVersion;
}
this.updatedBy = updatedBy;
}
- @ManyToOne
- @Cascade({CascadeType.SAVE_UPDATE})
- public Person getCreatedBy(){
- return this.createdBy;
- }
-
- /**
- *
- * @param createdBy createdBy
- */
- public void setCreatedBy(Person createdBy){
- this.createdBy = createdBy;
- }
-
- public String getUuid(){
- return this.uuid;
- }
- /**
- *
- * @param uuid uuid
- */
- protected void setUuid(String uuid){
- this.uuid = uuid;
- }
-
- @Temporal(TemporalType.TIMESTAMP)
- public Calendar getCreated(){
- return this.created;
- }
- /**
- *
- * @param created created
- */
- public void setCreated(Calendar created){
- this.created = created;
- }
-
@Temporal(TemporalType.TIMESTAMP)
public Calendar getUpdated(){
return this.updated;
import org.springframework.dao.DataAccessException;\r
\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
\r
\r
/**\r
* @author a.mueller\r
*\r
*/\r
-public abstract class DaoBase<T extends VersionableEntity> implements IDao<T> {\r
+public abstract class DaoBase<T extends CdmBase> implements IDao<T> {\r
\r
static Logger logger = Logger.getLogger(DaoBase.class);\r
\r
package eu.etaxonomy.cdm.persistence.dao;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;
+import au.com.bytecode.opencsv.CSVReader;
+
+import eu.etaxonomy.cdm.common.CdmUtils;
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
import eu.etaxonomy.cdm.model.common.Enumeration;
return null;
}
+ // load a list of defined terms from a simple text file
+ // if isEnumeration is true an Enumeration for the ordered term list will be returned
+ public Enumeration loadTerms(Class termClass, String filename, boolean isEnumeration) throws NoDefinedTermClassException, FileNotFoundException {
+ if (DefinedTermBase.class.isAssignableFrom(termClass)){
+ File termFile = new File(CdmUtils.getResourceDir().getAbsoluteFile()+File.separator+"terms"+File.separator+filename);
+ CSVReader reader = new CSVReader(new FileReader(termFile));
+ String [] nextLine;
+ try {
+ while ((nextLine = reader.readNext()) != null) {
+ // nextLine[] is an array of values from the line
+ for (String col : nextLine){
+ System.out.print(">"+col.toString()+"< ");
+ }
+ System.out.println();
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }else{
+ throw new NoDefinedTermClassException(termClass.getSimpleName());
+ }
+ return null;
+ }
+
}
import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.cdm.model.common.Enumeration;
-import eu.etaxonomy.cdm.model.common.VersionableEntity;
/**
* an data access interface that all data access classes implement
* @version 1.0
* @created 02-Nov-2007 19:36:10
*/
-public interface IDao<T extends VersionableEntity> {
+public interface IDao<T extends CdmBase> {
public String saveOrUpdate(T transientObject) throws DataAccessException;
/* (non-Javadoc)
package eu.etaxonomy.cdm.persistence.dao;
+import java.io.FileNotFoundException;
import java.util.List;
import eu.etaxonomy.cdm.model.common.Enumeration;
public interface IEnumerationDAO extends IDao<Enumeration> {
+ public Enumeration loadTerms(Class termClass, String filename, boolean isEnumeration) throws NoDefinedTermClassException, FileNotFoundException;
}
\ No newline at end of file
--- /dev/null
+package eu.etaxonomy.cdm.persistence.dao;
+
+public class NoDefinedTermClassException extends Exception {
+
+ public NoDefinedTermClassException() {
+ // TODO Auto-generated constructor stub
+ }
+
+ public NoDefinedTermClassException(String arg0) {
+ super(arg0);
+ // TODO Auto-generated constructor stub
+ }
+
+ public NoDefinedTermClassException(Throwable arg0) {
+ super(arg0);
+ // TODO Auto-generated constructor stub
+ }
+
+ public NoDefinedTermClassException(String arg0, Throwable arg1) {
+ super(arg0, arg1);
+ // TODO Auto-generated constructor stub
+ }
+
+}
\r
import eu.etaxonomy.cdm.model.agent.Agent;\r
import eu.etaxonomy.cdm.model.agent.Team;\r
-import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.cdm.model.name.NonViralName;\r
\r
/**\r
* @see eu.etaxonomy.cdm.strategy.INameCacheStrategy#getFullNameCache()\r
*/\r
// PROTOTYPE implementation\r
- public String getNameCache(VersionableEntity object) {\r
+ public String getNameCache(CdmBase object) {\r
String result;\r
NonViralName tn = (NonViralName)object;\r
if (tn.getUninomial() != null){\r
* @see eu.etaxonomy.cdm.strategy.INameCacheStrategy#getNameCache()\r
*/\r
// PROTOTYPE implementation\r
- public String getFullNameCache(VersionableEntity object) {\r
+ public String getFullNameCache(CdmBase object) {\r
String result;\r
NonViralName tn = (NonViralName)object;\r
result = getNameCache(object);\r
*/\r
package eu.etaxonomy.cdm.strategy;\r
\r
-import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
\r
/**\r
* @author a.mueller\r
public interface INameCacheStrategy extends IStrategy {\r
\r
//returns the composed name string without author or year\r
- public String getNameCache(VersionableEntity object);\r
+ public String getNameCache(CdmBase object);\r
\r
//returns the composed name string with author and/or year\r
- public String getFullNameCache(VersionableEntity object);\r
+ public String getFullNameCache(CdmBase object);\r
\r
}\r
\r
import eu.etaxonomy.cdm.model.agent.Agent;\r
import eu.etaxonomy.cdm.model.agent.Team;\r
-import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.cdm.model.name.NonViralName;\r
\r
public class ZooNameCacheStrategy extends StrategyBase implements\r
* @see eu.etaxonomy.cdm.strategy.INameCacheStrategy#getFullNameCache()\r
*/\r
// PROTOTYPE dummy implementation\r
- public String getNameCache(VersionableEntity object) {\r
+ public String getNameCache(CdmBase object) {\r
String result;\r
NonViralName tn = (NonViralName)object;\r
if (tn.getUninomial() != null){\r
* @see eu.etaxonomy.cdm.strategy.INameCacheStrategy#getNameCache()\r
*/\r
// PROTOTYPE dummy implementation\r
- public String getFullNameCache(VersionableEntity object) {\r
+ public String getFullNameCache(CdmBase object) {\r
String result;\r
NonViralName tn = (NonViralName)object;\r
result = getNameCache(object);\r
--- /dev/null
+UUID Term Inverseterm Symetric Transitive
+ Taxonomically Included in Taxonomically Includes *
+ Misapplied Name for Has Misapplied Name
+ Invalid Designation for Has Invalid Designation
+ Contradiction *
+ Congruent to *
+ Includes Included in *
+ Congruent to or Includes Congruent to or Included in *
+ Included in or Includes *
+ Congruent to or Included in or Includes *
+ Overlaps *
+ Congruent to or Overlaps *
+ Includes or Overlaps Included in or Overlaps
+ Congruent to or Includes or Overlaps Congruent to or Included in or Overlaps
+ Included in or Includes or Overlaps *
+ Does Not Exclude *
+ Excludes *
+ Congruent to or Excludes *
+ Includes or Excludes Included in or Excludes
+ Congruent to or Includes or Excludes Congruent to or Included in or Excludes
+ Included in or Includes or Excludes *
+ Does Not Overlap *
+ Overlaps or Excludes *
+ Congruent to or Overlaps or Excludes *
+ Includes or Overlaps or Excludes Included in or Overlaps or Excludes
+ Not Included in Does Not Include
+ Not Congruent to *
+ All Relationships *
--- /dev/null
+Uuid Term Inverseterm Symetric Transitive
+ First Parent Child
+ Second Parent Child
+ Female Parent Child
+ Male Parent Child
\ No newline at end of file
--- /dev/null
+Uuid Term Inverseterm Symetric Transitive
+ Orthographic Variant * *
+ Later Homonym Ealier Homonym *
+ Treated As Later Homonym Treated As Earlier Homonym
+ Alternative Name * *
+ Basionym New Combination
+ Replaced Synonym New Name
+ Conserved Against Rejected in Favour
+ Validated by Name Validating Name
+ Later Validated by Name Later Validating Name
+
+Hybridrelationshiptype
+ First Parent Child
+ Second Parent Child
+ Female Parent Child
+ Male Parent Child
\ No newline at end of file
--- /dev/null
+Uuid Term
+ Ambiguous
+ Doubtful
+ Confusum
+ Illegitimate
+ Superfluous
+ Rejected
+ Utique Rejected
+ Conserved Prop
+ Orthography Conserved Prop
+ Legitimate
+ Alternative
+ Novum
+ Utique Rejected Prop
+ Orthography Conserved
+ Rejected Prop
+ Conserved
+ Sanctioned
+ Invalid
+ Nudum
+ Combination Invalid
+ Provisional
\ No newline at end of file
--- /dev/null
+Uuid Term
+ Empire
+ Domain
+ Super Kingdom
+ Kingdom
+ Subkingdom
+ Infrakingdom
+ Superphylum
+ Phylum
+ Subphylum
+ Infraphylum
+ Superdivision
+ Division
+ Subdivision
+ Infradivision
+ Superclass
+ Class
+ Subclass
+ Infraclass
+ Superorder
+ Order
+ Suborder
+ Infraorder
+ Superfamily
+ Family
+ Subfamily
+ Infrafamily
+ Supertribe
+ Tribe
+ Subtribe
+ Infratribe
+ Suprageneric Taxon
+ Genus
+ Subgenus
+ Infragenus
+ Section
+ Subsection
+ Series
+ Subseries
+ Species Aggregate
+ Infrageneric Taxon
+ Species
+ Subspecific Aggregate
+ Subspecies
+ Infraspecies
+ Variety
+ Bio Variety
+ Patho Variety
+ Subvariety
+ Subsubvariety
+ Convar
+ Form
+ Special Form
+ Subform
+ Subsubform
+ Infraspecific Taxon
+ Candidate
+ Denomination Class
+ Grex
+ Graft Chimaera
+ Cultivar Group
+ Cultivar
\ No newline at end of file
--- /dev/null
+UUID Term
+ Synonym of
+ Pro Parte Synonym of
+ Partial Synonym of
+ Homotypic Synonym of
+ Heterotypic Synonym Of
\ No newline at end of file
--- /dev/null
+UUID Term
+ Holotype
+ Lectotype
+ Neotype
+ Epitype
+ Isolectotype
+ Isoneotype
+ Isotype
+ Paraneotype
+ Paratype
+ Second Step Lectotype
+ Second Step Neotype
+ Syntype
+ Paralectotype
+ Isoepitype
+ Iconotype
+ Phototype
\ No newline at end of file
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import java.io.FileNotFoundException;
import java.util.List;
import org.apache.log4j.Logger;
import eu.etaxonomy.cdm.model.common.Enumeration;
import eu.etaxonomy.cdm.model.common.Keyword;
+import eu.etaxonomy.cdm.model.name.Rank;
import eu.etaxonomy.cdm.test.unit.CdmUnitTestBase;
dao.saveOrUpdate(this.enumeration);
}
- @Test
- public void testFindById() {
- // fail("Not yet implemented");
- }
-
@Test
public void testFindString() {
List<Enumeration> myEnum = dao.find("biodomain");
}
@Test
- public void testExists() {
- // fail("Not yet implemented");
+ public void loadTerms() {
+ try {
+ dao.loadTerms(Rank.class, "Rank.csv", true);
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NoDefinedTermClassException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
}
@Test