merge trunk into cdmlib v3.3 branch
[cdmlib.git] / cdmlib-remote / src / main / java / eu / etaxonomy / cdm / remote / controller / DescriptionListPortalController.java
1 // $Id$
2 /**
3 * Copyright (C) 2009 EDIT European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9
10 package eu.etaxonomy.cdm.remote.controller;
11
12 import java.io.IOException;
13 import java.util.Arrays;
14 import java.util.List;
15 import java.util.UUID;
16
17 import javax.servlet.http.HttpServletRequest;
18 import javax.servlet.http.HttpServletResponse;
19
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;
28
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;
41
42 /**
43 * IMPORTANT:
44 *
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
49 * here
50 *
51 * @author a.kohlbecker
52 * @date Jun 25, 2013
53 *
54 */
55 @Controller
56 @RequestMapping(value = {"/portal/description"})
57 public class DescriptionListPortalController extends IdentifiableListController<DescriptionBase, IDescriptionService> {
58
59 public static final Logger logger = Logger.getLogger(DescriptionListPortalController.class);
60
61 @Autowired
62 private ITaxonService taxonService;
63
64 protected static final List<String> DESCRIPTION_INIT_STRATEGY = Arrays.asList(new String []{
65 "$",
66 "elements.$",
67 "elements.states.$",
68 "elements.sources.citation.authorTeam",
69 "elements.sources.nameUsedInSource.originalNameString",
70 "elements.multilanguageText",
71 "elements.media",
72 "name.$",
73 "name.rank.representations",
74 "name.status.type.representations",
75 "sources.$",
76 });
77
78
79 public DescriptionListPortalController() {
80 super();
81 setInitializationStrategy(DESCRIPTION_INIT_STRATEGY);
82 }
83
84
85 @Autowired
86 private ITermService termService;
87
88 /* (non-Javadoc)
89 * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)
90 */
91 @Override
92 @Autowired
93 public void setService(IDescriptionService service) {
94 this.service = service;
95 }
96
97 @InitBinder
98 @Override
99 public void initBinder(WebDataBinder binder) {
100 super.initBinder(binder);
101 binder.registerCustomEditor(DefinedTermBaseList.class, new TermBaseListPropertyEditor<Feature>(termService));
102 }
103 /**
104 *
105 * @param queryString
106 * @param type
107 * @param pageSize
108 * @param pageNumber
109 * @param matchMode
110 * @param request
111 * @param response
112 * @return
113 * @throws IOException
114 */
115 @RequestMapping(value = "/portal/descriptionElement/find", method = RequestMethod.GET)
116 public Pager<DescriptionElementBase> doFindDescriptionElements(
117 @RequestParam(value = "query", required = true) String queryString,
118 @RequestParam(value = "type", required = false) Class<? extends DescriptionElementBase> type,
119 @RequestParam(value = "pageSize", required = false) Integer pageSize,
120 @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
121 @RequestParam(value = "matchMode", required = false) MatchMode matchMode,
122 HttpServletRequest request,
123 HttpServletResponse response
124 )
125 throws IOException {
126
127 logger.info("doFindDescriptionElements : " + request.getRequestURI() + "?" + request.getQueryString() );
128
129 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
130 pagerParams.normalizeAndValidate(response);
131
132 Pager<DescriptionElementBase> pager = service.searchElements(type, queryString, pageSize, pageNumber, null, getInitializationStrategy());
133
134 return pager;
135 }
136
137 /**
138 * Requires the query parameter "descriptionType" to be present
139 *
140 * @param features
141 * @param descriptionType
142 * @param type
143 * @param pageSize
144 * @param pageNumber
145 * @param request
146 * @param response
147 * @return
148 * @throws IOException
149 */
150 @RequestMapping(value = "/portal/descriptionElement/byFeature", method = {RequestMethod.GET, RequestMethod.POST})
151 public Pager<DescriptionElementBase> doPageDescriptionElementsByFeature(
152 @RequestParam(value = "features", required = false) DefinedTermBaseList<Feature> features,
153 @RequestParam(value = "descriptionType", required = true) Class<? extends DescriptionBase> descriptionType,
154 @RequestParam(value = "type", required = false) Class<? extends DescriptionElementBase> type,
155 @RequestParam(value = "pageSize", required = false) Integer pageSize,
156 @RequestParam(value = "pageNumber", required = false) Integer pageNumber, HttpServletRequest request,
157 HttpServletResponse response) throws IOException {
158
159 logger.info("doPageDescriptionElementsByFeature : " + requestPathAndQuery(request));
160
161 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
162 pagerParams.normalizeAndValidate(response);
163
164 Pager<DescriptionElementBase> pager = service.pageDescriptionElements(null, descriptionType, features.asSet(),
165 type, pagerParams.getPageSize(), pagerParams.getPageIndex(), getInitializationStrategy());
166
167 return pager;
168 }
169
170 /**
171 * Requires the query parameter "taxon" to be present
172 *
173 * @param taxon_uuid
174 * @param features
175 * @param type
176 * @param pageSize
177 * @param pageNumber
178 * @param request
179 * @param response
180 * @return
181 * @throws IOException
182 */
183 @RequestMapping(value = "/portal/descriptionElement/byTaxon", method = {RequestMethod.GET, RequestMethod.POST})
184 public <T extends DescriptionElementBase> Pager<T> getDescriptionElementsForTaxon(
185 @RequestParam(value = "taxon", required = true) UUID taxon_uuid,
186 @RequestParam(value = "features", required = false) DefinedTermBaseList<Feature> features,
187 @RequestParam(value = "type", required = false) Class<T> type,
188 @RequestParam(value = "pageSize", required = false) Integer pageSize,
189 @RequestParam(value = "pageNumber", required = false) Integer pageNumber, HttpServletRequest request,
190 HttpServletResponse response) throws IOException {
191
192 logger.info("getDescriptionElementsForTaxon : " + requestPathAndQuery(request));
193
194 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
195 pagerParams.normalizeAndValidate(response);
196
197 Taxon taxon = null;
198 if( taxon_uuid!= null){
199 try {
200 taxon = (Taxon) taxonService.load(taxon_uuid);
201 } catch (Exception e) {
202 HttpStatusMessage.UUID_NOT_FOUND.send(response);
203 }
204 }
205 //TODO it seems as if the InitializationStrategy is not appropriate here !!!
206 // see #3728 (DescriptionListPortalController.getDescriptionElementsForTaxon() seems to be using inapproptiate init strategy)
207 Pager<T> pager = service.pageDescriptionElementsForTaxon(
208 taxon,
209 (features != null ? features.asSet() : null),
210 type,
211 pagerParams.getPageSize(),
212 pagerParams.getPageIndex(),
213 getInitializationStrategy()
214 );
215
216 return pager;
217 }
218 }