Project

General

Profile

Download (6.42 KB) Statistics
| Branch: | Tag: | Revision:
1 ba08dfd7 Andreas Müller
/**
2
* Copyright (C) 2007 EDIT
3 2a5361d0 Andreas Kohlbecker
* European Distributed Institute of Taxonomy
4 ba08dfd7 Andreas Müller
* http://www.e-taxonomy.eu
5 2a5361d0 Andreas Kohlbecker
*
6 ba08dfd7 Andreas Müller
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.model.occurrence;
10
11
import javax.persistence.Entity;
12
import javax.persistence.FetchType;
13
import javax.persistence.Inheritance;
14
import javax.persistence.InheritanceType;
15
import javax.persistence.ManyToOne;
16
import javax.persistence.Transient;
17
import javax.xml.bind.annotation.XmlAccessType;
18
import javax.xml.bind.annotation.XmlAccessorType;
19
import javax.xml.bind.annotation.XmlElement;
20
import javax.xml.bind.annotation.XmlIDREF;
21
import javax.xml.bind.annotation.XmlRootElement;
22
import javax.xml.bind.annotation.XmlSchemaType;
23
import javax.xml.bind.annotation.XmlType;
24
25
import org.apache.log4j.Logger;
26
import org.hibernate.envers.Audited;
27
import org.hibernate.search.annotations.IndexedEmbedded;
28
29
import eu.etaxonomy.cdm.model.common.EventBase;
30
import eu.etaxonomy.cdm.model.molecular.Cloning;
31 1c39686b Andreas Müller
import eu.etaxonomy.cdm.model.term.DefinedTerm;
32
import eu.etaxonomy.cdm.model.term.TermType;
33
import eu.etaxonomy.cdm.model.term.TermVocabulary;
34 ba08dfd7 Andreas Müller
35
/**
36
 * A material or method event handles data on materials or methods used for handling specimen or derived units
37
 * in general. It stores information on what material or method was used, who used it and when it was used.
38
 * For reusable data on materials or methods it is best practice to define these first as {@link DefinedTerm
39 00e9083c Andreas Müller
 * defined terms} of type {@link TermType#MaterialOrMethod} TODO and then use this term as {@link #getDefinedMaterialOrMethod()
40 2a5361d0 Andreas Kohlbecker
 * material or method term}. If this is not possible or if additional data needs to be added one may also
41 ba08dfd7 Andreas Müller
 * use {@link #getDescription() freetext} field inherited from {@link EventBase}. Actor and Date information
42
 * are also handled via {@link EventBase} fields.
43
 * This class may be extended by more specific classes which require structured handling of additional parameters.
44 2a5361d0 Andreas Kohlbecker
 *
45
 * In general material or method data is not considered to be CDM core data. Therefore the decision was made to handle
46 ba08dfd7 Andreas Müller
 * all the data with a common base class which is {@link MaterialOrMethodEvent} to reduce the number of tables required
47
 * in the underlying databases.
48 2a5361d0 Andreas Kohlbecker
 *
49 ba08dfd7 Andreas Müller
 * @author a.mueller
50 a88578ce Andreas Müller
 * @since 2013-07-08
51 ba08dfd7 Andreas Müller
 *
52
 */
