more tests and features for #476: Implement free-text search methods for TaxonBase...
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / description / WorkingSet.java
index 0bac724a2be7327ae5b403a597c1c174c5429d4f..0a761a8b978c53bd961ae1a54676dc1e43b32716 100644 (file)
 \r
 package eu.etaxonomy.cdm.model.description;\r
 \r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
 import java.util.HashSet;\r
 import java.util.Iterator;\r
 import java.util.List;\r
 import java.util.Set;\r
+import java.util.Map.Entry;\r
 \r
 import javax.persistence.Entity;\r
 import javax.persistence.FetchType;\r
+import javax.persistence.JoinColumn;\r
+import javax.persistence.JoinTable;\r
 import javax.persistence.ManyToMany;\r
 import javax.persistence.ManyToOne;\r
 import javax.persistence.OneToMany;\r
 import javax.persistence.Transient;\r
+import javax.validation.constraints.NotNull;\r
 import javax.xml.bind.annotation.XmlAccessType;\r
 import javax.xml.bind.annotation.XmlAccessorType;\r
 import javax.xml.bind.annotation.XmlElement;\r
@@ -37,9 +43,8 @@ import org.hibernate.envers.Audited;
 \r
 import eu.etaxonomy.cdm.model.common.AnnotatableEntity;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.common.LanguageString;\r
 import eu.etaxonomy.cdm.model.common.Representation;\r
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 \r
 /**\r
  * \r
@@ -62,9 +67,8 @@ import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 @Entity\r
 @Audited\r
 \r
-public class WorkingSet<S extends DescriptionBase> extends AnnotatableEntity {\r
+public class WorkingSet extends AnnotatableEntity {\r
        private static final long serialVersionUID = 3256448866757415686L;\r
-       @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(WorkingSet.class);\r
        \r
        @XmlElementWrapper(name = "Representations")\r
@@ -85,8 +89,14 @@ public class WorkingSet<S extends DescriptionBase> extends AnnotatableEntity {
     @XmlIDREF\r
     @XmlSchemaType(name = "IDREF")\r
     @ManyToMany(fetch = FetchType.LAZY)\r
+    @JoinTable(\r
+        name="WorkingSet_DescriptionBase",\r
+        joinColumns=@JoinColumn(name="WorkingSet_id"),\r
+        inverseJoinColumns=@JoinColumn(name="descriptions_id")\r
+    )\r
        @Cascade(CascadeType.SAVE_UPDATE)\r
-       private Set<S> descriptions = new HashSet<S>();\r
+       @NotNull\r
+       private Set<DescriptionBase> descriptions = new HashSet<DescriptionBase>();\r
        \r
        /** \r
         * Class constructor: creates a new empty working set instance.\r
@@ -214,7 +224,7 @@ public class WorkingSet<S extends DescriptionBase> extends AnnotatableEntity {
        public FeatureTree getDescriptiveSystem() {\r
                return descriptiveSystem;\r
        }\r
-       protected void setDescriptiveSystem(FeatureTree descriptiveSystem) {\r
+       public void setDescriptiveSystem(FeatureTree descriptiveSystem) {\r
                this.descriptiveSystem = descriptiveSystem;\r
        }\r
        \r
@@ -222,10 +232,10 @@ public class WorkingSet<S extends DescriptionBase> extends AnnotatableEntity {
         * Returns the {@link DescriptionBase descriptions} of\r
         * <i>this</i> working set.\r
         * \r
-        * @see    #addDescription(S)\r
-        * @see    #removeDescription(S)\r
+        * @see    #addDescription(DescriptionBase)\r
+        * @see    #removeDescription(DescriptionBase)\r
         */\r
-       public Set<S> getDescriptions() {\r
+       public Set<DescriptionBase> getDescriptions() {\r
                return descriptions;\r
        }\r
        \r
@@ -235,25 +245,68 @@ public class WorkingSet<S extends DescriptionBase> extends AnnotatableEntity {
         * working set.\r
         * \r
         * @param description   the description to be added to <i>this</i> working set\r
-        * @see                                                                         #getDescriptions()\r
-        * @see                                                                         WorkingSet#addDescription(S)\r
+        * @see                                 #getDescriptions()\r
+        * @see                                 WorkingSet#addDescription(DescriptionBase)\r
         */\r
-       public void addDescription(S description) {\r
-               logger.debug("addDescription");\r
-               this.descriptions.add(description);\r
+       public boolean addDescription(DescriptionBase description) {\r
+               boolean result = this.descriptions.add(description);\r
+               if (! description.getWorkingSets().contains(this)){\r
+                       description.addWorkingSet(this);\r
+               }\r
+               return result;\r
        }\r
        \r
        /** \r
         * Removes one element from the set of {@link #getDescriptions() descriptions} involved\r
         * in <i>this</i> working set.<BR>\r
         *\r
-        * @param  description   the description which should be removed\r
-        * @see                                                                 #getDescriptions()\r
-        * @see                                                                 #addDescription(S)\r
-        * @see                                                                 WorkingSet#removeDescription(S)\r
+        * @param  description  the description which should be removed\r
+        * @see                         #getDescriptions()\r
+        * @see                         #addDescription(DescriptionBase)\r
+        * @see                         WorkingSet#removeDescription(DescriptionBase)\r
         */\r
-       public void removeDescription(S description) {\r
-               this.descriptions.remove(description);\r
+       public boolean removeDescription(DescriptionBase description) {\r
+               boolean result = this.descriptions.remove(description);\r
+               if (description.getWorkingSets().contains(this)){\r
+                       description.removeWorkingSet(this);\r
+               }\r
+               return result;\r
+       }\r
+       \r
+       //*********************** CLONE ********************************************************/\r
+       \r
+       /** \r
+        * Clones <i>this</i> WorkingSet. This is a shortcut that enables to create\r
+        * a new instance that differs only slightly from <i>this</i> WorkingSet by\r
+        * modifying only some of the attributes.\r
+        * The descriptions and the descriptive system are the same, the representations \r
+        * are cloned.\r
+        * \r
+        * @see eu.etaxonomy.cdm.model.common.AnnotatableEntity#clone()\r
+        * @see java.lang.Object#clone()\r
+        */\r
+       @Override\r
+       public Object clone() {\r
+               WorkingSet result;\r
+               try {\r
+                       result = (WorkingSet)super.clone();\r
+                       result.descriptions = new HashSet<DescriptionBase>();\r
+                       \r
+                       for (DescriptionBase desc: this.descriptions){\r
+                               result.addDescription(desc);\r
+                       }\r
+                       \r
+                       result.representations = new HashSet<Representation>();\r
+                       for (Representation rep : this.representations){\r
+                               result.addRepresentation((Representation)rep.clone());\r
+                       }\r
+                       \r
+                       return result;\r
+               }catch (CloneNotSupportedException e) {\r
+                       logger.warn("Object does not implement cloneable");\r
+                       e.printStackTrace();\r
+                       return null;\r
+               }\r
        }\r
        \r
 }\r