\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
\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
\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
@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
+ @NotNull\r
private Set<DescriptionBase> descriptions = new HashSet<DescriptionBase>();\r
\r
/** \r
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
* working set.\r
* \r
* @param description the description to be added to <i>this</i> working set\r
- * @see #getDescriptions()\r
- * @see WorkingSet#addDescription(DescriptionBase)\r
+ * @see #getDescriptions()\r
+ * @see WorkingSet#addDescription(DescriptionBase)\r
*/\r
- public void addDescription(DescriptionBase 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(DescriptionBase)\r
- * @see WorkingSet#removeDescription(DescriptionBase)\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(DescriptionBase 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