2 * Copyright (C) 2009 EDIT European Distributed Institute of Taxonomy
3 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.cdm
.remote
.controller
;
11 import java
.io
.IOException
;
12 import java
.util
.List
;
14 import java
.util
.UUID
;
16 import javax
.servlet
.http
.HttpServletRequest
;
17 import javax
.servlet
.http
.HttpServletResponse
;
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
;
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
;
48 * TODO write controller documentation
50 * @author a.kohlbecker
55 @RequestMapping(value
= {"/occurrence"})
56 public class OccurrenceListController
extends AbstractIdentifiableListController
<SpecimenOrObservationBase
, IOccurrenceService
> {
59 private ITaxonService taxonService
;
62 private ITermService termService
;
65 * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)
69 public void setService(IOccurrenceService service
) {
70 this.service
= service
;
75 public void initBinder(WebDataBinder binder
) {
76 super.initBinder(binder
);
77 binder
.registerCustomEditor(UuidList
.class, new UUIDListPropertyEditor());
78 binder
.registerCustomEditor(Rectangle
.class, new RectanglePropertyEditor());
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
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
{
106 logger
.info("doListByAssociatedTaxon()" + requestPathAndQuery(request
));
108 Set
<TaxonRelationshipEdge
> includeRelationships
= ControllerUtils
.loadIncludeRelationships(relationshipUuids
, relationshipInversUuids
, termService
);
110 Taxon associatedTaxon
= (Taxon
) taxonService
.find(taxonUuid
);
111 PagerParameters pagerParams
= new PagerParameters(pageSize
, pageNumber
);
112 pagerParams
.normalizeAndValidate(response
);
114 List
<OrderHint
> orderHints
= null;
116 return service
.pageByAssociatedTaxon(null, includeRelationships
, associatedTaxon
,
117 maxDepth
, pagerParams
.getPageSize(), pagerParams
.getPageIndex(),
118 orderHints
, getInitializationStrategy());
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
));
129 List
<SpecimenOrObservationBaseDTO
> sobDTOs
= service
.listRootUnitDTOsByAssociatedTaxon(null, uuid
, OccurrenceController
.DERIVED_UNIT_INIT_STRATEGY
);
139 * minx(minlongitute),miny(minlatitute),maxx(maxlongitute),max(
140 * maxlatitute), e.g. 13.112,52.374,13.681,52.641 for the Berlin
143 * @param highlighting
149 * @throws IOException
150 * @throws ParseException
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
164 throws IOException
, LuceneParseException
{
166 logger
.info("doFindByFullText() " + requestPathAndQuery(request
) );
168 PagerParameters pagerParams
= new PagerParameters(pageSize
, pageNumber
);
169 pagerParams
.normalizeAndValidate(response
);
171 if(highlighting
== null){
172 highlighting
= false;
175 if(queryString
== null && boundingBox
== null) {
176 HttpStatusMessage
.create("Either query or bbox must be given", 400).send(response
);
180 Pager
<SearchResult
<SpecimenOrObservationBase
>> pager
= service
.findByFullText(clazz
, queryString
, boundingBox
, languages
,
181 highlighting
, pagerParams
.getPageSize(), pagerParams
.getPageIndex(), ((List
<OrderHint
>)null),
182 initializationStrategy
);
192 * @throws IOException
193 * @throws ParseException
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
203 // throws IOException {
205 // logger.info("dofindByIdentifier() " + requestPathAndQuery(request) );
207 // PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
208 // pagerParams.normalizeAndValidate(response);
211 // if(queryString == null ) {
212 // HttpStatusMessage.create("Query must be given", 400).send(response);
216 // Pager<DerivedUnit> pager = service.findByAccessionNumber(queryString,pageSize, pageNumber, null,this.initializationStrategy);
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
));
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
);