Project

General

Profile

Download (11.7 KB) Statistics
| Branch: | Tag: | Revision:
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
package eu.etaxonomy.cdm.strategy.cache.name;
10

    
11
import java.util.ArrayList;
12
import java.util.Iterator;
13
import java.util.List;
14
import java.util.Set;
15
import java.util.UUID;
16

    
17
import org.apache.log4j.Logger;
18

    
19
import eu.etaxonomy.cdm.common.CdmUtils;
20
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
21
import eu.etaxonomy.cdm.model.common.CdmBase;
22
import eu.etaxonomy.cdm.model.common.Language;
23
import eu.etaxonomy.cdm.model.name.INonViralName;
24
import eu.etaxonomy.cdm.model.name.NameRelationship;
25
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
26
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
27
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
28
import eu.etaxonomy.cdm.model.name.TaxonName;
29
import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
30
import eu.etaxonomy.cdm.model.reference.Reference;
31
import eu.etaxonomy.cdm.model.term.Representation;
32
import eu.etaxonomy.cdm.ref.TypedEntityReference;
33
import eu.etaxonomy.cdm.strategy.StrategyBase;
34
import eu.etaxonomy.cdm.strategy.cache.HTMLTagRules;
35
import eu.etaxonomy.cdm.strategy.cache.TagEnum;
36
import eu.etaxonomy.cdm.strategy.cache.TaggedCacheHelper;
37
import eu.etaxonomy.cdm.strategy.cache.TaggedText;
38

    
39
/**
40
 * @author AM
41
 */
42
public abstract class NameCacheStrategyBase
43
        extends StrategyBase
