ref #1445: improve search for identical names
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / FeatureTreeServiceImpl.java
1 /**
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 import java.util.Collection;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.UUID;
17
18 import javax.persistence.EntityNotFoundException;
19
20 import org.springframework.beans.factory.annotation.Autowired;
21 import org.springframework.stereotype.Service;
22 import org.springframework.transaction.annotation.Transactional;
23
24 import eu.etaxonomy.cdm.api.service.config.NodeDeletionConfigurator.ChildHandling;
25 import eu.etaxonomy.cdm.api.service.config.TermNodeDeletionConfigurator;
26 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
27 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
28 import eu.etaxonomy.cdm.model.term.TermNode;
29 import eu.etaxonomy.cdm.model.term.TermTree;
30 import eu.etaxonomy.cdm.model.term.TermType;
31 import eu.etaxonomy.cdm.persistence.dao.term.ITermNodeDao;
32 import eu.etaxonomy.cdm.persistence.dao.term.ITermTreeDao;
33 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
34 import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
35
36 @Service
37 @Transactional(readOnly = false)
38 public class FeatureTreeServiceImpl extends IdentifiableServiceBase<TermTree, ITermTreeDao> implements IFeatureTreeService {
39
40 private ITermNodeDao termNodeDao;
41
42 @Autowired
43 private IFeatureNodeService featureNodeService;
44
45 @Override
46 @Autowired
47 protected void setDao(ITermTreeDao dao) {
48 this.dao = dao;
49 }
50
51 @Autowired
52 protected void setTermNodeDao(ITermNodeDao termNodeDao) {
53 this.termNodeDao = termNodeDao;
54 }
55
56 @Override
57 @Transactional(readOnly = false)
58 public UpdateResult updateCaches(Class<? extends TermTree> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<TermTree> cacheStrategy, IProgressMonitor monitor) {
59 if (clazz == null){
60 clazz = TermTree.class;
61 }
62 return super.updateCachesImpl(clazz, stepSize, cacheStrategy, monitor);
63 }
64
65 @Override
66 public List<TermNode> getFeatureNodesAll() {
67 return termNodeDao.list();
68 }
69
70 @Override
71 public Map<UUID, TermNode> saveFeatureNodesAll(Collection<TermNode> featureNodeCollection) {
72 return termNodeDao.saveAll(featureNodeCollection);
73 }
74
75 @Override
76 public Map<UUID, TermNode> saveOrUpdateFeatureNodesAll(Collection<TermNode> featureNodeCollection) {
77 return termNodeDao.saveOrUpdateAll(featureNodeCollection);
78 }
79
80 @Override
81 public TermTree loadWithNodes(UUID uuid, List<String> propertyPaths, List<String> nodePaths) {
82
83 if(nodePaths==null){
84 nodePaths = new ArrayList<>();
85 }
86
87 if(!nodePaths.contains("children")) {
88 nodePaths.add("children");
89 }
90
91 List<String> rootPaths = new ArrayList<>();
92 rootPaths.add("root");
93 for(String path : nodePaths) {
94 rootPaths.add("root." + path);
95 }
96
97 if(propertyPaths != null) {
98 rootPaths.addAll(propertyPaths);
99 }
100
101 TermTree featureTree = load(uuid, rootPaths);
102 if(featureTree == null){
103 throw new EntityNotFoundException("No FeatureTree entity found for " + uuid);
104 }
105 dao.deepLoadNodes(featureTree.getRoot().getChildNodes(), nodePaths);
106 return featureTree;
107 }
108
109 /**
110 * Returns the featureTree specified by the given <code>uuid</code>.
111 * The specified featureTree either can be one of those stored in the CDM database or can be the
112 * DefaultFeatureTree (contains all Features in use).
113 * The uuid of the DefaultFeatureTree is defined in {@link IFeatureTreeService#DefaultFeatureTreeUuid}.
114 * The DefaultFeatureTree is also returned if no feature tree at all is stored in the cdm database.
115 *
116 * @see eu.etaxonomy.cdm.api.service.ServiceBase#load(java.util.UUID, java.util.List)
117 */
118 @Override
119 public TermTree load(UUID uuid, List<String> propertyPaths) {
120 return super.load(uuid, propertyPaths);
121 }
122
123 @Override
124 public TermTree createTransientDefaultFeatureTree() {
125 return load(ITermTreeDao.DefaultFeatureTreeUuid);
126 }
127
128 @Override
129 public DeleteResult delete(UUID featureTreeUuid){
130 DeleteResult result = new DeleteResult();
131 TermTree tree = dao.load(featureTreeUuid);
132
133 TermNode rootNode = HibernateProxyHelper.deproxy(tree.getRoot());
134 TermNodeDeletionConfigurator config = new TermNodeDeletionConfigurator();
135 config.setChildHandling(ChildHandling.DELETE);
136 result =featureNodeService.deleteFeatureNode(rootNode.getUuid(), config);
137 //FIXME test if this is necessary
138 tree.removeRootNode();
139 if (result.isOk()){
140 dao.delete(tree);
141 result.addDeletedObject(tree);
142 }
143 return result;
144 }
145
146 @Override
147 public <S extends TermTree> List<UuidAndTitleCache<S>> getUuidAndTitleCacheByTermType(Class<S> clazz, TermType termType, Integer limit,
148 String pattern) {
149 return dao.getUuidAndTitleCacheByTermType(clazz, termType, limit, pattern);
150 }
151 }