X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/blobdiff_plain/27ebd6c8c50d249af318d160063a65fed5508cd6..401ba974fd810698a230d02f64d58659555788fb:/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java index cb79690e60..bf373e5a22 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java @@ -1,9 +1,9 @@ // $Id$ /** * Copyright (C) 2007 EDIT -* European Distributed Institute of Taxonomy +* 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. */ @@ -12,15 +12,16 @@ package eu.etaxonomy.cdm.api.service; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import eu.etaxonomy.cdm.api.service.pager.Pager; import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl; +import eu.etaxonomy.cdm.common.monitor.IProgressMonitor; import eu.etaxonomy.cdm.model.agent.Address; import eu.etaxonomy.cdm.model.agent.AgentBase; import eu.etaxonomy.cdm.model.agent.Institution; @@ -28,8 +29,16 @@ import eu.etaxonomy.cdm.model.agent.InstitutionalMembership; import eu.etaxonomy.cdm.model.agent.Person; import eu.etaxonomy.cdm.model.agent.Team; import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase; -import eu.etaxonomy.cdm.model.common.UuidAndTitleCache; +import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao; +import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao; +import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache; +import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy; +import eu.etaxonomy.cdm.strategy.merge.ConvertMergeStrategy; +import eu.etaxonomy.cdm.strategy.merge.DefaultMergeStrategy; +import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy; +import eu.etaxonomy.cdm.strategy.merge.MergeException; +import eu.etaxonomy.cdm.strategy.merge.MergeMode; @@ -38,69 +47,79 @@ import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao; * */ @Service -@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) +@Transactional(readOnly = true) public class AgentServiceImpl extends IdentifiableServiceBase implements IAgentService { private static final Logger logger = Logger.getLogger(AgentServiceImpl.class); - - /** + @Autowired + ICdmGenericDao genericDao; + + @Override + @Autowired + protected void setDao(IAgentDao dao) { + assert dao != null; + this.dao = dao; + } + + /** * Constructor */ public AgentServiceImpl(){ if (logger.isDebugEnabled()) { logger.debug("Load AgentService Bean"); } } - - public List searchInstitutionByCode(String code) { - return dao.getInstitutionByCode(code); - } - public void generateTitleCache() { - // TODO Auto-generated method stub - + + @Override + @Transactional(readOnly = false) + public void updateTitleCache(Class clazz, Integer stepSize, IIdentifiableEntityCacheStrategy cacheStrategy, IProgressMonitor monitor) { + if (clazz == null){ + clazz = AgentBase.class; + } + super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor); } - @Autowired - protected void setDao(IAgentDao dao) { - assert dao != null; - this.dao = dao; + @Override + public List searchInstitutionByCode(String code) { + return dao.getInstitutionByCode(code); } + @Override public Pager getInstitutionalMemberships(Person person, Integer pageSize, Integer pageNumber) { Integer numberOfResults = dao.countInstitutionalMemberships(person); - + List results = new ArrayList(); - if(numberOfResults > 0) { // no point checking again - results = dao.getInstitutionalMemberships(person, pageSize, pageNumber); + if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) + results = dao.getInstitutionalMemberships(person, pageSize, pageNumber); } - + return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); } + @Override public Pager getMembers(Team team, Integer pageSize, Integer pageNumber) { Integer numberOfResults = dao.countMembers(team); - + List results = new ArrayList(); - if(numberOfResults > 0) { // no point checking again - results = dao.getMembers(team, pageSize, pageNumber); + if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) + results = dao.getMembers(team, pageSize, pageNumber); } - + return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); } + @Override public Pager
getAddresses(AgentBase agent, Integer pageSize, Integer pageNumber) { Integer numberOfResults = dao.countAddresses(agent); - + List
results = new ArrayList
(); - if(numberOfResults > 0) { // no point checking again - results = dao.getAddresses(agent, pageSize, pageNumber); + if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) + results = dao.getAddresses(agent, pageSize, pageNumber); } - + return new DefaultPagerImpl
(pageNumber, numberOfResults, pageSize, results); } - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.service.IAgentService#getTeamOrPersonBaseUuidAndNomenclaturalTitle() - */ + @Override public List> getTeamUuidAndNomenclaturalTitle() { return dao.getTeamUuidAndNomenclaturalTitle(); } @@ -113,5 +132,111 @@ public class AgentServiceImpl extends IdentifiableServiceBase> getTeamUuidAndTitleCache() { return dao.getTeamUuidAndTitleCache(); - } + } + + @Override + public List> getInstitutionUuidAndTitleCache() { + return dao.getInstitutionUuidAndTitleCache(); + } + + @Override + @Transactional(readOnly = false) + public DeleteResult delete(UUID agentUUID){ + AgentBase base = dao.load(agentUUID); + DeleteResult result = this.isDeletable(base, null); + + if (result.isOk()){ + if (base instanceof Team){ + Team baseTeam = (Team) base; + List members = baseTeam.getTeamMembers(); + List temp = new ArrayList(); + for (Person member:members){ + temp.add(member); + } + for (Person member: temp){ + members.remove(member); + } + } + saveOrUpdate(base); + + dao.delete(base); + + } + + return result; + } + + @Override + public DeleteResult delete(AgentBase agent){ + return delete(agent.getUuid()); + } + + @Override + @Transactional(readOnly = false) + public Person convertTeam2Person(UUID teamUuid) throws MergeException { + Team team = CdmBase.deproxy(dao.load(teamUuid), Team.class); + return convertTeam2Person(team); + } + + @Override + public Person convertTeam2Person(Team team) throws MergeException { + Person result = null; + team = CdmBase.deproxy(team, Team.class); + if (team.getTeamMembers().size() > 1){ + throw new IllegalArgumentException("Team must not have more than 1 member to be convertable into a person"); + }else if (team.getTeamMembers().size() == 1){ + result = team.getTeamMembers().get(0); + IMergeStrategy strategy = DefaultMergeStrategy.NewInstance(TeamOrPersonBase.class); + strategy.setDefaultCollectionMergeMode(MergeMode.FIRST); + genericDao.merge(result, team, strategy); + }else if (team.getTeamMembers().isEmpty()){ + result = Person.NewInstance(); + genericDao.save(result); + IMergeStrategy strategy = DefaultMergeStrategy.NewInstance(TeamOrPersonBase.class); + strategy.setDefaultMergeMode(MergeMode.SECOND); + strategy.setDefaultCollectionMergeMode(MergeMode.SECOND); + genericDao.merge(result, team, strategy); + }else{ + throw new IllegalStateException("Unhandled state of team members collection"); + } + + return result; + } + + @Override + @Transactional(readOnly = false) + public Team convertPerson2Team(UUID personUuid) throws MergeException, IllegalArgumentException { + Person person = CdmBase.deproxy(dao.load(personUuid), Person.class); + return convertPerson2Team(person); + } + + @Override + public Team convertPerson2Team(Person person) throws MergeException, IllegalArgumentException { + Team team = Team.NewInstance(); + ConvertMergeStrategy strategy = ConvertMergeStrategy.NewInstance(TeamOrPersonBase.class); + strategy.setDefaultMergeMode(MergeMode.SECOND); + strategy.setDefaultCollectionMergeMode(MergeMode.SECOND); + strategy.setDeleteSecondObject(true); + + + if (! genericDao.isMergeable(team, person, strategy)){ + throw new MergeException("Person can not be transformed into team."); + } + try { + this.save(team); + team.setProtectedNomenclaturalTitleCache(false); + team.setProtectedTitleCache(true); + team.setTitleCache(person.getTitleCache(), true); + genericDao.merge(team, person, strategy); + //team.addTeamMember(person); + + //this.save(team); +// team.setNomenclaturalTitle(person.getNomenclaturalTitle(), true); + } catch (Exception e) { + throw new MergeException("Unhandled merge exception", e); + } + return team; + } + + }