ref #8517 handle protected fieldunit titlecache in DerivedUnitFacadeFieldUnitCacheStr...
[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.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 * @author a.mueller
36 * @since 03.06.2010
37 */
38 public class DerivedUnitFacadeFieldUnitCacheStrategy
39 extends StrategyBase
40 implements IIdentifiableEntityCacheStrategy<FieldUnit> {
41
42 private static final long serialVersionUID = 1578628591216605619L;
43 private static final Logger logger = Logger.getLogger(DerivedUnitFacadeFieldUnitCacheStrategy.class);
44
45 private static final UUID uuid = UUID.fromString("df4672c1-ce5c-4724-af6d-91e2b326d4a4");
46
47 @Override
48 protected UUID getUuid() {return uuid;}
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 protected String getFieldData(DerivedUnitFacade facade) {
67
68 FieldUnit fieldUnit = facade.getFieldUnit(false);
69 if (fieldUnit != null && fieldUnit.isProtectedTitleCache()){
70 return fieldUnit.getTitleCache();
71 }
72
73 String ALTITUDE_PREFIX = "alt. ";
74 // String ALTITUDE_POSTFIX = " m";
75
76 String result = "";
77
78 //country
79 String strCountry = null;
80 NamedArea country = facade.getCountry();
81 Representation repCountry = country == null ? null : country.getRepresentation(Language.DEFAULT());
82 strCountry = repCountry == null ? null: repCountry.getLabel();
83 result = CdmUtils.concat(", ", result, strCountry);
84
85 //locality
86 result = CdmUtils.concat(", ", result, facade.getLocalityText());
87
88 //elevation
89 if (StringUtils.isNotBlank(facade.absoluteElevationToString())){
90 result = CdmUtils.concat(", " , result, ALTITUDE_PREFIX);
91 result += facade.absoluteElevationToString();
92 }
93
94 //exact locality
95 if (facade.getExactLocation() != null){
96 String exactLocation = facade.getExactLocation().toSexagesimalString(this.includeEmptySeconds, this.includeReferenceSystem);
97 result = CdmUtils.concat(", ", result, exactLocation);
98 }
99
100 //ecology
101 result = CdmUtils.concat(", ", result, facade.getEcology());
102
103 //gathering period
104 //TODO period.toString ??
105 TimePeriod gatheringPeriod = facade.getGatheringPeriod();
106 result = CdmUtils.concat(", ", result, (gatheringPeriod == null? null : gatheringPeriod.toString()));
107
108 //collector (team) and field number
109 String collectorAndFieldNumber = getCollectorAndFieldNumber(facade);
110 result = CdmUtils.concat(", ", result, collectorAndFieldNumber);
111
112 return result;
113 }
114
115 protected String addPlantDescription(String result, DerivedUnitFacade facade) {
116
117 //plant description
118 result = CdmUtils.concat("; ", result, facade.getPlantDescription());
119 if (StringUtils.isNotBlank(result) && !result.endsWith(".")){
120 result += ".";
121 }
122
123 return result;
124 }
125
126 private String getCollectorAndFieldNumber(DerivedUnitFacade facade) {
127 String result = "";
128 AgentBase<?> collector = facade.getCollector();
129 String fieldNumber = facade.getFieldNumber();
130 Person primaryCollector = facade.getPrimaryCollector();
131
132 if (collector == null){
133 return fieldNumber;
134 }else if(collector.isProtectedTitleCache()){
135 return CdmUtils.concat(" ", collector.getTitleCache(), fieldNumber);
136 }else{
137 result = "";
138 Team collectorTeam;
139 if (collector.isInstanceOf(Person.class)){
140 collectorTeam = Team.NewInstance();
141 if (primaryCollector == null){
142 primaryCollector = CdmBase.deproxy(collector, Person.class);
143 }
144 collectorTeam.addTeamMember(primaryCollector);
145 } else if (collector.isInstanceOf(Team.class) && ! collector.isProtectedTitleCache() ){
146 collectorTeam = CdmBase.deproxy(collector, Team.class);
147 }else{
148 return CdmUtils.concat(" ", collector.getTitleCache(), fieldNumber);
149 }
150
151 int counter = 0;
152 // int teamSize = collectorTeam.getTeamMembers().size();
153 boolean fieldNumberAdded = false;
154 List<Person> teamMembers = collectorTeam.getTeamMembers();
155 for (Person member : teamMembers){
156 counter++;
157 String concatString = TeamDefaultCacheStrategy.concatString(collectorTeam, teamMembers, counter);
158 //(counter >= teamSize)? " & " : ", ";
159 result = CdmUtils.concat(concatString, result, getMemberString(member) );
160 if (member.equals(primaryCollector)){
161 result = addFieldNumber(result, fieldNumber);
162 fieldNumberAdded = true;
163 }
164 }
165 if (collectorTeam.isHasMoreMembers()){
166 result = TeamDefaultCacheStrategy.addHasMoreMembers(result);
167 }
168 if (! fieldNumberAdded){
169 result = addFieldNumber(result, fieldNumber);
170 }
171 return result;
172 }
173 }
174
175 private String addFieldNumber(String str, String fieldNumber) {
176 String result = CdmUtils.concat(" ", str, fieldNumber);
177 return result;
178 }
179
180 /**
181 * Strategy to format a collector team member name
182 * @param member
183 * @return
184 */
185 private String getMemberString(Person member) {
186 if (StringUtils.isNotBlank(member.getFamilyName()) && ! member.isProtectedTitleCache() ){
187 String result = member.getFamilyName();
188 if (StringUtils.isNotBlank(member.getGivenName())){
189 result = member.getGivenName().substring(0,1) + ". " + result;
190 }
191 return result;
192 }else{
193 return member.getTitleCache();
194 }
195 }
196
197 private boolean testPrimaryCollectorInCollectorTeam(AgentBase collector, Person primaryCollector) {
198 if (collector.isInstanceOf(Person.class)){
199 return collector.equals(primaryCollector);
200 }else if (collector.isInstanceOf(Team.class)){
201 Team collectorTeam = CdmBase.deproxy(collector, Team.class);
202 return collectorTeam.getTeamMembers().contains(primaryCollector);
203 }else{
204 logger.warn("Collector is not of type person or team");
205 return false;
206 }
207 }
208
209 /**
210 * @param facade
211 */
212 private String getCode(DerivedUnitFacade facade) {
213 String code = "";
214 if(facade.getCollection() != null){
215 code = facade.getCollection().getCode();
216 if (isBlank(code)){
217 Institution institution = facade.getCollection().getInstitute();
218 if (institution != null){
219 code = institution.getCode();
220 }
221 if (isBlank(code)){
222 Collection superCollection = facade.getCollection().getSuperCollection();
223 if (superCollection != null){
224 code = superCollection.getCode();
225 }
226 }
227 }
228 }
229 return code;
230 }
231
232 // ************************** GETTER / SETTER ******************************************************
233
234 public boolean isIncludeSeconds() {
235 return includeEmptySeconds;
236 }
237 public void setIncludeSeconds(boolean includeSeconds) {
238 this.includeEmptySeconds = includeSeconds;
239 }
240
241 public void setIncludeReferenceSystem(boolean includeReferenceSystem) {
242 this.includeReferenceSystem = includeReferenceSystem;
243 }
244 public boolean isIncludeReferenceSystem() {
245 return includeReferenceSystem;
246 }
247 }