3 * Copyright (C) 2009 EDIT European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 1.1 See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.remote
.controller
;
12 import java
.io
.IOException
;
13 import java
.util
.Arrays
;
14 import java
.util
.List
;
15 import java
.util
.UUID
;
17 import javax
.servlet
.http
.HttpServletRequest
;
18 import javax
.servlet
.http
.HttpServletResponse
;
20 import org
.apache
.log4j
.Logger
;
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
;
29 import eu
.etaxonomy
.cdm
.api
.service
.IDescriptionService
;
30 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
31 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
32 import eu
.etaxonomy
.cdm
.api
.service
.pager
.Pager
;
33 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
34 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
35 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
36 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
37 import eu
.etaxonomy
.cdm
.persistence
.query
.MatchMode
;
38 import eu
.etaxonomy
.cdm
.remote
.controller
.util
.PagerParameters
;
39 import eu
.etaxonomy
.cdm
.remote
.editor
.DefinedTermBaseList
;
40 import eu
.etaxonomy
.cdm
.remote
.editor
.TermBaseListPropertyEditor
;
45 * This controller is mostly a 1:1 copy of the DescriptionListController
46 * and this provides identical end points which only differ in the depth of the
47 * object graphs returned.
48 * An exception is the doAccumulateDistributions() method, which is not repeated
51 * @author a.kohlbecker
56 @RequestMapping(value
= {"/portal/description"})
57 public class DescriptionListPortalController
extends IdentifiableListController
<DescriptionBase
, IDescriptionService
> {
59 public static final Logger logger
= Logger
.getLogger(DescriptionListPortalController
.class);
62 private ITaxonService taxonService
;
64 protected static final List
<String
> DESCRIPTION_INIT_STRATEGY
= Arrays
.asList(new String
[]{
67 "elements.annotations",
69 "elements.stateData.$",
70 "elements.sources.citation.authorTeam",
71 "elements.sources.nameUsedInSource",
72 "elements.multilanguageText",
77 protected static final List
<String
> DESCRIPTION_ELEMENT_INIT_STRATEGY
= Arrays
.asList(new String
[]{
82 "sources.citation.authorTeam",
83 "sources.nameUsedInSource",
87 "name.rank.representations",
88 "name.status.type.representations",
93 public DescriptionListPortalController() {
95 setInitializationStrategy(DESCRIPTION_INIT_STRATEGY
);
100 private ITermService termService
;
103 * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)
107 public void setService(IDescriptionService service
) {
108 this.service
= service
;
113 public void initBinder(WebDataBinder binder
) {
114 super.initBinder(binder
);
115 binder
.registerCustomEditor(DefinedTermBaseList
.class, new TermBaseListPropertyEditor
<Feature
>(termService
));
127 * @throws IOException
129 @RequestMapping(value
= "//portal/descriptionElement/find", method
= RequestMethod
.GET
) // mapped as absolute path, see CdmAntPathMatcher
130 public Pager
<DescriptionElementBase
> doFindDescriptionElements(
131 @RequestParam(value
= "query", required
= true) String queryString
,
132 @RequestParam(value
= "type", required
= false) Class
<?
extends DescriptionElementBase
> type
,
133 @RequestParam(value
= "pageSize", required
= false) Integer pageSize
,
134 @RequestParam(value
= "pageNumber", required
= false) Integer pageNumber
,
135 @RequestParam(value
= "matchMode", required
= false) MatchMode matchMode
,
136 HttpServletRequest request
,
137 HttpServletResponse response
141 logger
.info("doFindDescriptionElements : " + request
.getRequestURI() + "?" + request
.getQueryString() );
143 PagerParameters pagerParams
= new PagerParameters(pageSize
, pageNumber
);
144 pagerParams
.normalizeAndValidate(response
);
146 Pager
<DescriptionElementBase
> pager
= service
.searchElements(type
, queryString
, pageSize
, pageNumber
, null, getInitializationStrategy());
152 * Requires the query parameter "descriptionType" to be present
155 * @param descriptionType
162 * @throws IOException
164 @RequestMapping(value
= "//portal/descriptionElement/byFeature", method
= {RequestMethod
.GET
, RequestMethod
.POST
}) // mapped as absolute path, see CdmAntPathMatcher
165 public Pager
<DescriptionElementBase
> doPageDescriptionElementsByFeature(
166 @RequestParam(value
= "features", required
= false) DefinedTermBaseList
<Feature
> features
,
167 @RequestParam(value
= "descriptionType", required
= true) Class
<?
extends DescriptionBase
> descriptionType
,
168 @RequestParam(value
= "type", required
= false) Class
<?
extends DescriptionElementBase
> type
,
169 @RequestParam(value
= "pageSize", required
= false) Integer pageSize
,
170 @RequestParam(value
= "pageNumber", required
= false) Integer pageNumber
, HttpServletRequest request
,
171 HttpServletResponse response
) throws IOException
{
173 logger
.info("doPageDescriptionElementsByFeature : " + requestPathAndQuery(request
));
175 PagerParameters pagerParams
= new PagerParameters(pageSize
, pageNumber
);
176 pagerParams
.normalizeAndValidate(response
);
178 if(features
== null){
179 features
= new DefinedTermBaseList
<Feature
>();
182 Pager
<DescriptionElementBase
> pager
= service
.pageDescriptionElements(null, descriptionType
, features
.asSet(),
183 type
, pagerParams
.getPageSize(), pagerParams
.getPageIndex(), DESCRIPTION_ELEMENT_INIT_STRATEGY
);
189 * Requires the query parameter "taxon" to be present
199 * @throws IOException
201 @RequestMapping(value
= "//portal/descriptionElement/byTaxon", method
= {RequestMethod
.GET
, RequestMethod
.POST
}) // mapped as absolute path, see CdmAntPathMatcher
202 public <T
extends DescriptionElementBase
> Pager
<T
> getDescriptionElementsForTaxon(
203 @RequestParam(value
= "taxon", required
= true) UUID taxon_uuid
,
204 @RequestParam(value
= "features", required
= false) DefinedTermBaseList
<Feature
> features
,
205 @RequestParam(value
= "type", required
= false) Class
<T
> type
,
206 @RequestParam(value
= "pageSize", required
= false) Integer pageSize
,
207 @RequestParam(value
= "pageNumber", required
= false) Integer pageNumber
, HttpServletRequest request
,
208 HttpServletResponse response
) throws IOException
{
210 logger
.info("getDescriptionElementsForTaxon : " + requestPathAndQuery(request
));
212 PagerParameters pagerParams
= new PagerParameters(pageSize
, pageNumber
);
213 pagerParams
.normalizeAndValidate(response
);
216 if( taxon_uuid
!= null){
218 taxon
= (Taxon
) taxonService
.load(taxon_uuid
);
219 } catch (Exception e
) {
220 HttpStatusMessage
.UUID_NOT_FOUND
.send(response
);
223 //TODO it seems as if the InitializationStrategy is not appropriate here !!!
224 // see #3728 (DescriptionListPortalController.getDescriptionElementsForTaxon() seems to be using in-appropriate init strategy)
225 if (logger
.isDebugEnabled()){logger
.debug("get pager ...");}
226 Pager
<T
> pager
= service
.pageDescriptionElementsForTaxon(
228 (features
!= null ? features
.asSet() : null),
230 pagerParams
.getPageSize(),
231 pagerParams
.getPageIndex(),
232 DESCRIPTION_ELEMENT_INIT_STRATEGY
234 if (logger
.isDebugEnabled()){logger
.debug("get pager - DONE");}