adapted deleteResult
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / FeatureNodeServiceImpl.java
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.util.ArrayList;
13 import java.util.List;
14 import java.util.Set;
15 import java.util.UUID;
16
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;
21
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;
31
32 /**
33 * @author n.hoffmann
34 * @created Aug 5, 2010
35 * @version 1.0
36 */
37 @Service
38 @Transactional(readOnly = false)
39 public class FeatureNodeServiceImpl extends VersionableServiceBase<FeatureNode, IFeatureNodeDao> implements IFeatureNodeService {
40 private static final Logger logger = Logger.getLogger(FeatureNodeServiceImpl.class);
41
42 @Override
43 @Autowired
44 protected void setDao(IFeatureNodeDao dao) {
45 this.dao = dao;
46 }
47
48 @Autowired
49 private ITermService termService;
50
51 @Override
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);
57 Feature feature;
58 if (result.isOk()){
59 FeatureNode parent = node.getParent();
60 parent = HibernateProxyHelper.deproxy(parent, FeatureNode.class);
61 List<FeatureNode> children = new ArrayList(node.getChildNodes());
62
63 if (config.getChildHandling().equals(ChildHandling.DELETE)){
64
65 for (FeatureNode child: children){
66 deleteFeatureNode(child.getUuid(), config);
67 // node.removeChild(child);
68 }
69 if (parent != null){
70 parent.removeChild(node);
71 }
72
73 } else{
74
75 if (parent != null){
76 parent.removeChild(node);
77 for (FeatureNode child: children){
78 node.removeChild(child);
79 parent.addChild(child);
80 }
81 }else{
82 result.setAbort();
83 result.addException(new ReferencedObjectUndeletableException("The root node can not be deleted without its child nodes"));
84 return result;
85 }
86 }
87
88 dao.delete(node);
89 result.addDeletedObject(node);
90 if(parent!=null){
91 result.addUpdatedObject(parent);
92 }
93 if (config.isDeleteElement()){
94 feature = node.getFeature();
95 termService.delete(feature.getUuid());
96 result.addDeletedObject(feature);
97 }
98 }
99 return result;
100 }
101
102 @Override
103 public UpdateResult addChildFeatureNode(FeatureNode node, Feature featureChild){
104 UpdateResult result = new UpdateResult();
105 FeatureNode childNode = FeatureNode.NewInstance(featureChild);
106 save(childNode);
107 node.addChild(childNode);
108 result.addUpdatedObject(node);
109 return result;
110 }
111
112 @Override
113 public UpdateResult addChildFeatureNode(UUID nodeUUID, UUID featureChildUuid){
114 FeatureNode node = load(nodeUUID);
115 Feature child = HibernateProxyHelper.deproxy(termService.load(featureChildUuid), Feature.class);
116 return addChildFeatureNode(node, child);
117 }
118
119 @Override
120 public DeleteResult isDeletable(FeatureNode node, FeatureNodeDeletionConfigurator config){
121 DeleteResult result = new DeleteResult();
122 Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(node);
123 for (CdmBase ref:references){
124 if (ref instanceof FeatureNode){
125 break;
126 }
127 if (ref instanceof FeatureTree){
128 FeatureTree refTree = HibernateProxyHelper.deproxy(ref, FeatureTree.class);
129 if (node.getFeatureTree().equals((refTree))){
130 break;
131 }
132 }
133 result.setAbort();
134 result.addException(new ReferencedObjectUndeletableException("The featureNode is referenced by " + ref.getUserFriendlyDescription() +" with id " +ref.getId()));
135
136 }
137 return result;
138 }
139
140 /**
141 * {@inheritDoc}
142 */
143 @Override
144 public UpdateResult moveFeatureNode(UUID movedNodeUuid, UUID targetNodeUuid, int position) {
145 UpdateResult result = new UpdateResult();
146 FeatureNode movedNode = HibernateProxyHelper.deproxy(load(movedNodeUuid), FeatureNode.class);
147 FeatureNode targetNode = HibernateProxyHelper.deproxy(load(targetNodeUuid), FeatureNode.class);
148 FeatureNode parent = HibernateProxyHelper.deproxy(movedNode.getParent(), FeatureNode.class);
149 if(position<0){
150 targetNode.addChild(movedNode);
151 }
152 else{
153 targetNode.addChild(movedNode, position);
154 }
155 result.addUpdatedObject(targetNode);
156 saveOrUpdate(targetNode);
157 saveOrUpdate(movedNode);
158 if(parent!=null){
159 result.addUpdatedObject(parent);
160 saveOrUpdate(parent);
161 }
162 result.setCdmEntity(targetNode.getFeatureTree());
163 return result;
164 }
165
166 /**
167 * {@inheritDoc}
168 */
169 @Override
170 public UpdateResult moveFeatureNode(UUID movedNodeUuid, UUID targetNodeUuid) {
171 return moveFeatureNode(movedNodeUuid, targetNodeUuid, -1);
172 }
173
174 }