Project

General

Profile

« Previous | Next » 

Revision 9dc896c9

Added by Andreas Müller almost 7 years ago

fix #6368 rename table and class TaxonNameBase

View differences:

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