Project

General

Profile

Download (7.38 KB) Statistics
| Branch: | Tag: | Revision:
1 2f72f4da Andreas Müller
/**
2
* Copyright (C) 2009 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 2ef4c225 Andreas Kohlbecker
import java.util.Arrays;
14 2f72f4da Andreas Müller
import java.util.Collection;
15
import java.util.List;
16
import java.util.Map;
17 acdfa184 Andreas Kohlbecker
import java.util.Set;
18 2f72f4da Andreas Müller
import java.util.UUID;
19
20
import javax.persistence.EntityNotFoundException;
21
22
import org.springframework.beans.factory.annotation.Autowired;
23
import org.springframework.stereotype.Service;
24
import org.springframework.transaction.annotation.Transactional;
25
26
import eu.etaxonomy.cdm.api.service.config.NodeDeletionConfigurator.ChildHandling;
27
import eu.etaxonomy.cdm.api.service.config.TermNodeDeletionConfigurator;
28 2ef4c225 Andreas Kohlbecker
import eu.etaxonomy.cdm.api.service.pager.Pager;
29 2f72f4da Andreas Müller
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
30
import eu.etaxonomy.cdm.model.common.CdmBase;
31
import eu.etaxonomy.cdm.model.term.TermNode;
32
import eu.etaxonomy.cdm.model.term.TermTree;
33
import eu.etaxonomy.cdm.model.term.TermType;
34 2ef4c225 Andreas Kohlbecker
import eu.etaxonomy.cdm.persistence.dao.common.Restriction;
35 887eb4d0 Andreas Müller
import eu.etaxonomy.cdm.persistence.dao.term.ITermNodeDao;
36
import eu.etaxonomy.cdm.persistence.dao.term.ITermTreeDao;
37 adf08111 Katja Luther
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
38 3037370e Katja Luther
import eu.etaxonomy.cdm.persistence.dto.TermTreeDto;
39 2f72f4da Andreas Müller
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
40 b820a890 Andreas Müller
import eu.etaxonomy.cdm.persistence.query.OrderHint;
41 2f72f4da Andreas Müller
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
42
43
@Service
44
@Transactional(readOnly = false)
45
public class TermTreeServiceImpl
46 549e8cc5 Andreas Müller
            extends IdentifiableServiceBase<TermTree, ITermTreeDao>
47 2f72f4da Andreas Müller
            implements ITermTreeService {
48
49
    private ITermNodeDao termNodeDao;
50
51
    @Autowired
52
    private ITermNodeService termNodeService;
53
54
    @Override
55
    @Autowired
56 549e8cc5 Andreas Müller
    protected void setDao(ITermTreeDao dao) {
57 2f72f4da Andreas Müller
        this.dao = dao;
58
    }
59
60
    @Autowired
61
    protected void setTermNodeDao(ITermNodeDao termNodeDao) {
62
        this.termNodeDao = termNodeDao;
63
    }
64
65
    @Override
66
    @Transactional(readOnly = false)
67
    public UpdateResult updateCaches(Class<? extends TermTree> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<TermTree> cacheStrategy, IProgressMonitor monitor) {
68
        if (clazz == null){
69
            clazz = TermTree.class;
70
        }
71
        return super.updateCachesImpl(clazz, stepSize, cacheStrategy, monitor);
72
    }
73
74
    @Override
75
    public Map<UUID, TermNode> saveNodesAll(Collection<TermNode> nodeCollection) {
76
        return termNodeDao.saveAll(nodeCollection);
77
    }
78
79
    @Override
80
    public Map<UUID, TermNode> saveOrUpdateNodesAll(Collection<TermNode> nodeCollection) {
81
        return termNodeDao.saveOrUpdateAll(nodeCollection);
82
    }
83
84 adf08111 Katja Luther
85
    @Override
86 0e21282a Katja Luther
    @Transactional(readOnly = false)
87 adf08111 Katja Luther
    public UpdateResult saveOrUpdateTermTreeDtoList(List<TermTreeDto> dtos){
88
        UpdateResult result = new UpdateResult();
89
        MergeResult<TermTree> mergeResult;
90
        List<UUID> uuids = new ArrayList<>();
91
        dtos.stream().forEach(dto -> uuids.add(dto.getUuid()));
92
        List<TermTree> trees = dao.list(uuids, null, 0, null, null);
93
        //check all attributes for changes and adapt
94
        for (TermTree tree: trees){
95
            for (TermTreeDto dto: dtos){
96
97
                if (dto.getUuid().equals(tree.getUuid())){
98 0e21282a Katja Luther
                    tree.setTitleCache(dto.getTitleCache(), true);
99 adf08111 Katja Luther
                    tree.setAllowDuplicates(dto.isAllowDuplicate());
100
                    tree.setFlat(dto.isFlat());
101
                    tree.setOrderRelevant(dto.isOrderRelevant());
102
                }
103
104
                mergeResult = dao.merge(tree, true);
105
                result.addUpdatedObject(mergeResult.getMergedEntity());
106
            }
107
        }
108
        return result;
109
    }
110
111 2f72f4da Andreas Müller
    @Override
112
    public TermTree loadWithNodes(UUID uuid, List<String> propertyPaths, List<String> nodePaths) {
113
114
        if(nodePaths==null){
115
            nodePaths = new ArrayList<>();
116
        }
117
118
        if(!nodePaths.contains("children")) {
119
            nodePaths.add("children");
120
        }
121
122
        List<String> rootPaths = new ArrayList<>();
123
        rootPaths.add("root");
124
        for(String path : nodePaths) {
125
            rootPaths.add("root." + path);
126
        }
127
128
        if(propertyPaths != null) {
129
            rootPaths.addAll(propertyPaths);
130
        }
131
132
        TermTree featureTree = load(uuid, rootPaths);
133
        if(featureTree == null){
134
            throw new EntityNotFoundException("No FeatureTree entity found for " + uuid);
135
        }
136
        dao.deepLoadNodes(featureTree.getRoot().getChildNodes(), nodePaths);
137
        return featureTree;
138
    }
139
140
    /**
141
     * Returns the featureTree specified by the given <code>uuid</code>.
142
     * The specified featureTree either can be one of those stored in the CDM database or can be the
143
     * DefaultFeatureTree (contains all Features in use).
144 b5de83c2 Andreas Müller
     * The uuid of the DefaultFeatureTree is defined in {@link ITermTreeDao#DefaultFeatureTreeUuid}.
145
      *
146 2f72f4da Andreas Müller
     * @see eu.etaxonomy.cdm.api.service.ServiceBase#load(java.util.UUID, java.util.List)
147
     */