53
@XmlAccessorType(XmlAccessType.FIELD)
54
@XmlType(name = "MaterialOrMethod", propOrder = {
55 00e9083c Andreas Müller
	"definedMaterialOrMethod"
56 ba08dfd7 Andreas Müller
})
57
@XmlRootElement(name = "MaterialOrMethod")
58
@Entity
59
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
60
@Audited
61
public class MaterialOrMethodEvent extends EventBase implements Cloneable{
62
	private static final long serialVersionUID = -4799205199942053585L;
63
	private static final Logger logger = Logger.getLogger(MaterialOrMethodEvent.class);
64 2a5361d0 Andreas Kohlbecker
65 00e9083c Andreas Müller
    @XmlElement(name = "DefinedMaterialOrMethod")
66 ba08dfd7 Andreas Müller
    @XmlIDREF
67
    @XmlSchemaType(name = "IDREF")
68
    @ManyToOne(fetch=FetchType.LAZY)
69
    @IndexedEmbedded // no depth for terms
70 00e9083c Andreas Müller
	private DefinedTerm definedMaterialOrMethod;
71 2a5361d0 Andreas Kohlbecker
72 ba08dfd7 Andreas Müller
	//TODO citation / link
73
74 2a5361d0 Andreas Kohlbecker
75
// ******************** FACTORY METHOD ******************/
76
77 ba08dfd7 Andreas Müller
    public static MaterialOrMethodEvent NewInstance(){
78
    	return new MaterialOrMethodEvent();
79
    }
80 2a5361d0 Andreas Kohlbecker
81 00e9083c Andreas Müller
    public static MaterialOrMethodEvent NewInstance(DefinedTerm definedMaterialOrMethod, String methodText){
82
    	return new MaterialOrMethodEvent(definedMaterialOrMethod, methodText);
83 2a5361d0 Andreas Kohlbecker
    }
84
85 ba08dfd7 Andreas Müller
// ********************* CONSTRUCTOR ********************/
86 2a5361d0 Andreas Kohlbecker
87 ba08dfd7 Andreas Müller
    protected MaterialOrMethodEvent(){};
88
89 00e9083c Andreas Müller
    protected MaterialOrMethodEvent(DefinedTerm definedMaterialOrMethod, String methodText){
90
    	this.definedMaterialOrMethod = definedMaterialOrMethod;
91 ba08dfd7 Andreas Müller
    	this.setDescription(methodText);
92
    }
93
94 2a5361d0 Andreas Kohlbecker
95 ba08dfd7 Andreas Müller
// ********************* GETTER / SETTER ********************/
96 2a5361d0 Andreas Kohlbecker
97
98 ba08dfd7 Andreas Müller
	/**
99
	 * The {@link #getDescription()} method is inherited from {@link EventBase}.
100
	 * In this class it is used as freetext describing the material or method used
101 00e9083c Andreas Müller
	 * or if a {@link #getDefinedMaterialOrMethod() defined method} is given as
102 ba08dfd7 Andreas Müller
	 * an additional information about how this defined method was used.
103 2a5361d0 Andreas Kohlbecker
	 *
104 ba08dfd7 Andreas Müller
	 * @see #getMaterialMethodText()
105
	 */
106
    @Override
107
	public String getDescription() {
108
		return super.getDescription();
109
	}
110
111 2a5361d0 Andreas Kohlbecker
112 ba08dfd7 Andreas Müller
	/**
113
	 * @see #getDescription()
114
	 * @see #setMaterialMethodText(String)
115
	 */
116
    @Override
117
	public void setDescription(String materialMethodText) {
118
		super.setDescription(materialMethodText);
119
	}
120 2a5361d0 Andreas Kohlbecker
121
122
123 ba08dfd7 Andreas Müller
	/**
124
	 * A freetext describing the material or method or if
125 00e9083c Andreas Müller
	 * a {@link #getDefinedMaterialOrMethod() defined method} is given
126 ba08dfd7 Andreas Müller
	 * an additional information about how this method was used.
127 2a5361d0 Andreas Kohlbecker
	 * In future this method could be removed to decrease the number
128 ba08dfd7 Andreas Müller
	 * of transient getters in the CDM.
129
	 */
130
	@Transient
131
    public String getMaterialMethodText() {
132
		return this.getDescription();
133
	}
134
135
136
	/**
137
	 * @see #getMaterialMethodText()
138
	 */
139
	public void setMaterialMethodText(String materialMethodText) {
140
		this.setDescription(materialMethodText);
141
	}
142
143 2a5361d0 Andreas Kohlbecker
144 ba08dfd7 Andreas Müller
	/**
145 2a5361d0 Andreas Kohlbecker
	 * A defined material or method given as a defined term in a materialOrMethod
146 ba08dfd7 Andreas Müller
	 * {@link TermVocabulary term vocabulary}. If such a defined material or method is used
147
	 * the {@link #getDescription() description} should primarily focus on describing
148
	 * deviation from this method rather then repeating it.
149 2a5361d0 Andreas Kohlbecker
	 *
150 ba08dfd7 Andreas Müller
	 * @see #getDescription()
151
	 * @see #getMaterialMethodText()
152
	 * @return the material or method term
153
	 */
154 00e9083c Andreas Müller
	public DefinedTerm getDefinedMaterialOrMethod() {
155
		return definedMaterialOrMethod;
156 ba08dfd7 Andreas Müller
	}
157
158
	/**
159 00e9083c Andreas Müller
	 * @see #getDefinedMaterialOrMethod()
160 ba08dfd7 Andreas Müller
	 * @param materialMethodTerm
161
	 */
162 00e9083c Andreas Müller
	public void setDefinedMaterialOrMethod(DefinedTerm definedMaterialOrMethod) {
163
		this.definedMaterialOrMethod = definedMaterialOrMethod;
164 ba08dfd7 Andreas Müller
	}
165 2a5361d0 Andreas Kohlbecker
166 ba08dfd7 Andreas Müller
// ********************* CLONE ********************/
167 2a5361d0 Andreas Kohlbecker
	/**
168 ba08dfd7 Andreas Müller
	 * Clones <i>this</i> {@link Cloning}. This is a shortcut that enables to create
169
	 * a new instance that differs only slightly from <i>this</i> cloning by
170
	 * modifying only some of the attributes.<BR><BR>
171 2a5361d0 Andreas Kohlbecker
	 *
172 ba08dfd7 Andreas Müller
	 * @see EventBase#clone()
173
	 * @see java.lang.Object#clone()
174
	 */
175
	@Override
176
	public Object clone()  {
177
		try{
178
			MaterialOrMethodEvent result = (MaterialOrMethodEvent)super.clone();
179 2a5361d0 Andreas Kohlbecker
180 ba08dfd7 Andreas Müller
			//don't change materialMethodTerm
181
			return result;
182
		}catch (CloneNotSupportedException e) {
183
			logger.warn("Object does not implement cloneable");
184
			e.printStackTrace();
185
			return null;
186
		}
187
	}
188
}