Project

General

Profile

Download (10.5 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.strategy.cache.taxon;
2

    
3

    
4
/**
5
* Copyright (C) 2015 EDIT
6
* European Distributed Institute of Taxonomy
7
* http://www.e-taxonomy.eu
8
*
9
* The contents of this file are subject to the Mozilla Public License Version 1.1
10
* See LICENSE.TXT at the top of this package for the full license terms.
11
*/
12

    
13

    
14

    
15
import java.util.ArrayList;
16
import java.util.List;
17
import java.util.UUID;
18

    
19
import org.apache.commons.lang.StringUtils;
20

    
21
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
22
import eu.etaxonomy.cdm.model.agent.Person;
23
import eu.etaxonomy.cdm.model.agent.Team;
24
import eu.etaxonomy.cdm.model.name.NonViralName;
25
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
26
import eu.etaxonomy.cdm.model.reference.Reference;
27
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
28
import eu.etaxonomy.cdm.strategy.StrategyBase;
29
import eu.etaxonomy.cdm.strategy.cache.HTMLTagRules;
30
import eu.etaxonomy.cdm.strategy.cache.TagEnum;
31
import eu.etaxonomy.cdm.strategy.cache.TaggedCacheHelper;
32
import eu.etaxonomy.cdm.strategy.cache.TaggedText;
33
import eu.etaxonomy.cdm.strategy.cache.name.INameCacheStrategy;
34

    
35
public class TaxonBaseShortSecCacheStrategy<T extends TaxonBase>
36
        extends StrategyBase
37
        implements ITaxonCacheStrategy<T> {
38

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

    
42
	@Override
43
	protected UUID getUuid() {
44
		return uuid;
45
	}
46

    
47
//	@Override
48
//    public String getTitleCache(T taxonBase) {
49
//	    return getTitleCache(taxonBase, null);
50
//    }
51

    
52
	@Override
53
    public String getTitleCache(T taxonBase) {
54
		String title;
55
		if (taxonBase.getName() != null && taxonBase.getName().getTitleCache() != null){
56
			String namePart = getNamePart(taxonBase);
57

    
58
			title = namePart + " sec. ";  //TODO check if separator is required before, e.g. for nom. status. see TaxonBaseDefaultCacheStrategy
59
			title += getSecundumPart(taxonBase);
60
		}else{
61
			title = taxonBase.toString();
62
		}
63
		if (taxonBase.isDoubtful()){
64
			title = "?" + title;
65
		}
66
		return title;
67
	}
68

    
69
	/**
70
	 * @param taxonBase
71
	 * @param title
72
	 * @return
73
	 */
74
	private String getSecundumPart(T taxonBase) {
75
		String result = "???";
76
		Reference sec = taxonBase.getSec();
77
		sec = HibernateProxyHelper.deproxy(sec, Reference.class);
78
		if (sec != null){
79
			if (sec.isProtectedTitleCache()){
80
				return sec.getTitleCache();
81
			}
82
			if (sec.getAuthorship() != null){
83

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

    
108
					} else{
109
						if (authorTeam.getTeamMembers().get(0).getLastname() != null){
110
					        result = authorTeam.getTeamMembers().get(0).getLastname();
111
					    } else {
112
					        result = authorTeam.getTeamMembers().get(0).getTitleCache();
113
					    }
114
					}
115

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

    
137
	/**
138
	 * @param name
139
	 */
140
	private String getNamePart(TaxonBase<?> taxonBase) {
141
		TaxonNameBase<?,?> nameBase = taxonBase.getName();
142
		String result = nameBase.getTitleCache();
143
		//use name cache instead of title cache if required
144
		if (taxonBase.isUseNameCache() && nameBase.isInstanceOf(NonViralName.class)){
145
			NonViralName<?> nvn = HibernateProxyHelper.deproxy(nameBase, NonViralName.class);
146
			result = nvn.getNameCache();
147
		}
148
		if (StringUtils.isNotBlank(taxonBase.getAppendedPhrase())){
149
			result = result.trim() + " " +  taxonBase.getAppendedPhrase().trim();
150
		}
151
		return result;
152
	}
153

    
154
    @Override
155
    public List<TaggedText> getTaggedTitle(T taxonBase) {
156
        if (taxonBase == null){
157
            return null;
158
        }
159

    
160
        List<TaggedText> tags = new ArrayList<TaggedText>();
161

    
162
        if (taxonBase.isProtectedTitleCache()){
163
            //protected title cache
164
            tags.add(new TaggedText(TagEnum.name, taxonBase.getTitleCache()));
165
            return tags;
166
        }else{
167
            //name
168
            TaxonNameBase<?,INameCacheStrategy<TaxonNameBase>> name = taxonBase.getName();
169
            if (name != null){
170
                //TODO
171
                List<TaggedText> nameTags = name.getCacheStrategy().getTaggedTitle(name);
172
                tags.addAll(nameTags);
173
            }
174

    
175
            //ref.
176
            List<TaggedText> secTags;
177
            Reference ref = taxonBase.getSec();
178
            ref = HibernateProxyHelper.deproxy(ref, Reference.class);
179
            if (ref != null){
180
                secTags = getSecReferenceTags(ref);
181
            }else{
182
                secTags = new ArrayList<TaggedText>();
183
                if (isBlank(taxonBase.getAppendedPhrase())){
184
                    secTags.add(new TaggedText(TagEnum.reference, "???"));
185
                }
186
            }
187
            if(! secTags.isEmpty()){
188
                //sec.
189
                tags.add(new TaggedText(TagEnum.separator, "sec."));
190
                tags.addAll(secTags);
191
            }
192
        }
193
        return tags;
194
    }
195

    
196
    /**
197
     * @param ref
198
     */
199
    private List<TaggedText> getSecReferenceTags(Reference sec) {
200
        List<TaggedText> tags = new ArrayList<TaggedText>();
201

    
202
        if (sec.isProtectedTitleCache()){
203
            tags.add(new TaggedText(TagEnum.reference, sec.getTitleCache()));
204
        }else{
205
            if (sec.getAuthorship() != null){
206
                List<TaggedText> authorTags;
207
                if (sec.getAuthorship().isInstanceOf(Team.class)){
208
                    authorTags = handleTeam(sec);
209
                } else {
210
                    authorTags = handlePerson(sec);
211
                }
212
                tags.addAll(authorTags);
213

    
214
                //FIXME why did we have this normalization? For removing first names??
215
//                if (result != null){
216
//                    result = result.replaceAll("[A-Z]\\.", "");
217
//                }
218

    
219
                //year
220
                String year = sec.getYear();
221
                if (StringUtils.isNotBlank(year) && ! authorTags.isEmpty()){
222
                    tags.add(new TaggedText(TagEnum.separator, "("));
223
                    tags.add(new TaggedText(TagEnum.year, year));
224
                    tags.add(new TaggedText(TagEnum.separator, ")"));
225
                }
226
            }else{
227

    
228
            }
229
        }
230

    
231
        return tags;
232
    }
233

    
234
    private List<TaggedText>  handlePerson(Reference sec) {
235
        List<TaggedText> tags = new ArrayList<TaggedText>();
236

    
237
        Person author = HibernateProxyHelper.deproxy(sec.getAuthorship(), Person.class);
238
        String authorStr;
239
        if (author.getLastname() != null){
240
            authorStr = author.getLastname();
241
        } else{
242
            authorStr = author.getTitleCache();
243
        }
244
        tags.add(new TaggedText(TagEnum.authors, authorStr));
245
        return tags;
246
    }
247

    
248
    private List<TaggedText> handleTeam(Reference sec) {
249
        List<TaggedText> tags = new ArrayList<TaggedText>();
250

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

    
294
    @Override
295
    public String getTitleCache(T taxonBase, HTMLTagRules htmlTagRules) {
296
        List<TaggedText> tags = getTaggedTitle(taxonBase);
297
        if (tags == null){
298
            return null;
299
        }else{
300
            String result = TaggedCacheHelper.createString(tags, htmlTagRules);
301
            return result;
302
        }
303
    }
304

    
305
}
(3-3/3)