Project

General

Profile

Download (12.2 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 Map<Object, List> cachedTermMap = new HashMap<>();
38

    
39
    //new cache for features!!
40
    //dinstinguish preferences for both
41
    //load at start
42

    
43
	public TermManager(){
44
	}
45

    
46
	public void reset(){
47
		cachedTermMap = new HashMap<>();
48
	}
49

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

    
70
            }
71
            if (!uuids.isEmpty()){
72
                termBaseList.addAll(getTerms(uuids, termType));
73
            }
74
	    }
75
        return termBaseList;
76
	}
77

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

    
88
   public List<TermDto> getPreferredTerms(TermVocabularyDto termVocabularyDto){
89
       @SuppressWarnings("unchecked")
90
       List<TermDto> terms = cachedTermMap.get(termVocabularyDto.getUuid());
91
       if(terms==null || terms.isEmpty()){
92
           terms = getFilteredTermDtos(new ArrayList<>(termVocabularyDto.getTerms()));
93
           cachedTermMap.put(termVocabularyDto.getUuid(), terms);
94
       }
95
       return terms;
96
   }
97

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

    
122
           if (!uuids.isEmpty()){
123
               termBaseList.addAll(this.getTerms(uuids, DefinedTermBase.class));
124
           }
125

    
126
       }
127
       termBaseList.sort(comp);
128
       terms = termBaseList;
129
       return terms;
130
   }
131

    
132
	public <T extends DefinedTermBase> List<T> getPreferredTerms(Class<T> clazz){
133
	    @SuppressWarnings("unchecked")
134
        List<T> terms = cachedTermMap.get(clazz);
135
	    if(terms==null){
136
	        terms = getFilteredTerms(TermStore.getTerms(clazz));
137
	        cachedTermMap.put(clazz, terms);
138
	    }
139
	    return terms;
140
	}
141

    
142
	/**
143
	 * Generic method to get term preferences for a term vocabulary
144
	 *
145
	 * @param initialTerms a {@link java.util.List} object.
146
	 * @return a {@link java.util.List} object.
147
	 */
