Merging r13268 through r14040 from trunk/cdmlib into branches/cdmlib-unitils3
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / description / StateData.java
index f3ed0c6c238b2a1568e287fb1b98b9a5943edee7..9004e9e114a7b379c3f4e1c06275d174e0b973c4 100644 (file)
@@ -66,9 +66,8 @@ import eu.etaxonomy.cdm.model.common.VersionableEntity;
 @XmlRootElement(name = "StateData")\r
 @Entity\r
 @Audited\r
-public class StateData extends VersionableEntity implements IModifiable, IMultiLanguageTextHolder{\r
+public class StateData extends VersionableEntity implements IModifiable, IMultiLanguageTextHolder, Cloneable{\r
        private static final long serialVersionUID = -4380314126624505415L;\r
-       @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(StateData.class);\r
        \r
        @XmlElement(name = "State")\r
@@ -81,28 +80,51 @@ public class StateData extends VersionableEntity implements IModifiable, IMultiL
        @XmlElement(name = "Modifier")\r
        @ManyToMany(fetch = FetchType.LAZY)\r
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})\r
-       @NotNull // avoids creating a UNIQUE key for this field\r
+//     @NotNull // avoids creating a UNIQUE key for this field -> not needed for ManyToMany\r
        private Set<Modifier> modifiers = new HashSet<Modifier>();\r
        \r
        @XmlElement(name = "ModifyingText")\r
        @XmlJavaTypeAdapter(MultilanguageTextAdapter.class)\r
        @OneToMany(fetch = FetchType.LAZY)\r
+       @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})\r
        private Map<Language,LanguageString> modifyingText = new HashMap<Language,LanguageString>();\r
+\r
+//********************* FACTORY METHODS ************************\\r
        \r
        /** \r
-        * Class constructor: creates a new empty state data instance.\r
+        * Creates a new empty state data instance.\r
         */\r
-       public StateData() {\r
-               super();\r
+       public static StateData NewInstance(){\r
+               return new StateData();\r
        }\r
        \r
+       \r
        /** \r
         * Creates a new empty state data instance.\r
         */\r
-       public static StateData NewInstance(){\r
+       public static StateData NewInstance(State state){\r
                return new StateData();\r
        }\r
+       \r
+       /** \r
+        * Creates a new empty state data instance.\r
+        */\r
+       public static StateData NewInstance(String term, String label, String labelAbbrev){\r
+               State state = State.NewInstance(term, label, labelAbbrev);\r
+               return NewInstance(state);\r
+       }\r
+       \r
+//*************************** CONSTRUCTOR ************************\    \r
+       \r
+       /** \r
+        * Class constructor: creates a new empty state data instance.\r
+        */\r
+       public StateData() {\r
+               super();\r
+       }\r
 \r
+//************************** GETTER /SETTER *************************\\r
+       \r
        /** \r
         * Returns the {@link State state term} used in <i>this</i> state data.\r
         */\r
@@ -168,13 +190,34 @@ public class StateData extends VersionableEntity implements IModifiable, IMultiL
         * and the given {@link Language language} and adds it to the {@link MultilanguageText multilanguage text} \r
         * used to qualify the validity of <i>this</i> state data.\r
         * \r
+        * \r
         * @param text          the string describing the validity\r
         *                                      in a particular language\r
         * @param language      the language in which the text string is formulated\r
+        * \r
         * @see                         #getModifyingText()\r
-        * @see                         #addModifyingText(LanguageString)\r
+        * @see                         #putModifyingText(LanguageString)\r
+        * @deprecated          should follow the put semantic of maps, this method will be removed in v4.0\r
+        *                                      Use the {@link #putModifyingText(Language, String) putModifyingText} method instead\r
         */\r
+       @Deprecated\r
        public LanguageString addModifyingText(String text, Language language){\r
+               return this.putModifyingText(language, text);\r
+       }\r
+       \r
+       /**\r
+        * Creates a {@link LanguageString language string} based on the given text string\r
+        * and the given {@link Language language} and adds it to the {@link MultilanguageText multilanguage text} \r
+        * used to qualify the validity of <i>this</i> state data.\r
+        * \r
+        * @param language      the language in which the text string is formulated\r
+        * @param text          the string describing the validity\r
+        *                                      in a particular language\r
+        * \r
+        * @see                         #getModifyingText()\r
+        * @see                         #addModifyingText(LanguageString)\r
+        */\r
+       public LanguageString putModifyingText(Language language, String text){\r
                return this.modifyingText.put(language, LanguageString.NewInstance(text, language));\r
        }\r
        /**\r
@@ -185,9 +228,26 @@ public class StateData extends VersionableEntity implements IModifiable, IMultiL
         * @param text  the language string describing the validity\r
         *                              in a particular language\r
         * @see                 #getModifyingText()\r
-        * @see                 #addModifyingText(String, Language)\r
+        * @see                 #putModifyingText(Language, String)\r
+        * @deprecated  should follow the put semantic of maps, this method will be removed in v4.0\r
+        *                              Use the {@link #putModifyingText(LanguagString) putModifyingText} method instead\r
         */\r
+       @Deprecated\r
        public LanguageString addModifyingText(LanguageString text){\r
+               return this.putModifyingText(text);\r
+       }\r
+       \r
+       /**\r
+        * Adds a translated {@link LanguageString text in a particular language}\r
+        * to the {@link MultilanguageText multilanguage text} used to qualify the validity\r
+        * of <i>this</i> state data.\r
+        * \r
+        * @param text  the language string describing the validity\r
+        *                              in a particular language\r
+        * @see                 #getModifyingText()\r
+        * @see                 #putModifyingText(Language, String)\r
+        */\r
+       public LanguageString putModifyingText(LanguageString text){\r
                return this.modifyingText.put(text.getLanguage(),text);\r
        }\r
        /** \r
@@ -203,4 +263,42 @@ public class StateData extends VersionableEntity implements IModifiable, IMultiL
                return this.modifyingText.remove(lang);\r
        }\r
 \r
+//*********************************** CLONE *****************************************/\r
+\r
+       /** \r
+        * Clones <i>this</i> state data. This is a shortcut that enables to create\r
+        * a new instance that differs only slightly from <i>this</i> state data by\r
+        * modifying only some of the attributes.\r
+        * \r
+        * @see eu.etaxonomy.cdm.model.common.VersionableEntity#clone()\r
+        * @see java.lang.Object#clone()\r
+        */\r
+       @Override\r
+       public Object clone() {\r
+\r
+               try {\r
+                       StateData result = (StateData)super.clone();\r
+                       \r
+                       //modifiers\r
+                       result.modifiers = new HashSet<Modifier>();\r
+                       for (Modifier modifier : getModifiers()){\r
+                               result.modifiers.add(modifier);\r
+                       }\r
+                       \r
+                       //modifying text\r
+                       result.modifyingText = new HashMap<Language, LanguageString>();\r
+                       for (Language language : getModifyingText().keySet()){\r
+                               //TODO clone needed? See also IndividualsAssociation\r
+                               LanguageString newLanguageString = (LanguageString)getModifyingText().get(language).clone();\r
+                               result.modifyingText.put(language, newLanguageString);\r
+                       }\r
+                       \r
+                       return result;\r
+                       //no changes to: state\r
+               } catch (CloneNotSupportedException e) {\r
+                       logger.warn("Object does not implement cloneable");\r
+                       e.printStackTrace();\r
+                       return null;\r
+               }\r
+       }\r
 }
\ No newline at end of file