free text search: better querying for 'isNotNull' and code harmonization
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / description / StateData.java
index 9004e9e114a7b379c3f4e1c06275d174e0b973c4..e127170d057b75674d7773fc84422669aa9a9181 100644 (file)
@@ -1,8 +1,8 @@
 /**\r
 * Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \r
+*\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
@@ -35,7 +35,12 @@ import org.apache.log4j.Logger;
 import org.hibernate.annotations.Cascade;\r
 import org.hibernate.annotations.CascadeType;\r
 import org.hibernate.envers.Audited;\r
+import org.hibernate.search.annotations.Field;\r
+import org.hibernate.search.annotations.FieldBridge;\r
+import org.hibernate.search.annotations.IndexedEmbedded;\r
 \r
+import eu.etaxonomy.cdm.hibernate.search.DefinedTermBaseClassBridge;\r
+import eu.etaxonomy.cdm.hibernate.search.MultilanguageTextFieldBridge;\r
 import eu.etaxonomy.cdm.jaxb.MultilanguageTextAdapter;\r
 import eu.etaxonomy.cdm.model.common.IMultiLanguageTextHolder;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
@@ -52,7 +57,7 @@ import eu.etaxonomy.cdm.model.common.VersionableEntity;
  * instance.\r
  * <P>\r
  * This class corresponds to CharacterStateDataType according to the SDD schema.\r
- * \r
+ *\r
  * @author m.doering\r
  * @version 1.0\r
  * @created 08-Nov-2007 13:06:53\r
@@ -67,238 +72,239 @@ import eu.etaxonomy.cdm.model.common.VersionableEntity;
 @Entity\r
 @Audited\r
 public class StateData extends VersionableEntity implements IModifiable, IMultiLanguageTextHolder, Cloneable{\r
-       private static final long serialVersionUID = -4380314126624505415L;\r
-       private static final Logger logger = Logger.getLogger(StateData.class);\r
-       \r
-       @XmlElement(name = "State")\r
+    private static final long serialVersionUID = -4380314126624505415L;\r
+    private static final Logger logger = Logger.getLogger(StateData.class);\r
+\r
+    @XmlElement(name = "State")\r
     @XmlIDREF\r
     @XmlSchemaType(name = "IDREF")\r
     @ManyToOne(fetch = FetchType.LAZY)\r
-       private State state;\r
-       \r
-       @XmlElementWrapper(name = "Modifiers")\r
-       @XmlElement(name = "Modifier")\r
-       @ManyToMany(fetch = FetchType.LAZY)\r
-       @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})\r
+    @IndexedEmbedded\r
+    private State state;\r
+\r
+    @XmlElementWrapper(name = "Modifiers")\r
+    @XmlElement(name = "Modifier")\r
+    @ManyToMany(fetch = FetchType.LAZY)\r
+    @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})\r
+    @IndexedEmbedded\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
+    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
+    @Field(name="modifyingText")\r
+    @FieldBridge(impl=MultilanguageTextFieldBridge.class)\r
+    private Map<Language,LanguageString> modifyingText = new HashMap<Language,LanguageString>();\r
 \r
 //********************* FACTORY METHODS ************************\\r
-       \r
-       /** \r
-        * Creates a new empty state data instance.\r
-        */\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(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
+    /**\r
+     * Creates a new empty state data instance.\r
+     */\r
+    public static StateData NewInstance(){\r
+        return new StateData();\r
+    }\r
+\r
+\r
+    /**\r
+     * Creates a new empty state data instance.\r
+     *\r
+     * <b>NOTE:</b> {@link State}  is a sub class of {@link DefinedTermBase}.\r
+     * If the state passed as parameter has been created newly it <b>has to be persisted before</b> it is possible to save the StateData.\r
+     */\r
+    public static StateData NewInstance(State state){\r
+        StateData stateData = new StateData();\r
+        stateData.setState(state);\r
+        return stateData;\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
-       public State getState(){\r
-               return this.state;\r
-       }\r
-       /** \r
-        * @see #getState()\r
-        */\r
-       public void setState(State state){\r
-               this.state = state;\r
-       }\r
-       \r
-\r
-       /** \r
-        * Returns the set of {@link Modifier modifiers} used to qualify the validity\r
-        * of <i>this</i> state data. This is only metainformation.\r
-        */\r
-       public Set<Modifier> getModifiers(){\r
-               return this.modifiers;\r
-       }\r
-       \r
-       /**\r
-        * Adds a {@link Modifier modifier} to the set of {@link #getModifiers() modifiers}\r
-        * used to qualify the validity of <i>this</i> state data.\r
-        * \r
-        * @param modifier      the modifier to be added to <i>this</i> state data\r
-        * @see                         #getModifiers()\r
-        */\r
-       public void addModifier(Modifier modifier){\r
-               this.modifiers.add(modifier);\r
-       }\r
-       /** \r
-        * Removes one element from the set of {@link #getModifiers() modifiers}\r
-        * used to qualify the validity of <i>this</i> state data.\r
-        *\r
-        * @param  modifier     the modifier which should be removed\r
-        * @see                 #getModifiers()\r
-        * @see                 #addModifier(Modifier)\r
-        */\r
-       public void removeModifier(Modifier modifier){\r
-               this.modifiers.remove(modifier);\r
-       }\r
-\r
-\r
-       /** \r
-        * Returns the {@link MultilanguageText multilanguage text} used to qualify the validity\r
-        * of <i>this</i> state data.  The different {@link LanguageString language strings}\r
-        * contained in the multilanguage text should all have the same meaning.<BR>\r
-        * A multilanguage text does not belong to a controlled {@link TermVocabulary term vocabulary}\r
-        * as a {@link Modifier modifier} does.\r
-        * <P>\r
-        * NOTE: the actual content of <i>this</i> state data is NOT\r
-        * stored in the modifying text. This is only metainformation\r
-        * (like "Some experts express doubt about this assertion").\r
-        */\r
-       public Map<Language,LanguageString> getModifyingText(){\r
-               return this.modifyingText;\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
-        * \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                         #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
-        * 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
-        * @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
-        * Removes from the {@link MultilanguageText multilanguage text} used to qualify the validity\r
-        * of <i>this</i> state data the one {@link LanguageString language string}\r
-        * with the given {@link Language language}.\r
-        *\r
-        * @param  lang the language in which the language string to be removed\r
-        *                              has been formulated\r
-        * @see         #getModifyingText()\r
-        */\r
-       public LanguageString removeModifyingText(Language lang){\r
-               return this.modifyingText.remove(lang);\r
-       }\r
+\r
+    /**\r
+     * Returns the {@link State state term} used in <i>this</i> state data.\r
+     */\r
+    public State getState(){\r
+        return this.state;\r
+    }\r
+    /**\r
+     * @see    #getState()\r
+     */\r
+    public void setState(State state){\r
+        this.state = state;\r
+    }\r
+\r
+\r
+    /**\r
+     * Returns the set of {@link Modifier modifiers} used to qualify the validity\r
+     * of <i>this</i> state data. This is only metainformation.\r
+     */\r
+    public Set<Modifier> getModifiers(){\r
+        return this.modifiers;\r
+    }\r
+\r
+    /**\r
+     * Adds a {@link Modifier modifier} to the set of {@link #getModifiers() modifiers}\r
+     * used to qualify the validity of <i>this</i> state data.\r
+     *\r
+     * @param modifier the modifier to be added to <i>this</i> state data\r
+     * @see                            #getModifiers()\r
+     */\r
+    public void addModifier(Modifier modifier){\r
+        this.modifiers.add(modifier);\r
+    }\r
+    /**\r
+     * Removes one element from the set of {@link #getModifiers() modifiers}\r
+     * used to qualify the validity of <i>this</i> state data.\r
+     *\r
+     * @param  modifier        the modifier which should be removed\r
+     * @see                    #getModifiers()\r
+     * @see                    #addModifier(Modifier)\r
+     */\r
+    public void removeModifier(Modifier modifier){\r
+        this.modifiers.remove(modifier);\r
+    }\r
+\r
+\r
+    /**\r
+     * Returns the {@link MultilanguageText multilanguage text} used to qualify the validity\r
+     * of <i>this</i> state data.  The different {@link LanguageString language strings}\r
+     * contained in the multilanguage text should all have the same meaning.<BR>\r
+     * A multilanguage text does not belong to a controlled {@link TermVocabulary term vocabulary}\r
+     * as a {@link Modifier modifier} does.\r
+     * <P>\r
+     * NOTE: the actual content of <i>this</i> state data is NOT\r
+     * stored in the modifying text. This is only metainformation\r
+     * (like "Some experts express doubt about this assertion").\r
+     */\r
+    public Map<Language,LanguageString> getModifyingText(){\r
+        return this.modifyingText;\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
+     *\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                            #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
+     * 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
+     * @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
+     * Removes from the {@link MultilanguageText multilanguage text} used to qualify the validity\r
+     * of <i>this</i> state data the one {@link LanguageString language string}\r
+     * with the given {@link Language language}.\r
+     *\r
+     * @param  lang    the language in which the language string to be removed\r
+     *                                 has been formulated\r
+     * @see            #getModifyingText()\r
+     */\r
+    public LanguageString removeModifyingText(Language lang){\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
+    /**\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