148
    @Override
149
    public TermTree load(UUID uuid, List<String> propertyPaths) {
150
        return super.load(uuid, propertyPaths);
151
    }
152
153
    @Override
154 44900eab Andreas Müller
    public DeleteResult delete(UUID treeUuid){
155 2f72f4da Andreas Müller
        DeleteResult result = new DeleteResult();
156 44900eab Andreas Müller
        TermTree<?> tree = dao.load(treeUuid);
157 2f72f4da Andreas Müller
158 44900eab Andreas Müller
        TermNode<?> rootNode = CdmBase.deproxy(tree.getRoot());
159 2f72f4da Andreas Müller
        TermNodeDeletionConfigurator config = new TermNodeDeletionConfigurator();
160
        config.setChildHandling(ChildHandling.DELETE);
161
        result = termNodeService.deleteNode(rootNode.getUuid(), config);
162
        //FIXME test if this is necessary
163
        tree.removeRootNode();
164
        if (result.isOk()){
165
          dao.delete(tree);
166
          result.addDeletedObject(tree);
167
        }
168
        return result;
169
    }
170
171
    @Override
172
    public <S extends TermTree> List<UuidAndTitleCache<S>> getUuidAndTitleCacheByTermType(Class<S> clazz, TermType termType, Integer limit,
173
            String pattern) {
174
        return dao.getUuidAndTitleCacheByTermType(clazz, termType, limit, pattern);
175
    }
176
177 b820a890 Andreas Müller
    @Override
178
    public List<TermTree> list(TermType termType, Integer limit, Integer start, List<OrderHint> orderHints,
179
            List<String> propertyPaths) {
180 19b30c4f Andreas Kohlbecker
        return dao.list(null, buildTermTypeFilterRestrictions(termType), limit, start, orderHints, propertyPaths);
181 b820a890 Andreas Müller
    }
182
183 2ef4c225 Andreas Kohlbecker
    @Override
184
    public Pager<TermTree> page(TermType termType, Integer pageSize, Integer pageIndex, List<OrderHint> orderHints, List<String> propertyPaths) {
185 19b30c4f Andreas Kohlbecker
186
        return page(null, buildTermTypeFilterRestrictions(termType), pageSize, pageIndex, orderHints, propertyPaths);
187
    }
188
189
    @Override
190
    public List<Restriction<?>> buildTermTypeFilterRestrictions(TermType termType) {
191
        List<Restriction<?>> filterRestrictions = null;
192
        if(termType != null){
193 acdfa184 Andreas Kohlbecker
           Set<TermType> termTypes = termType.getGeneralizationOf(true);
194
           termTypes.add(termType);
195
           filterRestrictions = Arrays.asList(new Restriction<>("termType", null, termTypes.toArray()));
196 19b30c4f Andreas Kohlbecker
        }
197
        return filterRestrictions;
198 2ef4c225 Andreas Kohlbecker
    }
199
200 3037370e Katja Luther
    @Override
201
    public List<TermTreeDto> listTermTreeDtosByTermType(TermType termType) {
202
        return dao.listTermTreeDtosByTermType(termType);
203
    }
204
205 4d68581f Katja Luther
    @Override
206
    public TermTreeDto getTermTreeDtoByUuid(UUID uuid) {
207
        return dao.getTermTreeDtosByUuid(uuid);
208
    }
209 2f72f4da Andreas Müller
210
}