Revert last commit (taxon node handling is done in taxeditor)
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / AgentServiceImpl.java
index 2188c4fd04c2664b73555a5f4e1eaa638a372d28..bf373e5a22b4c7f19002fdf28b50d5980c89c7f0 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$\r
 /**\r
 * Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \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
@@ -11,9 +11,7 @@
 package eu.etaxonomy.cdm.api.service;\r
 \r
 import java.util.ArrayList;\r
-import java.util.Collection;\r
 import java.util.List;\r
-import java.util.Map;\r
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
@@ -23,14 +21,24 @@ import org.springframework.transaction.annotation.Transactional;
 \r
 import eu.etaxonomy.cdm.api.service.pager.Pager;\r
 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
+import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;\r
 import eu.etaxonomy.cdm.model.agent.Address;\r
 import eu.etaxonomy.cdm.model.agent.AgentBase;\r
 import eu.etaxonomy.cdm.model.agent.Institution;\r
 import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;\r
 import eu.etaxonomy.cdm.model.agent.Person;\r
 import eu.etaxonomy.cdm.model.agent.Team;\r
+import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;\r
-import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
+import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;\r
+import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;\r
+import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;\r
+import eu.etaxonomy.cdm.strategy.merge.ConvertMergeStrategy;\r
+import eu.etaxonomy.cdm.strategy.merge.DefaultMergeStrategy;\r
+import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy;\r
+import eu.etaxonomy.cdm.strategy.merge.MergeException;\r
+import eu.etaxonomy.cdm.strategy.merge.MergeMode;\r
 \r
 \r
 \r
@@ -39,97 +47,196 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint;
  *\r
  */\r
 @Service\r
-@Transactional(readOnly=true)\r
+@Transactional(readOnly = true)\r
 public class AgentServiceImpl extends IdentifiableServiceBase<AgentBase,IAgentDao> implements IAgentService {\r
     private static final Logger logger = Logger.getLogger(AgentServiceImpl.class);\r
-       \r
 \r
-       /**\r
+    @Autowired\r
+    ICdmGenericDao genericDao;\r
+\r
+       @Override\r
+    @Autowired\r
+       protected void setDao(IAgentDao dao) {\r
+               assert dao != null;\r
+               this.dao = dao;\r
+       }\r
+\r
+       /**\r
         * Constructor\r
         */\r
        public AgentServiceImpl(){\r
                if (logger.isDebugEnabled()) { logger.debug("Load AgentService Bean"); }\r
        }\r
 \r
-       public List<AgentBase> findAgentsByTitle(String title) {\r
-               return super.findCdmObjectsByTitle(title);\r
-       }\r
-\r
-       public AgentBase getAgentByUuid(UUID uuid) {\r
-               return dao.findByUuid(uuid);\r
-       }\r
 \r
-       @Transactional(readOnly=false)\r
-       public UUID saveAgent(AgentBase agent) {\r
-               return super.saveCdmObject(agent);\r
-       }\r
-       \r
+       @Override\r
        @Transactional(readOnly = false)\r
-       public Map<UUID, AgentBase> saveAgentAll(Collection<? extends AgentBase> agentCollection){\r
-               return saveCdmObjectAll(agentCollection);\r
+    public void updateTitleCache(Class<? extends AgentBase> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<AgentBase> cacheStrategy, IProgressMonitor monitor) {\r
+               if (clazz == null){\r
+                       clazz = AgentBase.class;\r
+               }\r
+               super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);\r
        }\r
 \r
-       \r
-       public List<AgentBase> getAllAgents(int limit, int start){\r
-               return dao.list(limit, start);\r
-       }\r
-       \r
+       @Override\r
        public List<Institution> searchInstitutionByCode(String code) {\r
                return dao.getInstitutionByCode(code);\r
        }\r
 \r
-       public void generateTitleCache() {\r
-               // TODO Auto-generated method stub\r
-               \r
-       }\r
-\r
-       @Autowired\r
-       protected void setDao(IAgentDao dao) {\r
-               assert dao != null;\r
-               this.dao = dao;\r
-       }\r
-\r
+       @Override\r
        public Pager<InstitutionalMembership> getInstitutionalMemberships(Person person, Integer pageSize, Integer pageNumber) {\r
         Integer numberOfResults = dao.countInstitutionalMemberships(person);\r
-               \r
+\r
                List<InstitutionalMembership> results = new ArrayList<InstitutionalMembership>();\r
-               if(numberOfResults > 0) { // no point checking again\r
-                       results = dao.getInstitutionalMemberships(person, pageSize, pageNumber); \r
+               if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)\r
+                       results = dao.getInstitutionalMemberships(person, pageSize, pageNumber);\r
                }\r
-               \r
+\r
                return new DefaultPagerImpl<InstitutionalMembership>(pageNumber, numberOfResults, pageSize, results);\r
        }\r
 \r
