Project

General

Profile

Download (9.12 KB) Statistics
| Branch: | Tag: | Revision:
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.strategy.cache.taxon;
10

    
11
import java.util.ArrayList;
12
import java.util.List;
13
import java.util.UUID;
14

    
15
import eu.etaxonomy.cdm.common.CdmUtils;
16
import eu.etaxonomy.cdm.format.reference.OriginalSourceFormatter;
17
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
18
import eu.etaxonomy.cdm.model.common.CdmBase;
19
import eu.etaxonomy.cdm.model.name.TaxonName;
20
import eu.etaxonomy.cdm.model.reference.Reference;
21
import eu.etaxonomy.cdm.model.taxon.Synonym;
22
import eu.etaxonomy.cdm.model.taxon.Taxon;
23
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
24
import eu.etaxonomy.cdm.strategy.StrategyBase;
25
import eu.etaxonomy.cdm.strategy.cache.HTMLTagRules;
26
import eu.etaxonomy.cdm.strategy.cache.TagEnum;
27
import eu.etaxonomy.cdm.strategy.cache.TaggedCacheHelper;
28
import eu.etaxonomy.cdm.strategy.cache.TaggedText;
29
import eu.etaxonomy.cdm.strategy.cache.name.INameCacheStrategy;
30
import eu.etaxonomy.cdm.strategy.cache.name.INonViralNameCacheStrategy;
31

    
32
public class TaxonBaseDefaultCacheStrategy<T extends TaxonBase>
33
        extends StrategyBase
34
        implements ITaxonCacheStrategy<T> {
35

    
36
    private static final long serialVersionUID = 5769890979070021350L;
37

    
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.isProtectedTitleCache()){
59
            //protected title cache
60
            tags.add(new TaggedText(TagEnum.name, taxonBase.getTitleCache()));
61
            return tags;
62
        }
63

    
64
        if (taxonBase.isDoubtful()){
65
            tags.add(new TaggedText(TagEnum.separator, "?"));
66
        }
67

    
68
        boolean isMisapplication = isMisapplication(taxonBase);
69
        //name
70
        List<TaggedText> nameTags = getNameTags(taxonBase, isMisapplication);
71

    
72
        if (nameTags.size() > 0){
73
            tags.addAll(nameTags);
74
        }else{
75
            tags.add(new TaggedText(TagEnum.fullName, "???"));
76
        }
77

    
78
        boolean isSynonym = taxonBase.isInstanceOf(Synonym.class);
79
        String secSeparator =  isMisapplication ? " sensu " : (isSynonym? " syn." : "") + " sec. ";
80
        //not used: we currently use a post-separator in the name tags
81
//                if (nameTags.get(nameTags.size() - 1).getType().equals(TagEnum.nomStatus)){
82
//                    secSeparator = "," + secSeparator;
83
//                }
84

    
85
        //sec.
86
        List<TaggedText> secTags = getSecundumTags(taxonBase, isMisapplication);
87
        if (!secTags.isEmpty()){
88
            tags.add(new TaggedText(TagEnum.separator, secSeparator));
89
            tags.addAll(secTags);
90
            List<TaggedText> secNameUsedInSourceTags = getSecNameUsedInSourceTags(taxonBase);
91
            if (!secNameUsedInSourceTags.isEmpty()){
92
                tags.add(new TaggedText(TagEnum.separator, " (sub "));
93
                tags.addAll(secNameUsedInSourceTags);
94
                tags.add(new TaggedText(TagEnum.separator, ")"));
95
            }
96
        }else if (isMisapplication && isBlank(taxonBase.getAppendedPhrase())){
97
            tags.add(new TaggedText(TagEnum.appendedPhrase, "auct."));
98
        }
99

    
100
        if (isMisapplication){
101
            TaxonName name = CdmBase.deproxy(taxonBase.getName());
102
            if (name != null && isNotBlank(name.getAuthorshipCache())){
103
                tags.add(new TaggedText(TagEnum.separator, ", non "));
104
                tags.add(new TaggedText(TagEnum.authors, name.getAuthorshipCache()));
105
            }
106
        }
107

    
108
        return tags;
109
    }
110

    
111
    private boolean isMisapplication(T taxonBase) {
112
        if (! taxonBase.isInstanceOf(Taxon.class)){
113
            return false;
114
        }else{
115
            return CdmBase.deproxy(taxonBase, Taxon.class).isMisapplicationOnly();
116
        }
117
    }
118

    
119
    private List<TaggedText> getNameTags(T taxonBase, boolean useNameCache) {
120
        List<TaggedText> tags = new ArrayList<>();
121
        TaxonName name = CdmBase.deproxy(taxonBase.getName());
122

    
123
        getNameTags(tags, name, (useNameCache || taxonBase.isUseNameCache()));
124
        if (isNotBlank(taxonBase.getAppendedPhrase())){
125
            tags.add(new TaggedText(TagEnum.appendedPhrase, taxonBase.getAppendedPhrase().trim()));
126
        }
127
        return tags;
128
    }
