cleanup
[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 * @since 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 createChildFeatureNode(FeatureNode node, Feature featureChild){
104 Feature feature = (Feature) termService.save(featureChild);
105 return addChildFeatureNode(node, feature);
106 }
107
108 @Override
109 public UpdateResult addChildFeatureNode(FeatureNode node, Feature featureChild){
110 return addChildFeatureNode(node, featureChild, 0);
111 }
112
113 @Override
114 public UpdateResult addChildFeatureNode(UUID nodeUUID, UUID featureChildUuid){
115 return addChildFeatureNode(nodeUUID, featureChildUuid, 0);
116 }
117
118 @Override
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);
123 }
124
125 @Override
126 public UpdateResult addChildFeatureNode(FeatureNode node, Feature featureChild, int position){
127 FeatureNode childNode = FeatureNode.NewInstance(featureChild);
128 UpdateResult result = new UpdateResult();
129 if(position<0) {
130 node.addChild(childNode);
131 }
132 else{
133 node.addChild(childNode, position);
134 }
135 save(childNode);
136 result.addUpdatedObject(node);
137 result.setCdmEntity(childNode);
138 return result;
139 }
140
141 @Override
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){
147 break;
148 }
149 if (ref instanceof FeatureTree){
150 FeatureTree refTree = HibernateProxyHelper.deproxy(ref, FeatureTree.class);
151 if (node.getFeatureTree().equals((refTree))){
152 break;
153 }
154 }
155 result.setAbort();
156 result.addException(new ReferencedObjectUndeletableException("The featureNode is referenced by " + ref.getUserFriendlyDescription() +" with id " +ref.getId()));
157
158 }
159 return result;
160 }
161
162 /**
163 * {@inheritDoc}
164 */
165 @Override
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);
171 if(position<0){
172 targetNode.addChild(movedNode);
173 }
174 else{
175 targetNode.addChild(movedNode, position);
176 }
177 result.addUpdatedObject(targetNode);
178 if(parent!=null){
179 result.addUpdatedObject(parent);
180 }
181 result.setCdmEntity(movedNode);
182 return result;
183 }
184
185 /**
186 * {@inheritDoc}
187 */
188 @Override
189 public UpdateResult moveFeatureNode(UUID movedNodeUuid, UUID targetNodeUuid) {
190 return moveFeatureNode(movedNodeUuid, targetNodeUuid, -1);
191 }
192
193 }