import java.util.ArrayList;\r
import java.util.Collection;\r
import java.util.HashSet;\r
-import java.util.Iterator;\r
import java.util.List;\r
import java.util.Map;\r
import java.util.Set;\r
private ITypeDesignationDao typeDesignationDao;\r
@Autowired\r
private IHomotypicalGroupDao homotypicalGroupDao;\r
- @Autowired\r
- private ICdmGenericDao genericDao;\r
+ @Autowired\r
+ private ICdmGenericDao genericDao;\r
\r
/**\r
* Constructor\r
if (logger.isDebugEnabled()) { logger.debug("Load NameService Bean"); }\r
}\r
\r
-//********************* METHODS ****************************************************************// \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(TaxonNameBase name){\r
- NameDeletionConfigurator config = new NameDeletionConfigurator(); \r
- try {\r
- return delete(name, config);\r
- } catch (ReferencedObjectUndeletableException e) {\r
- //TODO throw DeleteException - current implementation is preliminary for testing\r
- throw new RuntimeException(e);\r
- }\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.INameService#delete(eu.etaxonomy.cdm.model.name.TaxonNameBase, eu.etaxonomy.cdm.api.service.NameDeletionConfigurator)\r
- */\r
- @Override\r
- public UUID delete(TaxonNameBase name, NameDeletionConfigurator config) throws ReferencedObjectUndeletableException{\r
- if (name == null){\r
- return null;\r
- }\r
- \r
- //remove references to this name\r
- removeNameRelationshipsByDeleteConfig(name, config);\r
- \r
- //check if this name is still used somewhere\r
- \r
- //name relationships\r
- if (! name.getNameRelations().isEmpty()){\r
- String message = "Name can't be deleted as it is used in name relationship(s). Remove name relationships prior to deletion.";\r
- throw new ReferencedObjectUndeletableException(message);\r
+//********************* METHODS ****************************************************************//\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(TaxonNameBase name){\r
+ NameDeletionConfigurator config = new NameDeletionConfigurator();\r
+ try {\r
+ return delete(name, config);\r
+ } catch (ReferencedObjectUndeletableException e) {\r
+ //TODO throw DeleteException - current implementation is preliminary for testing\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.INameService#delete(eu.etaxonomy.cdm.model.name.TaxonNameBase, eu.etaxonomy.cdm.api.service.NameDeletionConfigurator)\r
+ */\r
+ @Override\r
+ public UUID delete(TaxonNameBase name, NameDeletionConfigurator config) throws ReferencedObjectUndeletableException{\r
+ if (name == null){\r
+ return null;\r
+ }\r
+\r
+ //remove references to this name\r
+ removeNameRelationshipsByDeleteConfig(name, config);\r
+\r
+ //check if this name is still used somewhere\r
+\r
+ //name relationships\r
+ if (! name.getNameRelations().isEmpty()){\r
+ String message = "Name can't be deleted as it is used in name relationship(s). Remove name relationships prior to deletion.";\r
+ throw new ReferencedObjectUndeletableException(message);\r
// return null;\r
- }\r
- \r
- //concepts\r
- if (! name.getTaxonBases().isEmpty()){\r
- String message = "Name can't be deleted as it is used in concept(s). Remove or change concept prior to deletion.";\r
- throw new ReferencedObjectUndeletableException(message);\r
- }\r
- \r
- //hybrid relationships\r
- if (name.isInstanceOf(NonViralName.class)){\r
- NonViralName nvn = CdmBase.deproxy(name, NonViralName.class);\r
+ }\r
+\r
+ //concepts\r
+ if (! name.getTaxonBases().isEmpty()){\r
+ String message = "Name can't be deleted as it is used in concept(s). Remove or change concept prior to deletion.";\r
+ throw new ReferencedObjectUndeletableException(message);\r
+ }\r
+\r
+ //hybrid relationships\r
+ if (name.isInstanceOf(NonViralName.class)){\r
+ NonViralName nvn = CdmBase.deproxy(name, NonViralName.class);\r
// if (! nvn.getHybridChildRelations().isEmpty()){\r
// String message = "Name can't be deleted as it is a child in (a) hybrid relationship(s). Remove hybrid relationships prior to deletion.";\r
// throw new RuntimeException(message);\r
// }\r
- if (! nvn.getHybridParentRelations().isEmpty()){\r
- String message = "Name can't be deleted as it is a parent in (a) hybrid relationship(s). Remove hybrid relationships prior to deletion.";\r
- throw new ReferencedObjectUndeletableException(message);\r
- }\r
- }\r
- \r
- //all type designation relationships are removed as they belong to the name\r
- deleteTypeDesignation(name, null);\r
+ if (! nvn.getHybridParentRelations().isEmpty()){\r
+ String message = "Name can't be deleted as it is a parent in (a) hybrid relationship(s). Remove hybrid relationships prior to deletion.";\r
+ throw new ReferencedObjectUndeletableException(message);\r
+ }\r
+ }\r
+\r
+ //all type designation relationships are removed as they belong to the name\r
+ deleteTypeDesignation(name, null);\r
// //type designations\r
// if (! name.getTypeDesignations().isEmpty()){\r
// String message = "Name can't be deleted as it has types. Remove types prior to deletion.";\r
// throw new ReferrencedObjectUndeletableException(message);\r
// }\r
- \r
- //check references with only reverse mapping\r
- Set<CdmBase> referencingObjects = genericDao.getReferencingObjects(name);\r
- for (CdmBase referencingObject : referencingObjects){\r
- //DerivedUnitBase?.storedUnder\r
- if (referencingObject.isInstanceOf(DerivedUnitBase.class)){\r
- String message = "Name can't be deleted as it is used as derivedUnit#storedUnder by %s. Remove 'stored under' prior to deleting this name";\r
- message = String.format(message, CdmBase.deproxy(referencingObject, DerivedUnitBase.class).getTitleCache());\r
- throw new ReferencedObjectUndeletableException(message);\r
- }\r
- //DescriptionElementSource#nameUsedInSource\r
- if (referencingObject.isInstanceOf(DescriptionElementSource.class)){\r
- String message = "Name can't be deleted as it is used as descriptionElementSource#nameUsedInSource";\r
- throw new ReferencedObjectUndeletableException(message);\r
- }\r
- //NameTypeDesignation#typeName\r
- if (referencingObject.isInstanceOf(NameTypeDesignation.class)){\r
- String message = "Name can't be deleted as it is used as a name type in a NameTypeDesignation";\r
- throw new ReferencedObjectUndeletableException(message);\r
- }\r
-\r
- //TaxonNameDescriptions#taxonName\r
- //deleted via cascade?\r
- \r
- //NomenclaturalStatus\r
- //deleted via cascade? \r
- \r
- }\r
- \r
- //TODO inline references\r
- \r
- dao.delete(name);\r
- return name.getUuid();\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.INameService#deleteTypeDesignation(eu.etaxonomy.cdm.model.name.TaxonNameBase, eu.etaxonomy.cdm.model.name.TypeDesignationBase)\r
- */\r
- @Override\r
- public void deleteTypeDesignation(TaxonNameBase name, TypeDesignationBase typeDesignation){\r
- if (name == null && typeDesignation == null){\r
- return;\r
- }else if (name != null && typeDesignation != null){\r
- removeSingleDesignation(name, typeDesignation);\r
- }else if (name != null){\r
- Set<TypeDesignationBase> designationSet = new HashSet<TypeDesignationBase>(name.getTypeDesignations());\r
- for (Object o : designationSet){\r
- TypeDesignationBase desig = CdmBase.deproxy(o, TypeDesignationBase.class);\r
- removeSingleDesignation(name, desig);\r
- }\r
- }else if (typeDesignation != null){\r
- Set<TaxonNameBase> nameSet = new HashSet<TaxonNameBase>(typeDesignation.getTypifiedNames());\r
- for (Object o : nameSet){\r
- TaxonNameBase singleName = CdmBase.deproxy(o, TaxonNameBase.class);\r
- removeSingleDesignation(singleName, typeDesignation);\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * @param name\r
- * @param typeDesignation\r
- */\r
- private void removeSingleDesignation(TaxonNameBase name, TypeDesignationBase typeDesignation) {\r
- name.removeTypeDesignation(typeDesignation);\r
- if (typeDesignation.getTypifiedNames().isEmpty()){\r
- typeDesignation.removeType();\r
- typeDesignationDao.delete(typeDesignation);\r
- }\r
- }\r
- \r
- \r
-\r
- /**\r
- * @param name\r
- * @param config\r
- */\r
- private void removeNameRelationshipsByDeleteConfig(TaxonNameBase name, NameDeletionConfigurator config) {\r
- if (config.isRemoveAllNameRelationships()){\r
- Set<NameRelationship> rels = name.getNameRelations();\r
- for (NameRelationship rel : rels){\r
- name.removeNameRelationship(rel);\r
- }\r
- }else{\r
- //relations to this name\r
- Set<NameRelationship> rels = name.getRelationsToThisName();\r
- for (NameRelationship rel : rels){\r
- if (config.isIgnoreHasBasionym() && NameRelationshipType.BASIONYM().equals(rel.getType() )){\r
- name.removeNameRelationship(rel);\r
- }else if (config.isIgnoreHasReplacedSynonym() && NameRelationshipType.REPLACED_SYNONYM().equals(rel.getType())){\r
- name.removeNameRelationship(rel);\r
- }\r
- }\r
- //relations from this name\r
- rels = name.getRelationsFromThisName();\r
- for (NameRelationship rel : rels){\r
- if (config.isIgnoreIsBasionymFor() && NameRelationshipType.BASIONYM().equals(rel.getType()) ){\r
- name.removeNameRelationship(rel);\r
- }else if (config.isIgnoreIsReplacedSynonymFor() && NameRelationshipType.REPLACED_SYNONYM().equals(rel.getType())){\r
- name.removeNameRelationship(rel);\r
- }\r
- }\r
- \r
- }\r
- }\r
\r
-//********************* METHODS ****************************************************************//\r
+ //check references with only reverse mapping\r
+ Set<CdmBase> referencingObjects = genericDao.getReferencingObjects(name);\r
+ for (CdmBase referencingObject : referencingObjects){\r
+ //DerivedUnitBase?.storedUnder\r
+ if (referencingObject.isInstanceOf(DerivedUnitBase.class)){\r
+ String message = "Name can't be deleted as it is used as derivedUnit#storedUnder by %s. Remove 'stored under' prior to deleting this name";\r
+ message = String.format(message, CdmBase.deproxy(referencingObject, DerivedUnitBase.class).getTitleCache());\r
+ throw new ReferencedObjectUndeletableException(message);\r
+ }\r
+ //DescriptionElementSource#nameUsedInSource\r
+ if (referencingObject.isInstanceOf(DescriptionElementSource.class)){\r
+ String message = "Name can't be deleted as it is used as descriptionElementSource#nameUsedInSource";\r
+ throw new ReferencedObjectUndeletableException(message);\r
+ }\r
+ //NameTypeDesignation#typeName\r
+ if (referencingObject.isInstanceOf(NameTypeDesignation.class)){\r
+ String message = "Name can't be deleted as it is used as a name type in a NameTypeDesignation";\r
+ throw new ReferencedObjectUndeletableException(message);\r
+ }\r
+\r
+ //TaxonNameDescriptions#taxonName\r
+ //deleted via cascade?\r
+\r
+ //NomenclaturalStatus\r
+ //deleted via cascade?\r
+\r
+ }\r
+\r
+ //TODO inline references\r
+\r
+ dao.delete(name);\r
+ return name.getUuid();\r
+ }\r
\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.INameService#deleteTypeDesignation(eu.etaxonomy.cdm.model.name.TaxonNameBase, eu.etaxonomy.cdm.model.name.TypeDesignationBase)\r
+ */\r
+ @Override\r
+ public void deleteTypeDesignation(TaxonNameBase name, TypeDesignationBase typeDesignation){\r
+ if (name == null && typeDesignation == null){\r
+ return;\r
+ }else if (name != null && typeDesignation != null){\r
+ removeSingleDesignation(name, typeDesignation);\r
+ }else if (name != null){\r
+ Set<TypeDesignationBase> designationSet = new HashSet<TypeDesignationBase>(name.getTypeDesignations());\r
+ for (Object o : designationSet){\r
+ TypeDesignationBase desig = CdmBase.deproxy(o, TypeDesignationBase.class);\r
+ removeSingleDesignation(name, desig);\r
+ }\r
+ }else if (typeDesignation != null){\r
+ Set<TaxonNameBase> nameSet = new HashSet<TaxonNameBase>(typeDesignation.getTypifiedNames());\r
+ for (Object o : nameSet){\r
+ TaxonNameBase singleName = CdmBase.deproxy(o, TaxonNameBase.class);\r
+ removeSingleDesignation(singleName, typeDesignation);\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @param name\r
+ * @param typeDesignation\r
+ */\r
+ private void removeSingleDesignation(TaxonNameBase name, TypeDesignationBase typeDesignation) {\r
+ name.removeTypeDesignation(typeDesignation);\r
+ if (typeDesignation.getTypifiedNames().isEmpty()){\r
+ typeDesignation.removeType();\r
+ typeDesignationDao.delete(typeDesignation);\r
+ }\r
+ }\r
\r
+\r
+\r
+ /**\r
+ * @param name\r
+ * @param config\r
+ */\r
+ private void removeNameRelationshipsByDeleteConfig(TaxonNameBase name, NameDeletionConfigurator config) {\r
+ if (config.isRemoveAllNameRelationships()){\r
+ Set<NameRelationship> rels = name.getNameRelations();\r
+ for (NameRelationship rel : rels){\r
+ name.removeNameRelationship(rel);\r
+ }\r
+ }else{\r
+ //relations to this name\r
+ Set<NameRelationship> rels = name.getRelationsToThisName();\r
+ for (NameRelationship rel : rels){\r
+ if (config.isIgnoreHasBasionym() && NameRelationshipType.BASIONYM().equals(rel.getType() )){\r
+ name.removeNameRelationship(rel);\r
+ }else if (config.isIgnoreHasReplacedSynonym() && NameRelationshipType.REPLACED_SYNONYM().equals(rel.getType())){\r
+ name.removeNameRelationship(rel);\r
+ }\r
+ }\r
+ //relations from this name\r
+ rels = name.getRelationsFromThisName();\r
+ for (NameRelationship rel : rels){\r
+ if (config.isIgnoreIsBasionymFor() && NameRelationshipType.BASIONYM().equals(rel.getType()) ){\r
+ name.removeNameRelationship(rel);\r
+ }else if (config.isIgnoreIsReplacedSynonymFor() && NameRelationshipType.REPLACED_SYNONYM().equals(rel.getType())){\r
+ name.removeNameRelationship(rel);\r
+ }\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+//********************* METHODS ****************************************************************//\r
+\r
+ /**\r
+ * @deprecated To be removed for harmonization see http://dev.e-taxonomy.eu/trac/wiki/CdmLibraryConventions\r
+ * duplicate of findByName\r
+ */\r
+ @Deprecated\r
public List getNamesByName(String name){\r
return super.findCdmObjectsByTitle(name);\r
}\r
\r
+ /**\r
+ * TODO candidate for harmonization\r
+ * new name findByName\r
+ */\r
public List<NonViralName> getNamesByNameCache(String nameCache){\r
List result = dao.findByName(nameCache, MatchMode.EXACT, null, null, null, null);\r
return result;\r
}\r
- \r
- \r
+\r
+\r
+ /**\r
+ * TODO candidate for harmonization\r
+ * new name saveHomotypicalGroups\r
+ *\r
+ * findByTitle\r
+ */\r
public List<NonViralName> findNamesByTitleCache(String titleCache, MatchMode matchMode, List<String> propertyPaths){\r
List result = dao.findByTitle(titleCache, matchMode, null, null, null ,propertyPaths);\r
return result;\r
}\r
- \r
+\r
+ /**\r
+ * @deprecated To be removed for harmonization see http://dev.e-taxonomy.eu/trac/wiki/CdmLibraryConventions\r
+ */\r
+ @Deprecated\r
public NonViralName findNameByUuid(UUID uuid, List<String> propertyPaths){\r
- return (NonViralName)dao.findByUuid(uuid, null ,propertyPaths); \r
+ return (NonViralName)dao.findByUuid(uuid, null ,propertyPaths);\r
}\r
\r
+ /**\r
+ * TODO candidate for harmonization\r
+ */\r
public List getNamesByName(String name, CdmBase sessionObject){\r
return super.findCdmObjectsByTitle(name, sessionObject);\r
}\r
\r
+ /**\r
+ * @deprecated To be removed for harmonization see http://dev.e-taxonomy.eu/trac/wiki/CdmLibraryConventions\r
+ * duplicate of findByTitle(clazz, queryString, matchmode, criteria, pageSize, pageNumber, orderHints, propertyPaths)\r
+ */\r
+ @Deprecated\r
public List findNamesByTitle(String title){\r
return super.findCdmObjectsByTitle(title);\r
}\r
\r
+ /**\r
+ * @deprecated To be removed for harmonization see http://dev.e-taxonomy.eu/trac/wiki/CdmLibraryConventions\r
+ * duplicate of findByTitle()\r
+ */\r
+ @Deprecated\r
public List findNamesByTitle(String title, CdmBase sessionObject){\r
return super.findCdmObjectsByTitle(title, sessionObject);\r
}\r
\r
+ /**\r
+ * TODO candidate for harmonization\r
+ * new name saveHomotypicalGroups\r
+ */\r
@Transactional(readOnly = false)\r
public Map<UUID, HomotypicalGroup> saveAllHomotypicalGroups(Collection<HomotypicalGroup> homotypicalGroups){\r
return homotypicalGroupDao.saveAll(homotypicalGroups);\r
}\r
\r
+ /**\r
+ * TODO candidate for harmonization\r
+ * new name saveTypeDesignations\r
+ */\r
@Transactional(readOnly = false)\r
public Map<UUID, TypeDesignationBase> saveTypeDesignationAll(Collection<TypeDesignationBase> typeDesignationCollection){\r
return typeDesignationDao.saveAll(typeDesignationCollection);\r
}\r
\r
+ /**\r
+ * TODO candidate for harmonization\r
+ * new name saveReferencedEntities\r
+ */\r
@Transactional(readOnly = false)\r
public Map<UUID, ReferencedEntityBase> saveReferencedEntitiesAll(Collection<ReferencedEntityBase> referencedEntityCollection){\r
return referencedEntityDao.saveAll(referencedEntityCollection);\r
}\r
\r
+ /**\r
+ * TODO candidate for harmonization\r
+ * new name getNames\r
+ */\r
public List<TaxonNameBase> getAllNames(int limit, int start){\r
return dao.list(limit, start);\r
}\r
\r
+ /**\r
+ * TODO candidate for harmonization\r
+ * new name getNomenclaturalStatus\r
+ */\r
public List<NomenclaturalStatus> getAllNomenclaturalStatus(int limit, int start){\r
return nomStatusDao.list(limit, start);\r
}\r
\r
+ /**\r
+ * TODO candidate for harmonization\r
+ * new name getTypeDesignations\r
+ */\r
public List<TypeDesignationBase> getAllTypeDesignations(int limit, int start){\r
return typeDesignationDao.getAllTypeDesignations(limit, start);\r
}\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 TaxonNameBase> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<TaxonNameBase> cacheStrategy, IProgressMonitor monitor) {\r
if (clazz == null){\r
clazz = TaxonNameBase.class;\r