- fully implemented deep delete (child derivates)
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / AgentServiceImpl.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.cdm.api.service;
12
13 import java.util.ArrayList;
14 import java.util.List;
15
16 import org.apache.log4j.Logger;
17 import org.springframework.beans.factory.annotation.Autowired;
18 import org.springframework.stereotype.Service;
19 import org.springframework.transaction.annotation.Transactional;
20
21 import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
22 import eu.etaxonomy.cdm.api.service.pager.Pager;
23 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
24 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
25 import eu.etaxonomy.cdm.model.agent.Address;
26 import eu.etaxonomy.cdm.model.agent.AgentBase;
27 import eu.etaxonomy.cdm.model.agent.Institution;
28 import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;
29 import eu.etaxonomy.cdm.model.agent.Person;
30 import eu.etaxonomy.cdm.model.agent.Team;
31 import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;
32 import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;
33 import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
34
35
36
37 /**
38 * @author a.mueller
39 *
40 */
41 @Service
42 @Transactional(readOnly = true)
43 public class AgentServiceImpl extends IdentifiableServiceBase<AgentBase,IAgentDao> implements IAgentService {
44 private static final Logger logger = Logger.getLogger(AgentServiceImpl.class);
45
46 /**
47 * Constructor
48 */
49 public AgentServiceImpl(){
50 if (logger.isDebugEnabled()) { logger.debug("Load AgentService Bean"); }
51 }
52
53 public List<Institution> searchInstitutionByCode(String code) {
54 return dao.getInstitutionByCode(code);
55 }
56
57
58 /* (non-Javadoc)
59 * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)
60 */
61 @Override
62 @Transactional(readOnly = false)
63 public void updateTitleCache(Class<? extends AgentBase> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<AgentBase> cacheStrategy, IProgressMonitor monitor) {
64 if (clazz == null){
65 clazz = AgentBase.class;
66 }
67 super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);
68 }
69
70 @Autowired
71 protected void setDao(IAgentDao dao) {
72 assert dao != null;
73 this.dao = dao;
74 }
75
76 public Pager<InstitutionalMembership> getInstitutionalMemberships(Person person, Integer pageSize, Integer pageNumber) {
77 Integer numberOfResults = dao.countInstitutionalMemberships(person);
78
79 List<InstitutionalMembership> results = new ArrayList<InstitutionalMembership>();
80 if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
81 results = dao.getInstitutionalMemberships(person, pageSize, pageNumber);
82 }
83
84 return new DefaultPagerImpl<InstitutionalMembership>(pageNumber, numberOfResults, pageSize, results);
85 }
86
87 public Pager<Person> getMembers(Team team, Integer pageSize, Integer pageNumber) {
88 Integer numberOfResults = dao.countMembers(team);
89
90 List<Person> results = new ArrayList<Person>();
91 if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
92 results = dao.getMembers(team, pageSize, pageNumber);
93 }
94
95 return new DefaultPagerImpl<Person>(pageNumber, numberOfResults, pageSize, results);
96 }
97
98 public Pager<Address> getAddresses(AgentBase agent, Integer pageSize, Integer pageNumber) {
99 Integer numberOfResults = dao.countAddresses(agent);
100
101 List<Address> results = new ArrayList<Address>();
102 if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
103 results = dao.getAddresses(agent, pageSize, pageNumber);
104 }
105
106 return new DefaultPagerImpl<Address>(pageNumber, numberOfResults, pageSize, results);
107 }
108
109 /* (non-Javadoc)
110 * @see eu.etaxonomy.cdm.api.service.IAgentService#getTeamOrPersonBaseUuidAndNomenclaturalTitle()
111 */
112 public List<UuidAndTitleCache<Team>> getTeamUuidAndNomenclaturalTitle() {
113 return dao.getTeamUuidAndNomenclaturalTitle();
114 }
115
116 @Override
117 public List<UuidAndTitleCache<Person>> getPersonUuidAndTitleCache() {
118 return dao.getPersonUuidAndTitleCache();
119 }
120
121 @Override
122 public List<UuidAndTitleCache<Team>> getTeamUuidAndTitleCache() {
123 return dao.getTeamUuidAndTitleCache();
124 }
125
126 /* (non-Javadoc)
127 * @see eu.etaxonomy.cdm.api.service.IAgentService#getInstitutionUuidAndTitleCache()
128 */
129 @Override
130 public List<UuidAndTitleCache<Institution>> getInstitutionUuidAndTitleCache() {
131 return dao.getInstitutionUuidAndTitleCache();
132 }
133
134 @Override
135 public DeleteResult delete(AgentBase base){
136
137 DeleteResult result = this.isDeletable(base, null);
138
139 if (result.isOk()){
140 if (base instanceof Team){
141 Team baseTeam = (Team) base;
142 List<Person> members = baseTeam.getTeamMembers();
143 List<Person> temp = new ArrayList<Person>();
144 for (Person member:members){
145 temp.add(member);
146 }
147 for (Person member: temp){
148 members.remove(member);
149 }
150 }
151 saveOrUpdate(base);
152
153 dao.delete(base);
154
155 }
156
157 return result;
158
159 }
160 }