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);
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
	    }
140
	    return terms;
141
	}
142

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

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

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

    
189
		return filteredTerms;
190
	}
191

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

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

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

    
212
        return filteredTerms;
213
    }
214

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

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

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

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

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

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

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

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

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

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

    
315

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

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

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

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

    
344
        return filteredTerms;
345
    }
346

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

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

    
366
        return filteredTerms;
367
    }
368

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