*\r
* The contents of this file are subject to the Mozilla Public License Version 1.1\r
* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/ \r
+*/\r
\r
package eu.etaxonomy.cdm.api.service;\r
\r
import java.util.Map;\r
import java.util.UUID;\r
\r
+import javax.persistence.EntityNotFoundException;\r
+\r
import org.springframework.beans.factory.annotation.Autowired;\r
import org.springframework.stereotype.Service;\r
-import org.springframework.transaction.annotation.Propagation;\r
import org.springframework.transaction.annotation.Transactional;\r
\r
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;\r
-import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
-import eu.etaxonomy.cdm.model.common.VocabularyEnum;\r
-import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
-import eu.etaxonomy.cdm.model.description.Feature;\r
import eu.etaxonomy.cdm.model.description.FeatureNode;\r
import eu.etaxonomy.cdm.model.description.FeatureTree;\r
import eu.etaxonomy.cdm.persistence.dao.description.IFeatureNodeDao;\r
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;\r
\r
@Service\r
-@Transactional(propagation = Propagation.SUPPORTS, readOnly = false)\r
+@Transactional(readOnly = false)\r
public class FeatureTreeServiceImpl extends IdentifiableServiceBase<FeatureTree, IFeatureTreeDao> implements IFeatureTreeService {\r
\r
- private IFeatureNodeDao featureNodeDao;\r
- \r
- @Autowired\r
- private IVocabularyService vocabularyService;\r
- \r
- @Autowired\r
- protected void setDao(IFeatureTreeDao dao) {\r
- this.dao = dao;\r
- }\r
- \r
- @Autowired\r
- protected void setFeatureNodeDao(IFeatureNodeDao featureNodeDao) {\r
- this.featureNodeDao = featureNodeDao;\r
- }\r
-\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)\r
- */\r
- @Override\r
- public void updateTitleCache(Class<? extends FeatureTree> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<FeatureTree> cacheStrategy, IProgressMonitor monitor) {\r
- if (clazz == null){\r
- clazz = FeatureTree.class;\r
- }\r
- super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);\r
- }\r
-\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#getFeatureNodesAll()\r
- */\r
- public List<FeatureNode> getFeatureNodesAll() {\r
- return featureNodeDao.list();\r
- }\r
- \r
- /*\r
- * (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#saveFeatureNodesAll(java.util.Collection)\r
- */\r
- public Map<UUID, FeatureNode> saveFeatureNodesAll(Collection<FeatureNode> featureNodeCollection) {\r
- return featureNodeDao.saveAll(featureNodeCollection);\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#saveOrUpdateFeatureNodesAll(java.util.Collection)\r
- */\r
- public Map<UUID, FeatureNode> saveOrUpdateFeatureNodesAll(Collection<FeatureNode> featureNodeCollection) {\r
- return featureNodeDao.saveOrUpdateAll(featureNodeCollection);\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#loadWithNodes(java.util.UUID, java.util.List, java.util.List)\r
- */\r
- public FeatureTree loadWithNodes(UUID uuid, List<String> propertyPaths, List<String> nodePaths) {\r
- nodePaths.add("children");\r
- \r
- List<String> rootPaths = new ArrayList<String>();\r
- rootPaths.add("root");\r
- for(String path : nodePaths) {\r
- rootPaths.add("root." + path);\r
- }\r
- \r
- if(propertyPaths != null) { \r
- rootPaths.addAll(propertyPaths);\r
- }\r
- \r
- FeatureTree featureTree = load(uuid, rootPaths);\r
- dao.loadNodes(featureTree.getRoot(),nodePaths);\r
- return featureTree;\r
- }\r
- \r
- /**\r
- * Returns the featureTree specified by the given <code>uuid</code>.\r
- * The specified featureTree either can be one of those stored in the CDM database or can be the \r
- * DefaultFeatureTree (contains all Features in use). \r
- * The uuid of the DefaultFeatureTree is defined in {@link IFeatureTreeService#DefaultFeatureTreeUuid}.\r
- * The DefaultFeatureTree is also returned if no feature tree at all is stored in the cdm database.\r
- * \r
- * @see eu.etaxonomy.cdm.api.service.ServiceBase#load(java.util.UUID, java.util.List)\r
- */\r
- @Override\r
- public FeatureTree load(UUID uuid, List<String> propertyPaths) {\r
- return super.load(uuid, propertyPaths);\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#createTransientDefaultFeatureTree()\r
- */\r
- @Override\r
- public FeatureTree createTransientDefaultFeatureTree() {\r
- return load(IFeatureTreeDao.DefaultFeatureTreeUuid);\r
- }\r
-\r
- \r
- \r
+ private IFeatureNodeDao featureNodeDao;\r
+\r
+ @Autowired\r
+ private IVocabularyService vocabularyService;\r
+\r
+ @Override\r
+ @Autowired\r
+ protected void setDao(IFeatureTreeDao dao) {\r
+ this.dao = dao;\r
+ }\r
+\r
+ @Autowired\r
+ protected void setFeatureNodeDao(IFeatureNodeDao featureNodeDao) {\r
+ this.featureNodeDao = featureNodeDao;\r
+ }\r
+\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)\r
+ */\r
+ @Override\r
+ @Transactional(readOnly = false)\r
+ public void updateTitleCache(Class<? extends FeatureTree> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<FeatureTree> cacheStrategy, IProgressMonitor monitor) {\r
+ if (clazz == null){\r
+ clazz = FeatureTree.class;\r
+ }\r
+ super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);\r
+ }\r
+\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#getFeatureNodesAll()\r
+ */\r
+ @Override\r
+ public List<FeatureNode> getFeatureNodesAll() {\r
+ return featureNodeDao.list();\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#saveFeatureNodesAll(java.util.Collection)\r
+ */\r
+ @Override\r
+ public Map<UUID, FeatureNode> saveFeatureNodesAll(Collection<FeatureNode> featureNodeCollection) {\r
+ return featureNodeDao.saveAll(featureNodeCollection);\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#saveOrUpdateFeatureNodesAll(java.util.Collection)\r
+ */\r
+ @Override\r
+ public Map<UUID, FeatureNode> saveOrUpdateFeatureNodesAll(Collection<FeatureNode> featureNodeCollection) {\r
+ return featureNodeDao.saveOrUpdateAll(featureNodeCollection);\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#loadWithNodes(java.util.UUID, java.util.List, java.util.List)\r
+ */\r
+ @Override\r
+ public FeatureTree loadWithNodes(UUID uuid, List<String> propertyPaths, List<String> nodePaths) {\r
+\r
+ if(!nodePaths.contains("children")) {\r
+ nodePaths.add("children");\r
+ }\r
+\r
+ List<String> rootPaths = new ArrayList<String>();\r
+ rootPaths.add("root");\r
+ for(String path : nodePaths) {\r
+ rootPaths.add("root." + path);\r
+ }\r
+\r
+ if(propertyPaths != null) {\r
+ rootPaths.addAll(propertyPaths);\r
+ }\r
+\r
+ FeatureTree featureTree = load(uuid, rootPaths);\r
+ if(featureTree == null){\r
+ throw new EntityNotFoundException("No FeatureTree entity found for " + uuid);\r
+ }\r
+ dao.deepLoadNodes(featureTree.getRoot().getChildNodes() ,nodePaths);\r
+ return featureTree;\r
+ }\r
+\r
+ /**\r
+ * Returns the featureTree specified by the given <code>uuid</code>.\r
+ * The specified featureTree either can be one of those stored in the CDM database or can be the\r
+ * DefaultFeatureTree (contains all Features in use).\r
+ * The uuid of the DefaultFeatureTree is defined in {@link IFeatureTreeService#DefaultFeatureTreeUuid}.\r
+ * The DefaultFeatureTree is also returned if no feature tree at all is stored in the cdm database.\r
+ *\r
+ * @see eu.etaxonomy.cdm.api.service.ServiceBase#load(java.util.UUID, java.util.List)\r
+ */\r
+ @Override\r
+ public FeatureTree load(UUID uuid, List<String> propertyPaths) {\r
+ return super.load(uuid, propertyPaths);\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IFeatureTreeService#createTransientDefaultFeatureTree()\r
+ */\r
+ @Override\r
+ public FeatureTree createTransientDefaultFeatureTree() {\r
+ return load(IFeatureTreeDao.DefaultFeatureTreeUuid);\r
+ }\r
+\r
+\r
+\r
}\r