Project

General

Profile

Download (14.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.Arrays;
14
import java.util.Collection;
15
import java.util.Comparator;
16
import java.util.HashMap;
17
import java.util.HashSet;
18
import java.util.Iterator;
19
import java.util.List;
20
import java.util.Map;
21
import java.util.Set;
22
import java.util.UUID;
23

    
24
import org.apache.commons.lang3.StringUtils;
25

    
26
import eu.etaxonomy.cdm.api.service.ITermService;
27
import eu.etaxonomy.cdm.model.term.DefinedTerm;
28
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
29
import eu.etaxonomy.cdm.model.term.TermBase;
30
import eu.etaxonomy.cdm.model.term.TermType;
31
import eu.etaxonomy.cdm.model.term.TermVocabulary;
32
import eu.etaxonomy.cdm.persistence.dto.TermDto;
33
import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
34
import eu.etaxonomy.taxeditor.model.DefaultTermComparator;
35
import eu.etaxonomy.taxeditor.model.TaxonRelationshipTypeInverseContainer;
36
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
37
import eu.etaxonomy.taxeditor.ui.combo.InverseTermWrapper;
38

    
39
/**
40
 * @author n.hoffmann
41
 * @created Dec 7, 2010
42
 */
43
public class TermManager {
44

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

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

    
51
	public TermManager(){
52
	}
53

    
54
	public void reset(){
55
		cachedTermMap = new HashMap<>();
56
	}
57

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

    
78
            }
79
            if (!uuids.isEmpty()){
80
                termBaseList.addAll(getTerms(uuids, termType));
81
            }
82
	    }
83
        return termBaseList;
84
	}
85

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

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

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

    
130
           if (!uuids.isEmpty()){
131
               termBaseList.addAll(this.getTerms(uuids, DefinedTermBase.class));
132
           }
133

    
134
       }
135
       termBaseList.sort(comp);
136
       terms = termBaseList;
137
       return terms;
138
   }
139

    
140
	public <T extends DefinedTermBase> List<T> getPreferredTerms(Class<T> clazz){
141
	    @SuppressWarnings("unchecked")
142
        List<T> terms = cachedTermMap.get(clazz);
143
	    if(terms==null){
144
	        terms = getFilteredTerms(TermStore.getTerms(clazz));
145
	        cachedTermMap.put(clazz, terms);
146
	    }
147
	    return terms;
148
	}
149

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

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

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

    
196
		return filteredTerms;
197
	}
198

    
199
	public <T extends DefinedTermBase>List<T> createTermListFromString(String stringValue, TermType type){
200
		 List<String> checked = new ArrayList<>();
201

    
202
		if (stringValue != null){
203
			String[] listChecked = stringValue.split(";"); //$NON-NLS-1$
204
			String[] listCheckedComma = stringValue.split(","); //$NON-NLS-1$
205
			if (listChecked != null ){
206
				checked = Arrays.asList(listChecked);
207
			}
208
			if (listCheckedComma != null && stringValue.contains(",")){ //$NON-NLS-1$
209
				checked = Arrays.asList(listCheckedComma);
210
			}
211
		}
212
        List<T> termsFromStringValues = getTermsFromStringValues(checked, type);
213
        return termsFromStringValues;
214
	}
215

    
216
	 protected <T extends DefinedTermBase> List<T> getTermsFromStringValues(List<String> listValue, TermType type) {
217
	        List<DefinedTermBase> termlist = new ArrayList<>();
218
	        ITermService termService = CdmStore.getService(ITermService.class);
219
	        List<UUID> uuidList = new ArrayList<>();
220
	                
221
	        for (String s : listValue) {
222
	            if (StringUtils.isNotBlank(s)){
223
	                UUID uuid = UUID.fromString(s);
224
	                uuidList.add(uuid);
225
	            }
226
	        }
227
	        
228
	        List<T> allTerms = getTerms(uuidList,  type);
229
	        if (!allTerms.isEmpty()) {
230
	        	return allTerms;
231
	        }
232
	        
233
	        if (!uuidList.isEmpty() && allTerms.isEmpty()){
234
	            termlist = termService.find(new HashSet(uuidList));
235
	        }else{
236
	            termlist = termService.listByTermType(type, null, null, null, null);
237
	        }
238

    
239
	        return new ArrayList(termlist);
240
	    }