148
	public <T extends DefinedTermBase> List<T> getFilteredTerms(List<T> initialTerms){
149
		List<T> filteredTerms = new ArrayList<>();
150
		if (initialTerms == null || initialTerms.isEmpty()){
151
		    return filteredTerms;
152
		}
153

    
154
		for (T term : initialTerms){
155
			if (term instanceof TaxonRelationshipTypeInverseContainer){
156
				if(!PreferencesUtil.getBooleanValue(getPrefName(term), true)){
157
					T type = (T)((TaxonRelationshipTypeInverseContainer) term).getType();
158
					filteredTerms.add(type);
159
				}
160
			}
161

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

    
188
		return filteredTerms;
189
	}
190

    
191
	/**
192
     * Generic method to get term preferences for a term vocabulary
193
     *
194
     * @param initialTerms a {@link java.util.List} object.
195
     * @return a {@link java.util.List} object.
196
     */
197
    public List<TermDto> getFilteredTermDtos(List<TermDto> initialTerms){
198

    
199
        List<TermDto> filteredTerms = new ArrayList<>();
200

    
201
        for (TermDto term : initialTerms){
202
            //TODO:inverse terms!!
203
            if(PreferencesUtil.getBooleanValue(getPrefNameByDto(term))){
204
                filteredTerms.add(term);
205
            }
206
        }
207
        if (filteredTerms.isEmpty()){
208
            return initialTerms;
209
        }
210

    
211
        return filteredTerms;
212
    }
213

    
214
    private <T extends TermBase> String getPrefName(T term) {
215
        return term.getTermType()!=null?term.getTermType().toString()+term.getUuid().toString():""+term.getUuid().toString();
216
    }
217

    
218
    private String getPrefNameByDto(TermDto term) {
219
        return term.getTermType()!=null?term.getTermType().toString()+term.getUuid().toString():""+term.getUuid().toString();
220
    }
221

    
222
	private <T extends DefinedTermBase> TermVocabulary<T> getTermVocabulary(Collection<T> initialTerms){
223

    
224
		if(!initialTerms.isEmpty()){
225
	    	T entity = initialTerms.iterator().next();
226
	        return entity.getVocabulary();
227
	    }
228
	    return null;
229
	}
230

    
231
	/**
232
	 * Generic method to set term preferences
233
	 *
234
	 * @param preferredTerms a {@link java.util.List} object.
235
	 * @param initialTerms a {@link java.util.List} object.
236
	 * @param <T> a T object.
237
	 */
238
	public <T extends DefinedTermBase> void setPreferredTerms(Collection<T> preferredTerms, Collection<T> initialTerms){
239
	    TermVocabulary<T> voc = getTermVocabulary(initialTerms);
240
		Collection<UUID> undesiredTermUuids = new ArrayList<>();
241
		for(TermBase term : initialTerms){
242
			if(! preferredTerms.contains(term)){
243
				undesiredTermUuids.add(term.getUuid());
244
				PreferencesUtil.setBooleanValue(getPrefName(term), false);
245
			}else{
246
			    PreferencesUtil.setBooleanValue(getPrefName(term), true);
247
			}
248
		}
249
		clearTermMapForTermVoc(voc.getUuid());
250
	}
251

    
252
	/**
253
     * Generic method to set term preferences
254
     *
255
     * @param preferredTerms a {@link java.util.List} object.
256
     * @param initialTerms a {@link java.util.List} object.
257
     * @param <T> a T object.
258
     */
259
    public  void setPreferredTermsByType(Collection<TermDto> preferredTerms, TermType type){
260
        List<?> oldValues = getPreferredTerms(type);
261
        if (oldValues != null){
262
            for (Object term: oldValues){
263
                if (term instanceof TermDto){
264
                    PreferencesUtil.setBooleanValue(getPrefNameByDto((TermDto)term), false);
265
                }else{
266
                    PreferencesUtil.setBooleanValue(getPrefName((DefinedTermBase)term), false);
267
                }
268
            }
269
        }
270
//        for(TermDto term : preferredTerms){
271
//           PreferencesUtil.setBooleanValue(getPrefNameByDto(term), true);
272
//
273
//        }
274

    
275
        clearTermMapForTermType(type);
276
        List<TermDto> list = new ArrayList<>(preferredTerms);
277
        cachedTermMap.put(type, list);
278
    }
279

    
280
    /**
281
     * Generic method to set term preferences
282
     *
283
     * @param preferredTerms a {@link java.util.List} object.
284
     * @param initialTerms a {@link java.util.List} object.
285
     * @param <T> a T object.
286
     */
287
    public void setPreferredTermsByDto(Collection<TermDto> preferredTerms, TermVocabularyDto vocDto){
288

    
289
        List<TermDto> oldValues = getPreferredTerms(vocDto);
290
        for (TermDto term: oldValues){
291
            PreferencesUtil.setBooleanValue(getPrefNameByDto(term), false);
292
        }
293
        TermType type = null;
294
        boolean allSameType = true;
295
        for(TermDto term : preferredTerms){
296
            PreferencesUtil.setBooleanValue(getPrefNameByDto(term), true);
297
           if (type == null){
298
               type = term.getTermType();
299
           }else if (!type.equals(term.getTermType())){
300
               allSameType = false;
301
           }
302
        }
303

    
304
        //if (initialTerms.iterator().hasNext()){
305
            clearTermMapForTermVoc(vocDto.getUuid());
306
            List<TermDto> list = new ArrayList<>(preferredTerms);
307
            cachedTermMap.put(vocDto.getUuid(), list);
308
            if (allSameType){
309
                cachedTermMap.put(type, list);
310
            }
311
        //}
312
    }
313

    
314

    
315
	public <T extends DefinedTermBase> void clearTermMapForTermVoc(UUID vocUuid){
316
	    cachedTermMap.remove(vocUuid);
317
	}
318

    
319
	public void clearTermMapForTermType(TermType termType){
320
        cachedTermMap.remove(termType);
321
    }
322

    
323
	/**
324
     * Generic method to get term preferences for a term vocabulary
325
     *
326
     * @param initialTerms a {@link java.util.List} object.
327
     * @return a {@link java.util.List} object.
328
     */
329
    public <T extends DefinedTermBase> List<T> getTerms(List<UUID> uuidList, Class clazz){
330

    
331
        List<T> filteredTerms = new ArrayList<>();
332
        @SuppressWarnings("unchecked")
333
		List<T> terms = TermStore.getTerms(clazz);
334
        if (uuidList == null || uuidList.isEmpty()){
335
            return terms;
336
        }
337
        for (T term : terms){
338
            if(uuidList.contains(term.getUuid())){
339
                filteredTerms.add(term);
340
            }
341
        }
342

    
343
        return filteredTerms;
344
    }
345

    
346
    /**
347
     * Generic method to get term preferences for a term vocabulary
348
     *
349
     * @param initialTerms a {@link java.util.List} object.
350
     * @return a {@link java.util.List} object.
351
     */
352
    public <T extends DefinedTermBase> List<T> getTerms(List<UUID> uuidList, TermType type){
353

    
354
        List<T> filteredTerms = new ArrayList<>();
355
        List<T> terms = TermStore.getTerms(type, null);
356
        if (uuidList == null || uuidList.isEmpty()){
357
            return terms;
358
        }
359
        for (T term : terms){
360
            if(uuidList.contains(term.getUuid())){
361
                filteredTerms.add(term);
362
            }
363
        }
364

    
365
        return filteredTerms;
366
    }
367

    
368
    /**
369
     * Generic method to get term preferences for a term vocabulary
370
     *
371
     * @param initialTerms a {@link java.util.List} object.
372
     * @return a {@link java.util.List} object.
373
     */
374
    public <T extends DefinedTermBase> List<T> getAllTerms(TermType type, Comparator comparator){
375
        List<T> terms = TermStore.getTerms(type, comparator);
376
        return terms;
377
    }
378
}
(10-10/13)