Project

General

Profile

Download (23.1 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.cdm.api.service;
11

    
12
import java.net.URI;
13
import java.util.ArrayList;
14
import java.util.Collection;
15
import java.util.Enumeration;
16
import java.util.HashSet;
17
import java.util.List;
18
import java.util.Locale;
19
import java.util.Map;
20
import java.util.Set;
21
import java.util.UUID;
22

    
23
import org.apache.commons.lang.StringUtils;
24
import org.apache.log4j.Logger;
25
import org.springframework.beans.factory.annotation.Autowired;
26
import org.springframework.beans.factory.annotation.Qualifier;
27
import org.springframework.stereotype.Service;
28
import org.springframework.transaction.annotation.Transactional;
29

    
30
import eu.etaxonomy.cdm.api.service.UpdateResult.Status;
31
import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
32
import eu.etaxonomy.cdm.api.service.config.TermDeletionConfigurator;
33
import eu.etaxonomy.cdm.api.service.exception.DataChangeNoRollbackException;
34
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
35
import eu.etaxonomy.cdm.api.service.pager.Pager;
36
import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
37
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
38
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
39
import eu.etaxonomy.cdm.model.common.CdmBase;
40
import eu.etaxonomy.cdm.model.common.Language;
41
import eu.etaxonomy.cdm.model.common.LanguageString;
42
import eu.etaxonomy.cdm.model.common.LanguageStringBase;
43
import eu.etaxonomy.cdm.model.location.NamedArea;
44
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
45
import eu.etaxonomy.cdm.model.location.NamedAreaType;
46
import eu.etaxonomy.cdm.model.media.Media;
47
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
48
import eu.etaxonomy.cdm.model.term.OrderedTermBase;
49
import eu.etaxonomy.cdm.model.term.OrderedTermVocabulary;
50
import eu.etaxonomy.cdm.model.term.Representation;
51
import eu.etaxonomy.cdm.model.term.TermType;
52
import eu.etaxonomy.cdm.model.term.TermVocabulary;
53
import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;
54
import eu.etaxonomy.cdm.persistence.dao.common.ILanguageStringBaseDao;
55
import eu.etaxonomy.cdm.persistence.dao.common.ILanguageStringDao;
56
import eu.etaxonomy.cdm.persistence.dao.common.IRepresentationDao;
57
import eu.etaxonomy.cdm.persistence.dto.TermDto;
58
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
59
import eu.etaxonomy.cdm.persistence.query.MatchMode;
60
import eu.etaxonomy.cdm.persistence.query.OrderHint;
61
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
62

    
63
@Service
64
@Transactional(readOnly = true)
65
public class TermServiceImpl extends IdentifiableServiceBase<DefinedTermBase,IDefinedTermDao> implements ITermService{
66
	@SuppressWarnings("unused")
67
	private static final Logger logger = Logger.getLogger(TermServiceImpl.class);
68

    
69
	private ILanguageStringDao languageStringDao;
70

    
71
	@Autowired
72
	private IVocabularyService vocabularyService;
73

    
74
	@Autowired
75
	@Qualifier("langStrBaseDao")
76
	private ILanguageStringBaseDao languageStringBaseDao;
77
	private IRepresentationDao representationDao;
78

    
79
	@Autowired
80
	public void setLanguageStringDao(ILanguageStringDao languageStringDao) {
81
		this.languageStringDao = languageStringDao;
82
	}
83

    
84
	@Autowired
85
	public void setRepresentationDao(IRepresentationDao representationDao) {
86
		this.representationDao = representationDao;
87
	}
88

    
89
	@Override
90
    @Autowired
91
	protected void setDao(IDefinedTermDao dao) {
92
		this.dao = dao;
93
	}
94

    
95
	@Override
96
	public <T extends DefinedTermBase> List<T> listByTermType(TermType termType, Integer limit, Integer start,
97
	        List<OrderHint> orderHints, List<String> propertyPaths) {
98
	    return dao.listByTermType(termType, limit, start, orderHints, propertyPaths);
99
	}
100

    
101
	@Override
102
	public DefinedTermBase getByUri(URI uri) {
103
		return dao.findByUri(uri);
104
	}
105

    
106
	@Override
107
	public Language getLanguageByIso(String iso639) {
108
	    return dao.getLanguageByIso(iso639);
109
	}
110

    
111
	@Override
112
	public Language getLanguageByLabel(String label) {
113
	    return Language.getLanguageByLabel(label);
114
	}
115

    
116
	@Override
117
	public List<Language> getLanguagesByLocale(Enumeration<Locale> locales){
118
		return dao.getLanguagesByLocale(locales);
119
	}
120

    
121
	@Override
122
    public <TERM extends DefinedTermBase> TERM findByIdInVocabulary(String id, UUID vocabularyUuid, Class<TERM> clazz) throws IllegalArgumentException {
123
        List<TERM> list = dao.getDefinedTermByIdInVocabulary(id, vocabularyUuid, clazz, null, null);
124
		if (list.isEmpty()){
125
			return null;
126
		}else if (list.size() == 1){
127
			return list.get(0);
128
		}else{
129
			String message = "There is more then 1 (%d) term with the same id in vocabulary. This is forbidden. Check the state of your database.";
130
			throw new IllegalStateException(String.format(message, list.size()));
131
		}
132
	}
133

    
134

    
135
	@Override
136
	public NamedArea getAreaByTdwgAbbreviation(String tdwgAbbreviation) {
137
		if (StringUtils.isBlank(tdwgAbbreviation)){ //TDWG areas should always have a label
138
			return null;
139
		}
140
		List<NamedArea> list = dao.getDefinedTermByIdInVocabulary(tdwgAbbreviation, NamedArea.uuidTdwgAreaVocabulary, NamedArea.class, null, null);
141
		if (list.isEmpty()){
142
			return null;
143
		}else if (list.size() == 1){
144
			return list.get(0);
145
		}else{
146
			String message = "There is more then 1 (%d) TDWG area with the same abbreviated label. This is forbidden. Check the state of your database.";
147
			throw new IllegalStateException(String.format(message, list.size()));
148
		}
149
	}
150

    
151
	@Override
152
	public <T extends DefinedTermBase> Pager<T> getGeneralizationOf(T definedTerm, Integer pageSize, Integer pageNumber) {
153
        long numberOfResults = dao.countGeneralizationOf(definedTerm);
154

    
155
		List<T> results = new ArrayList<>();
156
		if(numberOfResults > 0) { // no point checking again  //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
157
			results = dao.getGeneralizationOf(definedTerm, pageSize, pageNumber);
158
		}
159

    
160
		return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
161
	}
162

    
163
	@Override
164
	public <T extends DefinedTermBase> Pager<T> getIncludes(Collection<T> definedTerms, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
165
        long numberOfResults = dao.countIncludes(definedTerms);
166

    
167
		List<T> results = new ArrayList<>();
168
		if(numberOfResults > 0) { // no point checking again  //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
169
			results = dao.getIncludes(definedTerms, pageSize, pageNumber,propertyPaths);
170
		}
171

    
172
		return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
173
	}
174

    
175
	@Override
176
	public Pager<Media> getMedia(DefinedTermBase definedTerm, Integer pageSize,	Integer pageNumber) {
177
        long numberOfResults = dao.countMedia(definedTerm);
178

    
179
		List<Media> results = new ArrayList<>();
180
		if(numberOfResults > 0) { // no point checking again  //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
181
			results = dao.getMedia(definedTerm, pageSize, pageNumber);
182
		}
183

    
184
		return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
185
	}
186

    
187
	@Override
188
	public <T extends DefinedTermBase> Pager<T> getPartOf(Set<T> definedTerms,Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
189
        long numberOfResults = dao.countPartOf(definedTerms);
190

    
191
		List<T> results = new ArrayList<>();
192
		if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
193
			results = dao.getPartOf(definedTerms, pageSize, pageNumber, propertyPaths);
194
		}
195

    
196
		return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
197
	}
198

    
199
	@Override
200
	public Pager<NamedArea> list(NamedAreaLevel level, NamedAreaType type, Integer pageSize, Integer pageNumber,
201
			List<OrderHint> orderHints, List<String> propertyPaths) {
202
		long numberOfResults = dao.count(level, type);
203

    
204
		List<NamedArea> results = new ArrayList<>();
205
		if (numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
206
			results = dao.list(level, type, pageSize, pageNumber, orderHints, propertyPaths);
207
		}
208

    
209
		return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
210
	}
211

    
212
	@Override
213
	public <T extends DefinedTermBase> Pager<T> findByRepresentationText(String label, Class<T> clazz, Integer pageSize, Integer pageNumber) {
214
        long numberOfResults = dao.countDefinedTermByRepresentationText(label,clazz);
215

    
216
		List<T> results = new ArrayList<>();
217
		if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
218
			results = dao.getDefinedTermByRepresentationText(label, clazz, pageSize, pageNumber);
219
		}
220

    
221
		return new DefaultPagerImpl<T>(pageNumber, numberOfResults, pageSize, results);
222
	}
