merge-update from trunk; added import preference to add media as media specimen
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / name / HybridRelationship.java
index 8c3925714afed29593a34ee3b5954279207837d4..c4cc412f051a9b427ed19bd47fe0b1e1c9e3531c 100644 (file)
@@ -26,7 +26,7 @@ import org.hibernate.annotations.CascadeType;
 import org.hibernate.envers.Audited;
 
 import eu.etaxonomy.cdm.model.common.RelationshipBase;
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;
+import eu.etaxonomy.cdm.model.reference.Reference;
 
 /**
  * The class representing a hybrid relationship between one of the {@link BotanicalName parents}
@@ -55,9 +55,7 @@ import eu.etaxonomy.cdm.model.reference.ReferenceBase;
 })
 @Entity
 @Audited
-public class HybridRelationship extends RelationshipBase<NonViralName, NonViralName, HybridRelationshipType> {
-  
-       @SuppressWarnings("unused")
+public class HybridRelationship extends RelationshipBase<NonViralName, NonViralName, HybridRelationshipType>  implements Cloneable, Comparable<HybridRelationship>{
        private static final Logger logger = Logger.getLogger(HybridRelationship.class);
        
        //The nomenclatural code rule considered. The article/note/recommendation in the code in question that is commented on in
@@ -85,8 +83,10 @@ public class HybridRelationship extends RelationshipBase<NonViralName, NonViralN
     @ManyToOne(fetch=FetchType.LAZY)
        private HybridRelationshipType type;
 
-       //for hibernate use only, don't use
-       @Deprecated
+       /**
+        * @deprecated for hibernate use only, don't use
+        */
+       @Deprecated 
        private HybridRelationship(){
                super();
        }
@@ -102,7 +102,7 @@ public class HybridRelationship extends RelationshipBase<NonViralName, NonViralN
         * @param fromName                      the taxon name to be set as source for the new hybrid relationship
         * @param type                          the relationship type to be assigned to the new hybrid relationship
         * @param ruleConsidered        the string indicating the article of the ICBN for the hybrid taxon name
-        * @see                                         #HybridRelationship(BotanicalName, BotanicalName, HybridRelationshipType, ReferenceBase, String, String)
+        * @see                                         #HybridRelationship(BotanicalName, BotanicalName, HybridRelationshipType, Reference, String, String)
         * @see                                         BotanicalName#addHybridRelationship(HybridRelationship)
         */
        protected HybridRelationship(NonViralName hybridName, NonViralName parentName, HybridRelationshipType type, String ruleConsidered) {
@@ -111,7 +111,7 @@ public class HybridRelationship extends RelationshipBase<NonViralName, NonViralN
        
        /**
         * Class constructor: creates a new hybrid relationship instance including
-        * its {@link eu.etaxonomy.cdm.model.reference.ReferenceBase reference source} and adds it to the respective 
+        * its {@link eu.etaxonomy.cdm.model.reference.Reference reference source} and adds it to the respective 
         *{@link BotanicalName#getHybridRelationships() botanical taxon name relation sets} of both involved names.
         * 
         * @param toName                                the taxon name to be set as target for the new hybrid relationship
@@ -123,7 +123,7 @@ public class HybridRelationship extends RelationshipBase<NonViralName, NonViralN
         * @see                                                 #HybridRelationship(BotanicalName, BotanicalName, HybridRelationshipType, String)
         * @see                                                 BotanicalName#addHybridRelationship(HybridRelationship)
         */
-       protected HybridRelationship(NonViralName  hybridName, NonViralName parentName, HybridRelationshipType type, ReferenceBase citation, String citationMicroReference, String ruleConsidered) {
+       protected HybridRelationship(NonViralName  hybridName, NonViralName parentName, HybridRelationshipType type, Reference citation, String citationMicroReference, String ruleConsidered) {
                super(parentName, hybridName, type, citation, citationMicroReference);
                this.setRuleConsidered(ruleConsidered);
        }       
@@ -195,14 +195,73 @@ public class HybridRelationship extends RelationshipBase<NonViralName, NonViralN
        }
 
        protected void setRelatedFrom(NonViralName relatedFrom) {
+               if (relatedFrom == null){
+                       this.deletedObjects.add(this.relatedFrom);
+               }
                this.relatedFrom = relatedFrom;
        }
 
        protected void setRelatedTo(NonViralName relatedTo) {
+               if (relatedTo == null){
+                       this.deletedObjects.add(this.relatedTo);
+               }
                this.relatedTo = relatedTo;
        }
 
-       protected void setType(HybridRelationshipType type) {
+       public void setType(HybridRelationshipType type) {
                this.type = type;
        }
+       
+// ************************ compareTo *************************************************
+       /* (non-Javadoc)
+        * @see java.lang.Comparable#compareTo(java.lang.Object)
+        */
+//     @Override  //leads to compile errors in some environments
+       public int compareTo(HybridRelationship rel2) {
+               HybridRelationshipType type1 = this.getType();
+               HybridRelationshipType type2 = rel2.getType();
+               int compareType = type1.compareTo(type2);
+               if (compareType != 0){
+                       return compareType;
+               }else{
+                       NonViralName related1 = this.getRelatedFrom();
+                       NonViralName<?> related2 = rel2.getRelatedFrom();
+                       if (related1 != related2){
+                               related1 = this.getRelatedTo();
+                               related2 = rel2.getRelatedTo();
+                       }
+                       String title1 = related1.getTitleCache();
+                       String title2 = related2.getTitleCache();
+                       return title1.compareTo(title2);
+               }
+       }
+       
+       
+//*********************** CLONE ********************************************************/
+       
+       /** 
+        * Clones <i>this</i> hybrid relationship. This is a shortcut that enables to create
+        * a new instance that differs only slightly from <i>this</i> hybrid relationship by
+        * modifying only some of the attributes.<BR>
+        * CAUTION: Cloning a relationship will not add the relationship to the according 
+        * {@link #relatedFrom} and {@link #relatedTo} objects. The method is meant to be used
+        * mainly for internal purposes (e.g. used within {@link TaxonNameBase#clone()}
+        * 
+        * @see eu.etaxonomy.cdm.model.common.RelationshipBase#clone()
+        * @see java.lang.Object#clone()
+        */
+       @Override
+       public Object clone() {
+               HybridRelationship result;
+               try {
+                       result = (HybridRelationship)super.clone();
+                       //no changes to: relatedFrom, relatedTo, type
+                       return result;
+               } catch (CloneNotSupportedException e) {
+                       logger.warn("Object does not implement cloneable");
+                       e.printStackTrace();
+                       return null;
+               }
+       }
+       
 }
\ No newline at end of file