2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.cdm
.api
.facade
;
11 import java
.util
.List
;
12 import java
.util
.UUID
;
14 import org
.apache
.commons
.lang
.StringUtils
;
15 import org
.apache
.log4j
.Logger
;
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
;
38 public class DerivedUnitFacadeFieldUnitCacheStrategy
40 implements IIdentifiableEntityCacheStrategy
<FieldUnit
> {
42 private static final long serialVersionUID
= 1578628591216605619L;
43 private static final Logger logger
= Logger
.getLogger(DerivedUnitFacadeFieldUnitCacheStrategy
.class);
45 private static final UUID uuid
= UUID
.fromString("df4672c1-ce5c-4724-af6d-91e2b326d4a4");
48 protected UUID
getUuid() {return uuid
;}
50 private boolean includeEmptySeconds
= false;
51 private boolean includeReferenceSystem
= true;
54 public String
getTitleCache(FieldUnit fieldUnit
) {
55 DerivedUnitFacade facade
;
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
);
66 protected String
getFieldData(DerivedUnitFacade facade
) {
68 FieldUnit fieldUnit
= facade
.getFieldUnit(false);
69 if (fieldUnit
!= null && fieldUnit
.isProtectedTitleCache()){
70 return fieldUnit
.getTitleCache();
73 String ALTITUDE_PREFIX
= "alt. ";
74 // String ALTITUDE_POSTFIX = " m";
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
);
86 result
= CdmUtils
.concat(", ", result
, facade
.getLocalityText());
89 if (StringUtils
.isNotBlank(facade
.absoluteElevationToString())){
90 result
= CdmUtils
.concat(", " , result
, ALTITUDE_PREFIX
);
91 result
+= facade
.absoluteElevationToString();
95 if (facade
.getExactLocation() != null){
96 String exactLocation
= facade
.getExactLocation().toSexagesimalString(this.includeEmptySeconds
, this.includeReferenceSystem
);
97 result
= CdmUtils
.concat(", ", result
, exactLocation
);
101 result
= CdmUtils
.concat(", ", result
, facade
.getEcology());
104 //TODO period.toString ??
105 TimePeriod gatheringPeriod
= facade
.getGatheringPeriod();
106 result
= CdmUtils
.concat(", ", result
, (gatheringPeriod
== null?
null : gatheringPeriod
.toString()));
108 //collector (team) and field number
109 String collectorAndFieldNumber
= getCollectorAndFieldNumber(facade
);
110 result
= CdmUtils
.concat(", ", result
, collectorAndFieldNumber
);
115 protected String
addPlantDescription(String result
, DerivedUnitFacade facade
) {
118 result
= CdmUtils
.concat("; ", result
, facade
.getPlantDescription());
119 if (StringUtils
.isNotBlank(result
) && !result
.endsWith(".")){
126 private String
getCollectorAndFieldNumber(DerivedUnitFacade facade
) {
128 AgentBase
<?
> collector
= facade
.getCollector();
129 String fieldNumber
= facade
.getFieldNumber();
130 Person primaryCollector
= facade
.getPrimaryCollector();
132 if (collector
== null){
134 }else if(collector
.isProtectedTitleCache()){
135 return CdmUtils
.concat(" ", collector
.getTitleCache(), fieldNumber
);
139 if (collector
.isInstanceOf(Person
.class)){
140 collectorTeam
= Team
.NewInstance();
141 if (primaryCollector
== null){
142 primaryCollector
= CdmBase
.deproxy(collector
, Person
.class);
144 collectorTeam
.addTeamMember(primaryCollector
);
145 } else if (collector
.isInstanceOf(Team
.class) && ! collector
.isProtectedTitleCache() ){
146 collectorTeam
= CdmBase
.deproxy(collector
, Team
.class);
148 return CdmUtils
.concat(" ", collector
.getTitleCache(), fieldNumber
);
152 // int teamSize = collectorTeam.getTeamMembers().size();
153 boolean fieldNumberAdded
= false;
154 List
<Person
> teamMembers
= collectorTeam
.getTeamMembers();
155 for (Person member
: teamMembers
){
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;
165 if (collectorTeam
.isHasMoreMembers()){
166 result
= TeamDefaultCacheStrategy
.addHasMoreMembers(result
);
168 if (! fieldNumberAdded
){
169 result
= addFieldNumber(result
, fieldNumber
);
175 private String
addFieldNumber(String str
, String fieldNumber
) {
176 String result
= CdmUtils
.concat(" ", str
, fieldNumber
);
181 * Strategy to format a collector team member name
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
;
193 return member
.getTitleCache();
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
);
204 logger
.warn("Collector is not of type person or team");
212 private String
getCode(DerivedUnitFacade facade
) {
214 if(facade
.getCollection() != null){
215 code
= facade
.getCollection().getCode();
217 Institution institution
= facade
.getCollection().getInstitute();
218 if (institution
!= null){
219 code
= institution
.getCode();
222 Collection superCollection
= facade
.getCollection().getSuperCollection();
223 if (superCollection
!= null){
224 code
= superCollection
.getCode();
232 // ************************** GETTER / SETTER ******************************************************
234 public boolean isIncludeSeconds() {
235 return includeEmptySeconds
;
237 public void setIncludeSeconds(boolean includeSeconds
) {
238 this.includeEmptySeconds
= includeSeconds
;
241 public void setIncludeReferenceSystem(boolean includeReferenceSystem
) {
242 this.includeReferenceSystem
= includeReferenceSystem
;
244 public boolean isIncludeReferenceSystem() {
245 return includeReferenceSystem
;