@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
@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
* 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
* @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
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