+       @Override\r
        public Pager<Person> getMembers(Team team, Integer pageSize, Integer pageNumber) {\r
                Integer numberOfResults = dao.countMembers(team);\r
-                       \r
+\r
                List<Person> results = new ArrayList<Person>();\r
-               if(numberOfResults > 0) { // no point checking again\r
-                       results = dao.getMembers(team, pageSize, pageNumber); \r
+               if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)\r
+                       results = dao.getMembers(team, pageSize, pageNumber);\r
                }\r
-                       \r
+\r
                return new DefaultPagerImpl<Person>(pageNumber, numberOfResults, pageSize, results);\r
        }\r
 \r
+       @Override\r
        public Pager<Address> getAddresses(AgentBase agent, Integer pageSize, Integer pageNumber) {\r
                Integer numberOfResults = dao.countAddresses(agent);\r
-               \r
+\r
                List<Address> results = new ArrayList<Address>();\r
-               if(numberOfResults > 0) { // no point checking again\r
-                       results = dao.getAddresses(agent, pageSize, pageNumber); \r
+               if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)\r
+                       results = dao.getAddresses(agent, pageSize, pageNumber);\r
                }\r
-                       \r
+\r
                return new DefaultPagerImpl<Address>(pageNumber, numberOfResults, pageSize, results);\r
        }\r
 \r