241

    
242
	/**
243
     * Generic method to get term preferences for a term vocabulary
244
     *
245
     * @param initialTerms a {@link java.util.List} object.
246
     * @return a {@link java.util.List} object.
247
     */
248
    public List<TermDto> getFilteredTermDtos(List<TermDto> initialTerms){
249

    
250
        List<TermDto> filteredTerms = new ArrayList<>();
251

    
252
        for (TermDto term : initialTerms){
253
            //TODO:inverse terms!!
254
            if(PreferencesUtil.getBooleanValue(getPrefNameByDto(term))){
255
                filteredTerms.add(term);
256
            }
257
        }
258
        if (filteredTerms.isEmpty()){
259
            return initialTerms;
260
        }
261

    
262
        return filteredTerms;
263
    }
264

    
265
    private <T extends TermBase> String getPrefName(T term) {
266
        return term.getTermType()!=null?term.getTermType().toString()+term.getUuid().toString():""+term.getUuid().toString();
267
    }
268

    
269
    private String getPrefNameByDto(TermDto term) {
270
        return term.getTermType()!=null?term.getTermType().toString()+term.getUuid().toString():""+term.getUuid().toString();
271
    }
272

    
273
	private <T extends DefinedTermBase> TermVocabulary<T> getTermVocabulary(Collection<T> initialTerms){
274

    
275
		if(!initialTerms.isEmpty()){
276
	    	T entity = initialTerms.iterator().next();
277
	        return entity.getVocabulary();
278
	    }
279
	    return null;
280
	}
281

    
282
	/**
283
	 * Generic method to set term preferences
284
	 *
285
	 * @param preferredTerms a {@link java.util.List} object.
286
	 * @param initialTerms a {@link java.util.List} object.
287
	 * @param <T> a T object.
288
	 */
289
	public <T extends DefinedTermBase> void setPreferredTerms(Collection<T> preferredTerms, Collection<T> initialTerms){
290
	    TermVocabulary<T> voc = getTermVocabulary(initialTerms);
291
		Collection<UUID> undesiredTermUuids = new ArrayList<>();
292
		for(TermBase term : initialTerms){
293
			if(! preferredTerms.contains(term)){
294
				undesiredTermUuids.add(term.getUuid());
295
				PreferencesUtil.setBooleanValue(getPrefName(term), false);
296
			}else{
297
			    PreferencesUtil.setBooleanValue(getPrefName(term), true);
298
			}
299
		}
300
		clearTermMapForTermVoc(voc.getUuid());
301
	}
302

    
303
	/**
304
     * Generic method to set term preferences
305
     *
306
     * @param preferredTerms a {@link java.util.List} object.
307
     * @param initialTerms a {@link java.util.List} object.
308
     * @param <T> a T object.
309
     */
310
    public  void setPreferredTermsByType(Collection<TermDto> preferredTerms, TermType type){
311
        List<?> oldValues = getPreferredTerms(type);
312
        if (oldValues != null){
313
            for (Object term: oldValues){
314
                if (term instanceof TermDto){
315
                    PreferencesUtil.setBooleanValue(getPrefNameByDto((TermDto)term), false);
316
                }else{
317
                    PreferencesUtil.setBooleanValue(getPrefName((DefinedTermBase)term), false);
318
                }
319
            }
320
        }
321
//        for(TermDto term : preferredTerms){
322
//           PreferencesUtil.setBooleanValue(getPrefNameByDto(term), true);
323
//
324
//        }
325

    
326
        clearTermMapForTermType(type);
327
        List<TermDto> list = new ArrayList<>(preferredTerms);
328
        cachedTermMap.put(type.getUuid(), list);
329
    }
