From 2b29609659f29daae179591b289e5f741956bd9a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andreas=20M=EF=BF=BD=EF=BF=BDller?= Date: Fri, 29 May 2015 12:50:48 +0000 Subject: [PATCH] first implementation of TaxonNodeAgentRelation #3583 --- .gitattributes | 1 + .../test/resources/dbscripts/001-cdm.h2.sql | 50 +++++++ .../test/resources/dbscripts/001-cdm.h2.sql | 50 +++++++ .../etaxonomy/cdm/model/taxon/TaxonNode.java | 26 +++- .../model/taxon/TaxonNodeAgentRelation.java | 125 ++++++++++++++++++ .../eu/etaxonomy/cdm/hibernate.cfg.xml | 1 + .../test/resources/dbscripts/001-cdm.h2.sql | 50 +++++++ .../test/resources/dbscripts/001-cdm.h2.sql | 50 +++++++ 8 files changed, 346 insertions(+), 7 deletions(-) create mode 100644 cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNodeAgentRelation.java diff --git a/.gitattributes b/.gitattributes index 6c26b29b17..c982d85010 100644 --- a/.gitattributes +++ b/.gitattributes @@ -973,6 +973,7 @@ cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonComparator.java -te cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonComparatorSearch.java -text cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNaturalComparator.java -text cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNode.java -text +cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNodeAgentRelation.java -text cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNodeByNameComparator.java -text cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonRelationship.java -text cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonRelationshipType.java -text diff --git a/cdmlib-ext/src/test/resources/dbscripts/001-cdm.h2.sql b/cdmlib-ext/src/test/resources/dbscripts/001-cdm.h2.sql index 8efa945d23..7ee83f2f29 100644 --- a/cdmlib-ext/src/test/resources/dbscripts/001-cdm.h2.sql +++ b/cdmlib-ext/src/test/resources/dbscripts/001-cdm.h2.sql @@ -4569,6 +4569,56 @@ CREATE CACHED TABLE PUBLIC.TAXONNODE( TAXON_ID INTEGER ); -- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODE; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION( + ID INTEGER NOT NULL, + CREATED TIMESTAMP, + UUID VARCHAR(36), + UPDATED TIMESTAMP, + CREATEDBY_ID INTEGER, + UPDATEDBY_ID INTEGER, + AGENT_ID INTEGER, + TAXONNODE_ID INTEGER, + TYPE_ID INTEGER +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_AUD( + ID INTEGER NOT NULL, + REV INTEGER NOT NULL, + REVTYPE TINYINT, + CREATED TIMESTAMP, + UUID VARCHAR(36), + UPDATED TIMESTAMP, + CREATEDBY_ID INTEGER, + UPDATEDBY_ID INTEGER, + AGENT_ID INTEGER, + TAXONNODE_ID INTEGER, + TYPE_ID INTEGER +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_AUD; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION( + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + ANNOTATIONS_ID INTEGER NOT NULL +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION_AUD( + REV INTEGER NOT NULL, + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + ANNOTATIONS_ID INTEGER NOT NULL, + REVTYPE TINYINT +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION_AUD; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_MARKER( + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + MARKERS_ID INTEGER NOT NULL +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_MARKER; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_MARKER_AUD( + REV INTEGER NOT NULL, + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + MARKERS_ID INTEGER NOT NULL, + REVTYPE TINYINT +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_MARKER_AUD; CREATE CACHED TABLE PUBLIC.TAXONNODE_AUD( ID INTEGER NOT NULL, REV INTEGER NOT NULL, diff --git a/cdmlib-io/src/test/resources/dbscripts/001-cdm.h2.sql b/cdmlib-io/src/test/resources/dbscripts/001-cdm.h2.sql index 8efa945d23..7ee83f2f29 100644 --- a/cdmlib-io/src/test/resources/dbscripts/001-cdm.h2.sql +++ b/cdmlib-io/src/test/resources/dbscripts/001-cdm.h2.sql @@ -4569,6 +4569,56 @@ CREATE CACHED TABLE PUBLIC.TAXONNODE( TAXON_ID INTEGER ); -- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODE; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION( + ID INTEGER NOT NULL, + CREATED TIMESTAMP, + UUID VARCHAR(36), + UPDATED TIMESTAMP, + CREATEDBY_ID INTEGER, + UPDATEDBY_ID INTEGER, + AGENT_ID INTEGER, + TAXONNODE_ID INTEGER, + TYPE_ID INTEGER +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_AUD( + ID INTEGER NOT NULL, + REV INTEGER NOT NULL, + REVTYPE TINYINT, + CREATED TIMESTAMP, + UUID VARCHAR(36), + UPDATED TIMESTAMP, + CREATEDBY_ID INTEGER, + UPDATEDBY_ID INTEGER, + AGENT_ID INTEGER, + TAXONNODE_ID INTEGER, + TYPE_ID INTEGER +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_AUD; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION( + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + ANNOTATIONS_ID INTEGER NOT NULL +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION_AUD( + REV INTEGER NOT NULL, + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + ANNOTATIONS_ID INTEGER NOT NULL, + REVTYPE TINYINT +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION_AUD; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_MARKER( + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + MARKERS_ID INTEGER NOT NULL +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_MARKER; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_MARKER_AUD( + REV INTEGER NOT NULL, + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + MARKERS_ID INTEGER NOT NULL, + REVTYPE TINYINT +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_MARKER_AUD; CREATE CACHED TABLE PUBLIC.TAXONNODE_AUD( ID INTEGER NOT NULL, REV INTEGER NOT NULL, diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNode.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNode.java index 41c6c8f6d4..1c23a73080 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNode.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNode.java @@ -149,7 +149,7 @@ public class TaxonNode extends AnnotatableEntity implements ITaxonTreeNode, ITre @XmlSchemaType(name = "IDREF") @OneToMany(mappedBy="taxonNode", fetch=FetchType.LAZY) @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE}) - private final Set nodeAgents = new HashSet(); + private Set nodeAgents = new HashSet(); // private Taxon originalConcept; @@ -803,6 +803,14 @@ public class TaxonNode extends AnnotatableEntity implements ITaxonTreeNode, ITre return hasTaxon() ? getTaxon().getNullSafeRank() : null; } + /** + * @param clone + */ + private void addNodeAgent(TaxonNodeAgentRelation nodeAgentRelation) { + nodeAgentRelation.setTaxonNode(this); + + } + //*********************** CLONE ********************************************************/ /** * Clones this taxon node. This is a shortcut that enables to create @@ -816,14 +824,18 @@ public class TaxonNode extends AnnotatableEntity implements ITaxonTreeNode, ITre */ @Override public Object clone() { - TaxonNode result; try{ - result = (TaxonNode)super.clone(); - result.getTaxon().addTaxonNode(result); - result.childNodes = new ArrayList(); - result.countChildren = 0; + TaxonNode result = (TaxonNode)super.clone(); + result.getTaxon().addTaxonNode(result); + result.childNodes = new ArrayList(); + result.countChildren = 0; + + result.nodeAgents = new HashSet(); + for (TaxonNodeAgentRelation rel : this.nodeAgents){ + result.addNodeAgent((TaxonNodeAgentRelation)rel.clone()); + } - return result; + return result; }catch (CloneNotSupportedException e) { logger.warn("Object does not implement cloneable"); e.printStackTrace(); diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNodeAgentRelation.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNodeAgentRelation.java new file mode 100644 index 0000000000..59645f3e07 --- /dev/null +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNodeAgentRelation.java @@ -0,0 +1,125 @@ +// $Id$ +/** +* Copyright (C) 2015 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.model.taxon; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.ManyToOne; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlIDREF; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + +import org.apache.log4j.Logger; +import org.hibernate.annotations.Cascade; +import org.hibernate.annotations.CascadeType; +import org.hibernate.envers.Audited; +import org.springframework.security.core.GrantedAuthority; + +import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase; +import eu.etaxonomy.cdm.model.common.AnnotatableEntity; +import eu.etaxonomy.cdm.model.common.DefinedTerm; + +/** + * This class relates a TaxonNode (Taxon within it's given publication context) + * to an agent (person or team) and defining a type for this relationship. + * This is to indicate that an agent plays a certain role for this taxon + * (e.g. author of the according subtree, last scrutiny, ...). + * It is not meant to define rights and roles which are only handled via the + * {@link GrantedAuthority granted authorities}. + * @author a.mueller + * @date 29.05.2015 + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "TaxonNodeAgentRelation", propOrder = { + "taxonNode", + "agent", + "type", + }) +@XmlRootElement(name = "TaxonNodeAgentRelation") +@Entity +@Audited +public class TaxonNodeAgentRelation extends AnnotatableEntity { + private static final long serialVersionUID = -1476342569350403356L; + private static final Logger logger = Logger.getLogger(TaxonNodeAgentRelation.class); + + @XmlElement(name = "TaxonNode") + @XmlIDREF + @XmlSchemaType(name = "IDREF") + @ManyToOne(fetch = FetchType.LAZY) +// @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE}) //the + private TaxonNode taxonNode; + + @XmlElement(name = "Agent") + @XmlIDREF + @XmlSchemaType(name = "IDREF") + @ManyToOne(fetch = FetchType.LAZY) + @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE}) + private TeamOrPersonBase agent; + + @XmlElement(name = "Type") + @XmlIDREF + @XmlSchemaType(name = "IDREF") + @ManyToOne(fetch = FetchType.EAGER) + private DefinedTerm type; + + private TaxonNodeAgentRelation(){}; + +//********************* GETTER / SETTER **********************/ + + public TaxonNode getTaxonNode() { + return taxonNode; + } + public void setTaxonNode(TaxonNode taxonNode) { + this.taxonNode = taxonNode; + } + + public TeamOrPersonBase getAgent() { + return agent; + } + public void setAgent(TeamOrPersonBase agent) { + this.agent = agent; + } + + public DefinedTerm getType() { + return type; + } + public void setType(DefinedTerm type) { + this.type = type; + } + + +//************************** clone *******************************************/ + + /** + * Clones this taxon node agent relation. This is a shortcut that enables to create + * a new instance that differs only slightly from this relation. + * + * @see eu.etaxonomy.cdm.model.media.IdentifiableEntity#clone() + * @see java.lang.Object#clone() + */ + @Override + public Object clone() { + try{ + TaxonNodeAgentRelation result = (TaxonNodeAgentRelation)super.clone(); + + //no change to taxonNode, agent, type + return result; + }catch (CloneNotSupportedException e) { + logger.warn("Object does not implement cloneable"); + e.printStackTrace(); + return null; + } + } + +} diff --git a/cdmlib-persistence/src/main/resources/eu/etaxonomy/cdm/hibernate.cfg.xml b/cdmlib-persistence/src/main/resources/eu/etaxonomy/cdm/hibernate.cfg.xml index 9dbb3c690e..e48ff8a305 100644 --- a/cdmlib-persistence/src/main/resources/eu/etaxonomy/cdm/hibernate.cfg.xml +++ b/cdmlib-persistence/src/main/resources/eu/etaxonomy/cdm/hibernate.cfg.xml @@ -192,6 +192,7 @@ + diff --git a/cdmlib-persistence/src/test/resources/dbscripts/001-cdm.h2.sql b/cdmlib-persistence/src/test/resources/dbscripts/001-cdm.h2.sql index 8efa945d23..7ee83f2f29 100644 --- a/cdmlib-persistence/src/test/resources/dbscripts/001-cdm.h2.sql +++ b/cdmlib-persistence/src/test/resources/dbscripts/001-cdm.h2.sql @@ -4569,6 +4569,56 @@ CREATE CACHED TABLE PUBLIC.TAXONNODE( TAXON_ID INTEGER ); -- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODE; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION( + ID INTEGER NOT NULL, + CREATED TIMESTAMP, + UUID VARCHAR(36), + UPDATED TIMESTAMP, + CREATEDBY_ID INTEGER, + UPDATEDBY_ID INTEGER, + AGENT_ID INTEGER, + TAXONNODE_ID INTEGER, + TYPE_ID INTEGER +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_AUD( + ID INTEGER NOT NULL, + REV INTEGER NOT NULL, + REVTYPE TINYINT, + CREATED TIMESTAMP, + UUID VARCHAR(36), + UPDATED TIMESTAMP, + CREATEDBY_ID INTEGER, + UPDATEDBY_ID INTEGER, + AGENT_ID INTEGER, + TAXONNODE_ID INTEGER, + TYPE_ID INTEGER +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_AUD; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION( + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + ANNOTATIONS_ID INTEGER NOT NULL +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION_AUD( + REV INTEGER NOT NULL, + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + ANNOTATIONS_ID INTEGER NOT NULL, + REVTYPE TINYINT +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION_AUD; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_MARKER( + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + MARKERS_ID INTEGER NOT NULL +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_MARKER; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_MARKER_AUD( + REV INTEGER NOT NULL, + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + MARKERS_ID INTEGER NOT NULL, + REVTYPE TINYINT +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_MARKER_AUD; CREATE CACHED TABLE PUBLIC.TAXONNODE_AUD( ID INTEGER NOT NULL, REV INTEGER NOT NULL, diff --git a/cdmlib-services/src/test/resources/dbscripts/001-cdm.h2.sql b/cdmlib-services/src/test/resources/dbscripts/001-cdm.h2.sql index 8efa945d23..7ee83f2f29 100644 --- a/cdmlib-services/src/test/resources/dbscripts/001-cdm.h2.sql +++ b/cdmlib-services/src/test/resources/dbscripts/001-cdm.h2.sql @@ -4569,6 +4569,56 @@ CREATE CACHED TABLE PUBLIC.TAXONNODE( TAXON_ID INTEGER ); -- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODE; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION( + ID INTEGER NOT NULL, + CREATED TIMESTAMP, + UUID VARCHAR(36), + UPDATED TIMESTAMP, + CREATEDBY_ID INTEGER, + UPDATEDBY_ID INTEGER, + AGENT_ID INTEGER, + TAXONNODE_ID INTEGER, + TYPE_ID INTEGER +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_AUD( + ID INTEGER NOT NULL, + REV INTEGER NOT NULL, + REVTYPE TINYINT, + CREATED TIMESTAMP, + UUID VARCHAR(36), + UPDATED TIMESTAMP, + CREATEDBY_ID INTEGER, + UPDATEDBY_ID INTEGER, + AGENT_ID INTEGER, + TAXONNODE_ID INTEGER, + TYPE_ID INTEGER +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_AUD; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION( + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + ANNOTATIONS_ID INTEGER NOT NULL +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION_AUD( + REV INTEGER NOT NULL, + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + ANNOTATIONS_ID INTEGER NOT NULL, + REVTYPE TINYINT +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_ANNOTATION_AUD; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_MARKER( + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + MARKERS_ID INTEGER NOT NULL +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_MARKER; +CREATE CACHED TABLE PUBLIC.TAXONNODEAGENTRELATION_MARKER_AUD( + REV INTEGER NOT NULL, + TAXONNODEAGENTRELATION_ID INTEGER NOT NULL, + MARKERS_ID INTEGER NOT NULL, + REVTYPE TINYINT +); +-- 0 +/- SELECT COUNT(*) FROM PUBLIC.TAXONNODEAGENTRELATION_MARKER_AUD; CREATE CACHED TABLE PUBLIC.TAXONNODE_AUD( ID INTEGER NOT NULL, REV INTEGER NOT NULL, -- 2.34.1