223

    
224
	@Override
225
	public <T extends DefinedTermBase> Pager<T> findByRepresentationAbbreviation(String abbrev, Class<T> clazz, Integer pageSize, Integer pageNumber) {
226
        long numberOfResults = dao.countDefinedTermByRepresentationAbbrev(abbrev,clazz);
227

    
228
		List<T> results = new ArrayList<>();
229
		if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
230
			results = dao.getDefinedTermByRepresentationAbbrev(abbrev, clazz, pageSize, pageNumber);
231
		}
232

    
233
		return new DefaultPagerImpl<T>(pageNumber, numberOfResults, pageSize, results);
234
	}
235

    
236
	@Override
237
	public List<LanguageString> getAllLanguageStrings(int limit, int start) {
238
		return languageStringDao.list(limit, start);
239
	}
240

    
241
	@Override
242
	public List<Representation> getAllRepresentations(int limit, int start) {
243
		return representationDao.list(limit,start);
244
	}
245

    
246
	@Override
247
	public UUID saveLanguageData(LanguageStringBase languageData) {
248
		return languageStringBaseDao.save(languageData).getUuid();
249
	}
250

    
251

    
252
	/** @deprecated use {@link #delete(DefinedTermBase, TermDeletionConfigurator)} instead
253
	 * to allow DeleteResult return type*/
