Project

General

Profile

Download (8.04 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* 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.api.facade;
10

    
11
import java.util.List;
12
import java.util.UUID;
13

    
14
import org.apache.commons.lang.StringUtils;
15
import org.apache.log4j.Logger;
16

    
17
import eu.etaxonomy.cdm.common.CdmUtils;
18
import eu.etaxonomy.cdm.model.agent.AgentBase;
19
import eu.etaxonomy.cdm.model.agent.Institution;
20
import eu.etaxonomy.cdm.model.agent.Person;
21
import eu.etaxonomy.cdm.model.agent.Team;
22
import eu.etaxonomy.cdm.model.common.CdmBase;
23
import eu.etaxonomy.cdm.model.common.Language;
24
import eu.etaxonomy.cdm.model.common.TimePeriod;
25
import eu.etaxonomy.cdm.model.location.NamedArea;
26
import eu.etaxonomy.cdm.model.occurrence.Collection;
27
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
28
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
29
import eu.etaxonomy.cdm.model.term.Representation;
30
import eu.etaxonomy.cdm.strategy.StrategyBase;
31
import eu.etaxonomy.cdm.strategy.cache.agent.TeamDefaultCacheStrategy;
32
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
33

    
34
/**
35
 * Cache strategy for {@link FieldUnit field units} handled in a DerivedUnitFacade.
36
 *
37
 * @author a.mueller
38
 * @since 03.06.2010
39
 */
40
public class DerivedUnitFacadeFieldUnitCacheStrategy
41
        extends StrategyBase
42
        implements IIdentifiableEntityCacheStrategy<FieldUnit> {
43

    
44
    private static final long serialVersionUID = 1578628591216605619L;
45
	private static final Logger logger = Logger.getLogger(DerivedUnitFacadeFieldUnitCacheStrategy.class);
46

    
47
	private static final UUID uuid = UUID.fromString("df4672c1-ce5c-4724-af6d-91e2b326d4a4");
48

    
49
	@Override
50
	protected UUID getUuid() {return uuid;}
51

    
52
	private boolean includeEmptySeconds = false;
53
	private boolean includeReferenceSystem = true;
54

    
55
	@Override
56
	public String getTitleCache(FieldUnit fieldUnit) {
57
		DerivedUnitFacade facade;
58
		String result = "";
59
		DerivedUnitFacadeConfigurator config = DerivedUnitFacadeConfigurator.NewInstance();
60
		config.setFirePropertyChangeEvents(false);
61
		facade = DerivedUnitFacade.NewInstance(SpecimenOrObservationType.FieldUnit, fieldUnit, config);
62
		result = getFieldData(facade);
63
		result = addPlantDescription(result, facade);
64
		result = CdmUtils.addTrailingDotIfNotExists(result);
65
		facade.close();
66
		return result;
67
	}
68

    
69
	protected String getFieldData(DerivedUnitFacade facade) {
70

    
71
	    FieldUnit fieldUnit = facade.getFieldUnit(false);
72
	    if (fieldUnit != null && fieldUnit.isProtectedTitleCache()){
73
	        return fieldUnit.getTitleCache();
74
	    }
75

    
76
		String ALTITUDE_PREFIX = "alt. ";
77
//		String ALTITUDE_POSTFIX = " m";
78

    
79
		String result = "";
80

    
81
		//country
82
		String strCountry = null;
83
		NamedArea country = facade.getCountry();
84
		Representation repCountry = country == null ? null : country.getRepresentation(Language.DEFAULT());
85
		strCountry = repCountry == null ? null: repCountry.getLabel();
86
		result = CdmUtils.concat(", ", result, strCountry);
87

    
88
		//locality
89
		result = CdmUtils.concat(", ", result, facade.getLocalityText());
90

    
91
		//elevation
92
		if (StringUtils.isNotBlank(facade.absoluteElevationToString())){
93
			result = CdmUtils.concat(", " , result, ALTITUDE_PREFIX);
94
			result += facade.absoluteElevationToString();
95
		}
96

    
97
		//exact locality
98
		if (facade.getExactLocation() != null){
99
			String exactLocation = facade.getExactLocation().toSexagesimalString(this.includeEmptySeconds, this.includeReferenceSystem);
100
			result = CdmUtils.concat(", ", result, exactLocation);
101
		}
102

    
103
		//ecology
104
		result = CdmUtils.concat(", ", result, facade.getEcology());
105

    
106
		//gathering period
107
		//TODO period.toString ??
108
		TimePeriod gatheringPeriod = facade.getGatheringPeriod();
109
		result = CdmUtils.concat(", ", result, (gatheringPeriod == null? null : gatheringPeriod.toString()));
110

    
111
		//collector (team) and field number
112
		String collectorAndFieldNumber = getCollectorAndFieldNumber(facade);
113
		result = CdmUtils.concat(", ", result, collectorAndFieldNumber);
114

    
115
		return result;
116
	}
117

    
118
	protected String addPlantDescription(String result, DerivedUnitFacade facade) {
119
		//plant description
120
		result = CdmUtils.concat("; ", result, facade.getPlantDescription());
121
		return result;
122
	}
123

    
124
	private String getCollectorAndFieldNumber(DerivedUnitFacade facade) {
125
		String result = "";
126
		AgentBase<?> collector = facade.getCollector();
127
		String fieldNumber = facade.getFieldNumber();
128
		Person primaryCollector = facade.getPrimaryCollector();
129

    
130
		if (collector == null){
131
			return fieldNumber;
132
		}else if(collector.isProtectedTitleCache()){
133
			return  CdmUtils.concat(" ", collector.getTitleCache(), fieldNumber);
134
		}else{
135
			result = "";
136
			Team collectorTeam;
137
			if (collector.isInstanceOf(Person.class)){
138
				collectorTeam = Team.NewInstance();
139
				if (primaryCollector == null){
140
					primaryCollector = CdmBase.deproxy(collector, Person.class);
141
				}
142
				collectorTeam.addTeamMember(primaryCollector);
143
			} else if (collector.isInstanceOf(Team.class) && ! collector.isProtectedTitleCache() ){
144
				collectorTeam = CdmBase.deproxy(collector, Team.class);
145
			}else{
146
				return  CdmUtils.concat(" ", collector.getTitleCache(), fieldNumber);
147
			}
148

    
149
			int counter = 0;
150
//			int teamSize = collectorTeam.getTeamMembers().size();
151
			boolean fieldNumberAdded = false;
152
			List<Person> teamMembers = collectorTeam.getTeamMembers();
153
			for (Person member : teamMembers){
154
				counter++;
155
				String concatString = TeamDefaultCacheStrategy.concatString(collectorTeam, teamMembers, counter);
156
				//(counter >= teamSize)? " & " : ", ";
157
				result = CdmUtils.concat(concatString, result, getMemberString(member) );
158
				if (member.equals(primaryCollector)){
159
					result = addFieldNumber(result, fieldNumber);
160
					fieldNumberAdded = true;
161
				}
162
			}
163
			if (collectorTeam.isHasMoreMembers()){
164
			    result = TeamDefaultCacheStrategy.addHasMoreMembers(result);
165
			}
166
			if (! fieldNumberAdded){
167
				result = addFieldNumber(result, fieldNumber);
168
			}
169
			return result;
170
		}
171
	}
172

    
173
	private String addFieldNumber(String str, String fieldNumber) {
174
		String result = CdmUtils.concat(" ", str, fieldNumber);
175
		return result;
176
	}
177

    
178
	/**
179
	 * Strategy to format a collector team member name
180
	 * @param member
181
	 * @return
182
	 */
183
	private String getMemberString(Person member) {
184
		if (StringUtils.isNotBlank(member.getFamilyName()) && ! member.isProtectedTitleCache() ){
185
			String result = member.getFamilyName();
186
			if  (StringUtils.isNotBlank(member.getGivenName())){
187
				result = member.getGivenName().substring(0,1) + ". " + result;
188
			}
189
			return result;
190
		}else{
191
			return member.getTitleCache();
192
		}
193
	}
194

    
195
	private boolean testPrimaryCollectorInCollectorTeam(AgentBase collector, Person primaryCollector) {
196
		if (collector.isInstanceOf(Person.class)){
197
			return collector.equals(primaryCollector);
198
		}else if (collector.isInstanceOf(Team.class)){
199
			Team collectorTeam = CdmBase.deproxy(collector, Team.class);
200
			return collectorTeam.getTeamMembers().contains(primaryCollector);
201
		}else{
202
			logger.warn("Collector is not of type person or team");
203
			return false;
204
		}
205
	}
206

    
207
	/**
208
	 * @param facade
209
	 */
210
	private String getCode(DerivedUnitFacade facade) {
211
		String code = "";
212
		if(facade.getCollection() != null){
213
			code = facade.getCollection().getCode();
214
			if (isBlank(code)){
215
				Institution institution = facade.getCollection().getInstitute();
216
				if (institution != null){
217
					code = institution.getCode();
218
				}
219
				if (isBlank(code)){
220
					Collection superCollection = facade.getCollection().getSuperCollection();
221
					if (superCollection != null){
222
						code = superCollection.getCode();
223
					}
224
				}
225
			}
226
		}
227
		return code;
228
	}
229

    
230
// ************************** GETTER / SETTER ******************************************************
231

    
232
	public boolean isIncludeSeconds() {
233
		return includeEmptySeconds;
234
	}
235
	public void setIncludeSeconds(boolean includeSeconds) {
236
		this.includeEmptySeconds = includeSeconds;
237
	}
238

    
239
	public void setIncludeReferenceSystem(boolean includeReferenceSystem) {
240
		this.includeReferenceSystem = includeReferenceSystem;
241
	}
242
	public boolean isIncludeReferenceSystem() {
243
		return includeReferenceSystem;
244
	}
245
}
(4-4/6)