solving some reference cache strategy issues, e.g. #3645
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / strategy / cache / reference / NomRefDefaultCacheStrategyBase.java
1 /**
2 * Copyright (C) 2007 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
10 package eu.etaxonomy.cdm.strategy.cache.reference;
11
12 import org.apache.commons.lang.StringUtils;
13 import org.apache.log4j.Logger;
14
15 import eu.etaxonomy.cdm.common.CdmUtils;
16 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
17 import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
18 import eu.etaxonomy.cdm.model.reference.Reference;
19 import eu.etaxonomy.cdm.strategy.StrategyBase;
20
21 /**
22 * @author a.mueller
23 * @created 29.06.2008
24 */
25 public abstract class NomRefDefaultCacheStrategyBase<T extends Reference> extends StrategyBase implements INomenclaturalReferenceCacheStrategy<T>{
26 private static final long serialVersionUID = -725290113353165022L;
27
28 @SuppressWarnings("unused")
29 private static final Logger logger = Logger.getLogger(NomRefDefaultCacheStrategyBase.class);
30
31 protected String beforeYear = ". ";
32 protected String beforeMicroReference = ": ";
33 protected String afterYear = "";
34 protected String afterAuthor = ", ";
35
36
37 @Override
38 public String getTokenizedNomenclaturalTitel(T ref) {
39 String result = getTitleWithoutYearAndAuthor(ref, true);
40 result += INomenclaturalReference.MICRO_REFERENCE_TOKEN;
41 result = addYear(result, ref, true);
42 return result;
43 }
44
45 @Override
46 public String getTitleCache(T nomenclaturalReference) {
47 return getTitleCache(nomenclaturalReference, false);
48 }
49
50 @Override
51 public String getAbbrevTitleCache(T nomenclaturalReference) {
52 return getTitleCache(nomenclaturalReference, true);
53 }
54
55 private String getTitleCache(T ref, boolean isAbbrev) {
56 //TODO needed?
57 if (isAbbrev && ref.isProtectedAbbrevTitleCache()){
58 return ref.getAbbrevTitleCache();
59 }else if (!isAbbrev && ref.isProtectedTitleCache()){
60 return ref.getTitleCache();
61 }
62 String result = getTitleWithoutYearAndAuthor(ref, isAbbrev);
63 result = addYear(result, ref, false);
64 TeamOrPersonBase<?> team = ref.getAuthorTeam();
65
66 if (team != null){
67 String teamTitle = CdmUtils.getPreferredNonEmptyString(team.getTitleCache(), team.getNomenclaturalTitle(), isAbbrev, true);
68 if (teamTitle.length() > 0 ){
69 String concat = isNotBlank(result) ? afterAuthor : "";
70 result = team.getTitleCache() + concat + result;
71 }
72
73 }
74 return result;
75 }
76
77 protected abstract String getTitleWithoutYearAndAuthor(T reference, boolean isAbbrev);
78
79
80 @Override
81 public String getCitation(T referenceBase) {
82 StringBuilder stringBuilder = new StringBuilder();
83
84 String nextConcat = "";
85
86 TeamOrPersonBase<?> team = referenceBase.getAuthorTeam();
87 if (team != null && ! (team.getTitleCache() == null) && ! team.getTitleCache().trim().equals("")){
88 stringBuilder.append(team.getTitleCache() );
89 nextConcat = afterAuthor;
90 }
91
92 String year = referenceBase.getYear();
93 if (StringUtils.isNotBlank(year)){
94 stringBuilder.append(nextConcat + year);
95 }
96
97 return stringBuilder.toString();
98 }
99
100
101 @Override
102 public String getBeforeMicroReference(){
103 return beforeMicroReference;
104 }
105
106 protected String addYear(String string, T nomRef, boolean useFullDatePublished){
107 String result;
108 if (string == null){
109 return null;
110 }
111 String year = useFullDatePublished ? nomRef.getDatePublishedString() : nomRef.getYear();
112 if (StringUtils.isBlank(year)){
113 result = string + afterYear;
114 }else{
115 String concat = isBlank(string) ? "" : string.endsWith(".")? " " : beforeYear;
116 result = string + concat + year + afterYear;
117 }
118 return result;
119 }
120
121 @Override
122 public String getNomenclaturalCitation(T nomenclaturalReference, String microReference) {
123 if (nomenclaturalReference.isProtectedTitleCache()){
124 return nomenclaturalReference.getTitleCache();
125 }
126 String result = getTokenizedNomenclaturalTitel(nomenclaturalReference);
127 microReference = CdmUtils.Nz(microReference);
128 if (StringUtils.isNotBlank(microReference)){
129 microReference = getBeforeMicroReference() + microReference;
130 }
131 result = result.replaceAll(INomenclaturalReference.MICRO_REFERENCE_TOKEN, microReference);
132 return result;
133 }
134
135 }