254
	@Override
255
	@Deprecated
256
	public DeleteResult delete(DefinedTermBase term){
257
		DeleteResult result = new DeleteResult();
258

    
259
		TermDeletionConfigurator defaultConfig = new TermDeletionConfigurator();
260
		result = delete(term, defaultConfig);
261
		return result;
262
	}
263

    
264
	@Override
265
	@Deprecated
266
	@Transactional(readOnly = false)
267
	public DeleteResult delete(UUID termUuid){
268
	    DeleteResult result = new DeleteResult();
269

    
270
	    TermDeletionConfigurator defaultConfig = new TermDeletionConfigurator();
271
	    result = delete(dao.load(termUuid), defaultConfig);
272
	    return result;
273
	}
274

    
275
	@Override
276
	public DeleteResult delete(DefinedTermBase term, TermDeletionConfigurator config){
277
		if (config == null){
278
			config = new TermDeletionConfigurator();
279
		}
280
		Set<DefinedTermBase> termsToSave = new HashSet<DefinedTermBase>();
281

    
282
		DeleteResult result = isDeletable(term.getUuid(), config);
283
		if (result.isAbort()) {
284
            return result;
285
        }
286
		//CdmBase.deproxy(dao.merge(term), DefinedTermBase.class);
287

    
288
		try {
289
			//generalization of
290
			Set<DefinedTermBase> specificTerms = term.getGeneralizationOf();
291
			if (specificTerms.size()>0){
292
				if (config.isDeleteGeneralizationOfRelations()){
293
					DefinedTermBase generalTerm = term.getKindOf();
294
					for (DefinedTermBase specificTerm: specificTerms){
295
						term.removeGeneralization(specificTerm);
296
						if (generalTerm != null){
297
							generalTerm.addGeneralizationOf(specificTerm);
298
							termsToSave.add(generalTerm);
299
						}
300
					}
301
				}else{
302
					//TODO Exception type
303
					String message = "This term has specifing terms. Move or delete specifiing terms prior to delete or change delete configuration.";
304
					result.addRelatedObjects(specificTerms);
305
					result.setAbort();
306
					Exception ex = new DataChangeNoRollbackException(message);
307
					result.addException(ex);
308
				}
309
			}
310

    
311
			//kind of
312
			DefinedTermBase generalTerm = term.getKindOf();
313
			if (generalTerm != null){
314
				if (config.isDeleteKindOfRelations()){
315
					generalTerm.removeGeneralization(term);
316
				}else{
317
					//TODO Exception type
318
					String message = "This term is kind of another term. Move or delete kind of relationship prior to delete or change delete configuration.";
319
					result.addRelatedObject(generalTerm);
320
					result.setAbort();
321
					DataChangeNoRollbackException ex = new DataChangeNoRollbackException(message);
322
					result.addException(ex);
323
					throw ex;
324
				}
325
			}
326

    
327
			//part of
328
			DefinedTermBase parentTerm = term.getPartOf();
329
			if (parentTerm != null){
330
				if (! config.isDeletePartOfRelations()){
331
					//TODO Exception type
332
					String message = "This term is included in another term. Remove from parent term prior to delete or change delete configuration.";
333
					result.addRelatedObject(parentTerm);
334
					result.setAbort();
335
					DataChangeNoRollbackException ex = new DataChangeNoRollbackException(message);
336
					result.addException(ex);
337
				}
338
			}
339

    
340

    
341
			//included in
342
			Set<DefinedTermBase> includedTerms = term.getIncludes();
343
			if (includedTerms.size()> 0){
344
			    if (config.isDeleteIncludedRelations()){
345
			        DefinedTermBase parent = term.getPartOf();
346
			        for (DefinedTermBase includedTerm: includedTerms){
347
			            term.removeIncludes(includedTerm);
348
			            if (parent != null){
349
			                parent.addIncludes(includedTerm);
350
			                termsToSave.add(parent);
351
			            }
352
			        }
353
			    }else{
354
			        //TODO Exception type
355
			        String message = "This term includes other terms. Move or delete included terms prior to delete or change delete configuration.";
356
			        result.addRelatedObjects(includedTerms);
357
			        result.setAbort();
358
			        Exception ex = new DataChangeNoRollbackException(message);
359
			        result.addException(ex);
360
			    }
361
			}
362

    
363
			//part of
364
			if (parentTerm != null){
365
			    if (config.isDeletePartOfRelations()){
366
			        parentTerm.removeIncludes(term);
367
			        termsToSave.add(parentTerm);
368
			    }else{
369
			        //handled before "included in"
370
			    }
371
			}
372

    
373
			if (result.isOk()){
374
				TermVocabulary voc = term.getVocabulary();
375
				if (voc!= null){
376
					voc.removeTerm(term);
377
				}
378
				//TODO save voc
379
				if (true){
380
					dao.delete(term);
381
					result.addDeletedObject(term);
382
					dao.saveOrUpdateAll(termsToSave);
383
				}
384
			}
385
		} catch (DataChangeNoRollbackException e) {
386
			result.setStatus(Status.ERROR);
387
		}
388
		return result;
389
	}
