// $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
\r
import java.util.ArrayList;\r
import java.util.List;\r
+import java.util.UUID;\r
\r
import org.apache.log4j.Logger;\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.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.Person;\r
import eu.etaxonomy.cdm.model.agent.Team;\r
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
-import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;\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
*\r
*/\r
@Service\r
-@Transactional(propagation = Propagation.SUPPORTS, 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<Institution> searchInstitutionByCode(String code) {\r
- return dao.getInstitutionByCode(code);\r
- }\r
\r
- public void generateTitleCache() {\r
- // TODO Auto-generated method stub\r
- \r
+\r
+ @Override\r
+ @Transactional(readOnly = false)\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
- @Autowired\r
- protected void setDao(IAgentDao dao) {\r
- assert dao != null;\r
- this.dao = dao;\r
+ @Override\r
+ public List<Institution> searchInstitutionByCode(String code) {\r
+ return dao.getInstitutionByCode(code);\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
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.IAgentService#getTeamOrPersonBaseUuidAndNomenclaturalTitle()\r
- */\r
+ @Override\r
public List<UuidAndTitleCache<Team>> getTeamUuidAndNomenclaturalTitle() {\r
return dao.getTeamUuidAndNomenclaturalTitle();\r
}\r
@Override\r
public List<UuidAndTitleCache<Team>> getTeamUuidAndTitleCache() {\r
return dao.getTeamUuidAndTitleCache();\r
- } \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 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