refactoring taxon controllers, reducing code duplication
[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.annotations",
68 "elements.markers",
69 "elements.stateData.$",
70 "elements.sources.citation.authorTeam",
71 "elements.sources.nameUsedInSource",
72 "elements.multilanguageText",
73 "elements.media",
74 "elements.kindOfUnit"
75 });
76
77 protected static final List<String> DESCRIPTION_ELEMENT_INIT_STRATEGY = Arrays.asList(new String []{
78 "$",
79 "annotations",
80 "markers",
81 "stateData.$",
82 "sources.citation.authorTeam",
83 "sources.nameUsedInSource",
84 "multilanguageText",
85 "media",
86 "name.$",
87 "name.rank.representations",
88 "name.status.type.representations",
89 "taxon2.name"
90 });
91
92
93 public DescriptionListPortalController() {
94 super();
95 setInitializationStrategy(DESCRIPTION_INIT_STRATEGY);
96 }
97
98
99 @Autowired
100 private ITermService termService;
101
102 /* (non-Javadoc)
103 * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)
104 */
105 @Override
106 @Autowired
107 public void setService(IDescriptionService service) {
108 this.service = service;
109 }
110
111 @InitBinder
112 @Override
113 public void initBinder(WebDataBinder binder) {
114 super.initBinder(binder);
115 binder.registerCustomEditor(DefinedTermBaseList.class, new TermBaseListPropertyEditor<Feature>(termService));
116 }
117 /**
118 *
119 * @param queryString
120 * @param type
121 * @param pageSize
122 * @param pageNumber
123 * @param matchMode
124 * @param request
125 * @param response
126 * @return
127 * @throws IOException
128 */
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
138 )
139 throws IOException {
140
141 logger.info("doFindDescriptionElements : " + request.getRequestURI() + "?" + request.getQueryString() );
142
143 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
144 pagerParams.normalizeAndValidate(response);
145
146 Pager<DescriptionElementBase> pager = service.searchElements(type, queryString, pageSize, pageNumber, null, getInitializationStrategy());
147
148 return pager;
149 }
150
151 /**
152 * Requires the query parameter "descriptionType" to be present
153 *
154 * @param features
155 * @param descriptionType
156 * @param type
157 * @param pageSize
158 * @param pageNumber
159 * @param request
160 * @param response
161 * @return
162 * @throws IOException
163 */
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 {
172
173 logger.info("doPageDescriptionElementsByFeature : " + requestPathAndQuery(request));
174
175 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
176 pagerParams.normalizeAndValidate(response);
177
178 if(features == null){
179 features = new DefinedTermBaseList<Feature>();
180 }
181
182 Pager<DescriptionElementBase> pager = service.pageDescriptionElements(null, descriptionType, features.asSet(),
183 type, pagerParams.getPageSize(), pagerParams.getPageIndex(), DESCRIPTION_ELEMENT_INIT_STRATEGY);
184
185 return pager;
186 }
187
188 /**
189 * Requires the query parameter "taxon" to be present
190 *
191 * @param taxon_uuid
192 * @param features
193 * @param type
194 * @param pageSize
195 * @param pageNumber
196 * @param request
197 * @param response
198 * @return
199 * @throws IOException
200 */
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 {
209
210 logger.info("getDescriptionElementsForTaxon : " + requestPathAndQuery(request));
211
212 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
213 pagerParams.normalizeAndValidate(response);
214
215 Taxon taxon = null;
216 if( taxon_uuid!= null){
217 try {
218 taxon = (Taxon) taxonService.load(taxon_uuid);
219 } catch (Exception e) {
220 HttpStatusMessage.UUID_NOT_FOUND.send(response);
221 }
222 }
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(
227 taxon,
228 (features != null ? features.asSet() : null),
229 type,
230 pagerParams.getPageSize(),
231 pagerParams.getPageIndex(),
232 DESCRIPTION_ELEMENT_INIT_STRATEGY
233 );
234 if (logger.isDebugEnabled()){logger.debug("get pager - DONE");}
235 return pager;
236 }
237 }