ref #9395 findByAccessionNumber() -> findByGeneticAccessionNumber(), preserving old...
[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
9 package eu.etaxonomy.cdm.remote.controller;
10
11 import java.io.IOException;
12 import java.util.List;
13 import java.util.Set;
14 import java.util.UUID;
15
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletResponse;
18
19 import org.hibernate.search.spatial.impl.Rectangle;
20 import org.springframework.beans.factory.annotation.Autowired;
21 import org.springframework.stereotype.Controller;
22 import org.springframework.web.bind.WebDataBinder;
23 import org.springframework.web.bind.annotation.InitBinder;
24 import org.springframework.web.bind.annotation.RequestMapping;
25 import org.springframework.web.bind.annotation.RequestMethod;
26 import org.springframework.web.bind.annotation.RequestParam;
27
28 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
29 import eu.etaxonomy.cdm.api.service.ITaxonService;
30 import eu.etaxonomy.cdm.api.service.ITermService;
31 import eu.etaxonomy.cdm.api.service.dto.SpecimenOrObservationBaseDTO;
32 import eu.etaxonomy.cdm.api.service.pager.Pager;
33 import eu.etaxonomy.cdm.api.service.search.LuceneParseException;
34 import eu.etaxonomy.cdm.api.service.search.SearchResult;
35 import eu.etaxonomy.cdm.api.service.util.TaxonRelationshipEdge;
36 import eu.etaxonomy.cdm.model.common.Language;
37 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
38 import eu.etaxonomy.cdm.model.taxon.Taxon;
39 import eu.etaxonomy.cdm.persistence.query.OrderHint;
40 import eu.etaxonomy.cdm.remote.controller.util.ControllerUtils;
41 import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
42 import eu.etaxonomy.cdm.remote.editor.RectanglePropertyEditor;
43 import eu.etaxonomy.cdm.remote.editor.UUIDListPropertyEditor;
44 import eu.etaxonomy.cdm.remote.editor.UuidList;
45 import io.swagger.annotations.Api;
46
47 /**
48 * TODO write controller documentation
49 *
50 * @author a.kohlbecker
51 * @since 24.03.2009
52 */
53 @Controller
54 @Api("occurrence")
55 @RequestMapping(value = {"/occurrence"})
56 public class OccurrenceListController extends AbstractIdentifiableListController<SpecimenOrObservationBase, IOccurrenceService> {
57
58 @Autowired
59 private ITaxonService taxonService;
60
61 @Autowired
62 private ITermService termService;
63
64 /* (non-Javadoc)
65 * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)
66 */
67 @Override
68 @Autowired
69 public void setService(IOccurrenceService service) {
70 this.service = service;
71 }
72
73 @InitBinder
74 @Override
75 public void initBinder(WebDataBinder binder) {
76 super.initBinder(binder);
77 binder.registerCustomEditor(UuidList.class, new UUIDListPropertyEditor());
78 binder.registerCustomEditor(Rectangle.class, new RectanglePropertyEditor());
79 }
80
81 /**
82 * @param taxonUuid
83 * @param relationshipUuids a comma separated list of uuids e.g. CongruentTo; "60974c98-64ab-4574-bb5c-c110f6db634d"
84 * @param relationshipInversUuids a comma separated list of uuids
85 * @param maxDepth null for unlimited
86 * @param pageNumber
87 * @param pageSize
88 * @param request
89 * @param response
90 * @return
91 * @throws IOException
92 */
93 @RequestMapping(
94 value = {"byAssociatedTaxon"},
95 method = RequestMethod.GET)
96 public Pager<SpecimenOrObservationBase> doListByAssociatedTaxon(
97 @RequestParam(value = "taxonUuid", required = true) UUID taxonUuid,
98 @RequestParam(value = "relationships", required = false) UuidList relationshipUuids,
99 @RequestParam(value = "relationshipsInvers", required = false) UuidList relationshipInversUuids,
100 @RequestParam(value = "maxDepth", required = false) Integer maxDepth,
101 @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
102 @RequestParam(value = "pageSize", required = false) Integer pageSize,
103 HttpServletRequest request,
104 HttpServletResponse response) throws IOException {
105
106 logger.info("doListByAssociatedTaxon()" + requestPathAndQuery(request));
107
108 Set<TaxonRelationshipEdge> includeRelationships = ControllerUtils.loadIncludeRelationships(relationshipUuids, relationshipInversUuids, termService);
109
110 Taxon associatedTaxon = (Taxon) taxonService.find(taxonUuid);
111 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
112 pagerParams.normalizeAndValidate(response);
113
114 List<OrderHint> orderHints = null;
115
116 return service.pageByAssociatedTaxon(null, includeRelationships, associatedTaxon,
117 maxDepth, pagerParams.getPageSize(), pagerParams.getPageIndex(),
118 orderHints, getInitializationStrategy());
119
120 }
121
122 @RequestMapping(value = "rootUnitDTOsByAssociatedTaxon", method = RequestMethod.GET)
123 public List<SpecimenOrObservationBaseDTO> doListlistRootUnitDTOsByAssociatedTaxon(
124 @RequestParam(value = "uuid", required = true) UUID uuid,
125 HttpServletRequest request,
126 HttpServletResponse response) {
127 logger.info("doListlistRootUnitDTOByAssociatedTaxon() - " + requestPathAndQuery(request));
128
129 List<SpecimenOrObservationBaseDTO> sobDTOs = service.listRootUnitDTOsByAssociatedTaxon(null, uuid, OccurrenceController.DERIVED_UNIT_INIT_STRATEGY);
130 return sobDTOs;
131 }
132
133 /**
134 *
135 * @param clazz
136 * @param queryString
137 * @param boundingBox
138 * as
139 * minx(minlongitute),miny(minlatitute),maxx(maxlongitute),max(
140 * maxlatitute), e.g. 13.112,52.374,13.681,52.641 for the Berlin
141 * area
142 * @param languages
143 * @param highlighting
144 * @param pageNumber
145 * @param pageSize
146 * @param request
147 * @param response
148 * @return
149 * @throws IOException
150 * @throws ParseException
151 */
152 @RequestMapping(method = RequestMethod.GET, value={"findByFullText"})
153 public Pager<SearchResult<SpecimenOrObservationBase>> doFindByFullText(
154 @RequestParam(value = "clazz", required = false) Class<? extends SpecimenOrObservationBase<?>> clazz,
155 @RequestParam(value = "query", required = false) String queryString,
156 @RequestParam(value = "bbox", required = false) Rectangle boundingBox,
157 @RequestParam(value = "languages", required = false) List<Language> languages,
158 @RequestParam(value = "hl", required = false) Boolean highlighting,
159 @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
160 @RequestParam(value = "pageSize", required = false) Integer pageSize,
161 HttpServletRequest request,
162 HttpServletResponse response
163 )
164 throws IOException, LuceneParseException {
165
166 logger.info("doFindByFullText() " + requestPathAndQuery(request) );
167
168 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
169 pagerParams.normalizeAndValidate(response);
170
171 if(highlighting == null){
172 highlighting = false;
173 }
174
175 if(queryString == null && boundingBox == null) {
176 HttpStatusMessage.create("Either query or bbox must be given", 400).send(response);
177 return null;
178 }
179
180 Pager<SearchResult<SpecimenOrObservationBase>> pager = service.findByFullText(clazz, queryString, boundingBox, languages,
181 highlighting, pagerParams.getPageSize(), pagerParams.getPageIndex(), ((List<OrderHint>)null),
182 initializationStrategy);
183 return pager;
184 }
185
186 /**
187 *
188 * @param queryString
189 * @param request
190 * @param response
191 * @return
192 * @throws IOException
193 * @throws ParseException
194 */
195 // @RequestMapping(method = RequestMethod.GET, value={"byGeneticAccessionNumber"})
196 // public Pager<DerivedUnit> dofindByGeneticAccessionNumber(
197 // @RequestParam(value = "query", required = false) String queryString,
198 // @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
199 // @RequestParam(value = "pageSize", required = false) Integer pageSize,
200 // HttpServletRequest request,
201 // HttpServletResponse response
202 // )
203 // throws IOException {
204 //
205 // logger.info("dofindByIdentifier() " + requestPathAndQuery(request) );
206 //
207 // PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
208 // pagerParams.normalizeAndValidate(response);
209 //
210 //
211 // if(queryString == null ) {
212 // HttpStatusMessage.create("Query must be given", 400).send(response);
213 // return null;
214 // }
215 //
216 // Pager<DerivedUnit> pager = service.findByAccessionNumber(queryString,pageSize, pageNumber, null,this.initializationStrategy);
217 //
218 // return pager;
219 // }
220
221 @RequestMapping(method = RequestMethod.GET, value = "byGeneticAccessionNumber" )
222 public SpecimenOrObservationBaseDTO doGetByGeneticAccessionNumber(
223 @RequestParam(value="accessionNumber", required = true) String accessionNumber,
224 HttpServletRequest request,
225 HttpServletResponse response) throws IOException {
226 logger.info("doGetByGeneticAccessionNumber() - " + requestPathAndQuery(request));
227
228 SpecimenOrObservationBaseDTO sobDto = service.findByGeneticAccessionNumber(accessionNumber, null);
229 if(sobDto == null ) {
230 response.setHeader("Failure", "No DNA available for accession number ");
231 HttpStatusMessage.create("No DNA available for accession number " + accessionNumber, 400).send(response);
232 return null;
233 }
234 return sobDto;
235 }
236
237
238 }