390

    
391
	@Override
392
	@Transactional(readOnly = false)
393
	public DeleteResult delete(UUID termUuid, TermDeletionConfigurator config){
394
	    return delete(dao.load(termUuid), config);
395
	}
396

    
397
	@Override
398
	@Transactional(readOnly = false)
399
    public UpdateResult updateCaches(Class<? extends DefinedTermBase> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<DefinedTermBase> cacheStrategy, IProgressMonitor monitor) {
400
		//TODO shouldn't this be TermBase instead of DefinedTermBase
401
		if (clazz == null){
402
			clazz = DefinedTermBase.class;
403
		}
404
		return super.updateCachesImpl(clazz, stepSize, cacheStrategy, monitor);
405
	}
406

    
407
	@Override
408
    public DeleteResult isDeletable(UUID termUuid, DeleteConfiguratorBase config){
409
	    TermDeletionConfigurator termConfig = null;
410
	    if(config instanceof TermDeletionConfigurator){
411
	        termConfig = (TermDeletionConfigurator) config;
412
	    }
413
	    DeleteResult result = new DeleteResult();
414
	    DefinedTermBase term = load(termUuid);
415
        Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(term);
416

    
417
	    if(termConfig!=null){
418
	        //generalization of
419
	        Set<DefinedTermBase> specificTerms = term.getGeneralizationOf();
420
	        if (!specificTerms.isEmpty() && termConfig.isDeleteGeneralizationOfRelations()){
421
	            references.removeAll(specificTerms);
422
	        }
423
	        //kind of
424
	        DefinedTermBase generalTerm = term.getKindOf();
425
	        if (generalTerm != null && termConfig.isDeleteKindOfRelations()){
426
	            references.remove(generalTerm);
427
	        }
428
	        //part of
429
	        DefinedTermBase parentTerm = term.getPartOf();
430
	        if (parentTerm != null && termConfig.isDeletePartOfRelations()){
431
	            references.remove(parentTerm);
432
	        }
433
	        //included in
434
	        Set<DefinedTermBase> includedTerms = term.getIncludes();
435
	        if (!includedTerms.isEmpty() && termConfig.isDeleteIncludedRelations()){
436
	            references.removeAll(includedTerms);
437
	        }
438
	    }
439

    
440
	    //gather remaining referenced objects
441
        for (CdmBase relatedObject : references) {
442
            if(relatedObject instanceof TermVocabulary){
443
                continue;
444
            }
445
            result.getRelatedObjects().add(relatedObject);
446
            String message = "An object of " + relatedObject.getClass().getName() + " with ID " + relatedObject.getId() + " is referencing the object" ;
447
            result.addException(new ReferencedObjectUndeletableException(message));
448
            result.setAbort();
449
        }
450
        return result;
451
    }
