ref #10334 further handle include unpublished in webservices
[cdmlib.git] / cdmlib-remote / src / main / java / eu / etaxonomy / cdm / remote / controller / OccurrenceListController.java
1 /**
2 * Copyright (C) 2009 EDIT European Distributed Institute of Taxonomy
3 * http://www.e-taxonomy.eu
4 *
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 See LICENSE.TXT at the top of this package for the full license terms.
7 */
8 package eu.etaxonomy.cdm.remote.controller;
9
10 import java.io.IOException;
11 import java.util.List;
12 import java.util.Set;
13 import java.util.UUID;
14
15 import javax.servlet.http.HttpServletRequest;
16 import javax.servlet.http.HttpServletResponse;
17
18 import org.apache.logging.log4j.LogManager;
19 import org.apache.logging.log4j.Logger;
20 import org.hibernate.search.spatial.impl.Rectangle;
21 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.stereotype.Controller;
23 import org.springframework.web.bind.WebDataBinder;
24 import org.springframework.web.bind.annotation.InitBinder;
25 import org.springframework.web.bind.annotation.RequestMapping;
26 import org.springframework.web.bind.annotation.RequestMethod;
27 import org.springframework.web.bind.annotation.RequestParam;
28
29 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
30 import eu.etaxonomy.cdm.api.service.ITaxonService;
31 import eu.etaxonomy.cdm.api.service.ITermService;
32 import eu.etaxonomy.cdm.api.service.dto.RectangleDTO;
33 import eu.etaxonomy.cdm.api.service.dto.SpecimenOrObservationBaseDTO;
34 import eu.etaxonomy.cdm.api.service.pager.Pager;
35 import eu.etaxonomy.cdm.api.service.search.LuceneParseException;
36 import eu.etaxonomy.cdm.api.service.search.SearchResult;
37 import eu.etaxonomy.cdm.api.util.TaxonRelationshipEdge;
38 import eu.etaxonomy.cdm.model.common.Language;
39 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
40 import eu.etaxonomy.cdm.model.taxon.Taxon;
41 import eu.etaxonomy.cdm.persistence.query.OrderHint;
42 import eu.etaxonomy.cdm.remote.controller.util.ControllerUtils;
43 import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
44 import eu.etaxonomy.cdm.remote.editor.RectanglePropertyEditor;
45 import eu.etaxonomy.cdm.remote.editor.UUIDListPropertyEditor;
46 import eu.etaxonomy.cdm.remote.editor.UuidList;
47 import io.swagger.annotations.Api;
48
49 /**
50 * TODO write controller documentation
51 *
52 * @author a.kohlbecker
53 * @since 24.03.2009
54 */
55 @Controller
56 @Api("occurrence")
57 @RequestMapping(value = {"/occurrence"})
58 public class OccurrenceListController extends AbstractIdentifiableListController<SpecimenOrObservationBase, IOccurrenceService> {
59
60 private static final Logger logger = LogManager.getLogger();
61
62 @Autowired
63 private ITaxonService taxonService;
64
65 @Autowired
66 private ITermService termService;
67
68 @Override
69 @Autowired
70 public void setService(IOccurrenceService service) {
71 this.service = service;
72 }
73
74 @InitBinder
75 @Override
76 public void initBinder(WebDataBinder binder) {
77 super.initBinder(binder);
78 binder.registerCustomEditor(UuidList.class, new UUIDListPropertyEditor());
79 binder.registerCustomEditor(Rectangle.class, new RectanglePropertyEditor());
80 }
81
82 /**
83 * @param taxonUuid
84 * @param relationshipUuids a comma separated list of uuids e.g. CongruentTo; "60974c98-64ab-4574-bb5c-c110f6db634d"
85 * @param relationshipInversUuids a comma separated list of uuids
86 * @param maxDepth null for unlimited
87 */
88 @RequestMapping(
89 value = {"byAssociatedTaxon"},
90 method = RequestMethod.GET)
91 public Pager<SpecimenOrObservationBase> doListByAssociatedTaxon(
92 @RequestParam(value = "taxonUuid", required = true) UUID taxonUuid,
93 @RequestParam(value = "relationships", required = false) UuidList relationshipUuids,
94 @RequestParam(value = "relationshipsInvers", required = false) UuidList relationshipInversUuids,
95 @RequestParam(value = "maxDepth", required = false) Integer maxDepth,
96 @RequestParam(value = "pageIndex", required = false) Integer pageIndex,
97 @RequestParam(value = "pageSize", required = false) Integer pageSize,
98 HttpServletRequest request,
99 HttpServletResponse response) throws IOException {
100
101 logger.info("doListByAssociatedTaxon()" + requestPathAndQuery(request));
102 boolean includeUnpublished = NO_UNPUBLISHED;
103
104 Set<TaxonRelationshipEdge> includeRelationships = ControllerUtils.loadIncludeRelationships(relationshipUuids, relationshipInversUuids, termService);
105
106 Taxon associatedTaxon = (Taxon) taxonService.find(taxonUuid);
107 PagerParameters pagerParams = new PagerParameters(pageSize, pageIndex);
108 pagerParams.normalizeAndValidate(response);
109
110 List<OrderHint> orderHints = null;
111
112 return service.pageByAssociatedTaxon(null, includeRelationships, associatedTaxon,
113 includeUnpublished, maxDepth, pagerParams.getPageSize(), pagerParams.getPageIndex(),
114 orderHints, getInitializationStrategy());
115 }
116
117 @RequestMapping(value = "rootUnitDTOsByAssociatedTaxon", method = RequestMethod.GET)
118 public List<SpecimenOrObservationBaseDTO> doListlistRootUnitDTOsByAssociatedTaxon(
119 @RequestParam(value = "uuid", required = true) UUID uuid,
120 HttpServletRequest request,
121 HttpServletResponse response) {
122 logger.info("doListlistRootUnitDTOByAssociatedTaxon() - " + requestPathAndQuery(request));
123
124 boolean includeUnpublished = NO_UNPUBLISHED;
125 List<SpecimenOrObservationBaseDTO> sobDTOs = service.listRootUnitDTOsByAssociatedTaxon(
126 null, uuid, includeUnpublished, OccurrenceController.DERIVED_UNIT_INIT_STRATEGY);
127 return sobDTOs;
128 }
129
130 /**
131 *
132 * @param boundingBox
133 * as
134 * minx(minlongitute),miny(minlatitute),maxx(maxlongitute),max(
135 * maxlatitute), e.g. 13.112,52.374,13.681,52.641 for the Berlin
136 * area
137 */
138 @RequestMapping(method = RequestMethod.GET, value={"findByFullText"})
139 public Pager<SearchResult<SpecimenOrObservationBase>> doFindByFullText(
140 @RequestParam(value = "clazz", required = false) Class<? extends SpecimenOrObservationBase<?>> clazz,
141 @RequestParam(value = "query", required = false) String queryString,
142 @RequestParam(value = "bbox", required = false) RectangleDTO boundingBox,
143 @RequestParam(value = "languages", required = false) List<Language> languages,
144 @RequestParam(value = "hl", required = false) Boolean highlighting,
145 @RequestParam(value = "pageIndex", required = false) Integer pageIndex,
146 @RequestParam(value = "pageSize", required = false) Integer pageSize,
147 HttpServletRequest request,
148 HttpServletResponse response
149 )
150 throws IOException, LuceneParseException {
151
152 logger.info("doFindByFullText() " + requestPathAndQuery(request) );
153
154 PagerParameters pagerParams = new PagerParameters(pageSize, pageIndex);
155 pagerParams.normalizeAndValidate(response);
156
157 if(highlighting == null){
158 highlighting = false;
159 }
160
161 if(queryString == null && boundingBox == null) {
162 HttpStatusMessage.create("Either query or bbox must be given", 400).send(response);
163 return null;
164 }
165
166 Pager<SearchResult<SpecimenOrObservationBase>> pager = service.findByFullText(clazz, queryString, boundingBox, languages,
167 highlighting, pagerParams.getPageSize(), pagerParams.getPageIndex(), ((List<OrderHint>)null),
168 initializationStrategy);
169 return pager;
170 }
171
172 @RequestMapping(method = RequestMethod.GET, value = "byGeneticAccessionNumber" )
173 public SpecimenOrObservationBaseDTO doGetByGeneticAccessionNumber(
174 @RequestParam(value="accessionNumber", required = true) String accessionNumber,
175 HttpServletRequest request,
176 HttpServletResponse response) throws IOException {
177 logger.info("doGetByGeneticAccessionNumber() - " + requestPathAndQuery(request));
178
179 SpecimenOrObservationBaseDTO sobDto = service.findByGeneticAccessionNumber(accessionNumber, null);
180 if(sobDto == null ) {
181 response.setHeader("Failure", "No DNA available for accession number ");
182 HttpStatusMessage.create("No DNA available for accession number " + accessionNumber, 400).send(response);
183 return null;
184 }
185 return sobDto;
186 }
187 }