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
.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 import org
.springframework
.web
.servlet
.ModelAndView
;
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
.description
.TransmissionEngineDistribution
;
33 import eu
.etaxonomy
.cdm
.api
.service
.description
.TransmissionEngineDistribution
.AggregationMode
;
34 import eu
.etaxonomy
.cdm
.api
.service
.pager
.Pager
;
35 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
36 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
37 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
38 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
39 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaLevel
;
40 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaType
;
41 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
42 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
43 import eu
.etaxonomy
.cdm
.persistence
.query
.MatchMode
;
44 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
45 import eu
.etaxonomy
.cdm
.remote
.controller
.util
.PagerParameters
;
46 import eu
.etaxonomy
.cdm
.remote
.controller
.util
.ProgressMonitorUtil
;
47 import eu
.etaxonomy
.cdm
.remote
.editor
.DefinedTermBaseList
;
48 import eu
.etaxonomy
.cdm
.remote
.editor
.TermBaseListPropertyEditor
;
51 * TODO write controller documentation
53 * @author a.kohlbecker
57 @RequestMapping(value
= {"/description"})
58 public class DescriptionListController
extends IdentifiableListController
<DescriptionBase
, IDescriptionService
> {
62 private ITermService termService
;
65 private ITaxonService taxonService
;
69 public TransmissionEngineDistribution transmissionEngineDistribution
;
72 public ProgressMonitorController progressMonitorController
;
75 * There should only be one longtime processes
76 * therefore the according progress monitor uuid is stored in
79 private static UUID transmissionEngineMonitorUuid
= null;
84 * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)
88 public void setService(IDescriptionService service
) {
89 this.service
= service
;
94 public void initBinder(WebDataBinder binder
) {
95 super.initBinder(binder
);
96 binder
.registerCustomEditor(DefinedTermBaseList
.class, new TermBaseListPropertyEditor
<Feature
>(termService
));
101 * Runs the {@link TransmissionEngineDistribution} in a separate Thread and
102 * responds with a redirect to a progress monitor REST service end point.
104 * <b>NOTE</b> this is still a special implementation for the Euro+Med project.
105 * The parameters for the <i>superAreas</i>, the areas to which the subordinate areas should be projected,
106 * <i>lowerRank</i>, <i>upperRank</i> are hardcoded to: <code>TDWG_LEVEL3 areas, SUBSPECIES, GENUS</code>
109 * one of <code>byAreas</code>, <code>byRanks</code>,
110 * <code>byAreasAndRanks</code>
111 * @param frontendBaseUrl
112 * the cdm server instance base URL, this is needed for the a
113 * proper redirect URL when the service is running behind a
116 * the priority for the Thread to spawn, see
117 * {@link Thread#setPriority(int)}, defaults to 3
121 * @throws IOException
123 @RequestMapping(value
= { "accumulateDistributions" }, method
= RequestMethod
.GET
)
124 public ModelAndView
doAccumulateDistributions(
125 @RequestParam(value
= "mode", required
= true) final AggregationMode mode
,
126 @RequestParam(value
= "frontendBaseUrl", required
= false) String frontendBaseUrl
,
127 @RequestParam(value
= "priority", required
= false) Integer priority
,
128 HttpServletRequest request
,
129 HttpServletResponse response
) throws IOException
{
131 logger
.info("doAccumulateDistributions()" + request
.getRequestURI());
133 // transmissionEngineDistribution.updatePriorities();
135 String processLabel
= "accumulating distributions";
137 ProgressMonitorUtil progressUtil
= new ProgressMonitorUtil(progressMonitorController
);
139 final List
<String
> term_init_strategy
= Arrays
.asList(new String
[]{
143 if (!progressMonitorController
.isMonitorRunning(transmissionEngineMonitorUuid
)) {
144 transmissionEngineMonitorUuid
= progressUtil
.registerNewMonitor();
145 Thread subThread
= new Thread() {
148 Pager
<NamedArea
> areaPager
= termService
.list(NamedAreaLevel
.TDWG_LEVEL3(), (NamedAreaType
) null,
149 null, null, (List
<OrderHint
>) null, term_init_strategy
);
150 transmissionEngineDistribution
.accumulate(mode
, areaPager
.getRecords(), Rank
.SUBSPECIES(), Rank
.GENUS(),
151 null, progressMonitorController
.getMonitor(transmissionEngineMonitorUuid
));
154 if(priority
== null) {
155 priority
= AbstractController
.DEFAULT_BATCH_THREAD_PRIORITY
;
157 subThread
.setPriority(priority
);
161 // send redirect "see other"
162 return progressUtil
.respondWithMonitor(frontendBaseUrl
, request
, response
, processLabel
, transmissionEngineMonitorUuid
);
175 * @throws IOException
177 @RequestMapping(value
= "/descriptionElement/find", method
= RequestMethod
.GET
)
178 public Pager
<DescriptionElementBase
> doFindDescriptionElements(
179 @RequestParam(value
= "query", required
= true) String queryString
,
180 @RequestParam(value
= "type", required
= false) Class
<?
extends DescriptionElementBase
> type
,
181 @RequestParam(value
= "pageSize", required
= false) Integer pageSize
,
182 @RequestParam(value
= "pageNumber", required
= false) Integer pageNumber
,
183 @RequestParam(value
= "matchMode", required
= false) MatchMode matchMode
,
184 HttpServletRequest request
,
185 HttpServletResponse response
189 logger
.info("doFindDescriptionElements : " + requestPathAndQuery(request
) );
191 PagerParameters pagerParams
= new PagerParameters(pageSize
, pageNumber
);
192 pagerParams
.normalizeAndValidate(response
);
194 Pager
<DescriptionElementBase
> pager
= service
.searchElements(type
, queryString
, pageSize
, pageNumber
, null, getInitializationStrategy());
200 * Requires the query parameter "descriptionType" to be present
203 * @param descriptionType
210 * @throws IOException
212 @RequestMapping(value
= "/descriptionElement/byFeature", method
= RequestMethod
.GET
)
213 public Pager
<DescriptionElementBase
> doPageDescriptionElementsByFeature(
214 @RequestParam(value
= "features", required
= false) DefinedTermBaseList
<Feature
> features
,
215 @RequestParam(value
= "descriptionType", required
= true) Class
<?
extends DescriptionBase
> descriptionType
,
216 @RequestParam(value
= "type", required
= false) Class
<?
extends DescriptionElementBase
> type
,
217 @RequestParam(value
= "pageSize", required
= false) Integer pageSize
,
218 @RequestParam(value
= "pageNumber", required
= false) Integer pageNumber
, HttpServletRequest request
,
219 HttpServletResponse response
) throws IOException
{
221 logger
.info("doPageDescriptionElementsByFeature : " + requestPathAndQuery(request
));
223 PagerParameters pagerParams
= new PagerParameters(pageSize
, pageNumber
);
224 pagerParams
.normalizeAndValidate(response
);
226 if(features
== null){
227 features
= new DefinedTermBaseList
<Feature
>();
230 Pager
<DescriptionElementBase
> pager
= service
.pageDescriptionElements(null, descriptionType
, features
.asSet(),
231 type
, pagerParams
.getPageSize(), pagerParams
.getPageIndex(), getInitializationStrategy());
237 * Requires the query parameter "taxon" to be present
247 * @throws IOException
249 @RequestMapping(value
= "/descriptionElement/byTaxon", method
= {RequestMethod
.GET
, RequestMethod
.POST
})
250 public <T
extends DescriptionElementBase
> Pager
<T
> getDescriptionElementsForTaxon(
251 @RequestParam(value
= "taxon", required
= true) UUID taxon_uuid
,
252 @RequestParam(value
= "features", required
= false) DefinedTermBaseList
<Feature
> features
,
253 @RequestParam(value
= "type", required
= false) Class
<T
> type
,
254 @RequestParam(value
= "pageSize", required
= false) Integer pageSize
,
255 @RequestParam(value
= "pageNumber", required
= false) Integer pageNumber
, HttpServletRequest request
,
256 HttpServletResponse response
) throws IOException
{
258 logger
.info("getDescriptionElementsForTaxon : " + requestPathAndQuery(request
));
260 PagerParameters pagerParams
= new PagerParameters(pageSize
, pageNumber
);
261 pagerParams
.normalizeAndValidate(response
);
264 if( taxon_uuid
!= null){
266 taxon
= (Taxon
) taxonService
.load(taxon_uuid
);
267 } catch (Exception e
) {
268 HttpStatusMessage
.UUID_NOT_FOUND
.send(response
);
272 Pager
<T
> pager
= service
.pageDescriptionElementsForTaxon(taxon
, features
.asSet(), type
, pageSize
,
273 pageNumber
, getInitializationStrategy());
278 @RequestMapping(value
= "namedAreasInUse", method
= RequestMethod
.GET
)
279 public Pager
<NamedArea
> doPageNamedAreasInUse(
280 @RequestParam(value
= "pageSize", required
= false) Integer pageSize
,
281 @RequestParam(value
= "pageNumber", required
= false) Integer pageNumber
, HttpServletRequest request
,
282 HttpServletResponse response
) throws IOException
{
284 logger
.info("doPageNamedAreasInUse : " + requestPathAndQuery(request
));
286 PagerParameters pagerParams
= new PagerParameters(pageSize
, pageNumber
);
287 pagerParams
.normalizeAndValidate(response
);
289 Pager
<NamedArea
> pager
= service
.pageNamedAreasInUse(pageSize
, pageNumber
, getInitializationStrategy());