452

    
453
    @Override
454
    @Transactional(readOnly = false)
455
    public Map<UUID, Representation> saveOrUpdateRepresentations(Collection<Representation> representations){
456
        return representationDao.saveOrUpdateAll(representations);
457
    }
458

    
459
    @Override
460
    @Transactional(readOnly = true)
461
    public List<UuidAndTitleCache<NamedArea>> getUuidAndTitleCache(List<TermVocabulary> vocs, Integer limit, String pattern, Language lang) {
462
        List<NamedArea> areas = dao.getUuidAndTitleCache(vocs, limit, pattern);
463

    
464
        List<UuidAndTitleCache<NamedArea>> result = new ArrayList();
465
        UuidAndTitleCache<NamedArea> uuidAndTitleCache;
466
        for (NamedArea area: areas){
467
            uuidAndTitleCache = new UuidAndTitleCache<>(area.getUuid(), area.getId(), area.labelWithLevel(area, lang));
468
            result.add(uuidAndTitleCache);
469
        }
470

    
471
        return result;
472
    }
473

    
474
//    @Override
475
//    @Transactional(readOnly = true)
476
//    public List<UuidAndTitleCache<NamedArea>> getUuidAndTitleCache(List<TermVocabulary> vocs, Integer pageNumber, Integer limit, String pattern, Language lang, MatchMode matchMode) {
477
//        List<NamedArea> areas = dao.getUuidAndTitleCache(vocs, pageNumber, limit, pattern, matchMode);
478
//
479
//        List<UuidAndTitleCache<NamedArea>> result = new ArrayList();
480
//        UuidAndTitleCache<NamedArea> uuidAndTitleCache;
481
//        for (NamedArea area: areas){
482
//            uuidAndTitleCache = new UuidAndTitleCache<>(area.getUuid(), area.getId(), area.labelWithLevel(area, lang));
483
//            result.add(uuidAndTitleCache);
484
//        }
485
//
486
//        return result;
487
//    }
488
//
489
//    @Override
490
//    public long count(List<TermVocabulary> vocs, String pattern, Language lang) {
491
//        long count = dao.count(vocs, pattern);
492
//        return count;
493
//    }
494

    
495
    @Override
496
    public Collection<TermDto> getIncludesAsDto(
497
            TermDto parentTerm) {
498
        return dao.getIncludesAsDto(parentTerm);
499
    }
500

    
501
    @Override
502
    public Collection<TermDto> getKindOfsAsDto(
503
            TermDto parentTerm) {
504
        return dao.getKindOfsAsDto(parentTerm);
505
    }
506

    
507
    @Transactional(readOnly = false)
508
    @Override
509
    public void moveTerm(TermDto termDto, UUID parentUUID) {
510
        moveTerm(termDto, parentUUID, null);
511
    }
512

    
513
    @SuppressWarnings({ "rawtypes", "unchecked" })
514
    @Transactional(readOnly = false)
515
    @Override