330

    
331
    /**
332
     * Generic method to set term preferences
333
     *
334
     * @param preferredTerms a {@link java.util.List} object.
335
     * @param initialTerms a {@link java.util.List} object.
336
     * @param <T> a T object.
337
     */
338
    public void setPreferredTermsByDto(Collection<TermDto> preferredTerms, TermVocabularyDto vocDto){
339

    
340
        List<TermDto> oldValues = getPreferredTerms(vocDto);
341
        for (TermDto term: oldValues){
342
            PreferencesUtil.setBooleanValue(getPrefNameByDto(term), false);
343
        }
344
        TermType type = null;
345
        boolean allSameType = true;
346
        for(TermDto term : preferredTerms){
347
            PreferencesUtil.setBooleanValue(getPrefNameByDto(term), true);
348
           if (type == null){
349
               type = term.getTermType();
350
           }else if (!type.equals(term.getTermType())){
351
               allSameType = false;
352
           }
353
        }
354

    
355
        //if (initialTerms.iterator().hasNext()){
356
            clearTermMapForTermVoc(vocDto.getUuid());
357
            List<TermDto> list = new ArrayList<>(preferredTerms);
358
            cachedTermMap.put(vocDto.getUuid(), list);
359
            if (allSameType){
360
                cachedTermMap.put(type, list);
361
            }
362
        //}
363
    }
364

    
365

    
366
	public <T extends DefinedTermBase> void clearTermMapForTermVoc(UUID vocUuid){
367
	    cachedTermMap.remove(vocUuid);
368
	}
369

    
370
	public void clearTermMapForTermType(TermType termType){
371
        cachedTermMap.remove(termType.getUuid());
372
    }
373

    
374
	/**
375
     * Generic method to get term preferences for a term vocabulary
376
     *
377
     * @param initialTerms a {@link java.util.List} object.
378
     * @return a {@link java.util.List} object.
379
     */
380
    public <T extends DefinedTermBase> List<T> getTerms(List<UUID> uuidList, Class clazz){
381

    
382
        List<T> filteredTerms = new ArrayList<>();
383
        @SuppressWarnings("unchecked")
384
		List<T> terms = TermStore.getTerms(clazz);
385
        if (uuidList == null || uuidList.isEmpty()){
386
            return terms;
387
        }
388
        for (T term : terms){
389
            if(uuidList.contains(term.getUuid())){
390
                filteredTerms.add(term);
391
            }
392
        }
393

    
394
        return filteredTerms;
395
    }
396

    
397
    /**
398
     * Generic method to get term preferences for a term vocabulary
399
     *
400
     * @param initialTerms a {@link java.util.List} object.
401
     * @return a {@link java.util.List} object.
402
     */
403
    public <T extends DefinedTermBase> List<T> getTerms(List<UUID> uuidList, TermType type){
404

    
405
        List<T> filteredTerms = new ArrayList<>();
406
        List<T> terms = TermStore.getTerms(type, null);
407
        if (uuidList == null || uuidList.isEmpty()){
408
            return terms;
409
        }
410
        Set<UUID> alreadyAdded = new HashSet<>();
411
        Set<UUID> temp = new HashSet<>();
412
        for (T term : terms){
413
            if(uuidList.contains(term.getUuid())){
414
                filteredTerms.add(term);
415
                alreadyAdded.add(term.getUuid());
416
            }
417
        } 
418
        return filteredTerms;
419
    }
420

    
421
    /**
422
     * Generic method to get term preferences for a term vocabulary
423
     *
424
     * @param initialTerms a {@link java.util.List} object.
425
     * @return a {@link java.util.List} object.
426
     */
427
    public <T extends DefinedTermBase> List<T> getAllTerms(TermType type, Comparator comparator){
428
        List<T> terms = TermStore.getTerms(type, comparator);
429
        return terms;
430
    }
431
}
(10-10/13)