Project

General

Profile

Download (12.6 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

    
10
package eu.etaxonomy.taxeditor.store;
11

    
12
import java.util.ArrayList;
13
import java.util.Collection;
14
import java.util.Comparator;
15
import java.util.HashMap;
16
import java.util.Iterator;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.UUID;
20

    
21
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
22
import eu.etaxonomy.cdm.model.term.TermBase;
23
import eu.etaxonomy.cdm.model.term.TermType;
24
import eu.etaxonomy.cdm.model.term.TermVocabulary;
25
import eu.etaxonomy.cdm.persistence.dto.TermDto;
26
import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
27
import eu.etaxonomy.taxeditor.model.DefaultTermComparator;
28
import eu.etaxonomy.taxeditor.model.TaxonRelationshipTypeInverseContainer;
29
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
30

    
31
/**
32
 * @author n.hoffmann
33
 * @created Dec 7, 2010
34
 */
35
public class TermManager {
36

    
37
	private static final String TERMS = "terms";
38
	private static final String TERM = "term";
39
	private static final String HIDE = "hide";
40

    
41
	private static final String CLASS = "class";
42
	private static final String UUID_STRING = "uuid";
43

    
44

    
45
    private Map<Object, List> cachedTermMap = new HashMap<>();
46

    
47

    
48
    //new cache for features!!
49
    //dinstinguish preferences for both
50
    //load at start
51

    
52
	public TermManager(){
53
	}
54

    
55
	public <T extends DefinedTermBase> List<T> getPreferredTerms(TermType termType){
56
	    List<?> terms = cachedTermMap.get(termType);
57
	    List<T> termBaseList = new ArrayList<>();
58
	    if(terms==null || terms.isEmpty()){
59
	        termBaseList = getFilteredTerms(TermStore.<T>getTerms(termType, null));
60
	        if (termBaseList != null){
61
	            cachedTermMap.put(termType.getUuid(), termBaseList);
62
	        }
63
	    }else{
64
	        Iterator<?> iterator = terms.iterator();
65
            List<UUID> uuids = new ArrayList<>();
66
            while (iterator.hasNext()){
67
                Object term = iterator.next();
68
                if (term instanceof TermDto){
69
                    TermDto dto = (TermDto)term;
70
                    uuids.add(dto.getUuid());
71
                }else {
72
                    termBaseList.add((T)term);
73
                }
74

    
75
            }
76
            if (!uuids.isEmpty()){
77
                termBaseList.addAll(getTerms(uuids, termType));
78
            }
79
	    }
80
        return termBaseList;
81
	}
82

    
83
	public <T extends DefinedTermBase> List<T> getPreferredTerms(TermVocabulary<T> termVocabulary){
84
	    @SuppressWarnings("unchecked")
85
        List<T> terms = cachedTermMap.get(termVocabulary.getUuid());
86
	    if(terms==null){
87
	        terms = getFilteredTerms(new ArrayList<T>(TermStore.getTerms(termVocabulary,null)));
88
	        cachedTermMap.put(termVocabulary.getUuid(), terms);
89
	    }
90
	    return terms;
91
	}
92

    
93
   public List<TermDto> getPreferredTerms(TermVocabularyDto termVocabularyDto){
94
       @SuppressWarnings("unchecked")
95
       List<TermDto> terms = cachedTermMap.get(termVocabularyDto.getUuid());
96
       if(terms==null || terms.isEmpty()){
97
           terms = getFilteredTermDtos(new ArrayList<>(termVocabularyDto.getTerms()));
98
           cachedTermMap.put(termVocabularyDto.getUuid(), terms);
99
       }
100
       return terms;
101
   }
102

    
103
   public <T extends DefinedTermBase> List<T> getPreferredTerms(TermVocabulary<T> termVocabulary,
104
           Comparator comp){
105
       if (comp == null){
106
           comp = new DefaultTermComparator<T>();
107
       }
108
       @SuppressWarnings("unchecked")
109
    List<T> terms = cachedTermMap.get(termVocabulary.getUuid());
110
       List<T> termBaseList = new ArrayList<>();
111
       if(terms==null){
112
           termBaseList = getFilteredTerms(new ArrayList<T>(TermStore.getTerms(termVocabulary, comp)));
113
           cachedTermMap.put(termVocabulary.getUuid(), termBaseList);
114
       }else{
115
           Iterator<?> iterator = terms.iterator();
116
           List<UUID> uuids = new ArrayList<>();
117
           while (iterator.hasNext()){
118
               Object term = iterator.next();
119
               if (term instanceof TermDto){
120
                   TermDto dto = (TermDto)term;
121
                   uuids.add(dto.getUuid());
122
               }else {
123
                   termBaseList.add((T)term);
124
               }
125

    
126
           }
127
           if (!uuids.isEmpty()){
128
               termBaseList.addAll(this.getTerms(uuids, DefinedTermBase.class));
129
           }
130

    
131
       }
132
       termBaseList.sort(comp);
133
       terms = termBaseList;
134
       return terms;
135
   }
136

    
137
	public <T extends DefinedTermBase> List<T> getPreferredTerms(Class<T> clazz){
138
	    @SuppressWarnings("unchecked")
139
        List<T> terms = cachedTermMap.get(clazz);
140
	    if(terms==null){
141
	        terms = getFilteredTerms(TermStore.getTerms(clazz));
142
	        cachedTermMap.put(clazz, terms);
143

    
144
	    }
145
	    return terms;
146
	}
147

    
148
	/**
149
	 * Generic method to get term preferences for a term vocabulary
150
	 *
151
	 * @param initialTerms a {@link java.util.List} object.
152
	 * @return a {@link java.util.List} object.
153
	 */
154
	public <T extends DefinedTermBase> List<T> getFilteredTerms(List<T> initialTerms){
155
		List<T> filteredTerms = new ArrayList<>();
156
		if (initialTerms == null || initialTerms.isEmpty()){
157
		    return filteredTerms;
158
		}
159

    
160
		for (T term : initialTerms){
161
			if (term instanceof TaxonRelationshipTypeInverseContainer){
162
				if(!PreferencesUtil.getBooleanValue(getPrefName(term), true)){
163
					T type = (T)((TaxonRelationshipTypeInverseContainer) term).getType();
164
					filteredTerms.add(type);
165
				}
166
			}
167

    
168
			if(PreferencesUtil.getBooleanValue(getPrefName(term), true)){
169
				filteredTerms.add(term);
170
			}
171
		}
172
		if (filteredTerms.isEmpty()){
173
		    //check for dtos
174
		    List<TermDto> preferredTerms = null;
175
		    if (initialTerms.get(0).getVocabulary() != null){
176
		        preferredTerms = cachedTermMap.get(initialTerms.get(0).getVocabulary().getUuid());
177
		    }
178
		    if (preferredTerms == null){
179
		        preferredTerms = cachedTermMap.get(initialTerms.get(0).getTermType());
180
		    }
181
		    if (preferredTerms == null){
182
		        return initialTerms;
183
		    }
184
		    for (T term : initialTerms){
185
	            if (preferredTerms.contains(TermDto.fromTerm(term))){
186
	                filteredTerms.add(term);
187
	            }
188
	        }
189
		    if (filteredTerms.isEmpty()){
190
		        return initialTerms;
191
		    }
192
		}
193

    
194
		return filteredTerms;
195
	}
196

    
197
	/**
198
     * Generic method to get term preferences for a term vocabulary
199
     *
200
     * @param initialTerms a {@link java.util.List} object.
201
     * @return a {@link java.util.List} object.
202
     */
203
    public List<TermDto> getFilteredTermDtos(List<TermDto> initialTerms){
204

    
205
        List<TermDto> filteredTerms = new ArrayList<>();
206

    
207
        for (TermDto term : initialTerms){
208
            //TODO:inverse terms!!
209
            if(PreferencesUtil.getBooleanValue(getPrefNameByDto(term))){
210
                filteredTerms.add(term);
211
            }
212
        }
213
        if (filteredTerms.isEmpty()){
214
            return initialTerms;
215
        }
216

    
217
        return filteredTerms;
218
    }
219

    
220
    private <T extends TermBase> String getPrefName(T term) {
221
        return term.getTermType()!=null?term.getTermType().toString()+term.getUuid().toString():""+term.getUuid().toString();
222
    }
223

    
224
    private String getPrefNameByDto(TermDto term) {
225
        return term.getTermType()!=null?term.getTermType().toString()+term.getUuid().toString():""+term.getUuid().toString();
226
    }
227

    
228
	private <T extends DefinedTermBase> TermVocabulary<T> getTermVocabulary(Collection<T> initialTerms){
229

    
230
		if(!initialTerms.isEmpty()){
231
	    	T entity = initialTerms.iterator().next();
232
	        return entity.getVocabulary();
233
	    }
234
	    return null;
235
	}
236

    
237
	private  TermVocabularyDto getTermVocabularyByDto(Collection<TermDto> initialTerms){
238
        if(!initialTerms.isEmpty()){
239
            TermDto entity = initialTerms.iterator().next();
240
            return entity.getVocabularyDto();
241
        }
242
        return null;
243
    }
244

    
245

    
246
	/**
247
	 * Generic method to set term preferences
248
	 *
249
	 * @param preferredTerms a {@link java.util.List} object.
250
	 * @param initialTerms a {@link java.util.List} object.
251
	 * @param <T> a T object.
252
	 */
253
	public <T extends DefinedTermBase> void setPreferredTerms(Collection<T> preferredTerms, Collection<T> initialTerms){
254
	    TermVocabulary<T> voc = getTermVocabulary(initialTerms);
255
		Collection<UUID> undesiredTermUuids = new ArrayList<>();
256
		for(TermBase term : initialTerms){
257
			if(! preferredTerms.contains(term)){
258
				undesiredTermUuids.add(term.getUuid());
259
				PreferencesUtil.setBooleanValue(getPrefName(term), false);
260
			}else{
261
			    PreferencesUtil.setBooleanValue(getPrefName(term), true);
262
			}
263
		}
264
		clearTermMapForTermVoc(voc.getUuid());
265
	}
266

    
267

    
268
	/**
269
     * Generic method to set term preferences
270
     *
271
     * @param preferredTerms a {@link java.util.List} object.
272
     * @param initialTerms a {@link java.util.List} object.
273
     * @param <T> a T object.
274
     */
275
    public  void setPreferredTermsByType(Collection<TermDto> preferredTerms, TermType type){
276
        List<?> oldValues = getPreferredTerms(type);
277
        if (oldValues != null){
278
            for (Object term: oldValues){
279
                if (term instanceof TermDto){
280
                    PreferencesUtil.setBooleanValue(getPrefNameByDto((TermDto)term), false);
281
                }else{
282
                    PreferencesUtil.setBooleanValue(getPrefName((DefinedTermBase)term), false);
283
                }
284
            }
285
        }
286
//        for(TermDto term : preferredTerms){
287
//           PreferencesUtil.setBooleanValue(getPrefNameByDto(term), true);
288
//
289
//        }
290

    
291
        clearTermMapForTermType(type);
292
        List<TermDto> list = new ArrayList<>(preferredTerms);
293
        cachedTermMap.put(type, list);
294
    }
295

    
296
    /**
297
     * Generic method to set term preferences
298
     *
299
     * @param preferredTerms a {@link java.util.List} object.
300
     * @param initialTerms a {@link java.util.List} object.
301
     * @param <T> a T object.
302
     */
303
    public void setPreferredTermsByDto(Collection<TermDto> preferredTerms, TermVocabularyDto vocDto){
304

    
305
        List<TermDto> oldValues = getPreferredTerms(vocDto);
306
        for (TermDto term: oldValues){
307
            PreferencesUtil.setBooleanValue(getPrefNameByDto(term), false);
308
        }
309
        TermType type = null;
310
        boolean allSameType = true;
311
        for(TermDto term : preferredTerms){
312
            PreferencesUtil.setBooleanValue(getPrefNameByDto(term), true);
313
           if (type == null){
314
               type = term.getTermType();
315
           }else if (!type.equals(term.getTermType())){
316
               allSameType = false;
317
           }
318
        }
319

    
320
        //if (initialTerms.iterator().hasNext()){
321
            clearTermMapForTermVoc(vocDto.getUuid());
322
            List<TermDto> list = new ArrayList<>(preferredTerms);
323
            cachedTermMap.put(vocDto.getUuid(), list);
324
            if (allSameType){
325
                cachedTermMap.put(type, list);
326
            }
327
        //}
328
    }
329

    
330

    
331
	public <T extends DefinedTermBase> void clearTermMapForTermVoc(UUID vocUuid){
332
	    cachedTermMap.remove(vocUuid);
333
	}
334

    
335
	public void clearTermMapForTermType(TermType termType){
336
        cachedTermMap.remove(termType);
337
    }
338

    
339
	/**
340
     * Generic method to get term preferences for a term vocabulary
341
     *
342
     * @param initialTerms a {@link java.util.List} object.
343
     * @return a {@link java.util.List} object.
344
     */
345
    public <T extends DefinedTermBase> List<T> getTerms(List<UUID> uuidList, Class clazz){
346

    
347
        List<T> filteredTerms = new ArrayList<>();
348
        List<T> terms = TermStore.getTerms(clazz);
349
        if (uuidList == null || uuidList.isEmpty()){
350
            return terms;
351
        }
352
        for (T term : terms){
353
            if(uuidList.contains(term.getUuid())){
354
                filteredTerms.add(term);
355
            }
356
        }
357

    
358
        return filteredTerms;
359
    }
360

    
361
    /**
362
     * Generic method to get term preferences for a term vocabulary
363
     *
364
     * @param initialTerms a {@link java.util.List} object.
365
     * @return a {@link java.util.List} object.
366
     */
367
    public <T extends DefinedTermBase> List<T> getTerms(List<UUID> uuidList, TermType type){
368

    
369
        List<T> filteredTerms = new ArrayList<>();
370
        List<T> terms = TermStore.getTerms(type, null);
371
        if (uuidList == null || uuidList.isEmpty()){
372
            return terms;
373
        }
374
        for (T term : terms){
375
            if(uuidList.contains(term.getUuid())){
376
                filteredTerms.add(term);
377
            }
378
        }
379

    
380
        return filteredTerms;
381
    }
382

    
383
    /**
384
     * Generic method to get term preferences for a term vocabulary
385
     *
386
     * @param initialTerms a {@link java.util.List} object.
387
     * @return a {@link java.util.List} object.
388
     */
389
    public <T extends DefinedTermBase> List<T> getAllTerms(TermType type, Comparator comparator){
390
        List<T> terms = TermStore.getTerms(type, comparator);
391
        return terms;
392
    }
393
}
(10-10/13)