ref #6694 Add service method to add child features
[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 if(parent!=null){
90 result.addUpdatedObject(parent);
91 }
92 if (config.isDeleteElement()){
93 feature = node.getFeature();
94 termService.delete(feature.getUuid());
95 }
96 }
97 return result;
98 }
99
100 @Override
101 public UpdateResult addChildFeaturNode(FeatureNode node, Feature featureChild){
102 return addChildFeaturNode(node.getUuid(), featureChild.getUuid());
103 }
104
105 @Override
106 public UpdateResult addChildFeaturNode(UUID nodeUUID, UUID featureChildUuid){
107 FeatureNode node = load(nodeUUID);
108 Feature child = HibernateProxyHelper.deproxy(termService.load(featureChildUuid), Feature.class);
109 UpdateResult result = new UpdateResult();
110 FeatureNode childNode = FeatureNode.NewInstance(child);
111 save(childNode);
112 node.addChild(childNode);
113 result.addUpdatedObject(node);
114 return result;
115 }
116
117 @Override
118 public DeleteResult isDeletable(FeatureNode node, FeatureNodeDeletionConfigurator config){
119 DeleteResult result = new DeleteResult();
120 Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(node);
121 for (CdmBase ref:references){
122 if (ref instanceof FeatureNode){
123 break;
124 }
125 if (ref instanceof FeatureTree){
126 FeatureTree refTree = HibernateProxyHelper.deproxy(ref, FeatureTree.class);
127 if (node.getFeatureTree().equals((refTree))){
128 break;
129 }
130 }
131 result.setAbort();
132 result.addException(new ReferencedObjectUndeletableException("The featureNode is referenced by " + ref.getUserFriendlyDescription() +" with id " +ref.getId()));
133
134 }
135 return result;
136 }
137
138 /**
139 * {@inheritDoc}
140 */
141 @Override
142 public UpdateResult moveFeatureNode(UUID movedNodeUuid, UUID targetNodeUuid, int position) {
143 UpdateResult result = new UpdateResult();
144 FeatureNode movedNode = HibernateProxyHelper.deproxy(load(movedNodeUuid), FeatureNode.class);
145 FeatureNode targetNode = HibernateProxyHelper.deproxy(load(targetNodeUuid), FeatureNode.class);
146 FeatureNode parent = HibernateProxyHelper.deproxy(movedNode.getParent(), FeatureNode.class);
147 if(position<0){
148 targetNode.addChild(movedNode);
149 }
150 else{
151 targetNode.addChild(movedNode, position);
152 }
153 result.addUpdatedObject(targetNode);
154 saveOrUpdate(targetNode);
155 saveOrUpdate(movedNode);
156 if(parent!=null){
157 result.addUpdatedObject(parent);
158 saveOrUpdate(parent);
159 }
160 result.setCdmEntity(targetNode.getFeatureTree());
161 return result;
162 }
163
164 /**
165 * {@inheritDoc}
166 */
167 @Override
168 public UpdateResult moveFeatureNode(UUID movedNodeUuid, UUID targetNodeUuid) {
169 return moveFeatureNode(movedNodeUuid, targetNodeUuid, -1);
170 }
171
172 }