-/**\r
-* Copyright (C) 2009 EDIT\r
-* European Distributed Institute of Taxonomy\r
-* http://www.e-taxonomy.eu\r
-*\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
-package eu.etaxonomy.cdm.api.service;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Set;\r
-import java.util.UUID;\r
-\r
-import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.stereotype.Service;\r
-import org.springframework.transaction.annotation.Transactional;\r
-\r
-import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;\r
-import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;\r
-import eu.etaxonomy.cdm.api.service.pager.Pager;\r
-import eu.etaxonomy.cdm.api.service.pager.impl.AbstractPagerImpl;\r
-import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
-import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;\r
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.description.PolytomousKey;\r
-import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.persistence.dao.description.IIdentificationKeyDao;\r
-import eu.etaxonomy.cdm.persistence.dao.description.IPolytomousKeyDao;\r
-import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;\r
-\r
-@Service\r
-@Transactional(readOnly = false)\r
-public class PolytomousKeyServiceImpl extends IdentifiableServiceBase<PolytomousKey, IPolytomousKeyDao> implements IPolytomousKeyService {\r
-\r
- private IIdentificationKeyDao identificationKeyDao;\r
-\r
- @Autowired\r
- private IPolytomousKeyNodeService nodeService;\r
-\r
-\r
- @Override\r
- @Autowired\r
- protected void setDao(IPolytomousKeyDao dao) {\r
- this.dao = dao;\r
- }\r
-\r
- @Autowired\r
- protected void setDao(IIdentificationKeyDao identificationKeyDao) {\r
- this.identificationKeyDao = identificationKeyDao;\r
- }\r
-\r
- @Override\r
- public UpdateResult updateCaches(Class<? extends PolytomousKey> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<PolytomousKey> cacheStrategy, IProgressMonitor monitor) {\r
- if (clazz == null){\r
- clazz = PolytomousKey.class;\r
- }\r
- return super.updateCachesImpl(clazz, stepSize, cacheStrategy, monitor);\r
- }\r
-\r
- @Override\r
- public PolytomousKey loadWithNodes(UUID uuid, List<String> propertyPaths, List<String> nodePaths) {\r
-\r
- if(nodePaths == null){\r
- nodePaths = new ArrayList<String>();\r
- }\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
- PolytomousKey polytomousKey = load(uuid, rootPaths);\r
- dao.loadNodes(polytomousKey.getRoot(),nodePaths);\r
- return polytomousKey;\r
- }\r
-\r
- /**\r
- * Returns the polytomous key specified by the given <code>uuid</code>.\r
- *\r
- * @see eu.etaxonomy.cdm.api.service.ServiceBase#load(java.util.UUID, java.util.List)\r
- */\r
- @Override\r
- public PolytomousKey load(UUID uuid, List<String> propertyPaths) {\r
- return super.load(uuid, propertyPaths);\r
- }\r
-\r
- @Override\r
- public Pager<PolytomousKey> findByTaxonomicScope(\r
- TaxonBase taxon, Integer pageSize,\r
- Integer pageNumber, List<String> propertyPaths, List<String> nodePaths) {\r
-\r
- List<PolytomousKey> list = new ArrayList<PolytomousKey>();\r
- Long numberOfResults = identificationKeyDao.countByTaxonomicScope(taxon.getUuid(), PolytomousKey.class);\r
- if(AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)){\r
- list = identificationKeyDao.findByTaxonomicScope(taxon.getUuid(), PolytomousKey.class, pageSize, pageNumber, propertyPaths);\r
- }\r
- if (nodePaths != null) {\r
- for (PolytomousKey polytomousKey : list) {\r
- dao.loadNodes(polytomousKey.getRoot(), nodePaths);\r
- }\r
- }\r
- Pager<PolytomousKey> pager = new DefaultPagerImpl<PolytomousKey>(pageNumber, numberOfResults, pageSize, list);\r
-\r
- return pager;\r
- }\r
-\r
- @Override\r
- public UpdateResult updateAllNodeNumberings(UUID polytomousKeyUuid) {\r
- UpdateResult result = new UpdateResult();\r
- PolytomousKey polytomousKey = dao.load(polytomousKeyUuid);\r
- polytomousKey.getRoot().refreshNodeNumbering();\r
- return result;\r
- }\r
-\r
- @Override\r
- public UpdateResult updateAllNodeNumberings() {\r
- UpdateResult result = new UpdateResult();\r
- List<PolytomousKey> polytomousKeys = dao.list();\r
- for(PolytomousKey polytomousKey : polytomousKeys) {\r
- polytomousKey.getRoot().refreshNodeNumbering();\r
- }\r
- return result;\r
- }\r
-\r
- @Override\r
- public DeleteResult delete(PolytomousKey key){\r
- //DeleteResult result = new DeleteResult();\r
- PolytomousKeyNode root = key.getRoot();\r
-\r
-\r
- DeleteResult result = isDeletable(key.getUuid(), null);\r
- DeleteResult resultRoot = new DeleteResult();\r
- if (result.isOk()){\r
- try{\r
- if (root != null){\r
- // root.setKey(null);\r
- resultRoot = nodeService.delete(root.getUuid(), true);\r
-\r
- }\r
- }catch(Exception e){\r
- result.addException(e);\r
- result.setAbort();\r
- return result;\r
- }\r
- try{\r
- if (resultRoot.isOk()){\r
- dao.delete(key);\r
- result.addDeletedObject(key);\r
- result.includeResult(resultRoot);\r
- }\r
- }catch(Exception e){\r
- result.addException(e);\r
- result.setAbort();\r
- return result;\r
- }\r
- }\r
- return result;\r
- }\r
-\r
- @Override\r
- public DeleteResult isDeletable(UUID keyUuid, DeleteConfiguratorBase config){\r
- DeleteResult result = new DeleteResult();\r
- PolytomousKey key = this.load(keyUuid);\r
- Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(key);\r
- if (references != null){\r
- Iterator<CdmBase> iterator = references.iterator();\r
- CdmBase ref;\r
- while (iterator.hasNext()){\r
- ref = iterator.next();\r
- if ((ref instanceof PolytomousKeyNode) ){\r
- PolytomousKeyNode node = HibernateProxyHelper.deproxy(ref, PolytomousKeyNode.class);\r
- if (!node.getKey().equals(key)){\r
- String message = "The key is a subkey of " + node.getKey() + ", referenced in node with id: " + node.getId() + ". Please remove the subkey reference first and then delete the key. " ;\r
- result.addException(new ReferencedObjectUndeletableException(message));\r
- result.setAbort();\r
- result.addRelatedObject(ref);\r
- }\r
- }\r
- }\r
- }\r
- return result;\r
- }\r
-\r
-}\r
+/**
+* Copyright (C) 2009 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.cdm.api.service;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
+import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
+import eu.etaxonomy.cdm.api.service.pager.Pager;
+import eu.etaxonomy.cdm.api.service.pager.impl.AbstractPagerImpl;
+import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
+import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.description.PolytomousKey;
+import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.persistence.dao.description.IIdentificationKeyDao;
+import eu.etaxonomy.cdm.persistence.dao.description.IPolytomousKeyDao;
+import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
+
+@Service
+@Transactional(readOnly = false)
+public class PolytomousKeyServiceImpl extends IdentifiableServiceBase<PolytomousKey, IPolytomousKeyDao> implements IPolytomousKeyService {
+
+ private IIdentificationKeyDao identificationKeyDao;
+
+ @Autowired
+ private IPolytomousKeyNodeService nodeService;
+
+
+ @Override
+ @Autowired
+ protected void setDao(IPolytomousKeyDao dao) {
+ this.dao = dao;
+ }
+
+ @Autowired
+ protected void setDao(IIdentificationKeyDao identificationKeyDao) {
+ this.identificationKeyDao = identificationKeyDao;
+ }
+
+ @Override
+ public UpdateResult updateCaches(Class<? extends PolytomousKey> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<PolytomousKey> cacheStrategy, IProgressMonitor monitor) {
+ if (clazz == null){
+ clazz = PolytomousKey.class;
+ }
+ return super.updateCachesImpl(clazz, stepSize, cacheStrategy, monitor);
+ }
+
+ @Override
+ public PolytomousKey loadWithNodes(UUID uuid, List<String> propertyPaths, List<String> nodePaths) {
+
+ if(nodePaths == null){
+ nodePaths = new ArrayList<String>();
+ }
+ nodePaths.add("children");
+
+ List<String> rootPaths = new ArrayList<String>();
+ rootPaths.add("root");
+ for(String path : nodePaths) {
+ rootPaths.add("root." + path);
+ }
+
+ if(propertyPaths != null) {
+ rootPaths.addAll(propertyPaths);
+ }
+
+ PolytomousKey polytomousKey = load(uuid, rootPaths);
+ dao.loadNodes(polytomousKey.getRoot(),nodePaths);
+ return polytomousKey;
+ }
+
+ /**
+ * Returns the polytomous key specified by the given <code>uuid</code>.
+ *
+ * @see eu.etaxonomy.cdm.api.service.ServiceBase#load(java.util.UUID, java.util.List)
+ */
+ @Override
+ public PolytomousKey load(UUID uuid, List<String> propertyPaths) {
+ return super.load(uuid, propertyPaths);
+ }
+
+ @Override
+ public Pager<PolytomousKey> findByTaxonomicScope(
+ TaxonBase taxon, Integer pageSize,
+ Integer pageNumber, List<String> propertyPaths, List<String> nodePaths) {
+
+ List<PolytomousKey> list = new ArrayList<PolytomousKey>();
+ Long numberOfResults = identificationKeyDao.countByTaxonomicScope(taxon.getUuid(), PolytomousKey.class);
+ if(AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)){
+ list = identificationKeyDao.findByTaxonomicScope(taxon.getUuid(), PolytomousKey.class, pageSize, pageNumber, propertyPaths);
+ }
+ if (nodePaths != null) {
+ for (PolytomousKey polytomousKey : list) {
+ dao.loadNodes(polytomousKey.getRoot(), nodePaths);
+ }
+ }
+ Pager<PolytomousKey> pager = new DefaultPagerImpl<PolytomousKey>(pageNumber, numberOfResults, pageSize, list);
+
+ return pager;
+ }
+
+ @Override
+ public UpdateResult updateAllNodeNumberings(UUID polytomousKeyUuid) {
+ UpdateResult result = new UpdateResult();
+ PolytomousKey polytomousKey = dao.load(polytomousKeyUuid);
+ polytomousKey.getRoot().refreshNodeNumbering();
+ return result;
+ }
+
+ @Override
+ public UpdateResult updateAllNodeNumberings() {
+ UpdateResult result = new UpdateResult();
+ List<PolytomousKey> polytomousKeys = dao.list();
+ for(PolytomousKey polytomousKey : polytomousKeys) {
+ polytomousKey.getRoot().refreshNodeNumbering();
+ }
+ return result;
+ }
+
+ @Override
+ public DeleteResult delete(PolytomousKey key){
+
+ PolytomousKeyNode root = key.getRoot();
+
+ DeleteResult result = isDeletable(key.getUuid(), null);
+ DeleteResult resultRoot = new DeleteResult();
+ if (result.isOk()){
+ try{
+ if (root != null){
+ // root.setKey(null);
+ resultRoot = nodeService.delete(root.getUuid(), true);
+ }
+ }catch(Exception e){
+ result.addException(e);
+ result.setAbort();
+ return result;
+ }
+ try{
+ if (resultRoot.isOk()){
+ dao.delete(key);
+ result.addDeletedObject(key);
+ result.includeResult(resultRoot);
+ }
+ }catch(Exception e){
+ result.addException(e);
+ result.setAbort();
+ return result;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public DeleteResult isDeletable(UUID keyUuid, DeleteConfiguratorBase config){
+ DeleteResult result = new DeleteResult();
+ PolytomousKey key = this.load(keyUuid);
+ Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(key);
+ if (references != null){
+ Iterator<CdmBase> iterator = references.iterator();
+ CdmBase ref;
+ while (iterator.hasNext()){
+ ref = iterator.next();
+ if ((ref instanceof PolytomousKeyNode) ){
+ PolytomousKeyNode node = HibernateProxyHelper.deproxy(ref, PolytomousKeyNode.class);
+ if (!node.getKey().equals(key)){
+ String message = "The key is a subkey of " + node.getKey() + ", referenced in node with id: " + node.getId() + ". Please remove the subkey reference first and then delete the key. " ;
+ result.addException(new ReferencedObjectUndeletableException(message));
+ result.setAbort();
+ result.addRelatedObject(ref);
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+}