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
\r
private IIdentificationKeyDao identificationKeyDao;\r
private ITaxonDao taxonDao;\r
-\r
-// private IPolytomousKeyNodeDao nodeDao;\r
+ @Autowired\r
+ private IPolytomousKeyNodeService nodeService;\r
\r
\r
@Override\r
this.taxonDao = taxonDao;\r
}\r
\r
-// @Autowired\r
-// protected void setDao(IPolytomousKeyNodeDao nodeDao) {\r
-// this.nodeDao = nodeDao;\r
-// }\r
+\r
\r
\r
/* (non-Javadoc)\r
Integer pageNumber, List<String> propertyPaths, List<String> nodePaths) {\r
\r
List<PolytomousKey> list = new ArrayList<PolytomousKey>();\r
- taxon = taxonDao.findById(taxon.getId());\r
- Long numberOfResults = identificationKeyDao.countByTaxonomicScope(taxon, PolytomousKey.class);\r
+ Long numberOfResults = identificationKeyDao.countByTaxonomicScope(taxon.getUuid(), PolytomousKey.class);\r
if(AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)){\r
- list = identificationKeyDao.findByTaxonomicScope(taxon, PolytomousKey.class, pageSize, pageNumber, propertyPaths);\r
+ list = identificationKeyDao.findByTaxonomicScope(taxon.getUuid(), PolytomousKey.class, pageSize, pageNumber, propertyPaths);\r
}\r
if (nodePaths != null) {\r
for (PolytomousKey polytomousKey : list) {\r
return pager;\r
}\r
\r
-// /* (non-Javadoc)\r
-// * @see eu.etaxonomy.cdm.api.service.ServiceBase#delete(eu.etaxonomy.cdm.model.common.CdmBase)\r
-// */\r
-// @Override\r
-// public UUID delete(PolytomousKey key) {\r
-//\r
-//// nodeDao.deleteForKey(key);\r
-//\r
-// return super.delete(key);\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, null);\r
+\r
+ if (result.isOk()){\r
+ try{\r
+ if (root != null){\r
+ nodeService.delete(root.getUuid(), true);\r
+ }\r
+ }catch(Exception e){\r
+ result.addException(e);\r
+ result.setAbort();\r
+ return result;\r
+ }\r
+ try{\r
+ dao.delete(key);\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(PolytomousKey key, DeleteConfiguratorBase config){\r
+ DeleteResult result = new DeleteResult();\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