fix #6381 Also use barcode or catalogue number for titlecache if accession number...
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / facade / DerivedUnitFacadeFieldUnitCacheStrategy.java
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.Representation;
25 import eu.etaxonomy.cdm.model.common.TimePeriod;
26 import eu.etaxonomy.cdm.model.location.NamedArea;
27 import eu.etaxonomy.cdm.model.occurrence.Collection;
28 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
29 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
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 * @author a.mueller
36 * @date 03.06.2010
37 *
38 */
39 public class DerivedUnitFacadeFieldUnitCacheStrategy extends StrategyBase implements IIdentifiableEntityCacheStrategy<FieldUnit> {
40 private static final long serialVersionUID = 1578628591216605619L;
41 private static final Logger logger = Logger.getLogger(DerivedUnitFacadeFieldUnitCacheStrategy.class);
42
43 private static final UUID uuid = UUID.fromString("df4672c1-ce5c-4724-af6d-91e2b326d4a4");
44
45 @Override
46 protected UUID getUuid() {
47 return uuid;
48 }
49
50 private boolean includeEmptySeconds = false;
51 private boolean includeReferenceSystem = true;
52
53 @Override
54 public String getTitleCache(FieldUnit fieldUnit) {
55 DerivedUnitFacade facade;
56 String result = "";
57 DerivedUnitFacadeConfigurator config = DerivedUnitFacadeConfigurator.NewInstance();
58 config.setFirePropertyChangeEvents(false);
59 facade = DerivedUnitFacade.NewInstance(SpecimenOrObservationType.FieldUnit, fieldUnit, config);
60 result = getFieldData(facade);
61 result = addPlantDescription(result, facade);
62 facade.close();
63 return result;
64 }
65
66
67 protected String getFieldData(DerivedUnitFacade facade) {
68 String ALTITUDE_PREFIX = "alt. ";
69 // String ALTITUDE_POSTFIX = " m";
70
71 String result = "";
72
73
74 //country
75 String strCountry = null;
76 NamedArea country = facade.getCountry();
77 Representation repCountry = country == null ? null : country.getRepresentation(Language.DEFAULT());
78 //TODO currently the label is the 3 digit representation of the country and text is the full text.
79 //this is against the common way of handling text, label and labelabbrev in defined terms
80 strCountry = repCountry == null ? null: repCountry.getText();
81 result = CdmUtils.concat(", ", result, strCountry);
82
83 //locality
84 result = CdmUtils.concat(", ", result, facade.getLocalityText());
85
86 //elevation
87 if (StringUtils.isNotBlank(facade.absoluteElevationToString())){
88 result = CdmUtils.concat(", " , result, ALTITUDE_PREFIX);
89 result += facade.absoluteElevationToString();
90 }
91
92 //exact locality
93 if (facade.getExactLocation() != null){
94 String exactLocation = facade.getExactLocation().toSexagesimalString(this.includeEmptySeconds, this.includeReferenceSystem);
95 result = CdmUtils.concat(", ", result, exactLocation);
96 }
97
98 //ecology
99 result = CdmUtils.concat(", ", result, facade.getEcology());
100
101 //gathering period
102 //TODO period.toString ??
103 TimePeriod gatheringPeriod = facade.getGatheringPeriod();
104 result = CdmUtils.concat(", ", result, (gatheringPeriod == null? null : gatheringPeriod.toString()));
105
106 //collector (team) and field number
107 String collectorAndFieldNumber = getCollectorAndFieldNumber(facade);
108 result = CdmUtils.concat(", ", result, collectorAndFieldNumber);
109
110
111 return result;
112 }
113
114
115 protected String addPlantDescription(String result, DerivedUnitFacade facade) {
116
117 //plant description
118 result = CdmUtils.concat("; ", result, facade.getPlantDescription());
119 if (CdmUtils.isNotEmpty(result) && !result.endsWith(".")){
120 result += ".";
121 }
122
123 return result;
124 }
125
126
127
128 private String getCollectorAndFieldNumber(DerivedUnitFacade facade) {
129 String result = "";
130 AgentBase<?> collector = facade.getCollector();
131 String fieldNumber = facade.getFieldNumber();
132 Person primaryCollector = facade.getPrimaryCollector();
133
134 if (collector == null){
135 return fieldNumber;
136 }else if(collector.isProtectedTitleCache()){
137 return CdmUtils.concat(" ", collector.getTitleCache(), fieldNumber);
138 }else{
139 result = "";
140 Team collectorTeam;
141 if (collector.isInstanceOf(Person.class)){
142 collectorTeam = Team.NewInstance();
143 if (primaryCollector == null){
144 primaryCollector = CdmBase.deproxy(collector, Person.class);
145 }
146 collectorTeam.addTeamMember(primaryCollector);
147 } else if (collector.isInstanceOf(Team.class) && ! collector.isProtectedTitleCache() ){
148 collectorTeam = CdmBase.deproxy(collector, Team.class);
149 }else{
150 return CdmUtils.concat(" ", collector.getTitleCache(), fieldNumber);
151 }
152
153 int counter = 0;
154 // int teamSize = collectorTeam.getTeamMembers().size();
155 boolean fieldNumberAdded = false;
156 List<Person> teamMembers = collectorTeam.getTeamMembers();
157 for (Person member : teamMembers){
158 counter++;
159 String concatString = TeamDefaultCacheStrategy.concatString(collectorTeam, teamMembers, counter);
160 //(counter >= teamSize)? " & " : ", ";
161 result = CdmUtils.concat(concatString, result, getMemberString(member) );
162 if (member.equals(primaryCollector)){
163 result = addFieldNumber(result, fieldNumber);
164 fieldNumberAdded = true;
165 }
166 }
167 if (collectorTeam.isHasMoreMembers()){
168 result = TeamDefaultCacheStrategy.addHasMoreMembers(result);
169 }
170 if (! fieldNumberAdded){
171 result = addFieldNumber(result, fieldNumber);
172 }
173 return result;
174 }
175
176 }
177
178 private String addFieldNumber(String str, String fieldNumber) {
179 String result = CdmUtils.concat(" ", str, fieldNumber);
180 return result;
181 }
182
183
184
185 /**
186 * Strategy to format a collector team member name
187 * @param member
188 * @return
189 */
190 private String getMemberString(Person member) {
191 if (StringUtils.isNotBlank(member.getLastname()) && ! member.isProtectedTitleCache() ){
192 String result = member.getLastname();
193 if (StringUtils.isNotBlank(member.getFirstname())){
194 result = member.getFirstname().substring(0,1) + ". " + result;
195 }
196 return result;
197 }else{
198 return member.getTitleCache();
199 }
200 }
201
202
203
204 private boolean testPrimaryCollectorInCollectorTeam(AgentBase collector, Person primaryCollector) {
205 if (collector.isInstanceOf(Person.class)){
206 return collector.equals(primaryCollector);
207 }else if (collector.isInstanceOf(Team.class)){
208 Team collectorTeam = CdmBase.deproxy(collector, Team.class);
209 return collectorTeam.getTeamMembers().contains(primaryCollector);
210 }else{
211 logger.warn("Collector is not of type person or team");
212 return false;
213 }
214 }
215
216
217
218 /**
219 * @param facade
220 */
221 private String getCode(DerivedUnitFacade facade) {
222 String code = "";
223 if(facade.getCollection() != null){
224 code = facade.getCollection().getCode();
225 if (CdmUtils.isEmpty(code)){
226 Institution institution = facade.getCollection().getInstitute();
227 if (institution != null){
228 code = institution.getCode();
229 }
230 if (CdmUtils.isEmpty(code)){
231 Collection superCollection = facade.getCollection().getSuperCollection();
232 if (superCollection != null){
233 code = superCollection.getCode();
234 }
235 }
236 }
237 }
238 return code;
239 }
240
241 // ************************** GETTER / SETTER ******************************************************
242
243 public boolean isIncludeSeconds() {
244 return includeEmptySeconds;
245 }
246
247
248
249 public void setIncludeSeconds(boolean includeSeconds) {
250 this.includeEmptySeconds = includeSeconds;
251 }
252
253
254
255 public void setIncludeReferenceSystem(boolean includeReferenceSystem) {
256 this.includeReferenceSystem = includeReferenceSystem;
257 }
258
259
260
261 public boolean isIncludeReferenceSystem() {
262 return includeReferenceSystem;
263 }
264
265
266 }