Project

General

Profile

Download (6 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(22-22/101)