Project

General

Profile

Download (6.98 KB) Statistics
| Branch: | Tag: | Revision:
1 9479da48 Andreas Müller
/**
2
* Copyright (C) 2007 EDIT
3 4af7bea2 Andreas Kohlbecker
* European Distributed Institute of Taxonomy
4 9479da48 Andreas Müller
* http://www.e-taxonomy.eu
5 4af7bea2 Andreas Kohlbecker
*
6 9479da48 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
10
package eu.etaxonomy.cdm.model.occurrence;
11
12
13 c8abee83 Andreas Müller
import java.beans.PropertyChangeEvent;
14
import java.beans.PropertyChangeListener;
15 9479da48 Andreas Müller
16 974e7f9a Andreas Müller
import javax.persistence.Column;
17 ee91bcd9 ben.clark
import javax.persistence.Entity;
18
import javax.persistence.FetchType;
19
import javax.persistence.ManyToOne;
20 0b28b2de ben.clark
import javax.validation.Valid;
21 4e9e556b a.babadshanjan
import javax.xml.bind.annotation.XmlAccessType;
22
import javax.xml.bind.annotation.XmlAccessorType;
23
import javax.xml.bind.annotation.XmlElement;
24
import javax.xml.bind.annotation.XmlIDREF;
25
import javax.xml.bind.annotation.XmlRootElement;
26
import javax.xml.bind.annotation.XmlSchemaType;
27
import javax.xml.bind.annotation.XmlType;
28 9479da48 Andreas Müller
29 162987d3 Andreas Müller
import org.apache.commons.lang.StringUtils;
30 ee91bcd9 ben.clark
import org.apache.log4j.Logger;
31 1bf727e4 Andreas Müller
import org.hibernate.annotations.Cascade;
32
import org.hibernate.annotations.CascadeType;
33 ee91bcd9 ben.clark
import org.hibernate.envers.Audited;
34 43eb84c3 ben.clark
import org.hibernate.search.annotations.Field;
35
import org.hibernate.search.annotations.Indexed;
36
import org.hibernate.search.annotations.IndexedEmbedded;
37 4208745a ben.clark
import org.springframework.beans.factory.annotation.Configurable;
38
39 1d36aa54 Andreas Müller
import eu.etaxonomy.cdm.model.agent.Person;
40 4208745a ben.clark
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
41 ad690b5a Andreas Müller
import eu.etaxonomy.cdm.strategy.cache.common.IdentifiableEntityDefaultCacheStrategy;
42 ee91bcd9 ben.clark
43 9479da48 Andreas Müller
/**
44 162987d3 Andreas Müller
 *
45 4af7bea2 Andreas Kohlbecker
 * In situ observation of a taxon in the field. If a specimen exists,
46 162987d3 Andreas Müller
 * in most cases a parallel field unit object should be instantiated and the specimen then
47 c150ee7f Andreas Müller
 * is "derived" from the field unit via derivation type "accessioning" or any other.
48 162987d3 Andreas Müller
 *
49 9479da48 Andreas Müller
 * @author m.doering
50
 * @created 08-Nov-2007 13:06:40
51
 */
