2 * Copyright (C) 2007 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
.List
;
15 import java
.util
.UUID
;
17 import org
.apache
.log4j
.Logger
;
18 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
19 import org
.springframework
.stereotype
.Service
;
20 import org
.springframework
.transaction
.annotation
.Transactional
;
22 import eu
.etaxonomy
.cdm
.api
.service
.config
.FeatureNodeDeletionConfigurator
;
23 import eu
.etaxonomy
.cdm
.api
.service
.config
.NodeDeletionConfigurator
.ChildHandling
;
24 import eu
.etaxonomy
.cdm
.api
.service
.exception
.ReferencedObjectUndeletableException
;
25 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
26 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
27 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
28 import eu
.etaxonomy
.cdm
.model
.description
.FeatureNode
;
29 import eu
.etaxonomy
.cdm
.model
.description
.FeatureTree
;
30 import eu
.etaxonomy
.cdm
.persistence
.dao
.description
.IFeatureNodeDao
;
38 @Transactional(readOnly
= false)
39 public class FeatureNodeServiceImpl
extends VersionableServiceBase
<FeatureNode
, IFeatureNodeDao
> implements IFeatureNodeService
{
40 private static final Logger logger
= Logger
.getLogger(FeatureNodeServiceImpl
.class);
44 protected void setDao(IFeatureNodeDao dao
) {
49 private ITermService termService
;
52 @Transactional(readOnly
= false)
53 public DeleteResult
deleteFeatureNode(UUID nodeUuid
, FeatureNodeDeletionConfigurator config
) {
54 DeleteResult result
= new DeleteResult();
55 FeatureNode node
= HibernateProxyHelper
.deproxy(dao
.load(nodeUuid
), FeatureNode
.class);
56 result
= isDeletable(node
, config
);
58 FeatureNode parent
= node
.getParent();
59 parent
= HibernateProxyHelper
.deproxy(parent
, FeatureNode
.class);
60 List
<FeatureNode
> children
= new ArrayList(node
.getChildNodes());
62 if (config
.getChildHandling().equals(ChildHandling
.DELETE
)){
64 for (FeatureNode child
: children
){
65 deleteFeatureNode(child
.getUuid(), config
);
66 // node.removeChild(child);
69 parent
.removeChild(node
);
75 parent
.removeChild(node
);
76 for (FeatureNode child
: children
){
77 node
.removeChild(child
);
78 parent
.addChild(child
);
82 result
.addException(new ReferencedObjectUndeletableException("The root node can not be deleted without its child nodes"));
88 result
.addDeletedObject(node
);
90 result
.addUpdatedObject(parent
);
92 if (config
.isDeleteElement()){
93 DefinedTermBase term
= node
.getTerm();
94 termService
.delete(term
.getUuid());
95 result
.addDeletedObject(term
);
102 public UpdateResult
createChildFeatureNode(FeatureNode node
, DefinedTermBase term
){
103 term
= termService
.save(term
);
104 return addChildFeatureNode(node
, term
);
108 public UpdateResult
addChildFeatureNode(FeatureNode node
, DefinedTermBase featureChild
){
109 return addChildFeatureNode(node
, featureChild
, 0);
113 public UpdateResult
addChildFeatureNode(UUID nodeUUID
, UUID termChildUuid
){
114 return addChildFeatureNode(nodeUUID
, termChildUuid
, 0);
118 public UpdateResult
addChildFeatureNode(UUID nodeUUID
, UUID termChildUuid
, int position
){
119 FeatureNode node
= load(nodeUUID
);
120 DefinedTermBase child
= HibernateProxyHelper
.deproxy(termService
.load(termChildUuid
), DefinedTermBase
.class);
121 return addChildFeatureNode(node
, child
, position
);
125 public UpdateResult
addChildFeatureNode(FeatureNode node
, DefinedTermBase term
, int position
){
126 FeatureNode childNode
= FeatureNode
.NewInstance(term
);
127 UpdateResult result
= new UpdateResult();
129 node
.addChild(childNode
);
132 node
.addChild(childNode
, position
);
135 result
.addUpdatedObject(node
);
136 result
.setCdmEntity(childNode
);
141 public DeleteResult
isDeletable(FeatureNode node
, FeatureNodeDeletionConfigurator config
){
142 DeleteResult result
= new DeleteResult();
143 Set
<CdmBase
> references
= commonService
.getReferencingObjectsForDeletion(node
);
144 for (CdmBase ref
:references
){
145 if (ref
instanceof FeatureNode
){
148 if (ref
instanceof FeatureTree
){
149 FeatureTree refTree
= HibernateProxyHelper
.deproxy(ref
, FeatureTree
.class);
150 if (node
.getFeatureTree().equals((refTree
))){
155 result
.addException(new ReferencedObjectUndeletableException("The featureNode is referenced by " + ref
.getUserFriendlyDescription() +" with id " +ref
.getId()));
165 public UpdateResult
moveFeatureNode(UUID movedNodeUuid
, UUID targetNodeUuid
, int position
) {
166 UpdateResult result
= new UpdateResult();
167 FeatureNode movedNode
= HibernateProxyHelper
.deproxy(load(movedNodeUuid
), FeatureNode
.class);
168 FeatureNode targetNode
= HibernateProxyHelper
.deproxy(load(targetNodeUuid
), FeatureNode
.class);
169 FeatureNode parent
= HibernateProxyHelper
.deproxy(movedNode
.getParent(), FeatureNode
.class);
171 targetNode
.addChild(movedNode
);
174 targetNode
.addChild(movedNode
, position
);
176 result
.addUpdatedObject(targetNode
);
178 result
.addUpdatedObject(parent
);
180 result
.setCdmEntity(movedNode
);
188 public UpdateResult
moveFeatureNode(UUID movedNodeUuid
, UUID targetNodeUuid
) {
189 return moveFeatureNode(movedNodeUuid
, targetNodeUuid
, -1);