2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.api
.service
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Arrays
;
14 import java
.util
.Collection
;
15 import java
.util
.List
;
18 import java
.util
.UUID
;
20 import javax
.persistence
.EntityNotFoundException
;
22 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
23 import org
.springframework
.stereotype
.Service
;
24 import org
.springframework
.transaction
.annotation
.Transactional
;
26 import eu
.etaxonomy
.cdm
.api
.service
.config
.NodeDeletionConfigurator
.ChildHandling
;
27 import eu
.etaxonomy
.cdm
.api
.service
.config
.TermNodeDeletionConfigurator
;
28 import eu
.etaxonomy
.cdm
.api
.service
.pager
.Pager
;
29 import eu
.etaxonomy
.cdm
.common
.monitor
.IProgressMonitor
;
30 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
31 import eu
.etaxonomy
.cdm
.model
.term
.TermNode
;
32 import eu
.etaxonomy
.cdm
.model
.term
.TermTree
;
33 import eu
.etaxonomy
.cdm
.model
.term
.TermType
;
34 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.Restriction
;
35 import eu
.etaxonomy
.cdm
.persistence
.dao
.term
.ITermNodeDao
;
36 import eu
.etaxonomy
.cdm
.persistence
.dao
.term
.ITermTreeDao
;
37 import eu
.etaxonomy
.cdm
.persistence
.dto
.MergeResult
;
38 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermTreeDto
;
39 import eu
.etaxonomy
.cdm
.persistence
.dto
.UuidAndTitleCache
;
40 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
41 import eu
.etaxonomy
.cdm
.strategy
.cache
.common
.IIdentifiableEntityCacheStrategy
;
44 @Transactional(readOnly
= false)
45 public class TermTreeServiceImpl
46 extends IdentifiableServiceBase
<TermTree
, ITermTreeDao
>
47 implements ITermTreeService
{
49 private ITermNodeDao termNodeDao
;
52 private ITermNodeService termNodeService
;
56 protected void setDao(ITermTreeDao dao
) {
61 protected void setTermNodeDao(ITermNodeDao termNodeDao
) {
62 this.termNodeDao
= termNodeDao
;
66 @Transactional(readOnly
= false)
67 public UpdateResult
updateCaches(Class
<?
extends TermTree
> clazz
, Integer stepSize
, IIdentifiableEntityCacheStrategy
<TermTree
> cacheStrategy
, IProgressMonitor monitor
) {
69 clazz
= TermTree
.class;
71 return super.updateCachesImpl(clazz
, stepSize
, cacheStrategy
, monitor
);
75 public Map
<UUID
, TermNode
> saveNodesAll(Collection
<TermNode
> nodeCollection
) {
76 return termNodeDao
.saveAll(nodeCollection
);
80 public Map
<UUID
, TermNode
> saveOrUpdateNodesAll(Collection
<TermNode
> nodeCollection
) {
81 return termNodeDao
.saveOrUpdateAll(nodeCollection
);
86 @Transactional(readOnly
= false)
87 public UpdateResult
saveOrUpdateTermTreeDtoList(List
<TermTreeDto
> dtos
){
88 UpdateResult result
= new UpdateResult();
89 MergeResult
<TermTree
> mergeResult
;
90 List
<UUID
> uuids
= new ArrayList
<>();
91 dtos
.stream().forEach(dto
-> uuids
.add(dto
.getUuid()));
92 List
<TermTree
> trees
= dao
.list(uuids
, null, 0, null, null);
93 //check all attributes for changes and adapt
94 for (TermTree tree
: trees
){
95 for (TermTreeDto dto
: dtos
){
97 if (dto
.getUuid().equals(tree
.getUuid())){
98 tree
.setTitleCache(dto
.getTitleCache(), true);
99 tree
.setAllowDuplicates(dto
.isAllowDuplicate());
100 tree
.setFlat(dto
.isFlat());
101 tree
.setOrderRelevant(dto
.isOrderRelevant());
104 mergeResult
= dao
.merge(tree
, true);
105 result
.addUpdatedObject(mergeResult
.getMergedEntity());
112 public TermTree
loadWithNodes(UUID uuid
, List
<String
> propertyPaths
, List
<String
> nodePaths
) {
115 nodePaths
= new ArrayList
<>();
118 if(!nodePaths
.contains("children")) {
119 nodePaths
.add("children");
122 List
<String
> rootPaths
= new ArrayList
<>();
123 rootPaths
.add("root");
124 for(String path
: nodePaths
) {
125 rootPaths
.add("root." + path
);
128 if(propertyPaths
!= null) {
129 rootPaths
.addAll(propertyPaths
);
132 TermTree featureTree
= load(uuid
, rootPaths
);
133 if(featureTree
== null){
134 throw new EntityNotFoundException("No FeatureTree entity found for " + uuid
);
136 dao
.deepLoadNodes(featureTree
.getRoot().getChildNodes(), nodePaths
);
141 * Returns the featureTree specified by the given <code>uuid</code>.
142 * The specified featureTree either can be one of those stored in the CDM database or can be the
143 * DefaultFeatureTree (contains all Features in use).
144 * The uuid of the DefaultFeatureTree is defined in {@link ITermTreeDao#DefaultFeatureTreeUuid}.
146 * @see eu.etaxonomy.cdm.api.service.ServiceBase#load(java.util.UUID, java.util.List)
149 public TermTree
load(UUID uuid
, List
<String
> propertyPaths
) {
150 return super.load(uuid
, propertyPaths
);
154 public DeleteResult
delete(UUID treeUuid
){
155 DeleteResult result
= new DeleteResult();
156 TermTree
<?
> tree
= dao
.load(treeUuid
);
158 TermNode
<?
> rootNode
= CdmBase
.deproxy(tree
.getRoot());
159 TermNodeDeletionConfigurator config
= new TermNodeDeletionConfigurator();
160 config
.setChildHandling(ChildHandling
.DELETE
);
161 result
= termNodeService
.deleteNode(rootNode
.getUuid(), config
);
162 //FIXME test if this is necessary
163 tree
.removeRootNode();
166 result
.addDeletedObject(tree
);
172 public <S
extends TermTree
> List
<UuidAndTitleCache
<S
>> getUuidAndTitleCacheByTermType(Class
<S
> clazz
, TermType termType
, Integer limit
,
174 return dao
.getUuidAndTitleCacheByTermType(clazz
, termType
, limit
, pattern
);
178 public List
<TermTree
> list(TermType termType
, Integer limit
, Integer start
, List
<OrderHint
> orderHints
,
179 List
<String
> propertyPaths
) {
180 return dao
.list(null, buildTermTypeFilterRestrictions(termType
), limit
, start
, orderHints
, propertyPaths
);
184 public Pager
<TermTree
> page(TermType termType
, Integer pageSize
, Integer pageIndex
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
186 return page(null, buildTermTypeFilterRestrictions(termType
), pageSize
, pageIndex
, orderHints
, propertyPaths
);
190 public List
<Restriction
<?
>> buildTermTypeFilterRestrictions(TermType termType
) {
191 List
<Restriction
<?
>> filterRestrictions
= null;
192 if(termType
!= null){
193 Set
<TermType
> termTypes
= termType
.getGeneralizationOf(true);
194 termTypes
.add(termType
);
195 filterRestrictions
= Arrays
.asList(new Restriction
<>("termType", null, termTypes
.toArray()));
197 return filterRestrictions
;
201 public List
<TermTreeDto
> listTermTreeDtosByTermType(TermType termType
) {
202 return dao
.listTermTreeDtosByTermType(termType
);
206 public TermTreeDto
getTermTreeDtoByUuid(UUID uuid
) {
207 return dao
.getTermTreeDtosByUuid(uuid
);