129

    
130
    private List<TaggedText> getNameTags(List<TaggedText> tags, TaxonName name, boolean useNameCache) {
131
        if (name != null){
132
            INameCacheStrategy nameCacheStrategy = name.cacheStrategy();
133
            useNameCache = useNameCache && name.isNonViral() && nameCacheStrategy instanceof INonViralNameCacheStrategy;
134
            if (useNameCache){
135
                INonViralNameCacheStrategy nvnCacheStrategy = (INonViralNameCacheStrategy)nameCacheStrategy;
136
                List<TaggedText> nameCacheTags = nvnCacheStrategy.getTaggedName(name);
137
                tags.addAll(nameCacheTags);
138
            }else{
139
                List<TaggedText> nameTags = nameCacheStrategy.getTaggedTitle(name);
140
                tags.addAll(nameTags);
141
                List<TaggedText> statusTags = nameCacheStrategy.getNomStatusTags(name, true, true);
142
                tags.addAll(statusTags);
143
            }
144
        }
145

    
146
        return tags;
147
    }
148

    
149
    private List<TaggedText> getSecNameUsedInSourceTags(T taxonBase) {
150
        List<TaggedText> tags = new ArrayList<>();
151
        if (taxonBase.getSecSource()!=null && taxonBase.getSecSource().getNameUsedInSource() != null) {
152
            //if names are equal there is no need for now to show the "sub" name
153
            if (!taxonBase.getSecSource().getNameUsedInSource().equals(taxonBase.getName())) {
154
                getNameTags(tags, taxonBase.getSecSource().getNameUsedInSource(), true);
155
            }
156
        }
157
        return tags;
158
    }
159

    
160

    
161
    private List<TaggedText> getSecundumTags(T taxonBase, boolean isMisapplication) {
162
        List<TaggedText> tags = new ArrayList<>();
163

    
164
        Reference sec = taxonBase.getSec();
165
        sec = HibernateProxyHelper.deproxy(sec);
166
        String secRef;
167
        if (sec == null){
168
            //missing sec
169
            if (isBlank(taxonBase.getAppendedPhrase()) && !isMisapplication ){
170
                secRef = "???";
171
            }else{
172
                secRef = null;
173
            }
174
        }
175
        else{
176
            //existing sec
177
            if (sec.isProtectedTitleCache() == false &&
178
                    sec.cacheStrategy() != null &&
179
                    sec.getAuthorship() != null &&
180
                    isNotBlank(sec.getAuthorship().getTitleCache()) &&
181
                    isNotBlank(sec.getYear())){
182
                secRef = OriginalSourceFormatter.INSTANCE.format(sec, null);  //microRef is handled later
183
            }else if ((sec.isWebPage() || sec.isDatabase() || sec.isMap())
184
                    && titleExists(sec)){  //maybe we should also test protected caches (but which one, the abbrev cache or the titleCache?
185
                secRef = isNotBlank(sec.getAbbrevTitle())? sec.getAbbrevTitle() : sec.getTitle();
186
                String secDate = sec.getYear();
187
                if (isBlank(secDate) && sec.getAccessed() != null){
188
                    secDate = String.valueOf(sec.getAccessed().getYear());
189
                }
190
                secRef = CdmUtils.concat(" ", secRef, secDate);
191
            }else{
192
                secRef = sec.getTitleCache();
193
                //TODO maybe not always correct
194
                if (secTitleTrailingDotShouldBeRemoved(sec)){
195
                    secRef = CdmUtils.removeTrailingDots(secRef);
196
                }
197
            }
198
        }
199
        if (secRef != null){
200
            tags.add(new TaggedText(TagEnum.secReference, secRef));
201
        }
202
        //secMicroReference
203
        if (isNotBlank(taxonBase.getSecMicroReference())){
204
            tags.add(new TaggedText(TagEnum.separator, ": "));
205
            tags.add(new TaggedText(TagEnum.secMicroReference, taxonBase.getSecMicroReference()));
206
        }
207
        return tags;
208
    }
209

    
210

    
211
    private boolean secTitleTrailingDotShouldBeRemoved(Reference sec) {
212
        if (sec.isProtectedTitleCache()){
213
            return false;
214
        }else if (sec.getAbbrevTitle()!= null && sec.getTitleCache().endsWith(sec.getAbbrevTitle())){
215
            return false;
216
        }else if (sec.getTitle() != null && sec.getTitle().endsWith(".") && sec.getTitleCache().endsWith(sec.getTitle())){
217
            return false;
218
        }
219
        return true;
220
    }
221

    
222
    private boolean titleExists(Reference ref) {
223
        return isNotBlank(ref.getAbbrevTitle()) || isNotBlank(ref.getTitle());
224
    }
225

    
226
    @Override
227
    public String getTitleCache(T taxonBase, HTMLTagRules htmlTagRules) {
228
        List<TaggedText> tags = getTaggedTitle(taxonBase);
229
        if (tags == null){
230
            return null;
231
        }else{
232
            String result = TaggedCacheHelper.createString(tags, htmlTagRules);
233
            return result;
234
        }
235
    }
236
}
(3-3/3)