X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/blobdiff_plain/76de813f61a50b80e7ed0c47fc9d6f5a1653c706..62f7f3cbe3716d02f5fc359e9acc409b4ac7c793:/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceBase.java diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceBase.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceBase.java index a123cf3f0b..4e494d0f4f 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceBase.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceBase.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. */ @@ -18,10 +18,11 @@ import java.util.Set; import java.util.UUID; import org.apache.log4j.Logger; -import org.hibernate.LockMode; +import org.hibernate.LockOptions; import org.hibernate.Session; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.dao.DataAccessException; import org.springframework.transaction.annotation.Transactional; import eu.etaxonomy.cdm.api.service.pager.Pager; @@ -32,150 +33,199 @@ import eu.etaxonomy.cdm.persistence.query.Grouping; import eu.etaxonomy.cdm.persistence.query.OrderHint; public abstract class ServiceBase> implements IService, ApplicationContextAware { - @SuppressWarnings("unused") - private static final Logger logger = Logger.getLogger(ServiceBase.class); - - //flush after saving this number of objects - int flushAfterNo = 2000; - protected ApplicationContext appContext; - - protected DAO dao; - - @Transactional(readOnly = true) - public void lock(T t, LockMode lockMode) { - dao.lock(t, lockMode); - } - - @Transactional(readOnly = true) - public void refresh(T t, LockMode lockMode, List propertyPaths) { - dao.refresh(t, lockMode, propertyPaths); - } - - @Transactional(readOnly = false) - public void clear() { - dao.clear(); - } - - @Transactional(readOnly = true) - public int count(Class clazz) { - return dao.count(clazz); - } - - @Transactional(readOnly = false) - public UUID delete(T persistentObject) { - return dao.delete(persistentObject); - } - - @Transactional(readOnly = true) - public boolean exists(UUID uuid) { - return dao.exists(uuid); - } - - @Transactional(readOnly = true) - public List find(Set uuidSet) { - return dao.findByUuid(uuidSet); - } - - @Transactional(readOnly = true) - public T find(UUID uuid) { - return dao.findByUuid(uuid); - } - - @Transactional(readOnly = true) - public Session getSession() { - return dao.getSession(); - } - - @Transactional(readOnly = true) - public List group(Class clazz,Integer limit, Integer start, List groups, List propertyPaths) { - return dao.group(clazz, limit, start, groups, propertyPaths); - } - - @Transactional(readOnly = true) - public List list(Class type, Integer limit, Integer start, List orderHints, List propertyPaths){ - return dao.list(type,limit, start, orderHints,propertyPaths); - } - - @Transactional(readOnly = true) - public T load(UUID uuid) { - return dao.load(uuid); - } - - @Transactional(readOnly = true) - public T load(UUID uuid, List propertyPaths){ - return dao.load(uuid, propertyPaths); - } - - @Transactional(readOnly = false) - public UUID merge(T newInstance) { - return dao.merge(newInstance); - } - - @Transactional(readOnly = true) - public Pager page(Class type, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths){ - Integer numberOfResults = dao.count(type); - List results = new ArrayList(); - pageNumber = pageNumber == null ? 0 : pageNumber; - if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) - Integer start = pageSize == null ? 0 : pageSize * pageNumber; - results = dao.list(type, pageSize, start, orderHints,propertyPaths); - } - return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); - } - - @Transactional(readOnly = true) + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(ServiceBase.class); + + //flush after saving this number of objects + int flushAfterNo = 2000; + protected ApplicationContext appContext; + + protected DAO dao; + + @Override + @Transactional(readOnly = true) + public void lock(T t, LockOptions lockOptions) { + dao.lock(t, lockOptions); + } + + @Override + @Transactional(readOnly = true) + public void refresh(T t, LockOptions lockOptions, List propertyPaths) { + dao.refresh(t, lockOptions, propertyPaths); + } + + @Override + @Transactional(readOnly = false) + public void clear() { + dao.clear(); + } + + @Override + @Transactional(readOnly = true) + public int count(Class clazz) { + return dao.count(clazz); + } + + @Override + @Transactional(readOnly = false) + public DeleteResult delete(T persistentObject) { + DeleteResult result = new DeleteResult(); + try{ + dao.delete(persistentObject); + } catch(DataAccessException e){ + result.setError(); + result.addException(e); + } + return result; + } + + @Override + @Transactional(readOnly = true) + public boolean exists(UUID uuid) { + return dao.exists(uuid); + } + + @Override + @Transactional(readOnly = true) + public List find(Set uuidSet) { + return dao.list(uuidSet, null, null, null, null); + } + + @Override + @Transactional(readOnly = true) + public List findById(Set idSet) { //can't be called find(Set) as this conflicts with find(Set group(Class clazz,Integer limit, Integer start, List groups, List propertyPaths) { + return dao.group(clazz, limit, start, groups, propertyPaths); + } + + @Override + @Transactional(readOnly = true) + public List list(Class type, Integer limit, Integer start, List orderHints, List propertyPaths){ + return dao.list(type,limit, start, orderHints,propertyPaths); + } + + @Override + @Transactional(readOnly = true) + public T load(UUID uuid) { + return uuid == null ? null : dao.load(uuid); + } + + @Override + @Transactional(readOnly = true) + public T load(UUID uuid, List propertyPaths){ + return uuid == null ? null : dao.load(uuid, propertyPaths); + } + + @Override + @Transactional(readOnly = false) + public T merge(T newInstance) { + return dao.merge(newInstance); + } + + @Override + @Transactional(readOnly = true) + public Pager page(Class type, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths){ + Integer numberOfResults = dao.count(type); + List results = new ArrayList(); + pageNumber = pageNumber == null ? 0 : pageNumber; + if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) + Integer start = pageSize == null ? 0 : pageSize * pageNumber; + results = dao.list(type, pageSize, start, orderHints,propertyPaths); + } + return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); + } + + @Override + @Transactional(readOnly = true) public UUID refresh(T persistentObject) { - return dao.refresh(persistentObject); - } - - /** - * FIXME Candidate for harmonization - * is this method used, and if so, should it be exposed in the service layer? - * it seems a bit incongruous that we use an ORM to hide the fact that there is a - * database, then expose a method that talks about "rows" . . . - */ - @Transactional(readOnly = true) - public List rows(String tableName, int limit, int start) { - return dao.rows(tableName, limit, start); - } - - @Transactional(readOnly = false) - public Map save(Collection newInstances) { - return dao.saveAll(newInstances); - } - - @Transactional(readOnly = false) - public UUID save(T newInstance) { - return dao.save(newInstance); - } - - @Transactional(readOnly = false) - public UUID saveOrUpdate(T transientObject) { - return dao.saveOrUpdate(transientObject); - } - - @Transactional(readOnly = false) - public Map saveOrUpdate(Collection transientInstances) { - return dao.saveOrUpdateAll(transientInstances); - } - - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.service.Iyyy#setApplicationContext(org.springframework.context.ApplicationContext) - */ - public void setApplicationContext(ApplicationContext appContext){ - this.appContext = appContext; - } - - - protected abstract void setDao(DAO dao); - - @Transactional(readOnly = false) - public UUID update(T transientObject) { - return dao.update(transientObject); - } - - @Transactional(readOnly = true) - public List list(T example, Set includeProperties, Integer limit, Integer start, List orderHints, List propertyPaths) { - return dao.list(example, includeProperties, limit, start, orderHints, propertyPaths); - } + return dao.refresh(persistentObject); + } + + /** + * FIXME Candidate for harmonization + * is this method used, and if so, should it be exposed in the service layer? + * it seems a bit incongruous that we use an ORM to hide the fact that there is a + * database, then expose a method that talks about "rows" . . . + */ + @Override + @Transactional(readOnly = true) + public List rows(String tableName, int limit, int start) { + return dao.rows(tableName, limit, start); + } + + @Override + @Transactional(readOnly = false) + public Map save(Collection newInstances) { + return dao.saveAll(newInstances); + } + + @Override + @Transactional(readOnly = false) + public UUID save(T newInstance) { + return dao.save(newInstance); + } + + @Override + @Transactional(readOnly = false) + public UUID saveOrUpdate(T transientObject) { + return dao.saveOrUpdate(transientObject); + } + + @Override + @Transactional(readOnly = false) + public Map saveOrUpdate(Collection transientInstances) { + return dao.saveOrUpdateAll(transientInstances); + } + + @Override + public void setApplicationContext(ApplicationContext appContext){ + this.appContext = appContext; + } + + + protected abstract void setDao(DAO dao); + + @Override + @Transactional(readOnly = false) + public UUID update(T transientObject) { + return dao.update(transientObject); + } + + @Override + @Transactional(readOnly = true) + public List list(T example, Set includeProperties, Integer limit, Integer start, List orderHints, List propertyPaths) { + return dao.list(example, includeProperties, limit, start, orderHints, propertyPaths); + } + + + }