refactoring taxonNode controllers - return dtos from the service layer, support for...
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Mon, 13 Jun 2016 15:02:03 +0000 (17:02 +0200)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Mon, 13 Jun 2016 15:02:03 +0000 (17:02 +0200)
cdmlib-print/src/main/java/eu/etaxonomy/cdm/print/LocalXMLEntityFactory.java
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonNodeController.java
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonNodePrintAppController.java [moved from cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonNodeListController.java with 57% similarity]
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/json/processor/bean/TaxonNodeDtoBeanProcessor.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ITaxonNodeService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java

index 6b4a496ddcdcde2dbee4a6d296135ee14287154f..aa888fb2d2c5b37783e83d4d5135edb0bb3aa18d 100644 (file)
@@ -17,6 +17,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
+import net.sf.json.JsonConfig;
+
 import org.apache.log4j.Logger;
 import org.jdom.Document;
 import org.jdom.Element;
@@ -34,13 +36,11 @@ import eu.etaxonomy.cdm.remote.controller.FeatureNodeController;
 import eu.etaxonomy.cdm.remote.controller.FeatureTreeController;
 import eu.etaxonomy.cdm.remote.controller.FeatureTreeListController;
 import eu.etaxonomy.cdm.remote.controller.NameController;
-import eu.etaxonomy.cdm.remote.controller.TaxonNodeController;
-import eu.etaxonomy.cdm.remote.controller.TaxonNodeListController;
+import eu.etaxonomy.cdm.remote.controller.TaxonNodePrintAppController;
 import eu.etaxonomy.cdm.remote.controller.TaxonPortalController;
 import eu.etaxonomy.cdm.remote.controller.dto.PolytomousKeyNodeDtoController;
 import eu.etaxonomy.cdm.remote.view.JsonView;
 import eu.etaxonomy.cdm.remote.view.JsonView.Type;
-import net.sf.json.JsonConfig;
 
 /**
  * The local entity factory assumes that an application context is available and
@@ -70,9 +70,7 @@ public class LocalXMLEntityFactory extends XmlEntityFactoryBase {
     @Autowired
     private ClassificationController classificationController;
     @Autowired
-    private TaxonNodeListController taxonNodeListController;
-    @Autowired
-    private TaxonNodeController taxonNodeController;
+    private TaxonNodePrintAppController taxonNodePrintAppController;
     @Autowired
     private NameController nameController;
     @Autowired
@@ -116,10 +114,8 @@ public class LocalXMLEntityFactory extends XmlEntityFactoryBase {
                        .getBean("classificationListController");
        classificationController = (ClassificationController) applicationConfiguration
                        .getBean("classificationController");
-       taxonNodeListController = (TaxonNodeListController) applicationConfiguration
-                       .getBean("taxonNodeListController");
-       taxonNodeController = (TaxonNodeController) applicationConfiguration
-                       .getBean("taxonNodeController");
+       taxonNodePrintAppController = (TaxonNodePrintAppController) applicationConfiguration
+                       .getBean("taxonNodePrintAppController");
 
        nameController = (NameController) applicationConfiguration
                        .getBean("nameController");
@@ -182,7 +178,7 @@ public class LocalXMLEntityFactory extends XmlEntityFactoryBase {
                 resultObject = classificationController.getChildNodes(uuid,
                         null);
             } else if (EntityType.TAXON_NODE.equals(entityType)) {
-                resultObject = taxonNodeListController
+                resultObject = taxonNodePrintAppController
                         .getChildNodes(uuid, null);
             }
         } catch (IOException e) {
@@ -207,7 +203,7 @@ public class LocalXMLEntityFactory extends XmlEntityFactoryBase {
         xmlView.setJsonConfig(jsonConfig);
         Object resultObject = null;
         try {
-            resultObject = taxonNodeController.doGet(taxonNodeUuid, null, null);
+            resultObject = taxonNodePrintAppController.doGet(taxonNodeUuid, null, null);
         } catch (IOException e) {
             monitor.warning(e.getLocalizedMessage(), e);
             logger.error(e);
@@ -312,8 +308,7 @@ public class LocalXMLEntityFactory extends XmlEntityFactoryBase {
 
         Object resultObject = null;
         try {
-            resultObject = taxonNodeController.getCdmBaseProperty(uuid,
-                    "taxon", null);
+            resultObject = taxonNodePrintAppController.doGetTaxon(uuid);
         } catch (IOException e) {
             monitor.warning(e.getLocalizedMessage(), e);
             logger.error(e);
index dab504650df5a5d3621f57eae9324090e6ca76df..d160e2c79ce96e604568ebede1123b73aefbdd62 100644 (file)
@@ -12,39 +12,36 @@ package eu.etaxonomy.cdm.remote.controller;
 
 import io.swagger.annotations.Api;
 
-import java.util.Arrays;
-import java.util.List;
+import java.io.IOException;
+import java.util.UUID;
+
+import javax.servlet.http.HttpServletResponse;
 
-import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
+import eu.etaxonomy.cdm.api.service.NodeSortMode;
+import eu.etaxonomy.cdm.api.service.pager.Pager;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
+import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
 
 /**
- * @author n.hoffmann
- * @created Apr 9, 2010
- * @version 1.0
+ *
+ * @author a.kohlbecker
+ * @date Jun 13, 2016
+ *
  */
 @Controller
 @Api("taxonNode")
 @RequestMapping(value = {"/taxonNode/{uuid}"})