-       public Pager<AgentBase> search(Class<? extends AgentBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
-        Integer numberOfResults = dao.count(clazz,queryString);\r
-               \r
-               List<AgentBase> results = new ArrayList<AgentBase>();\r
-               if(numberOfResults > 0) { // no point checking again\r
-                       results = dao.search(clazz,queryString, pageSize, pageNumber, orderHints, propertyPaths); \r
+       @Override\r
+       public List<UuidAndTitleCache<Team>> getTeamUuidAndNomenclaturalTitle() {\r
+               return dao.getTeamUuidAndNomenclaturalTitle();\r
+       }\r
+\r
+       @Override\r
+       public List<UuidAndTitleCache<Person>> getPersonUuidAndTitleCache() {\r
+               return dao.getPersonUuidAndTitleCache();\r
+       }\r
+\r
+       @Override\r
+       public List<UuidAndTitleCache<Team>> getTeamUuidAndTitleCache() {\r
+               return dao.getTeamUuidAndTitleCache();\r
+       }\r
+\r
+       @Override\r
+       public List<UuidAndTitleCache<Institution>> getInstitutionUuidAndTitleCache() {\r
+               return dao.getInstitutionUuidAndTitleCache();\r
+       }\r
+\r
+       @Override\r
+       @Transactional(readOnly = false)\r
+    public DeleteResult delete(UUID agentUUID){\r
+               AgentBase base = dao.load(agentUUID);\r
+               DeleteResult result = this.isDeletable(base, null);\r
+\r
+       if (result.isOk()){\r
+                       if (base instanceof Team){\r
+                               Team baseTeam = (Team) base;\r
+                               List<Person> members = baseTeam.getTeamMembers();\r
+                               List<Person> temp = new ArrayList<Person>();\r
+                               for (Person member:members){\r
+                                       temp.add(member);\r
+                               }\r
+                               for (Person member: temp){\r
+                                       members.remove(member);\r
+                               }\r
+                       }\r
+                       saveOrUpdate(base);\r
+\r
+                       dao.delete(base);\r
+\r
                }\r
-               \r
-               return new DefaultPagerImpl<AgentBase>(pageNumber, numberOfResults, pageSize, results);\r
+\r
+               return result;\r
+    }\r
+\r
+       @Override\r
+    public DeleteResult delete(AgentBase agent){\r
+               return delete(agent.getUuid());\r
        }\r
+\r
+       @Override\r
+       @Transactional(readOnly = false)\r
+       public Person convertTeam2Person(UUID teamUuid) throws MergeException {\r
+           Team team = CdmBase.deproxy(dao.load(teamUuid), Team.class);\r
+           return convertTeam2Person(team);\r
+       }\r
+\r
+       @Override\r
+       public Person convertTeam2Person(Team team) throws MergeException {\r
+               Person result = null;\r
+               team = CdmBase.deproxy(team, Team.class);\r
+               if (team.getTeamMembers().size() > 1){\r
+                       throw new IllegalArgumentException("Team must not have more than 1 member to be convertable into a person");\r
+               }else if (team.getTeamMembers().size() == 1){\r
+                       result = team.getTeamMembers().get(0);\r
+                       IMergeStrategy strategy = DefaultMergeStrategy.NewInstance(TeamOrPersonBase.class);\r
+                       strategy.setDefaultCollectionMergeMode(MergeMode.FIRST);\r
+                       genericDao.merge(result, team, strategy);\r
+               }else if (team.getTeamMembers().isEmpty()){\r
+                       result = Person.NewInstance();\r
+                       genericDao.save(result);\r
+                       IMergeStrategy strategy = DefaultMergeStrategy.NewInstance(TeamOrPersonBase.class);\r
+                       strategy.setDefaultMergeMode(MergeMode.SECOND);\r
+                       strategy.setDefaultCollectionMergeMode(MergeMode.SECOND);\r
+                       genericDao.merge(result, team, strategy);\r
+               }else{\r
+                       throw new IllegalStateException("Unhandled state of team members collection");\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       @Transactional(readOnly = false)\r
+       public Team convertPerson2Team(UUID personUuid) throws MergeException, IllegalArgumentException {\r
+           Person person = CdmBase.deproxy(dao.load(personUuid), Person.class);\r
+           return convertPerson2Team(person);\r
+       }\r
+\r
+       @Override\r
+       public Team convertPerson2Team(Person person) throws MergeException, IllegalArgumentException {\r
+               Team team = Team.NewInstance();\r
+               ConvertMergeStrategy strategy = ConvertMergeStrategy.NewInstance(TeamOrPersonBase.class);\r
+               strategy.setDefaultMergeMode(MergeMode.SECOND);\r
+               strategy.setDefaultCollectionMergeMode(MergeMode.SECOND);\r
+               strategy.setDeleteSecondObject(true);\r
+\r
+\r
+               if (! genericDao.isMergeable(team, person, strategy)){\r
+                       throw new MergeException("Person can not be transformed into team.");\r
+               }\r
+               try {\r
+                       this.save(team);\r
+                       team.setProtectedNomenclaturalTitleCache(false);\r
+                       team.setProtectedTitleCache(true);\r
+                       team.setTitleCache(person.getTitleCache(), true);\r
+                       genericDao.merge(team, person, strategy);\r
+                       //team.addTeamMember(person);\r
+\r
+                       //this.save(team);\r
+//                     team.setNomenclaturalTitle(person.getNomenclaturalTitle(), true);\r
+               } catch (Exception e) {\r
+                       throw new MergeException("Unhandled merge exception", e);\r
+               }\r
+               return team;\r
+       }\r
+\r
+\r
 }\r