52 4e9e556b a.babadshanjan
@XmlAccessorType(XmlAccessType.FIELD)
53 c150ee7f Andreas Müller
@XmlType(name = "FieldUnit", propOrder = {
54 4e9e556b a.babadshanjan
    "fieldNumber",
55 1d36aa54 Andreas Müller
    "primaryCollector",
56 4e9e556b a.babadshanjan
    "fieldNotes",
57
    "gatheringEvent"
58
})
59 c150ee7f Andreas Müller
@XmlRootElement(name = "FieldUnit")
60 9479da48 Andreas Müller
@Entity
61 43eb84c3 ben.clark
@Indexed(index = "eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase")
62 ee91bcd9 ben.clark
@Audited
63 4208745a ben.clark
@Configurable
64 c150ee7f Andreas Müller
public class FieldUnit extends SpecimenOrObservationBase<IIdentifiableEntityCacheStrategy<FieldUnit>> implements Cloneable{
65
	private static final long serialVersionUID = -7586670941559035171L;
66
	private static final Logger logger = Logger.getLogger(FieldUnit.class);
67 9479da48 Andreas Müller
68 4e9e556b a.babadshanjan
	@XmlElement(name = "FieldNumber")
69 4af7bea2 Andreas Kohlbecker
	@Field
70 95d79c4d Andreas Müller
    //TODO Val #3379
71
//	@NullOrNotEmpty
72 974e7f9a Andreas Müller
	@Column(length=255)
73 9479da48 Andreas Müller
	private String fieldNumber;
74 4af7bea2 Andreas Kohlbecker
75 1d36aa54 Andreas Müller
	@XmlElement(name = "PrimaryCollector")
76
	@XmlIDREF
77
	@XmlSchemaType(name = "IDREF")
78
	@ManyToOne(fetch = FetchType.LAZY)
79 903cecc9 Cherian Mathew
    @Cascade( { CascadeType.SAVE_UPDATE,CascadeType.MERGE })
80 1d36aa54 Andreas Müller
    @IndexedEmbedded(depth = 2)
81
    @Valid
82
	private Person primaryCollector;
83 4af7bea2 Andreas Kohlbecker
84 4e9e556b a.babadshanjan
	@XmlElement(name = "FieldNotes")
85 4af7bea2 Andreas Kohlbecker
	@Field
86 95d79c4d Andreas Müller
    //TODO Val #3379
87
//	@NullOrNotEmpty
88 974e7f9a Andreas Müller
	@Column(length=255)
89 9479da48 Andreas Müller
	private String fieldNotes;
90 4af7bea2 Andreas Kohlbecker
91 4e9e556b a.babadshanjan
	@XmlElement(name = "GatheringEvent")
92
	@XmlIDREF
93
	@XmlSchemaType(name = "IDREF")
94 ee91bcd9 ben.clark
	@ManyToOne(fetch = FetchType.LAZY)
95 903cecc9 Cherian Mathew
    @Cascade( { CascadeType.SAVE_UPDATE,CascadeType.MERGE })
96 43eb84c3 ben.clark
    @IndexedEmbedded(depth = 2)
97 0b28b2de ben.clark
    @Valid
98 9479da48 Andreas Müller
	private GatheringEvent gatheringEvent;
99
100 483579cd Andreas Müller
// *************** FACTORY METHOD *************************/
101
102 0ed0ef35 Andreas Müller
	/**
103 483579cd Andreas Müller
	 * Factory method.
104 0ed0ef35 Andreas Müller
	 * @return
105
	 */
106 c150ee7f Andreas Müller
	public static FieldUnit NewInstance(){
107
		return new FieldUnit();
108 0ed0ef35 Andreas Müller
	}
109 4af7bea2 Andreas Kohlbecker
110 1d36aa54 Andreas Müller
//****************************** CONSTRUCTOR **************************************/
111 4af7bea2 Andreas Kohlbecker
112 0ed0ef35 Andreas Müller
	/**
113
	 * Constructor
114
	 */
115 c150ee7f Andreas Müller
	protected FieldUnit(){
116 483579cd Andreas Müller
		super(SpecimenOrObservationType.FieldUnit);
117 ad690b5a Andreas Müller
        initDefaultCacheStrategy();
118 0ed0ef35 Andreas Müller
	}
119 4af7bea2 Andreas Kohlbecker
120 7a62cb64 Andreas Müller
//****************************** CACHE STRATEGY **************************************/
121
122 ad690b5a Andreas Müller
    private static final String facadeStrategyClassName =
123
            "eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeFieldUnitCacheStrategy";
124 7a62cb64 Andreas Müller
    /**
125 ad690b5a Andreas Müller
     * Sets the default cache strategy
126 7a62cb64 Andreas Müller
     */
127
    @Override
128 ad690b5a Andreas Müller
    protected void initDefaultCacheStrategy() {
129
        try {
130
            String facadeClassName = facadeStrategyClassName;
131
            Class<?> facadeClass = Class.forName(facadeClassName);
132
            try {
133
                this.cacheStrategy = (IIdentifiableEntityCacheStrategy)facadeClass.newInstance();
134
            } catch (InstantiationException e) {
135
                e.printStackTrace();
136
            } catch (IllegalAccessException e) {
137
                e.printStackTrace();
138
            }
139
        } catch (ClassNotFoundException e) {
140
            this.cacheStrategy = new IdentifiableEntityDefaultCacheStrategy<FieldUnit>();
141
        }
142 7a62cb64 Andreas Müller
    }
143
144 ad690b5a Andreas Müller
145 1d36aa54 Andreas Müller
// ************************ GETTER / SETTER *******************************************
146 ee91bcd9 ben.clark
147 9479da48 Andreas Müller
	public GatheringEvent getGatheringEvent() {
148 ee91bcd9 ben.clark
    	return gatheringEvent;
149 9479da48 Andreas Müller
	}
150 4af7bea2 Andreas Kohlbecker
151 9479da48 Andreas Müller
	public void setGatheringEvent(GatheringEvent gatheringEvent) {
152 0ed0ef35 Andreas Müller
		this.gatheringEvent = gatheringEvent;
153 1bf727e4 Andreas Müller
		addGatheringEventPropertyChangeListener();
154 4af7bea2 Andreas Kohlbecker
	}
155
156 1bf727e4 Andreas Müller
157
	private void addGatheringEventPropertyChangeListener() {
158 c8abee83 Andreas Müller
		if (gatheringEvent != null){
159
			gatheringEvent.addPropertyChangeListener(getNewGatheringEventPropChangeListener());
160
		}
161 1bf727e4 Andreas Müller
	}
162 9479da48 Andreas Müller
163 1d36aa54 Andreas Müller
	/**
164
	 * The collectors field number. If the collector is a team the field number
165
	 * is taken from the field book of the primary collector.
166
	 * @see #primaryCollector
167
	 * @return
168
	 */
169 9479da48 Andreas Müller
	public String getFieldNumber() {
170
		return fieldNumber;
171
	}
172 4af7bea2 Andreas Kohlbecker
173 9479da48 Andreas Müller
	public void setFieldNumber(String fieldNumber) {
174 bc89eb0d Andreas Müller
		this.fieldNumber = StringUtils.isBlank(fieldNumber)? null : fieldNumber;
175 9479da48 Andreas Müller
	}
176
177 1d36aa54 Andreas Müller
178
	/**
179
	 * The primary collector is the person who the field books belongs to.
180
	 * So the field number is also taken from him (his field book).
181
	 * @see #fieldNumber
182
	 * @param primaryCollector
183
	 */
184
	public void setPrimaryCollector(Person primaryCollector) {
185
		this.primaryCollector = primaryCollector;
186
	}
187
188
	public Person getPrimaryCollector() {
189
		return primaryCollector;
190
	}
191 4af7bea2 Andreas Kohlbecker
192 9479da48 Andreas Müller
	public String getFieldNotes() {
193
		return fieldNotes;
194
	}
195 4af7bea2 Andreas Kohlbecker
196 9479da48 Andreas Müller
	public void setFieldNotes(String fieldNotes) {
197 bc89eb0d Andreas Müller
		this.fieldNotes = StringUtils.isBlank(fieldNotes)? null : fieldNotes;
198 9479da48 Andreas Müller
	}
199 4af7bea2 Andreas Kohlbecker
200 c8abee83 Andreas Müller
	// *********** Listener *****************************/
201 4af7bea2 Andreas Kohlbecker
202 c8abee83 Andreas Müller
	private PropertyChangeListener getNewGatheringEventPropChangeListener() {
203
		PropertyChangeListener listener = new PropertyChangeListener(){
204 4af7bea2 Andreas Kohlbecker
205
			@Override
206
            public void propertyChange(PropertyChangeEvent event) {
207 c8abee83 Andreas Müller
				firePropertyChange(event);
208
			}
209 4af7bea2 Andreas Kohlbecker
210 c8abee83 Andreas Müller
		};
211
		return listener;
212
	}
213 4af7bea2 Andreas Kohlbecker
214
	//*********** CLONE **********************************/
215
216
	/**
217 c150ee7f Andreas Müller
	 * Clones <i>this</i> field unit. This is a shortcut that enables to
218
	 * create a new instance that differs only slightly from <i>this</i> field unit
219 b8615f45 Andreas Müller
	 * by modifying only some of the attributes.<BR>
220
	 * This method overrides the clone method from {@link SpecimenOrObservationBase SpecimenOrObservationBase}.
221 4af7bea2 Andreas Kohlbecker
	 *
222 b8615f45 Andreas Müller
	 * @see SpecimenOrObservationBase#clone()
223 dc776ce0 a.babadshanjan
	 * @see eu.etaxonomy.cdm.model.media.IdentifiableMediaEntity#clone()
224 b8615f45 Andreas Müller
	 * @see java.lang.Object#clone()
225
	 */
226
	@Override
227 c150ee7f Andreas Müller
	public FieldUnit clone(){
228 b8615f45 Andreas Müller
		try{
229 c150ee7f Andreas Müller
			FieldUnit result = (FieldUnit)super.clone();
230 b8615f45 Andreas Müller
			//no changes to: fieldNotes, fieldNumber
231
			return result;
232
		} catch (CloneNotSupportedException e) {
233
			logger.warn("Object does not implement cloneable");
234
			e.printStackTrace();
235
			return null;
236
		}
237 4af7bea2 Andreas Kohlbecker
238 b8615f45 Andreas Müller
	}
239 1d36aa54 Andreas Müller
240 9479da48 Andreas Müller
}