Create and rename Identifiable(List)Controllers
[cdmlib.git] / cdmlib-remote / src / main / java / eu / etaxonomy / cdm / remote / controller / OccurrenceListController.java
index 378665c03ab1fb49354270254ff92bc7dde847b7..594dbb6b22f580b5dade905d9cb31b5d774bb0b3 100644 (file)
-// $Id$\r
-/**\r
- * Copyright (C) 2009 EDIT European Distributed Institute of Taxonomy\r
- * http://www.e-taxonomy.eu\r
- *\r
- * The contents of this file are subject to the Mozilla Public License Version\r
- * 1.1 See LICENSE.TXT at the top of this package for the full license terms.\r
- */\r
-\r
-package eu.etaxonomy.cdm.remote.controller;\r
-\r
-import java.io.IOException;\r
-import java.util.EnumSet;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Set;\r
-import java.util.UUID;\r
-\r
-import javax.servlet.http.HttpServletRequest;\r
-import javax.servlet.http.HttpServletResponse;\r
-\r
-import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.stereotype.Controller;\r
-import org.springframework.web.bind.WebDataBinder;\r
-import org.springframework.web.bind.annotation.InitBinder;\r
-import org.springframework.web.bind.annotation.PathVariable;\r
-import org.springframework.web.bind.annotation.RequestMapping;\r
-import org.springframework.web.bind.annotation.RequestMethod;\r
-import org.springframework.web.bind.annotation.RequestParam;\r
-\r
-import eu.etaxonomy.cdm.api.service.IOccurrenceService;\r
-import eu.etaxonomy.cdm.api.service.ITaxonService;\r
-import eu.etaxonomy.cdm.api.service.ITermService;\r
-import eu.etaxonomy.cdm.api.service.pager.Pager;\r
-import eu.etaxonomy.cdm.api.service.util.TaxonRelationshipEdge;\r
-import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction;\r
-import eu.etaxonomy.cdm.model.location.NamedArea;\r
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
-import eu.etaxonomy.cdm.persistence.query.MatchMode;\r
-import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
-import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;\r
-import eu.etaxonomy.cdm.remote.editor.CdmTypePropertyEditor;\r
-import eu.etaxonomy.cdm.remote.editor.MatchModePropertyEditor;\r
-import eu.etaxonomy.cdm.remote.editor.NamedAreaPropertyEditor;\r
-import eu.etaxonomy.cdm.remote.editor.UUIDListPropertyEditor;\r
-import eu.etaxonomy.cdm.remote.editor.UuidList;\r
-\r
-/**\r
- * TODO write controller documentation\r
- *\r
- * @author a.kohlbecker\r
- * @date 24.03.2009\r
- */\r
-@Controller\r
-@RequestMapping(value = {"/occurrence"})\r
-public class OccurrenceListController extends IdentifiableListController<SpecimenOrObservationBase, IOccurrenceService> {\r
-\r
-\r
-    @Autowired\r
-    private ITaxonService taxonService;\r
-\r
-    @Autowired\r
-    private ITermService termService;\r
-\r
-    /* (non-Javadoc)\r
-     * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)\r
-     */\r
-    @Override\r
-    @Autowired\r
-    public void setService(IOccurrenceService service) {\r
-        this.service = service;\r
-    }\r
-\r
-    @InitBinder\r
-    @Override\r
-    public void initBinder(WebDataBinder binder) {\r
-        super.initBinder(binder);\r
-        binder.registerCustomEditor(UuidList.class, new UUIDListPropertyEditor());\r
-    }\r
-\r
-    /**\r
-     * @param taxonUuid\r
-     * @param relationshipUuids e.g. CongruentTo;  "60974c98-64ab-4574-bb5c-c110f6db634d"\r
-     * @param relationshipInversUuids\r
-     * @param maxDepth null for unlimited\r
-     * @param pageNumber\r
-     * @param pageSize\r
-     * @param request\r
-     * @param response\r
-     * @return\r
-     * @throws IOException\r
-     */\r
-    @RequestMapping(\r
-            value = {"byAssociatedTaxon"},\r
-            method = RequestMethod.GET)\r
-    public Pager<SpecimenOrObservationBase> doListByAssociatedTaxon(\r
-                @RequestParam(value = "taxonUuid", required = true) UUID taxonUuid,\r
-                @RequestParam(value = "relationships", required = false) UuidList relationshipUuids,\r
-                @RequestParam(value = "relationshipsInvers", required = false) UuidList relationshipInversUuids,\r
-                @RequestParam(value = "maxDepth", required = false) Integer maxDepth,\r
-                @RequestParam(value = "pageNumber", required = false) Integer pageNumber,\r
-                @RequestParam(value = "pageSize", required = false) Integer pageSize,\r
-                HttpServletRequest request,\r
-                HttpServletResponse response) throws IOException {\r
-\r
-        Set<TaxonRelationshipEdge> includeRelationships = null;\r
-        if(relationshipUuids != null || relationshipInversUuids != null){\r
-            includeRelationships = new HashSet<TaxonRelationshipEdge>();\r
-            if(relationshipUuids != null) {\r
-                for (UUID uuid : relationshipUuids) {\r
-                    if(relationshipInversUuids != null && relationshipInversUuids.contains(uuid)){\r
-                        includeRelationships.add(new TaxonRelationshipEdge((TaxonRelationshipType) termService.find(uuid), Direction.relatedTo, Direction.relatedFrom));\r
-                        relationshipInversUuids.remove(uuid);\r
-                    } else {\r
-                        includeRelationships.add(new TaxonRelationshipEdge((TaxonRelationshipType) termService.find(uuid), Direction.relatedTo));\r
-                    }\r
-                }\r
-            }\r
-            if(relationshipInversUuids != null) {\r
-                for (UUID uuid : relationshipInversUuids) {\r
-                    includeRelationships.add(new TaxonRelationshipEdge((TaxonRelationshipType) termService.find(uuid), Direction.relatedFrom));\r
-                }\r
-            }\r
-        }\r
-\r
-        Taxon associatedTaxon = (Taxon) taxonService.find(taxonUuid);\r
-        PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);\r
-        pagerParams.normalizeAndValidate(response);\r
-\r
-        List<OrderHint> orderHints = null;\r
-\r
-        return service.pageByAssociatedTaxon(null, includeRelationships, associatedTaxon,\r
-                maxDepth, pagerParams.getPageSize(), pagerParams.getPageIndex(),\r
-                orderHints, DEFAULT_INIT_STRATEGY);\r
-\r
-    }\r
+// $Id$
+/**
+ * Copyright (C) 2009 EDIT 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.
+ */
+
+package eu.etaxonomy.cdm.remote.controller;
+
+import io.swagger.annotations.Api;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.lucene.queryparser.classic.ParseException;
+import org.hibernate.search.spatial.impl.Rectangle;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+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.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.ITaxonService;
+import eu.etaxonomy.cdm.api.service.ITermService;
+import eu.etaxonomy.cdm.api.service.pager.Pager;
+import eu.etaxonomy.cdm.api.service.search.SearchResult;
+import eu.etaxonomy.cdm.api.service.util.TaxonRelationshipEdge;
+import eu.etaxonomy.cdm.model.common.Language;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.persistence.query.OrderHint;
+import eu.etaxonomy.cdm.remote.controller.util.ControllerUtils;
+import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
+import eu.etaxonomy.cdm.remote.editor.RectanglePropertyEditor;
+import eu.etaxonomy.cdm.remote.editor.UUIDListPropertyEditor;
+import eu.etaxonomy.cdm.remote.editor.UuidList;
+
+/**
+ * TODO write controller documentation
+ *
+ * @author a.kohlbecker
+ * @date 24.03.2009
+ */
+@Controller
+@Api("occurrence")
+@RequestMapping(value = {"/occurrence"})
+public class OccurrenceListController extends AbstractIdentifiableListController<SpecimenOrObservationBase, IOccurrenceService> {
+
+
+    @Autowired
+    private ITaxonService taxonService;
+
+    @Autowired
+    private ITermService termService;
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)
+     */
+    @Override
+    @Autowired
+    public void setService(IOccurrenceService service) {
+        this.service = service;
+    }
+
+    @InitBinder
+    @Override
+    public void initBinder(WebDataBinder binder) {
+        super.initBinder(binder);
+        binder.registerCustomEditor(UuidList.class, new UUIDListPropertyEditor());
+        binder.registerCustomEditor(Rectangle.class, new RectanglePropertyEditor());
+    }
+
+    /**
+     * @param taxonUuid
+     * @param relationshipUuids a comma separated list of uuids e.g. CongruentTo;  "60974c98-64ab-4574-bb5c-c110f6db634d"
+     * @param relationshipInversUuids a comma separated list of uuids
+     * @param maxDepth null for unlimited
+     * @param pageNumber
+     * @param pageSize
+     * @param request
+     * @param response
+     * @return
+     * @throws IOException
+     */
+    @RequestMapping(
+            value = {"byAssociatedTaxon"},
+            method = RequestMethod.GET)
+    public Pager<SpecimenOrObservationBase> doListByAssociatedTaxon(
+                @RequestParam(value = "taxonUuid", required = true) UUID taxonUuid,
+                @RequestParam(value = "relationships", required = false) UuidList relationshipUuids,
+                @RequestParam(value = "relationshipsInvers", required = false) UuidList relationshipInversUuids,
+                @RequestParam(value = "maxDepth", required = false) Integer maxDepth,
+                @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
+                @RequestParam(value = "pageSize", required = false) Integer pageSize,
+                HttpServletRequest request,
+                HttpServletResponse response) throws IOException {
+
+        logger.info("doListByAssociatedTaxon()" + request.getRequestURI() + "?" + request.getQueryString());
+
+        Set<TaxonRelationshipEdge> includeRelationships = ControllerUtils.loadIncludeRelationships(relationshipUuids, relationshipInversUuids, termService);
+
+        Taxon associatedTaxon = (Taxon) taxonService.find(taxonUuid);
+        PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
+        pagerParams.normalizeAndValidate(response);
+
+        List<OrderHint> orderHints = null;
+
+        return service.pageByAssociatedTaxon(null, includeRelationships, associatedTaxon,
+                maxDepth, pagerParams.getPageSize(), pagerParams.getPageIndex(),
+                orderHints, getInitializationStrategy());
+
+    }
+
+    /**
+     *
+     * @param clazz
+     * @param queryString
+     * @param boundingBox
+     *            as
+     *            minx(minlongitute),miny(minlatitute),maxx(maxlongitute),max(
+     *            maxlatitute), e.g. 13.112,52.374,13.681,52.641 for the Berlin
+     *            area
+     * @param languages
+     * @param highlighting
+     * @param pageNumber
+     * @param pageSize
+     * @param request
+     * @param response
+     * @return
+     * @throws IOException
+     * @throws ParseException
+     */
+    @RequestMapping(method = RequestMethod.GET, value={"findByFullText"})
+    public Pager<SearchResult<SpecimenOrObservationBase>> dofindByFullText(
+            @RequestParam(value = "clazz", required = false) Class<? extends SpecimenOrObservationBase<?>> clazz,
+            @RequestParam(value = "query", required = false) String queryString,
+            @RequestParam(value = "bbox", required = false) Rectangle boundingBox,
+            @RequestParam(value = "languages", required = false) List<Language> languages,
+            @RequestParam(value = "hl", required = false) Boolean highlighting,
+            @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
+            @RequestParam(value = "pageSize", required = false) Integer pageSize,
+            HttpServletRequest request,
+            HttpServletResponse response
+            )
+             throws IOException, ParseException {
+
+         logger.info("findByFullText : " + request.getRequestURI() + "?" + request.getQueryString() );
+
+         PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
+         pagerParams.normalizeAndValidate(response);
+
+         if(highlighting == null){
+             highlighting = false;
+         }
+
+         if(queryString == null && boundingBox == null) {
+             HttpStatusMessage.create("Either query or bbox must be given", 400).send(response);
+             return null;
+         }
+
+        Pager<SearchResult<SpecimenOrObservationBase>> pager = service.findByFullText(clazz, queryString, boundingBox, languages,
+                highlighting, pagerParams.getPageSize(), pagerParams.getPageIndex(), ((List<OrderHint>)null),
+                initializationStrategy);
+        return pager;
+    }
+
 }
\ No newline at end of file