44
        implements INameCacheStrategy {
45
    private static final long serialVersionUID = -2322348388258675517L;
46

    
47
    private static final Logger logger = Logger.getLogger(NameCacheStrategyBase.class);
48

    
49
    final static UUID uuid = UUID.fromString("817ae5b5-3ac2-414b-a134-a9ae86cba040");
50

    
51
    /**
52
     * Constructor
53
     */
54
    public NameCacheStrategyBase() {
55
        super();
56
    }
57

    
58

    
59
    @Override
60
    public String getFullTitleCache(TaxonName taxonName, HTMLTagRules htmlTagRules) {
61
        List<TaggedText> tags = getTaggedFullTitle(taxonName);
62
        if (tags == null){
63
            return null;
64
        }else{
65
            String result = createString(tags, htmlTagRules);
66
            return result;
67
        }
68
    }
69

    
70
    @Override
71
    public String getFullTitleCache(TaxonName taxonName) {
72
        return getFullTitleCache(taxonName, null);
73
    }
74

    
75

    
76
    /**
77
     * @param nonViralName
78
     * @param tags
79
     * @return
80
     */
81
    @Override
82
    public List<TaggedText> getNomStatusTags(TaxonName taxonName, boolean includeSeparatorBefore,
83
            boolean includeSeparatorAfter) {
84

    
85
        Set<NomenclaturalStatus> ncStati = taxonName.getStatus();
86
        Iterator<NomenclaturalStatus> iterator = ncStati.iterator();
87
        List<TaggedText> nomStatusTags = new ArrayList<>();
88
        while (iterator.hasNext()) {
89
            NomenclaturalStatus ncStatus = iterator.next();
90
            // since the NewInstance method of nomencatural status allows null as parameter
91
            // we have to check for null values here
92
            String nomStatusStr = "not defined";
93
            if(ncStatus.getType() != null){
94
                NomenclaturalStatusType statusType =  ncStatus.getType();
95
                Language lang = Language.LATIN();
96
                Representation repr = statusType.getRepresentation(lang);
97
                if (repr != null){
98
                    nomStatusStr = repr.getAbbreviatedLabel();
99
                }else{
100
                    String message = "No latin representation available for nom. status. " + statusType.getTitleCache();
101
                    logger.warn(message);
102
                    throw new IllegalStateException(message);
103
                }
104
            }else if(isNotBlank(ncStatus.getRuleConsidered())){
105
                nomStatusStr = ncStatus.getRuleConsidered();
106
            }
107
            String statusSeparator = ", ";
108
            if (includeSeparatorBefore){
109
                nomStatusTags.add(new TaggedText(TagEnum.separator, statusSeparator));
110
            }
111
            nomStatusTags.add(new TaggedText(TagEnum.nomStatus, nomStatusStr, new TypedEntityReference<>(ncStatus.getClass(), ncStatus.getUuid())));
112
            if (includeSeparatorAfter){
113
                nomStatusTags.add(new TaggedText(TagEnum.postSeparator, ","));
114
            }
115
        }
116
        return nomStatusTags;
117
    }
118

    
119
    @Override
120
    public String getNameCache(TaxonName nonViralName) {
121
        List<TaggedText> tags = getTaggedName(nonViralName);
122
        if (tags == null){
123
            return null;
124
        }else{
125
            String result = createString(tags);
126
            return result;
127
        }
128
    }
129

    
130
    @Override
131
    public String getNameCache(TaxonName nonViralName, HTMLTagRules htmlTagRules) {
132
        List<TaggedText> tags = getTaggedName(nonViralName);
133
        if (tags == null){
134
            return null;
135
        }else{
136
            String result = createString(tags, htmlTagRules);
137
            return result;
138
        }
139
    }
140

    
141

    
142
    /**
143
     * Generates and returns the title cache of the given name.
144
     * The title cache in general includes the name and the authorship and year for some types of names.
145
     *
146
     * @see eu.etaxonomy.cdm.strategy.INameCacheStrategy#getTitleCache(eu.etaxonomy.cdm.model.common.CdmBase)
147
     * @see eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy#getTitleCache(eu.etaxonomy.cdm.model.common.IdentifiableEntity)
148
     */
149
    @Override
150
    public String getTitleCache(TaxonName taxonName) {
151
        return getTitleCache(taxonName, null);
152
    }
153

    
154
    @Override
155
    public String getTitleCache(TaxonName taxonName, HTMLTagRules htmlTagRules) {
156
        List<TaggedText> tags = getTaggedTitle(taxonName);
157
        if (tags == null){
158
            return null;
159
        }else{
160
            String result = createString(tags, htmlTagRules);
161
            return result;
162
        }
163
    }
164

    
165
    @Override
166
    public List<TaggedText> getTaggedTitle(TaxonName taxonName) {
167
        if (taxonName == null){
168
            return null;
169
        }
170
        //TODO how to handle protected fullTitleCache here?
171

    
172
        if (taxonName.isProtectedTitleCache()){
173
            //protected title cache
174
            List<TaggedText> tags = new ArrayList<>();
175
            tags.add(new TaggedText(TagEnum.name, taxonName.getTitleCache()));
176
            return tags;
177
        }else{
178
            return doGetTaggedTitle(taxonName);
179
        }
180

    
181
    }
182

    
183
    protected abstract List<TaggedText> doGetTaggedTitle(TaxonName taxonName);
184

    
185
    @Override
186
    public List<TaggedText> getTaggedFullTitle(TaxonName taxonName) {
187
        List<TaggedText> tags = new ArrayList<>();
188

    
189
        //null
190
        if (taxonName == null){
191
            return null;
192
        }
193

    
194
        //protected full title cache
195
        if (taxonName.isProtectedFullTitleCache()){
196
            tags.add(new TaggedText(TagEnum.fullName, taxonName.getFullTitleCache()));
197
            return tags;
198
        }
199

    
200
        //title cache
201
//      String titleCache = nonViralName.getTitleCache();
202
        List<TaggedText> titleTags = getTaggedTitle(taxonName);
203
        tags.addAll(titleTags);
204

    
205
        //reference
206
        String microReference = taxonName.getNomenclaturalMicroReference();
207
        INomenclaturalReference ref = taxonName.getNomenclaturalReference();
208
        String referenceCache = null;
209
        if (ref != null){
210
            Reference reference = HibernateProxyHelper.deproxy(ref, Reference.class);
211
            referenceCache = reference.getNomenclaturalCitation(microReference);
212
        }
213
            //add to tags
214
        if (isNotBlank(referenceCache)){
215
            if (! referenceCache.trim().startsWith("in ")){
216
                String refConcat = ", ";
217
                tags.add(new TaggedText(TagEnum.separator, refConcat));
218
            }
219
            tags.add(new TaggedText(TagEnum.reference, referenceCache));
220
        }
221

    
222
        addOriginalSpelling(tags, taxonName);
223

    
224
        //nomenclatural status
225
        tags.addAll(getNomStatusTags(taxonName, true, false));
226
        return tags;
227

    
228
    }
229

    
230
    protected void addOriginalSpelling(List<TaggedText> tags, TaxonName taxonName){
231
        String originalName = getOriginalNameString(taxonName, tags);
232
        if (isNotBlank(originalName)){
233
            tags.add(new TaggedText(TagEnum.name, originalName));
234
        }
235
    }
236

    
237
    private String getOriginalNameString(TaxonName currentName, List<TaggedText> originalNameTaggs) {
238
        List<String> originalNameStrings = new ArrayList<>(1);
239
        currentName = CdmBase.deproxy(currentName);
240
        //Hibernate.initialize(currentName.getRelationsToThisName());
241
        for (NameRelationship nameRel : currentName.getRelationsToThisName()){  //handle list, just in case we have strange data; this may result in strange looking results
242
            NameRelationshipType type = nameRel.getType();
243
            if(type != null && type.equals(NameRelationshipType.ORIGINAL_SPELLING())){
244
                String originalNameString;
245
                TaxonName originalName = nameRel.getFromName();
246
                if (!originalName.isNonViral()){
247
                    originalNameString = originalName.getTitleCache();
248
                }else{
249
                    INonViralName originalNvName = CdmBase.deproxy(originalName);
250
                    originalNameString = makeOriginalNameString(currentName, originalNvName, originalNameTaggs);
251
                }
252
                originalNameStrings.add("[as \"" + originalNameString + "\"]");
253
            }
254
        }
255
        if (originalNameStrings.size() > 0){
256
            String result = CdmUtils.concat("", originalNameStrings.toArray(new String[originalNameStrings.size()])) ;
257
            return result;
258
        }else{
259
            return null;
260
        }
261
    }
262

    
263
    private String makeOriginalNameString(TaxonName currentName, INonViralName originalName,
264
            List<TaggedText> currentNameTags) {
265
        //use cache if necessary
266
        String cacheToUse = null;
267
        if (originalName.isProtectedNameCache() && isNotBlank(originalName.getNameCache())){
268
            cacheToUse = originalName.getNameCache();
269
        }else if (originalName.isProtectedTitleCache() && isNotBlank(originalName.getTitleCache())){
270
            cacheToUse = originalName.getTitleCache();
271
        }else if (originalName.isProtectedFullTitleCache() && isNotBlank(originalName.getFullTitleCache())){
272
            cacheToUse = originalName.getFullTitleCache();
273
        }
274
        if (cacheToUse != null){
275
            return cacheToUse;
276
        }
277
        //use atomized data
278
        //get originalNameParts array
279
        String originalNameString = originalName.getNameCache();
280
        if (originalNameString == null){
281
            originalNameString = originalName.getTitleCache();
282
        }
283
        if (originalNameString == null){  //should not happen
284
            originalNameString = originalName.getFullTitleCache();
285
        }
286
        String[] originalNameSplit = originalNameString.split("\\s+");
287

    
288
        //get current name parts
289
        String currentNameString = createString(currentNameTags);
290
        String[] currentNameSplit = currentNameString.split("\\s+");
291

    
292
        //compute string
293
        String result = originalNameString;
294
        for (int i = 0; i < Math.min(originalNameSplit.length, currentNameSplit.length); i++){
295
            if (originalNameSplit[i].equals(currentNameSplit[i])){
296
                result = result.replaceFirst(originalNameSplit[i], "").trim();
297
            }
298
        }
299
        //old
300
//      if (originalName.getGenusOrUninomial() != null && originalName.getGenusOrUninomial().equals(currentName.getGenusOrUninomial())){
301
//
302
//      }
303
        return result;
304
    }
305

    
306
    protected String createString(List<TaggedText> tags) {
307
        return TaggedCacheHelper.createString(tags);
308
    }
309

    
310
    protected String createString(List<TaggedText> tags, HTMLTagRules htmlTagRules) {
311
        return TaggedCacheHelper.createString(tags, htmlTagRules);
312
    }
313

    
314
}
(5-5/7)