516
    public void moveTerm(TermDto termDto, UUID parentUuid, TermMovePosition termMovePosition) {
517
        boolean isKindOf = termDto.getKindOfUuid()!=null && termDto.getKindOfUuid().equals(parentUuid);
518
        TermVocabulary vocabulary = HibernateProxyHelper.deproxy(vocabularyService.load(termDto.getVocabularyUuid()));
519
        DefinedTermBase parent = HibernateProxyHelper.deproxy(dao.load(parentUuid));
520
        if(parent==null){
521
            //new parent is a vocabulary
522
            TermVocabulary parentVocabulary = HibernateProxyHelper.deproxy(vocabularyService.load(parentUuid));
523
            DefinedTermBase term = HibernateProxyHelper.deproxy(dao.load(termDto.getUuid()));
524
            if(parentVocabulary!=null){
525
                term.setKindOf(null);
526
                term.setPartOf(null);
527

    
528
                vocabulary.removeTerm(term);
529
                parentVocabulary.addTerm(term);
530
            }
531
            vocabularyService.saveOrUpdate(parentVocabulary);
532
        }
533
        else {
534
            DefinedTermBase term = HibernateProxyHelper.deproxy(dao.load(termDto.getUuid()));
535
            //new parent is a term
536
            if(parent.isInstanceOf(OrderedTermBase.class)
537
                    && term.isInstanceOf(OrderedTermBase.class)
538
                    && termMovePosition!=null
539
                    && HibernateProxyHelper.deproxy(parent, OrderedTermBase.class).getVocabulary().isInstanceOf(OrderedTermVocabulary.class)) {
540
                //new parent is an ordered term
541
                OrderedTermBase orderedTerm = HibernateProxyHelper.deproxy(term, OrderedTermBase.class);
542
                OrderedTermBase targetOrderedDefinedTerm = HibernateProxyHelper.deproxy(parent, OrderedTermBase.class);
543
                OrderedTermVocabulary otVoc = HibernateProxyHelper.deproxy(targetOrderedDefinedTerm.getVocabulary(), OrderedTermVocabulary.class);
544
                if(termMovePosition.equals(TermMovePosition.BEFORE)) {
545
                    orderedTerm.getVocabulary().removeTerm(orderedTerm);
546
                    otVoc.addTermAbove(orderedTerm, targetOrderedDefinedTerm);
547
                    if (targetOrderedDefinedTerm.getPartOf() != null){
548
                        targetOrderedDefinedTerm.getPartOf().addIncludes(orderedTerm);
549
                    }
550
                }
551
                else if(termMovePosition.equals(TermMovePosition.AFTER)) {
552
                    orderedTerm.getVocabulary().removeTerm(orderedTerm);
553
                    otVoc.addTermBelow(orderedTerm, targetOrderedDefinedTerm);
554
                    if (targetOrderedDefinedTerm.getPartOf() != null){
555
                        targetOrderedDefinedTerm.getPartOf().addIncludes(orderedTerm);
556
                    }
557
                }
558
                else if(termMovePosition.equals(TermMovePosition.ON)) {
559
                    orderedTerm.getVocabulary().removeTerm(orderedTerm);
560
                    targetOrderedDefinedTerm.addIncludes(orderedTerm);
561
                    targetOrderedDefinedTerm.getVocabulary().addTerm(orderedTerm);
562
                }
563
            }
564
            else{
565
                vocabulary.removeTerm(term);
566
                if(isKindOf){
567
                    parent.addGeneralizationOf(term);
568
                }
569
                else{
570
                    parent.addIncludes(term);
571
                }
572
                parent.getVocabulary().addTerm(term);
573
            }
574
            vocabularyService.saveOrUpdate(parent.getVocabulary());
575
        }
576
    }
577

    
578
    @SuppressWarnings({ "rawtypes", "unchecked" })
579
    @Transactional(readOnly = false)
580
    @Override
581
    public TermDto addNewTerm(TermType termType, UUID parentUUID, boolean isKindOf) {
582
        DefinedTermBase term = termType.getEmptyDefinedTermBase();
583
        dao.save(term);
584
        DefinedTermBase parent = dao.load(parentUUID);
585
        if(isKindOf){
586
            parent.addGeneralizationOf(term);
587
        }
588
        else{
589
            parent.addIncludes(term);
590
        }
591
        parent.getVocabulary().addTerm(term);
592
        dao.saveOrUpdate(parent);
593
        return TermDto.fromTerm(term, true);
594
    }
595

    
596
    @Override
597
    public Collection<TermDto> findByTitleAsDto(String title, TermType termType){
598
        return dao.findByTitleAsDto(title, termType);
599
    }
600

    
601
    public enum TermMovePosition{
602
        BEFORE,
603
        AFTER,
604
        ON
605
    }
606

    
607
}
(98-98/103)