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
.description
.Feature
;
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
);
59 FeatureNode parent
= node
.getParent();
60 parent
= HibernateProxyHelper
.deproxy(parent
, FeatureNode
.class);
61 List
<FeatureNode
> children
= new ArrayList(node
.getChildNodes());
63 if (config
.getChildHandling().equals(ChildHandling
.DELETE
)){
65 for (FeatureNode child
: children
){
66 deleteFeatureNode(child
.getUuid(), config
);
67 // node.removeChild(child);
70 parent
.removeChild(node
);
76 parent
.removeChild(node
);
77 for (FeatureNode child
: children
){
78 node
.removeChild(child
);
79 parent
.addChild(child
);
83 result
.addException(new ReferencedObjectUndeletableException("The root node can not be deleted without its child nodes"));
89 result
.addDeletedObject(node
);
91 result
.addUpdatedObject(parent
);
93 if (config
.isDeleteElement()){
94 feature
= node
.getFeature();
95 termService
.delete(feature
.getUuid());
96 result
.addDeletedObject(feature
);
103 public UpdateResult
createChildFeatureNode(FeatureNode node
, Feature featureChild
){
104 Feature feature
= (Feature
) termService
.save(featureChild
);
105 return addChildFeatureNode(node
, feature
);
109 public UpdateResult
addChildFeatureNode(FeatureNode node
, Feature featureChild
){
110 return addChildFeatureNode(node
, featureChild
, 0);
114 public UpdateResult
addChildFeatureNode(UUID nodeUUID
, UUID featureChildUuid
){
115 return addChildFeatureNode(nodeUUID
, featureChildUuid
, 0);
119 public UpdateResult
addChildFeatureNode(UUID nodeUUID
, UUID featureChildUuid
, int position
){
120 FeatureNode node
= load(nodeUUID
);
121 Feature child
= HibernateProxyHelper
.deproxy(termService
.load(featureChildUuid
), Feature
.class);
122 return addChildFeatureNode(node
, child
, position
);
126 public UpdateResult
addChildFeatureNode(FeatureNode node
, Feature featureChild
, int position
){
127 FeatureNode childNode
= FeatureNode
.NewInstance(featureChild
);
128 UpdateResult result
= new UpdateResult();
130 node
.addChild(childNode
);
133 node
.addChild(childNode
, position
);
136 result
.addUpdatedObject(node
);
137 result
.setCdmEntity(childNode
);
142 public DeleteResult
isDeletable(FeatureNode node
, FeatureNodeDeletionConfigurator config
){
143 DeleteResult result
= new DeleteResult();
144 Set
<CdmBase
> references
= commonService
.getReferencingObjectsForDeletion(node
);
145 for (CdmBase ref
:references
){
146 if (ref
instanceof FeatureNode
){
149 if (ref
instanceof FeatureTree
){
150 FeatureTree refTree
= HibernateProxyHelper
.deproxy(ref
, FeatureTree
.class);
151 if (node
.getFeatureTree().equals((refTree
))){
156 result
.addException(new ReferencedObjectUndeletableException("The featureNode is referenced by " + ref
.getUserFriendlyDescription() +" with id " +ref
.getId()));
166 public UpdateResult
moveFeatureNode(UUID movedNodeUuid
, UUID targetNodeUuid
, int position
) {
167 UpdateResult result
= new UpdateResult();
168 FeatureNode movedNode
= HibernateProxyHelper
.deproxy(load(movedNodeUuid
), FeatureNode
.class);
169 FeatureNode targetNode
= HibernateProxyHelper
.deproxy(load(targetNodeUuid
), FeatureNode
.class);
170 FeatureNode parent
= HibernateProxyHelper
.deproxy(movedNode
.getParent(), FeatureNode
.class);
172 targetNode
.addChild(movedNode
);
175 targetNode
.addChild(movedNode
, position
);
177 result
.addUpdatedObject(targetNode
);
179 result
.addUpdatedObject(parent
);
181 result
.setCdmEntity(movedNode
);
189 public UpdateResult
moveFeatureNode(UUID movedNodeUuid
, UUID targetNodeUuid
) {
190 return moveFeatureNode(movedNodeUuid
, targetNodeUuid
, -1);