-public class TaxonNodeController extends BaseController<TaxonNode, ITaxonNodeService> {
-    @SuppressWarnings("unused")
-    private static final Logger logger = Logger
-            .getLogger(TaxonNodeController.class);
-
-    private static final List<String> NODE_INIT_STRATEGY = Arrays.asList(new String[]{
-            "taxon.sec",
-            "taxon.name"
-    });
-
-    public TaxonNodeController(){
-        super();
-        setInitializationStrategy(NODE_INIT_STRATEGY);
-    }
+public class TaxonNodeController extends AbstractController<TaxonNode, ITaxonNodeService> {
+
 
     /* (non-Javadoc)
      * @see eu.etaxonomy.cdm.remote.controller.BaseController#setService(eu.etaxonomy.cdm.api.service.IService)
@@ -54,4 +51,50 @@ public class TaxonNodeController extends BaseController<TaxonNode, ITaxonNodeSer
     public void setService(ITaxonNodeService service) {
         this.service = service;
     }
+
+
+    /**
+     *
+     * @param uuid
+     * @param response
+     * @return
+     * @throws IOException
+     */
+    @RequestMapping(
+            value = {"parent"},
+            method = RequestMethod.GET)
+    public TaxonNodeDto doGetParent(
+            @PathVariable("uuid") UUID uuid,
+            HttpServletResponse response
+            ) throws IOException {
+
+        return service.parentDto(uuid);
+    }
+
+    /**
+     *
+     * @param uuid
+     * @param pageIndex
+     * @param pageSize
+     * @param sortMode
+     * @param response
+     * @return
+     * @throws IOException
+     */
+    @RequestMapping(
+            value = {"childNodes"},
+            method = RequestMethod.GET)
+    public Pager<TaxonNodeDto> doPageChildNodes(
+            @PathVariable("uuid") UUID uuid,
+            @RequestParam(value = "pageNumber", required = false) Integer pageIndex,
+            @RequestParam(value = "pageSize", required = false) Integer pageSize,
+            @RequestParam(value="sortMode", defaultValue="AlphabeticalOrder") NodeSortMode sortMode,
+            HttpServletResponse response
+            ) throws IOException {
+
+        PagerParameters pagerParameters = new PagerParameters(pageSize, pageIndex);
+        pagerParameters.normalizeAndValidate(response);
+
+        return service.pageChildNodesDTOs(uuid, false, sortMode, pagerParameters.getPageSize(), pagerParameters.getPageIndex());
+    }
 }
similarity index 57%
rename from cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonNodeListController.java
rename to cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TaxonNodePrintAppController.java
index c78456199bb3386a27e33ffc097d5a89f5bd890f..d8144c0dab3a9cc219d7699f0911f80157a50701 100644 (file)
 
 package eu.etaxonomy.cdm.remote.controller;
 
-import io.swagger.annotations.Api;
-
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.stereotype.Component;
 
 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 
 /**
+ * This class once was a controller but is no longer needed as such.
+ * The cdmlib-print project however still relies on this class being present to
+ * access its methods directly, but is not using it as controller, though
+ *
+ *
  * @author n.hoffmann
  * @created Apr 8, 2010
+ *
+ * @deprecated only used by cdmlib-print in an unorthodox way to get cdm entities as xml
  */
-@Controller
-@Api("taxonNode")
-public class TaxonNodeListController extends AbstractController<TaxonNode, ITaxonNodeService> {
+@Deprecated
+@Component
+public class TaxonNodePrintAppController extends AbstractController<TaxonNode, ITaxonNodeService> {
     @SuppressWarnings("unused")
-    private static final Logger logger = Logger.getLogger(TaxonNodeListController.class);
+    private static final Logger logger = Logger.getLogger(TaxonNodePrintAppController.class);
 
 
     private static final List<String> NODE_INIT_STRATEGY = Arrays.asList(new String[]{
@@ -62,12 +66,13 @@ public class TaxonNodeListController extends AbstractController<TaxonNode, ITaxo
      * @param response
      * @return
      * @throws IOException
+     *
+     * @deprecated use the TaxonNodeController.doPageChildNodes() instead,
+     *  has no request mapping to avoid conflicts with that method
      */
-    @RequestMapping(
-            value = {"//taxonNode/{taxonNodeUuid}/childNodes"},
-            method = RequestMethod.GET)
+    @Deprecated
     public List<TaxonNode> getChildNodes(
-            @PathVariable("taxonNodeUuid") UUID taxonNodeUuid,
+           UUID taxonNodeUuid,
             HttpServletResponse response
             ) throws IOException {
 
@@ -76,5 +81,15 @@ public class TaxonNodeListController extends AbstractController<TaxonNode, ITaxo
         return service.loadChildNodesOfTaxonNode(taxonNode, NODE_INIT_STRATEGY, false, null);
     }
 
+    public TaxonNode doGet(UUID taxonNodeUuid, HttpServletRequest request, HttpServletResponse response
+            ) throws IOException {
+        return service.load(taxonNodeUuid, getInitializationStrategy());
+    }
+
+    public TaxonBase doGetTaxon(UUID taxonNodeUuid) throws IOException {
+        TaxonNode taxonNode = service.load(taxonNodeUuid, getInitializationStrategy());
+        return taxonNode.getTaxon();
+    }
+
 
 }
index f946a77b980945398107080a9e45ebce5576b3a7..29164769ea25a312f22b912d62c2cd8a4388a7e5 100644 (file)
@@ -12,17 +12,19 @@ package eu.etaxonomy.cdm.remote.json.processor.bean;
 
 import java.util.List;
 
-import eu.etaxonomy.cdm.model.taxon.TaxonNode;
-import eu.etaxonomy.cdm.strategy.cache.TaggedText;
 import net.sf.json.JSONObject;
 import net.sf.json.JsonConfig;
 import net.sf.json.processors.JsonBeanProcessor;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.cdm.strategy.cache.TaggedText;
 
 /**
  * @author a.kohlbecker
  * @date 29.07.2010
  *
+ * @deprecated use the eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto instead for all classification web service endpoints
  */
+@Deprecated
 public class TaxonNodeDtoBeanProcessor implements JsonBeanProcessor {
 
 
index d2368e4103a7a6d8191e7c54df24485198e17df0..4e0d9d07c7121214c17fd5f0b9a04993df29c449 100755 (executable)
@@ -24,6 +24,7 @@ import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
 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.dto.TaxonNodeDto;
 
 
 /**
@@ -43,6 +44,21 @@ public interface ITaxonNodeService extends IAnnotatableService<TaxonNode>{
         */
        public List<TaxonNode> loadChildNodesOfTaxonNode(TaxonNode taxonNode, List<String> propertyPaths, boolean recursive, NodeSortMode sortMode);
 
+       /**
+     *returns the childnodes of the taxonNode, if recursive is true it returns all descendants, if sort is true the nodes are sorted
+     *
+     * @param taxonNode
+     * @param recursive
+     * @param sortMode
+     * @param pageSize
+     * @param pageIndex
+     *
+     * @return List<TaxonNodeDto>
+     */
+    public Pager<TaxonNodeDto> pageChildNodesDTOs(UUID taxonNodeUuid, boolean recursive, NodeSortMode sortMode, Integer pageSize, Integer pageIndex);
+
+    public TaxonNodeDto parentDto(UUID taxonNodeUuid);
+
        /**
         * Changes the taxon associated with the given taxon node into a synonym of the new accepted taxon node.
         * All data associated with the former taxon are moved to the newly accepted taxon.
index 35069077187df6cf9a42f3490e828e14f0ac728d..e54c070549d44df5db8a084bf4332b35ff3f948e 100755 (executable)
@@ -32,6 +32,7 @@ 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.HHH_9751_Util;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
 import eu.etaxonomy.cdm.model.common.DefinedTerm;
@@ -51,6 +52,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
 import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;
 import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer;
 import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
 
 /**
  * @author n.hoffmann
@@ -82,13 +84,17 @@ public class TaxonNodeServiceImpl extends AnnotatableServiceBase<TaxonNode, ITax
     @Override
     public List<TaxonNode> loadChildNodesOfTaxonNode(TaxonNode taxonNode,
             List<String> propertyPaths, boolean recursive, NodeSortMode sortMode) {
-        taxonNode = dao.load(taxonNode.getUuid());
+
+        getSession().refresh(taxonNode);
         List<TaxonNode> childNodes;
         if (recursive == true){
                childNodes  = dao.listChildrenOf(taxonNode, null, null, null, recursive);
         }else{
                childNodes = new ArrayList<TaxonNode>(taxonNode.getChildNodes());
         }
+
+        HHH_9751_Util.removeAllNull(childNodes);
+
         if (sortMode != null){
             Comparator<TaxonNode> comparator = sortMode.newComparator();
                Collections.sort(childNodes, comparator);
@@ -97,6 +103,44 @@ public class TaxonNodeServiceImpl extends AnnotatableServiceBase<TaxonNode, ITax
         return childNodes;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Pager<TaxonNodeDto> pageChildNodesDTOs(UUID taxonNodeUuid, boolean recursive, NodeSortMode sortMode,
+            Integer pageSize, Integer pageIndex) {
+
+
+        List<TaxonNode> childNodes = loadChildNodesOfTaxonNode(dao.load(taxonNodeUuid), null, recursive, sortMode);
+
+        if (sortMode != null){
+            Comparator<TaxonNode> comparator = sortMode.newComparator();
+            Collections.sort(childNodes, comparator);
+        }
+
+        List<TaxonNodeDto> dtos = new ArrayList<>(pageSize);
+        int start = PagerUtils.startFor(pageSize, pageIndex);
+        int limit = PagerUtils.limitFor(pageSize);
+        Long totalCount = Long.valueOf(childNodes.size());
+        if(PagerUtils.hasResultsInRange(totalCount, pageIndex, pageSize)) {
+            for(int i = start; i < start + limit; i++) {
+                dtos.add(new TaxonNodeDto(childNodes.get(i)));
+            }
+        }
+
+
+        return new DefaultPagerImpl<TaxonNodeDto>(pageIndex, totalCount, pageSize , dtos);
+    }
+
+    @Override
+    public TaxonNodeDto parentDto(UUID taxonNodeUuid) {
+        TaxonNode taxonNode = dao.load(taxonNodeUuid);
+        if(taxonNode.getParent() != null) {
+            return new TaxonNodeDto(taxonNode.getParent());
+        }
+        return null;
+    }
+
     @Override
     @Autowired
     protected void setDao(ITaxonNodeDao dao) {
@@ -628,4 +672,5 @@ public class TaxonNodeServiceImpl extends AnnotatableServiceBase<TaxonNode, ITax
         return result;
     }
 
+
 }