Project

General

Profile

Download (6.87 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
        //name
68
        List<TaggedText> nameTags = getNameTags(taxonBase);
69

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

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

    
83
        //ref.
84
        List<TaggedText> secTags = getSecundumTags(taxonBase);
85

    
86
        //sec.
87
        if (!secTags.isEmpty()){
88
            tags.add(new TaggedText(TagEnum.separator, secSeparator));
89
            tags.addAll(secTags);
90
        }
91

    
92
        return tags;
93
    }
94

    
95
    private boolean isMisapplication(T taxonBase) {
96
        if (! taxonBase.isInstanceOf(Taxon.class)){
97
            return false;
98
        }else{
99
            return CdmBase.deproxy(taxonBase, Taxon.class).isMisapplicationOnly();
100
        }
101
    }
102

    
103
    private List<TaggedText> getNameTags(T taxonBase) {
104
        List<TaggedText> tags = new ArrayList<>();
105
        TaxonName name = CdmBase.deproxy(taxonBase.getName());
106

    
107
        if (name != null){
108
            INameCacheStrategy nameCacheStrategy = name.getCacheStrategy();
109
            if (taxonBase.isUseNameCache() && name.isNonViral() && nameCacheStrategy instanceof INonViralNameCacheStrategy){
110
                INonViralNameCacheStrategy nvnCacheStrategy = (INonViralNameCacheStrategy)nameCacheStrategy;
111
                List<TaggedText> nameCacheTags = nvnCacheStrategy.getTaggedName(name);
112
                tags.addAll(nameCacheTags);
113
            }else{
114
                List<TaggedText> nameTags = nameCacheStrategy.getTaggedTitle(name);
115
                tags.addAll(nameTags);
116
                List<TaggedText> statusTags = nameCacheStrategy.getNomStatusTags(name, true, true);
117
                tags.addAll(statusTags);
118
            }
119
            if (isNotBlank(taxonBase.getAppendedPhrase())){
120
                tags.add(new TaggedText(TagEnum.appendedPhrase, taxonBase.getAppendedPhrase().trim()));
121
            }
122
        }
123

    
124
        return tags;
125
    }
126

    
127
    private List<TaggedText> getSecundumTags(T taxonBase) {
128
        List<TaggedText> tags = new ArrayList<>();
129

    
130
        Reference sec = taxonBase.getSec();
131
        sec = HibernateProxyHelper.deproxy(sec);
132
        String secRef;
133
        if (sec == null){
134
            //missing sec
135
            if (isBlank(taxonBase.getAppendedPhrase())){
136
                secRef = "???";
137
            }else{
138
                secRef = null;
139
            }
140
        }
141
        else{
142
            //existing sec
143
            if (sec.isProtectedTitleCache() == false &&
144
                    sec.getCacheStrategy() != null &&
145
                    sec.getAuthorship() != null &&
146
                    isNotBlank(sec.getAuthorship().getTitleCache()) &&
147
                    isNotBlank(sec.getYear())){
148
                secRef = OriginalSourceFormatter.INSTANCE.format(sec, null);  //microRef is handled later
149
            }else if ((sec.isWebPage() || sec.isDatabase() || sec.isMap())
150
                    && titleExists(sec)){  //maybe we should also test protected caches (but which one, the abbrev cache or the titleCache?
151
                secRef = isNotBlank(sec.getAbbrevTitle())? sec.getAbbrevTitle() : sec.getTitle();
152
                String secDate = sec.getYear();
153
                if (isBlank(secDate) && sec.getAccessed() != null){
154
                    secDate = String.valueOf(sec.getAccessed().getYear());
155
                }
156
                secRef = CdmUtils.concat(" ", secRef, secDate);
157
            }else{
158
                secRef = sec.getTitleCache();
159
                //TODO maybe not always correct
160
                secRef = CdmUtils.removeTrailingDots(secRef);
161
            }
162
        }
163
        if (secRef != null){
164
            tags.add(new TaggedText(TagEnum.secReference, secRef));
165
        }
166
        //secMicroReference
167
        if (isNotBlank(taxonBase.getSecMicroReference())){
168
            tags.add(new TaggedText(TagEnum.separator, ": "));
169
            tags.add(new TaggedText(TagEnum.secMicroReference, taxonBase.getSecMicroReference()));
170
        }
171
        return tags;
172
    }
173

    
174
    private boolean titleExists(Reference ref) {
175
        return isNotBlank(ref.getAbbrevTitle()) || isNotBlank(ref.getTitle());
176
    }
177

    
178
    @Override
179
    public String getTitleCache(T taxonBase, HTMLTagRules htmlTagRules) {
180
        List<TaggedText> tags = getTaggedTitle(taxonBase);
181
        if (tags == null){
182
            return null;
183
        }else{
184
            String result = TaggedCacheHelper.createString(tags, htmlTagRules);
185
            return result;
186
        }
187
    }
188
}
(3-3/3)