From: Andreas Kohlbecker Date: Fri, 13 Nov 2015 19:57:11 +0000 (+0100) Subject: #4313 implementing full stack of methods to expose TaxonNodeAgentRelations via remote... X-Git-Tag: 3.12.0^2~61 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/commitdiff_plain/798120f11ccf7bd9c4e069a01521a47996907c56 #4313 implementing full stack of methods to expose TaxonNodeAgentRelations via remote controllers --- diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java index d7fc28d91e..5b4336dc1d 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java @@ -2245,4 +2245,5 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase implem return getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(classification,null); } + } diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonNodeDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonNodeDaoHibernateImpl.java index 203b62d8ea..2e80724fe0 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonNodeDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonNodeDaoHibernateImpl.java @@ -17,6 +17,7 @@ import java.util.UUID; import org.apache.log4j.Logger; import org.hibernate.Criteria; +import org.hibernate.Query; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.springframework.beans.factory.annotation.Autowired; @@ -27,6 +28,7 @@ import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.model.taxon.Classification; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.taxon.TaxonNode; +import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation; import eu.etaxonomy.cdm.persistence.dao.hibernate.common.AnnotatableDaoImpl; import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao; import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao; @@ -112,7 +114,7 @@ public class TaxonNodeDaoHibernateImpl extends AnnotatableDaoImpl @Override public List listChildrenOf(TaxonNode node, Integer pageSize, Integer pageIndex, List propertyPaths, boolean recursive){ if (recursive == true){ - Criteria crit = getSession().createCriteria(TaxonNode.class); + Criteria crit = getSession().createCriteria(TaxonNode.class); crit.add( Restrictions.like("treeIndex", node.treeIndex()+ "%") ); if(pageSize != null) { crit.setMaxResults(pageSize); @@ -122,22 +124,22 @@ public class TaxonNodeDaoHibernateImpl extends AnnotatableDaoImpl crit.setFirstResult(0); } } - List results = (List) crit.list(); + List results = crit.list(); results.remove(node); defaultBeanInitializer.initializeAll(results, propertyPaths); return results; }else{ return classificationDao.listChildrenOf(node.getTaxon(), node.getClassification(), pageSize, pageIndex, propertyPaths); } - + } - + @Override public Long countChildrenOf(TaxonNode node, Classification classification, boolean recursive) { - + if (recursive == true){ - Criteria crit = getSession().createCriteria(TaxonNode.class); + Criteria crit = getSession().createCriteria(TaxonNode.class); crit.add( Restrictions.like("treeIndex", node.treeIndex()+ "%") ); crit.setProjection(Projections.rowCount()); return ((Integer)crit.uniqueResult().hashCode()).longValue(); @@ -145,6 +147,57 @@ public class TaxonNodeDaoHibernateImpl extends AnnotatableDaoImpl return classificationDao.countChildrenOf(node.getTaxon(), classification); } } + /** + * {@inheritDoc} + */ + @Override + public List listTaxonNodeAgentRelations(UUID taxonUuid, UUID classificationUuid, + Integer start, Integer limit, List propertyPaths) { + + String hql = "select tnar from TaxonNodeAgentRelation as tnar " + + "join tnar.taxonNode as tn " + + "join tn.taxon as t " + + "join tn.classification as c " + + "join fetch tnar.agent as a " + + "where t.uuid = :taxonUuid and c.uuid = :classificationUuid " + + "order by a.titleCache"; + Query query = getSession().createQuery(hql); + + if(limit != null) { + query.setMaxResults(limit); + if(start != null) { + query.setFirstResult(start); + } + } + + query.setParameter("taxonUuid", taxonUuid); + query.setParameter("classificationUuid", classificationUuid); + + List records = query.list(); + if(propertyPaths != null) { + defaultBeanInitializer.initializeAll(records, propertyPaths); + } + return records; + } + /** + * {@inheritDoc} + */ + @Override + public long countTaxonNodeAgentRelations(UUID taxonUuid, UUID classificationUuid) { + String hql = "select count(tnar) from TaxonNodeAgentRelation as tnar " + + "join tnar.taxonNode as tn " + + "join tn.taxon as t " + + "join tn.classification as c " + + "where t.uuid = :taxonUuid and c.uuid = :classificationUuid"; + Query query = getSession().createQuery(hql); + + query.setParameter("taxonUuid", taxonUuid); + query.setParameter("classificationUuid", classificationUuid); + + Long count = Long.parseLong(query.uniqueResult().toString()); + + return count; + } } diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonNodeDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonNodeDao.java index 75fbf01c11..ee87ddfb98 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonNodeDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonNodeDao.java @@ -14,6 +14,7 @@ import java.util.UUID; import eu.etaxonomy.cdm.model.taxon.Classification; import eu.etaxonomy.cdm.model.taxon.TaxonNode; +import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation; import eu.etaxonomy.cdm.persistence.dao.common.IAnnotatableDao; /** @@ -39,4 +40,30 @@ public interface ITaxonNodeDao extends IAnnotatableDao { public List listChildrenOf(TaxonNode node, Integer pageSize, Integer pageIndex, List propertyPaths, boolean recursive); public abstract Long countChildrenOf(TaxonNode node, Classification classification, boolean recursive); + + /** + * Returns the of TaxonNodeAgentRelation entities which are associated with the TaxonNode for the + * given TaxonUuid in the specified Classification. + * + * @param taxonUuid + * @param limit + * @param start + * @param classification + * @param propertyPaths + * @return + */ + public List listTaxonNodeAgentRelations(UUID taxonUuid, UUID classificationUuid, + Integer start, Integer limit, List propertyPaths); + + /** + * Returns the number of TaxonNodeAgentRelation entities which are associated with the TaxonNode for the + * given TaxonUuid in the specified Classification. + * + * @param taxonUuid + * @param classification + * @return + */ + public long countTaxonNodeAgentRelations(UUID taxonUuid, UUID classificationUuid); + + } diff --git a/cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonController.java b/cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonController.java index 8cbec05dc2..0cf3970295 100644 --- a/cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonController.java +++ b/cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonController.java @@ -34,6 +34,7 @@ import com.wordnik.swagger.annotations.Api; import eu.etaxonomy.cdm.api.service.INameService; import eu.etaxonomy.cdm.api.service.IOccurrenceService; +import eu.etaxonomy.cdm.api.service.ITaxonNodeService; import eu.etaxonomy.cdm.api.service.ITaxonService; import eu.etaxonomy.cdm.api.service.config.IncludedTaxonConfiguration; import eu.etaxonomy.cdm.api.service.dto.IncludedTaxaDTO; @@ -43,6 +44,7 @@ import eu.etaxonomy.cdm.model.taxon.Classification; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.taxon.TaxonBase; import eu.etaxonomy.cdm.model.taxon.TaxonNode; +import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation; import eu.etaxonomy.cdm.persistence.query.OrderHint; import eu.etaxonomy.cdm.persistence.query.OrderHint.SortOrder; import eu.etaxonomy.cdm.remote.controller.util.PagerParameters; @@ -65,6 +67,8 @@ public class TaxonController extends BaseController private IOccurrenceService occurrenceService; @Autowired private INameService nameService; + @Autowired + private ITaxonNodeService nodeService; protected static final List TAXONNODE_INIT_STRATEGY = Arrays.asList(new String []{ "taxonNodes" @@ -175,6 +179,7 @@ public class TaxonController extends BaseController @PathVariable("uuid") UUID uuid, HttpServletRequest request, HttpServletResponse response) throws IOException { + TaxonBase tb = service.load(uuid, TAXONNODE_INIT_STRATEGY); if(tb instanceof Taxon){ return ((Taxon)tb).getTaxonNodes(); @@ -184,6 +189,25 @@ public class TaxonController extends BaseController } } + @RequestMapping(value = "taxonNodeAgentRelations/{classification_uuid}", method = RequestMethod.GET) + public Pager doGetTaxonNodeAgentRelations( + @PathVariable("uuid") UUID uuid, + @PathVariable("classification_uuid") UUID classificationUuid, + @RequestParam(value = "pageNumber", required = false) Integer pageNumber, + @RequestParam(value = "pageSize", required = false) Integer pageSize, + HttpServletRequest request, + HttpServletResponse response) throws IOException { + + PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber); + pagerParams.normalizeAndValidate(response); + + Pager pager = nodeService.pageTaxonNodeAgentRelations(uuid, classificationUuid, + pagerParams.getPageSize(), pagerParams.getPageIndex(), null); + return pager; + + + } + @RequestMapping(value = "specimensOrObservations", method = RequestMethod.GET) public ModelAndView doListSpecimensOrObservations( diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ITaxonNodeService.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ITaxonNodeService.java index def7fb1108..2620c7f1bd 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ITaxonNodeService.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ITaxonNodeService.java @@ -16,10 +16,12 @@ import java.util.Set; import java.util.UUID; import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator; +import eu.etaxonomy.cdm.api.service.pager.Pager; import eu.etaxonomy.cdm.model.reference.Reference; import eu.etaxonomy.cdm.model.taxon.Classification; import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType; import eu.etaxonomy.cdm.model.taxon.TaxonNode; +import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation; /** @@ -137,7 +139,16 @@ public interface ITaxonNodeService extends IAnnotatableService{ */ public DeleteResult deleteTaxonNodes(List list, TaxonDeletionConfigurator config); - + /** + * Returns the of TaxonNodeAgentRelation entities which are associated with the TaxonNode for the + * given TaxonUuid in the specified Classification. + * + * @param taxonUuid + * @param classification + * @return + */ + public Pager pageTaxonNodeAgentRelations(UUID taxonUuid, UUID classificationUuid, + Integer pageSize, Integer pageIndex, List propertyPaths); } diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java index 0dd73bc67a..4b1678b44b 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java @@ -29,6 +29,9 @@ import eu.etaxonomy.cdm.api.service.config.NodeDeletionConfigurator.ChildHandlin import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator; import eu.etaxonomy.cdm.api.service.config.TaxonNodeDeletionConfigurator; import eu.etaxonomy.cdm.api.service.dto.CdmEntityIdentifier; +import eu.etaxonomy.cdm.api.service.pager.Pager; +import eu.etaxonomy.cdm.api.service.pager.PagerUtils; +import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl; import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.model.description.TaxonDescription; import eu.etaxonomy.cdm.model.name.HomotypicalGroup; @@ -41,6 +44,7 @@ import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.taxon.TaxonNaturalComparator; import eu.etaxonomy.cdm.model.taxon.TaxonNode; +import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation; import eu.etaxonomy.cdm.model.taxon.TaxonNodeByNameComparator; import eu.etaxonomy.cdm.model.taxon.TaxonNodeByRankAndNameComparator; import eu.etaxonomy.cdm.model.taxon.TaxonRelationship; @@ -544,4 +548,21 @@ public class TaxonNodeServiceImpl extends AnnotatableServiceBase pageTaxonNodeAgentRelations(UUID taxonUuid, UUID classificationUuid, + Integer pageSize, Integer pageIndex, List propertyPaths) { + + List records = null; + + long count = dao.countTaxonNodeAgentRelations(taxonUuid, classificationUuid); + if(PagerUtils.hasResultsInRange(count, pageIndex, pageSize)) { + records = dao.listTaxonNodeAgentRelations(taxonUuid, classificationUuid, + PagerUtils.startFor(pageSize, pageIndex), PagerUtils.limitFor(pageSize), propertyPaths); + + } + + Pager pager = new DefaultPagerImpl(pageIndex, count, pageSize, records); + return pager; + } + } diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/description/TransmissionEngineDistribution.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/description/TransmissionEngineDistribution.java index a1fc46de88..e013fc99c7 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/description/TransmissionEngineDistribution.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/description/TransmissionEngineDistribution.java @@ -402,7 +402,7 @@ public class TransmissionEngineDistribution { //TODO extends IoBase? taxonPager = taxonService.page(Taxon.class, batchSize, pageIndex++, null, null); if(taxonPager.getCurrentIndex() == 0){ - subMonitor.beginTask("Accumulating by area ", taxonPager.getCount()); + subMonitor.beginTask("Accumulating by area ", taxonPager.getCount().intValue()); } logger.debug("accumulateByArea() - taxon " + taxonPager.getFirstRecord() + " to " + taxonPager.getLastRecord() + " of " + taxonPager.getCount() + "]"); @@ -539,7 +539,7 @@ public class TransmissionEngineDistribution { //TODO extends IoBase? if(taxonSubMonitor == null) { taxonSubMonitor = new SubProgressMonitor(subMonitor, ticksPerRank); - taxonSubMonitor.beginTask("Accumulating by rank " + rank.getLabel(), taxonPager.getCount()); + taxonSubMonitor.beginTask("Accumulating by rank " + rank.getLabel(), taxonPager.getCount().intValue()); }