Revision 9dc896c9
Added by Andreas Müller almost 7 years ago
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/cache/name/NameCacheStrategyBase.java | ||
---|---|---|
8 | 8 |
*/ |
9 | 9 |
package eu.etaxonomy.cdm.strategy.cache.name; |
10 | 10 |
|
11 |
import java.util.ArrayList; |
|
12 |
import java.util.Iterator; |
|
11 | 13 |
import java.util.List; |
14 |
import java.util.Set; |
|
12 | 15 |
import java.util.UUID; |
13 | 16 |
|
17 |
import org.apache.commons.lang.StringUtils; |
|
14 | 18 |
import org.apache.log4j.Logger; |
15 | 19 |
|
20 |
import eu.etaxonomy.cdm.common.CdmUtils; |
|
21 |
import eu.etaxonomy.cdm.common.UTF8; |
|
22 |
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; |
|
23 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
|
24 |
import eu.etaxonomy.cdm.model.common.Language; |
|
25 |
import eu.etaxonomy.cdm.model.common.Representation; |
|
26 |
import eu.etaxonomy.cdm.model.name.INonViralName; |
|
16 | 27 |
import eu.etaxonomy.cdm.model.name.ITaxonNameBase; |
28 |
import eu.etaxonomy.cdm.model.name.NameRelationship; |
|
29 |
import eu.etaxonomy.cdm.model.name.NameRelationshipType; |
|
30 |
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus; |
|
31 |
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType; |
|
32 |
import eu.etaxonomy.cdm.model.name.TaxonName; |
|
33 |
import eu.etaxonomy.cdm.model.reference.INomenclaturalReference; |
|
34 |
import eu.etaxonomy.cdm.model.reference.Reference; |
|
17 | 35 |
import eu.etaxonomy.cdm.strategy.StrategyBase; |
18 | 36 |
import eu.etaxonomy.cdm.strategy.cache.HTMLTagRules; |
37 |
import eu.etaxonomy.cdm.strategy.cache.TagEnum; |
|
38 |
import eu.etaxonomy.cdm.strategy.cache.TaggedCacheHelper; |
|
19 | 39 |
import eu.etaxonomy.cdm.strategy.cache.TaggedText; |
20 | 40 |
|
21 | 41 |
/** |
22 | 42 |
* @author AM |
23 | 43 |
*/ |
24 |
public abstract class NameCacheStrategyBase<T extends ITaxonNameBase> extends StrategyBase implements INameCacheStrategy<T> { |
|
44 |
public abstract class NameCacheStrategyBase<T extends ITaxonNameBase> |
|
45 |
extends StrategyBase |
|
46 |
implements INameCacheStrategy<T> { |
|
25 | 47 |
private static final long serialVersionUID = -2322348388258675517L; |
26 | 48 |
|
27 |
@SuppressWarnings("unused") |
|
28 | 49 |
private static final Logger logger = Logger.getLogger(NameCacheStrategyBase.class); |
29 | 50 |
|
30 | 51 |
final static UUID uuid = UUID.fromString("817ae5b5-3ac2-414b-a134-a9ae86cba040"); |
... | ... | |
36 | 57 |
super(); |
37 | 58 |
} |
38 | 59 |
|
60 |
// @Override |
|
61 |
// public abstract String getFullTitleCache(T name); |
|
62 |
// |
|
63 |
// @Override |
|
64 |
// public abstract String getFullTitleCache(T name, HTMLTagRules rules); |
|
65 |
|
|
66 |
|
|
67 |
@Override |
|
68 |
public String getFullTitleCache(T taxonName, HTMLTagRules htmlTagRules) { |
|
69 |
List<TaggedText> tags = getTaggedFullTitle(taxonName); |
|
70 |
if (tags == null){ |
|
71 |
return null; |
|
72 |
}else{ |
|
73 |
String result = createString(tags, htmlTagRules); |
|
74 |
return result; |
|
75 |
} |
|
76 |
} |
|
77 |
|
|
78 |
@Override |
|
79 |
public String getFullTitleCache(T taxonName) { |
|
80 |
return getFullTitleCache(taxonName, null); |
|
81 |
} |
|
82 |
|
|
83 |
|
|
84 |
/** |
|
85 |
* @param nonViralName |
|
86 |
* @param tags |
|
87 |
* @return |
|
88 |
*/ |
|
89 |
@Override |
|
90 |
public List<TaggedText> getNomStatusTags(T nonViralName, boolean includeSeparatorBefore, |
|
91 |
boolean includeSeparatorAfter) { |
|
92 |
|
|
93 |
Set<NomenclaturalStatus> ncStati = nonViralName.getStatus(); |
|
94 |
Iterator<NomenclaturalStatus> iterator = ncStati.iterator(); |
|
95 |
List<TaggedText> nomStatusTags = new ArrayList<>(); |
|
96 |
while (iterator.hasNext()) { |
|
97 |
NomenclaturalStatus ncStatus = iterator.next(); |
|
98 |
// since the NewInstance method of nomencatural status allows null as parameter |
|
99 |
// we have to check for null values here |
|
100 |
String nomStatusStr = "not defined"; |
|
101 |
if(ncStatus.getType() != null){ |
|
102 |
NomenclaturalStatusType statusType = ncStatus.getType(); |
|
103 |
Language lang = Language.LATIN(); |
|
104 |
Representation repr = statusType.getRepresentation(lang); |
|
105 |
if (repr != null){ |
|
106 |
nomStatusStr = repr.getAbbreviatedLabel(); |
|
107 |
}else{ |
|
108 |
String message = "No latin representation available for nom. status. " + statusType.getTitleCache(); |
|
109 |
logger.warn(message); |
|
110 |
throw new IllegalStateException(message); |
|
111 |
} |
|
112 |
}else if(StringUtils.isNotBlank(ncStatus.getRuleConsidered())){ |
|
113 |
nomStatusStr = ncStatus.getRuleConsidered(); |
|
114 |
} |
|
115 |
String statusSeparator = ", "; |
|
116 |
if (includeSeparatorBefore){ |
|
117 |
nomStatusTags.add(new TaggedText(TagEnum.separator, statusSeparator)); |
|
118 |
} |
|
119 |
nomStatusTags.add(new TaggedText(TagEnum.nomStatus, nomStatusStr)); |
|
120 |
if (includeSeparatorAfter){ |
|
121 |
nomStatusTags.add(new TaggedText(TagEnum.postSeparator, ",")); |
|
122 |
} |
|
123 |
} |
|
124 |
return nomStatusTags; |
|
125 |
} |
|
126 |
|
|
127 |
|
|
128 |
/** |
|
129 |
* Generates and returns the "name cache" (only scientific name without author teams and year). |
|
130 |
* @see eu.etaxonomy.cdm.strategy.cache.name.INameCacheStrategy#getNameCache(eu.etaxonomy.cdm.model.name.TaxonName) |
|
131 |
*/ |
|
132 |
@Override |
|
133 |
public String getNameCache(T nonViralName) { |
|
134 |
List<TaggedText> tags = getTaggedName(nonViralName); |
|
135 |
if (tags == null){ |
|
136 |
return null; |
|
137 |
}else{ |
|
138 |
String result = createString(tags); |
|
139 |
return result; |
|
140 |
} |
|
141 |
} |
|
142 |
|
|
39 | 143 |
|
40 | 144 |
/** |
41 | 145 |
* Generates and returns the title cache of the given name. |
... | ... | |
45 | 149 |
* @see eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy#getTitleCache(eu.etaxonomy.cdm.model.common.IdentifiableEntity) |
46 | 150 |
*/ |
47 | 151 |
@Override |
48 |
public abstract String getTitleCache(T name); |
|
152 |
public String getTitleCache(T nonViralName) { |
|
153 |
return getTitleCache(nonViralName, null); |
|
154 |
} |
|
49 | 155 |
|
50 | 156 |
@Override |
51 |
public abstract String getTitleCache(T name, HTMLTagRules rules); |
|
157 |
public String getTitleCache(T nonViralName, HTMLTagRules htmlTagRules) { |
|
158 |
List<TaggedText> tags = getTaggedTitle(nonViralName); |
|
159 |
if (tags == null){ |
|
160 |
return null; |
|
161 |
}else{ |
|
162 |
String result = createString(tags, htmlTagRules); |
|
163 |
return result; |
|
164 |
} |
|
165 |
} |
|
52 | 166 |
|
53 | 167 |
@Override |
54 |
public abstract String getFullTitleCache(T name); |
|
168 |
public List<TaggedText> getTaggedTitle(T taxonName) { |
|
169 |
if (taxonName == null){ |
|
170 |
return null; |
|
171 |
} |
|
172 |
//TODO how to handle protected fullTitleCache here? |
|
55 | 173 |
|
56 |
@Override |
|
57 |
public abstract String getFullTitleCache(T name, HTMLTagRules rules); |
|
174 |
if (taxonName.isProtectedTitleCache()){ |
|
175 |
//protected title cache |
|
176 |
List<TaggedText> tags = new ArrayList<>(); |
|
177 |
tags.add(new TaggedText(TagEnum.name, taxonName.getTitleCache())); |
|
178 |
return tags; |
|
179 |
}else{ |
|
180 |
return doGetTaggedTitle(taxonName); |
|
181 |
} |
|
58 | 182 |
|
59 |
@Override |
|
60 |
public abstract List<TaggedText> getTaggedTitle(T taxonNameBase); |
|
183 |
} |
|
184 |
|
|
185 |
protected abstract List<TaggedText> doGetTaggedTitle(T taxonName); |
|
61 | 186 |
|
62 | 187 |
@Override |
63 |
public abstract List<TaggedText> getTaggedFullTitle(T taxonNameBase); |
|
188 |
public List<TaggedText> getTaggedFullTitle(T nonViralName) { |
|
189 |
List<TaggedText> tags = new ArrayList<>(); |
|
190 |
|
|
191 |
//null |
|
192 |
if (nonViralName == null){ |
|
193 |
return null; |
|
194 |
} |
|
195 |
|
|
196 |
//protected full title cache |
|
197 |
if (nonViralName.isProtectedFullTitleCache()){ |
|
198 |
tags.add(new TaggedText(TagEnum.fullName, nonViralName.getFullTitleCache())); |
|
199 |
return tags; |
|
200 |
} |
|
201 |
|
|
202 |
//title cache |
|
203 |
// String titleCache = nonViralName.getTitleCache(); |
|
204 |
List<TaggedText> titleTags = getTaggedTitle(nonViralName); |
|
205 |
tags.addAll(titleTags); |
|
206 |
|
|
207 |
//reference |
|
208 |
String microReference = nonViralName.getNomenclaturalMicroReference(); |
|
209 |
INomenclaturalReference ref = nonViralName.getNomenclaturalReference(); |
|
210 |
String referenceCache = null; |
|
211 |
if (ref != null){ |
|
212 |
Reference reference = HibernateProxyHelper.deproxy(ref, Reference.class); |
|
213 |
referenceCache = reference.getNomenclaturalCitation(microReference); |
|
214 |
} |
|
215 |
//add to tags |
|
216 |
if (StringUtils.isNotBlank(referenceCache)){ |
|
217 |
if (! referenceCache.trim().startsWith("in ")){ |
|
218 |
String refConcat = ", "; |
|
219 |
tags.add(new TaggedText(TagEnum.separator, refConcat)); |
|
220 |
} |
|
221 |
tags.add(new TaggedText(TagEnum.reference, referenceCache)); |
|
222 |
} |
|
223 |
|
|
224 |
addOriginalSpelling(tags, nonViralName); |
|
225 |
|
|
226 |
//nomenclatural status |
|
227 |
tags.addAll(getNomStatusTags(nonViralName, true, false)); |
|
228 |
return tags; |
|
229 |
|
|
230 |
} |
|
231 |
|
|
232 |
protected void addOriginalSpelling(List<TaggedText> tags, ITaxonNameBase name){ |
|
233 |
String originalName = getOriginalNameString(name, tags); |
|
234 |
if (StringUtils.isNotBlank(originalName)){ |
|
235 |
tags.add(new TaggedText(TagEnum.name, originalName)); |
|
236 |
} |
|
237 |
} |
|
238 |
|
|
239 |
private String getOriginalNameString(ITaxonNameBase currentName, List<TaggedText> originalNameTaggs) { |
|
240 |
List<String> originalNameStrings = new ArrayList<>(1); |
|
241 |
currentName = CdmBase.deproxy(currentName); |
|
242 |
//Hibernate.initialize(currentName.getRelationsToThisName()); |
|
243 |
for (NameRelationship nameRel : currentName.getRelationsToThisName()){ //handle list, just in case we have strange data; this may result in strange looking results |
|
244 |
NameRelationshipType type = nameRel.getType(); |
|
245 |
if(type != null && type.equals(NameRelationshipType.ORIGINAL_SPELLING())){ |
|
246 |
String originalNameString; |
|
247 |
TaxonName originalName = nameRel.getFromName(); |
|
248 |
if (!originalName.isNonViral()){ |
|
249 |
originalNameString = originalName.getTitleCache(); |
|
250 |
}else{ |
|
251 |
INonViralName originalNvName = CdmBase.deproxy(originalName); |
|
252 |
originalNameString = makeOriginalNameString(currentName, originalNvName, originalNameTaggs); |
|
253 |
} |
|
254 |
originalNameStrings.add("[as " + UTF8.QUOT_DBL_LOW9 + originalNameString + UTF8.QUOT_DBL_LEFT + "]"); |
|
255 |
} |
|
256 |
} |
|
257 |
if (originalNameStrings.size() > 0){ |
|
258 |
String result = CdmUtils.concat("", originalNameStrings.toArray(new String[originalNameStrings.size()])) ; |
|
259 |
return result; |
|
260 |
}else{ |
|
261 |
return null; |
|
262 |
} |
|
263 |
} |
|
264 |
|
|
265 |
private String makeOriginalNameString(ITaxonNameBase currentName, INonViralName originalName, |
|
266 |
List<TaggedText> currentNameTags) { |
|
267 |
//use cache if necessary |
|
268 |
String cacheToUse = null; |
|
269 |
if (originalName.isProtectedNameCache() && StringUtils.isNotBlank(originalName.getNameCache())){ |
|
270 |
cacheToUse = originalName.getNameCache(); |
|
271 |
}else if (originalName.isProtectedTitleCache() && StringUtils.isNotBlank(originalName.getTitleCache())){ |
|
272 |
cacheToUse = originalName.getTitleCache(); |
|
273 |
}else if (originalName.isProtectedFullTitleCache() && StringUtils.isNotBlank(originalName.getFullTitleCache())){ |
|
274 |
cacheToUse = originalName.getFullTitleCache(); |
|
275 |
} |
|
276 |
if (cacheToUse != null){ |
|
277 |
return cacheToUse; |
|
278 |
} |
|
279 |
//use atomized data |
|
280 |
//get originalNameParts array |
|
281 |
String originalNameString = originalName.getNameCache(); |
|
282 |
if (originalNameString == null){ |
|
283 |
originalNameString = originalName.getTitleCache(); |
|
284 |
} |
|
285 |
if (originalNameString == null){ //should not happen |
|
286 |
originalNameString = originalName.getFullTitleCache(); |
|
287 |
} |
|
288 |
String[] originalNameSplit = originalNameString.split("\\s+"); |
|
289 |
|
|
290 |
//get current name parts |
|
291 |
String currentNameString = createString(currentNameTags); |
|
292 |
String[] currentNameSplit = currentNameString.split("\\s+"); |
|
293 |
|
|
294 |
//compute string |
|
295 |
String result = originalNameString; |
|
296 |
for (int i = 0; i < Math.min(originalNameSplit.length, currentNameSplit.length); i++){ |
|
297 |
if (originalNameSplit[i].equals(currentNameSplit[i])){ |
|
298 |
result = result.replaceFirst(originalNameSplit[i], "").trim(); |
|
299 |
} |
|
300 |
} |
|
301 |
//old |
|
302 |
// if (originalName.getGenusOrUninomial() != null && originalName.getGenusOrUninomial().equals(currentName.getGenusOrUninomial())){ |
|
303 |
// |
|
304 |
// } |
|
305 |
return result; |
|
306 |
} |
|
307 |
|
|
308 |
/** |
|
309 |
* @param tags |
|
310 |
* @return |
|
311 |
*/ |
|
312 |
protected String createString(List<TaggedText> tags) { |
|
313 |
return TaggedCacheHelper.createString(tags); |
|
314 |
} |
|
315 |
|
|
316 |
/** |
|
317 |
* @param tags |
|
318 |
* @param htmlTagRules |
|
319 |
* @return |
|
320 |
*/ |
|
321 |
protected String createString(List<TaggedText> tags, HTMLTagRules htmlTagRules) { |
|
322 |
return TaggedCacheHelper.createString(tags, htmlTagRules); |
|
323 |
} |
|
64 | 324 |
|
65 | 325 |
} |
Also available in: Unified diff
fix #6368 rename table and class TaxonNameBase