d425c54605b1165033745f4a87821fb8c0e90761
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / strategy / cache / taxon / TaxonBaseDefaultCacheStrategy.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
10 package eu.etaxonomy.cdm.strategy.cache.taxon;
11
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.UUID;
15
16 import org.apache.commons.lang.StringUtils;
17
18 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
19 import eu.etaxonomy.cdm.model.common.CdmBase;
20 import eu.etaxonomy.cdm.model.name.ITaxonNameBase;
21 import eu.etaxonomy.cdm.model.name.TaxonName;
22 import eu.etaxonomy.cdm.model.reference.Reference;
23 import eu.etaxonomy.cdm.model.taxon.Synonym;
24 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
25 import eu.etaxonomy.cdm.strategy.StrategyBase;
26 import eu.etaxonomy.cdm.strategy.cache.HTMLTagRules;
27 import eu.etaxonomy.cdm.strategy.cache.TagEnum;
28 import eu.etaxonomy.cdm.strategy.cache.TaggedCacheHelper;
29 import eu.etaxonomy.cdm.strategy.cache.TaggedText;
30 import eu.etaxonomy.cdm.strategy.cache.name.INameCacheStrategy;
31 import eu.etaxonomy.cdm.strategy.cache.name.INonViralNameCacheStrategy;
32
33 public class TaxonBaseDefaultCacheStrategy<T extends TaxonBase>
34 extends StrategyBase
35 implements ITaxonCacheStrategy<T> {
36
37 private static final long serialVersionUID = 5769890979070021350L;
38 final static UUID uuid = UUID.fromString("931e48f0-2033-11de-8c30-0800200c9a66");
39
40 @Override
41 protected UUID getUuid() {
42 return uuid;
43 }
44
45 @Override
46 public String getTitleCache(T taxonBase) {
47 return getTitleCache(taxonBase, null);
48 }
49
50 @Override
51 public List<TaggedText> getTaggedTitle(T taxonBase) {
52 if (taxonBase == null){
53 return null;
54 }
55
56 List<TaggedText> tags = new ArrayList<>();
57
58 if (taxonBase.isDoubtful()){
59 tags.add(new TaggedText(TagEnum.separator, "?"));
60 }
61 if (taxonBase.isProtectedTitleCache()){
62 //protected title cache
63 tags.add(new TaggedText(TagEnum.name, taxonBase.getTitleCache()));
64 }else{
65 //name
66 List<TaggedText> nameTags = getNameTags(taxonBase);
67
68 if (nameTags.size() > 0){
69 tags.addAll(nameTags);
70 }else{
71 tags.add(new TaggedText(TagEnum.fullName, "???"));
72 }
73
74 boolean isSynonym = taxonBase.isInstanceOf(Synonym.class);
75 String secSeparator = (isSynonym? " syn." : "") + " sec. ";
76 //not used: we currently use a post-separator in the name tags
77 // if (nameTags.get(nameTags.size() - 1).getType().equals(TagEnum.nomStatus)){
78 // secSeparator = "," + secSeparator;
79 // }
80
81 //ref.
82 List<TaggedText> secTags = getSecundumTags(taxonBase);
83
84 //sec.
85 if (!secTags.isEmpty()){
86 tags.add(new TaggedText(TagEnum.separator, secSeparator));
87 tags.addAll(secTags);
88 }
89
90 }
91 return tags;
92 }
93
94 private <X extends ITaxonNameBase> List<TaggedText> getNameTags(T taxonBase) {
95 List<TaggedText> tags = new ArrayList<>();
96 TaxonName name = CdmBase.deproxy(taxonBase.getName());
97
98 if (name != null){
99 INameCacheStrategy nameCacheStrategy = name.getCacheStrategy();
100 if (taxonBase.isUseNameCache() && name.isNonViral() && nameCacheStrategy instanceof INonViralNameCacheStrategy){
101 INonViralNameCacheStrategy nvnCacheStrategy = (INonViralNameCacheStrategy)nameCacheStrategy;
102 List<TaggedText> nameCacheTags = nvnCacheStrategy.getTaggedName(name);
103 tags.addAll(nameCacheTags);
104 }else{
105 List<TaggedText> nameTags = nameCacheStrategy.getTaggedTitle(name);
106 tags.addAll(nameTags);
107 List<TaggedText> statusTags = nameCacheStrategy.getNomStatusTags(name, true, true);
108 tags.addAll(statusTags);
109 }
110 if (StringUtils.isNotBlank(taxonBase.getAppendedPhrase())){
111 tags.add(new TaggedText(TagEnum.appendedPhrase, taxonBase.getAppendedPhrase().trim()));
112 }
113 }
114
115 return tags;
116 }
117
118 private List<TaggedText> getSecundumTags(T taxonBase) {
119 List<TaggedText> tags = new ArrayList<>();
120
121 Reference ref = taxonBase.getSec();
122 ref = HibernateProxyHelper.deproxy(ref, Reference.class);
123 String secRef;
124 if (ref == null){
125 //missing sec
126 if (isBlank(taxonBase.getAppendedPhrase())){
127 secRef = "???";
128 }else{
129 secRef = null;
130 }
131 }
132 else{
133 //existing sec
134 if (ref.isProtectedTitleCache() == false &&
135 ref.getCacheStrategy() != null &&
136 ref.getAuthorship() != null &&
137 isNotBlank(ref.getAuthorship().getTitleCache()) &&
138 isNotBlank(ref.getYear())){
139 secRef = ref.getCacheStrategy().getCitation(ref);
140 }else{
141 secRef = ref.getTitleCache();
142 }
143 }
144 if (secRef != null){
145 tags.add(new TaggedText(TagEnum.secReference, secRef));
146 }
147 //secMicroReference
148 if (StringUtils.isNotBlank(taxonBase.getSecMicroReference())){
149 tags.add(new TaggedText(TagEnum.separator, ": "));
150 tags.add(new TaggedText(TagEnum.secReference, taxonBase.getSecMicroReference()));
151
152 }
153 return tags;
154 }
155
156
157 @Override
158 public String getTitleCache(T taxonBase, HTMLTagRules htmlTagRules) {
159 List<TaggedText> tags = getTaggedTitle(taxonBase);
160 if (tags == null){
161 return null;
162 }else{
163 String result = TaggedCacheHelper.createString(tags, htmlTagRules);
164 return result;
165 }
166 }
167 }