Project

General

Profile

Download (6.45 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.NodeDeletionConfigurator.ChildHandling;
23
import eu.etaxonomy.cdm.api.service.config.TermNodeDeletionConfigurator;
24
import eu.etaxonomy.cdm.api.service.exception.DataChangeNoRollbackException;
25
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
26
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
27
import eu.etaxonomy.cdm.model.common.CdmBase;
28
import eu.etaxonomy.cdm.model.description.Feature;
29
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
30
import eu.etaxonomy.cdm.model.term.TermNode;
31
import eu.etaxonomy.cdm.model.term.TermTree;
32
import eu.etaxonomy.cdm.persistence.dao.term.ITermNodeDao;
33

    
34
/**
35
 * @author n.hoffmann
36
 * @since Aug 5, 2010
37
 */
38
@Service
39
@Transactional(readOnly = false)
40
public class FeatureNodeServiceImpl extends VersionableServiceBase<TermNode, ITermNodeDao> implements IFeatureNodeService {
41

    
42
    @SuppressWarnings("unused")
43
    private static final Logger logger = Logger.getLogger(FeatureNodeServiceImpl.class);
44

    
45
	@Override
46
    @Autowired
47
	protected void setDao(ITermNodeDao dao) {
48
		this.dao = dao;
49
	}
50

    
51
	@Autowired
52
    private ITermService termService;
53

    
54
	@Autowired
55
	private IVocabularyService vocabularyService;
56

    
57
	 @Override
58
	 @Transactional(readOnly = false)
59
	 public DeleteResult deleteFeatureNode(UUID nodeUuid, TermNodeDeletionConfigurator config) {
60
	     DeleteResult result = new DeleteResult();
61
	     TermNode<Feature> node = dao.load(nodeUuid);
62
	     result = isDeletable(nodeUuid, config);
63

    
64
	     if (result.isOk()){
65
	         node = HibernateProxyHelper.deproxy(node);
66
	         TermNode<Feature> parent = node.getParent();
67
             parent = CdmBase.deproxy(parent);
68
	         List<TermNode<Feature>> children = new ArrayList<>(node.getChildNodes());
69

    
70
	         if (config.getChildHandling().equals(ChildHandling.DELETE)){
71

    
72
	             for (TermNode<Feature> child: children){
73
	                 deleteFeatureNode(child.getUuid(), config);
74
	                // node.removeChild(child);
75
	             }
76
	             if (parent != null){
77
	                 parent.removeChild(node);
78
	             }
79

    
80
	         } else{
81

    
82
	             if (parent != null){
83
	                 parent.removeChild(node);
84
	                 for (TermNode<Feature> child: children){
85
	                     node.removeChild(child);
86
	                     parent.addChild(child);
87
	                 }
88
	             }else{
89
	                 result.setAbort();
90
	                 result.addException(new ReferencedObjectUndeletableException("The root node can not be deleted without its child nodes"));
91
	                 return result;
92
	             }
93
	         }
94

    
95
	         dao.delete(node);
96
	         result.addDeletedObject(node);
97
	         if(parent!=null){
98
	             result.addUpdatedObject(parent);
99
	         }
100
	         if (config.isDeleteElement()){
101
	             DefinedTermBase<?> term = node.getTerm();
102
                 termService.delete(term.getUuid());
103
                 result.addDeletedObject(term);
104
             }
105
	     }
106
	     return result;
107
	 }
108

    
109

    
110

    
111

    
112
     @Override
113
     public UpdateResult addChildFeatureNode(UUID nodeUUID, UUID termChildUuid){
114
         return addChildFeatureNode(nodeUUID, termChildUuid, 0);
115
     }
116

    
117
	 @Override
118
	 public UpdateResult addChildFeatureNode(UUID nodeUUID, UUID termChildUuid, int position){
119
	     TermNode node = load(nodeUUID);
120
	     DefinedTermBase child = HibernateProxyHelper.deproxy(termService.load(termChildUuid), DefinedTermBase.class);
121

    
122
	     TermNode childNode;
123
         UpdateResult result = new UpdateResult();
124
         if(position<0) {
125
             childNode = node.addChild(child);
126
         }
127
         else{
128
             childNode = node.addChild(child, position);
129
         }
130
         save(childNode);
131
         result.addUpdatedObject(node);
132
         result.setCdmEntity(childNode);
133
         return result;
134
     }
135

    
136
	 @Override
137
	 public DeleteResult isDeletable(UUID nodeUuid, TermNodeDeletionConfigurator config){
138
	     TermNode<Feature> node = load(nodeUuid);
139
	     DeleteResult result = new DeleteResult();
140
	     if (node == null){
141
	         result.addException(new DataChangeNoRollbackException("The object is not available anymore."));
142
	         result.setAbort();
143
	         return result;
144
	     }
145
	     Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(node);
146
	     for (CdmBase ref:references){
147
	         if (ref instanceof TermNode){
148
	             break;
149
	         }
150
	         if (ref instanceof TermTree){
151
	             TermTree<Feature> refTree = HibernateProxyHelper.deproxy(ref, TermTree.class);
152
	             if (node.getGraph().equals((refTree))){
153
	                 break;
154
	             }
155
	         }
156
	         result.setAbort();
157
	         result.addException(new ReferencedObjectUndeletableException("The featureNode is referenced by " + ref.getUserFriendlyDescription() +" with id " +ref.getId()));
158

    
159
	     }
160
	     return result;
161
	 }
162

    
163
    /**
164
     * {@inheritDoc}
165
     */
166
    @Override
167
    public UpdateResult moveFeatureNode(UUID movedNodeUuid, UUID targetNodeUuid, int position) {
168
        UpdateResult result = new UpdateResult();
169
        TermNode<Feature> movedNode = HibernateProxyHelper.deproxy(load(movedNodeUuid), TermNode.class);
170
        TermNode<Feature> targetNode = HibernateProxyHelper.deproxy(load(targetNodeUuid), TermNode.class);
171
        TermNode<Feature> parent = HibernateProxyHelper.deproxy(movedNode.getParent(), TermNode.class);
172
        if(position<0){
173
            targetNode.addChild(movedNode);
174
        }
175
        else{
176
            targetNode.addChild(movedNode, position);
177
        }
178
        result.addUpdatedObject(targetNode);
179
        if(parent!=null){
180
            result.addUpdatedObject(parent);
181
        }
182
        result.setCdmEntity(movedNode);
183
        return result;
184
    }
185

    
186
    /**
187
     * {@inheritDoc}
188
     */
189
    @Override
190
    public UpdateResult moveFeatureNode(UUID movedNodeUuid, UUID targetNodeUuid) {
191
        return moveFeatureNode(movedNodeUuid, targetNodeUuid, -1);
192
    }
193

    
194

    
195

    
196

    
197
}
(18-18/100)