Project

General

Profile

Download (10.5 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2015 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.agent.Person;
20
import eu.etaxonomy.cdm.model.agent.Team;
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

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

    
36
    private static final long serialVersionUID = -2831618484053675222L;
37
    final static UUID uuid = UUID.fromString("931e48f0-2033-11de-8c30-0800200c9a66");
38

    
39
	@Override
40
	protected UUID getUuid() {
41
		return uuid;
42
	}
43

    
44

    
45
	@Override
46
    public String getTitleCache(T taxonBase) {
47
		String title;
48
		if (taxonBase.getName() != null && taxonBase.getName().getTitleCache() != null){
49
			title = getNamePart(taxonBase);
50
		}else{
51
		    title = "???";
52
		}
53
        boolean isSynonym = taxonBase.isInstanceOf(Synonym.class);
54
        String secSeparator =  (isSynonym? " syn." : "") + " sec. ";
55
		title += secSeparator;  //TODO check if separator is required before, e.g. for nom. status. see TaxonBaseDefaultCacheStrategy
56
		title += getSecundumPart(taxonBase);
57
		if (taxonBase.isDoubtful()){
58
			title = "?" + title;
59
		}
60
		return title;
61
	}
62

    
63
	/**
64
	 * @param taxonBase
65
	 * @param title
66
	 * @return
67
	 */
68
	private String getSecundumPart(T taxonBase) {
69
		String result = "???";
70
		Reference sec = taxonBase.getSec();
71
		sec = HibernateProxyHelper.deproxy(sec, Reference.class);
72
		if (sec != null){
73
			if (sec.isProtectedTitleCache()){
74
				return sec.getTitleCache();
75
			}
76
			if (sec.getAuthorship() != null){
77

    
78
				if (sec.getAuthorship().isInstanceOf(Team.class)){
79
					Team authorTeam = HibernateProxyHelper.deproxy(sec.getAuthorship(), Team.class);
80
					if (authorTeam.getTeamMembers().size() > 2){
81
						if (authorTeam.getTeamMembers().get(0).getLastname() != null){
82
					        result = authorTeam.getTeamMembers().get(0).getLastname() + " & al.";
83
					    } else {
84
					        result = authorTeam.getTeamMembers().get(0).getTitleCache();
85
					        result = result + " & al.";
86
					    }
87
					} else if (authorTeam.getTeamMembers().size() == 2){
88
						String firstAuthor;
89
						if (authorTeam.getTeamMembers().get(0).getLastname() != null){
90
							firstAuthor = authorTeam.getTeamMembers().get(0).getLastname();
91
						}else{
92
							firstAuthor = authorTeam.getTeamMembers().get(0).getTitleCache();
93
						}
94
						String secondAuthor;
95
						if (authorTeam.getTeamMembers().get(1).getLastname() != null){
96
							secondAuthor = authorTeam.getTeamMembers().get(1).getLastname();
97
						}else{
98
							secondAuthor = authorTeam.getTeamMembers().get(1).getTitleCache();
99
						}
100
						result = firstAuthor + " & " + secondAuthor;
101

    
102
					} else{
103
						if (authorTeam.getTeamMembers().get(0).getLastname() != null){
104
					        result = authorTeam.getTeamMembers().get(0).getLastname();
105
					    } else {
106
					        result = authorTeam.getTeamMembers().get(0).getTitleCache();
107
					    }
108
					}
109

    
110
				} else {
111
					Person author = HibernateProxyHelper.deproxy(sec.getAuthorship(), Person.class);
112
					if (author.getLastname() != null){
113
						result = author.getLastname();
114
					} else{
115
						result = author.getTitleCache();
116
					}
117
				}
118
				if (result != null){
119
					result = result.replaceAll("[A-Z]\\.", "");
120
				}
121
				if (sec.getYear() != null && result != null){
122
					result = result.concat(" (" + sec.getYear()+")");
123
				}
124
			}else{
125
				result = taxonBase.getSec().getTitleCache();
126
			}
127
		}
128
		return result;
129
	}
130

    
131
	/**
132
	 * @param name
133
	 */
134
	private String getNamePart(TaxonBase<?> taxonBase) {
135
		TaxonName taxonName = taxonBase.getName();
136
		String result = taxonName.getTitleCache();
137
		//use name cache instead of title cache if required
138
		if (taxonBase.isUseNameCache()){
139
			result = taxonName.getNameCache();
140
		}
141
		if (StringUtils.isNotBlank(taxonBase.getAppendedPhrase())){
142
			result = result.trim() + " " +  taxonBase.getAppendedPhrase().trim();
143
		}
144
		return result;
145
	}
146

    
147
    @Override
148
    public List<TaggedText> getTaggedTitle(T taxonBase) {
149
        if (taxonBase == null){
150
            return null;
151
        }
152

    
153
        List<TaggedText> tags = new ArrayList<TaggedText>();
154

    
155
        if (taxonBase.isProtectedTitleCache()){
156
            //protected title cache
157
            tags.add(new TaggedText(TagEnum.name, taxonBase.getTitleCache()));
158
            return tags;
159
        }else{
160
            //name
161
            TaxonName<?,INameCacheStrategy<TaxonName>> name = taxonBase.getName();
162
            if (name != null){
163
                //TODO
164
                List<TaggedText> nameTags = name.getCacheStrategy().getTaggedTitle(name);
165
                tags.addAll(nameTags);
166
            }
167

    
168
            //ref.
169
            List<TaggedText> secTags;
170
            Reference ref = taxonBase.getSec();
171
            ref = HibernateProxyHelper.deproxy(ref, Reference.class);
172
            if (ref != null){
173
                secTags = getSecReferenceTags(ref);
174
            }else{
175
                secTags = new ArrayList<TaggedText>();
176
                if (isBlank(taxonBase.getAppendedPhrase())){
177
                    secTags.add(new TaggedText(TagEnum.reference, "???"));
178
                }
179
            }
180
            if(! secTags.isEmpty()){
181
                //sec.
182
                boolean isSynonym = taxonBase.isInstanceOf(Synonym.class);
183
                String secSeparator =  (isSynonym? " syn." : "") + " sec. ";
184
                tags.add(new TaggedText(TagEnum.separator, secSeparator));
185
                tags.addAll(secTags);
186
            }
187
        }
188
        return tags;
189
    }
190

    
191
    /**
192
     * @param ref
193
     */
194
    private List<TaggedText> getSecReferenceTags(Reference sec) {
195
        List<TaggedText> tags = new ArrayList<TaggedText>();
196

    
197
        if (sec.isProtectedTitleCache()){
198
            tags.add(new TaggedText(TagEnum.reference, sec.getTitleCache()));
199
        }else{
200
            if (sec.getAuthorship() != null){
201
                List<TaggedText> authorTags;
202
                if (sec.getAuthorship().isInstanceOf(Team.class)){
203
                    authorTags = handleTeam(sec);
204
                } else {
205
                    authorTags = handlePerson(sec);
206
                }
207
                tags.addAll(authorTags);
208

    
209
                //FIXME why did we have this normalization? For removing first names??
210
//                if (result != null){
211
//                    result = result.replaceAll("[A-Z]\\.", "");
212
//                }
213

    
214
                //year
215
                String year = sec.getYear();
216
                if (StringUtils.isNotBlank(year) && ! authorTags.isEmpty()){
217
                    tags.add(new TaggedText(TagEnum.separator, "("));
218
                    tags.add(new TaggedText(TagEnum.year, year));
219
                    tags.add(new TaggedText(TagEnum.separator, ")"));
220
                }
221
            }else{
222

    
223
            }
224
        }
225

    
226
        return tags;
227
    }
228

    
229
    private List<TaggedText>  handlePerson(Reference sec) {
230
        List<TaggedText> tags = new ArrayList<TaggedText>();
231

    
232
        Person author = HibernateProxyHelper.deproxy(sec.getAuthorship(), Person.class);
233
        String authorStr;
234
        if (author.getLastname() != null){
235
            authorStr = author.getLastname();
236
        } else{
237
            authorStr = author.getTitleCache();
238
        }
239
        tags.add(new TaggedText(TagEnum.authors, authorStr));
240
        return tags;
241
    }
242

    
243
    private List<TaggedText> handleTeam(Reference sec) {
244
        List<TaggedText> tags = new ArrayList<TaggedText>();
245

    
246
        Team authorTeam = HibernateProxyHelper.deproxy(sec.getAuthorship(), Team.class);
247
        if (authorTeam.isProtectedTitleCache() || authorTeam.getTeamMembers().isEmpty()){
248
            String authorStr = authorTeam.getTitleCache();
249
            tags.add(new TaggedText(TagEnum.authors, authorStr));
250
        }else if (authorTeam.getTeamMembers().size() > 2){
251
            //>2 members
252
            if (authorTeam.getTeamMembers().get(0).getLastname() != null){
253
                String authorStr = authorTeam.getTeamMembers().get(0).getLastname() + " & al.";
254
                tags.add(new TaggedText(TagEnum.authors, authorStr));
255
            } else {
256
                String authorStr = authorTeam.getTeamMembers().get(0).getTitleCache();
257
                authorStr = authorStr + " & al.";
258
                tags.add(new TaggedText(TagEnum.authors, authorStr));
259
            }
260
        } else if (authorTeam.getTeamMembers().size() == 2){
261
            //2 members
262
            String firstAuthor;
263
            if (authorTeam.getTeamMembers().get(0).getLastname() != null){
264
                firstAuthor = authorTeam.getTeamMembers().get(0).getLastname();
265
            }else{
266
                firstAuthor = authorTeam.getTeamMembers().get(0).getTitleCache();
267
            }
268
            String secondAuthor;
269
            if (authorTeam.getTeamMembers().get(1).getLastname() != null){
270
                secondAuthor = authorTeam.getTeamMembers().get(1).getLastname();
271
            }else{
272
                secondAuthor = authorTeam.getTeamMembers().get(1).getTitleCache();
273
            }
274
            String authorStr = firstAuthor + " & " + secondAuthor;
275
            tags.add(new TaggedText(TagEnum.authors, authorStr));
276
        } else{
277
            //1 member
278
            String authorStr;
279
            if (authorTeam.getTeamMembers().get(0).getLastname() != null){
280
                authorStr = authorTeam.getTeamMembers().get(0).getLastname();
281
            } else {
282
                authorStr = authorTeam.getTeamMembers().get(0).getTitleCache();
283
            }
284
            tags.add(new TaggedText(TagEnum.authors, authorStr));
285
        }
286
        return tags;
287
    }
288

    
289
    @Override
290
    public String getTitleCache(T taxonBase, HTMLTagRules htmlTagRules) {
291
        List<TaggedText> tags = getTaggedTitle(taxonBase);
292
        if (tags == null){
293
            return null;
294
        }else{
295
            String result = TaggedCacheHelper.createString(tags, htmlTagRules);
296
            return result;
297
        }
298
    }
299

    
300
}
(3-3/3)