596a154ad04040c8b677d3ce14f0ecac03e50de6
[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 protected static final List<String> DESCRIPTION_ELEMENT_INIT_STRATEGY = Arrays.asList(new String []{
79 "$",
80 "states.$",
81 "sources.citation.authorTeam",
82 "sources.nameUsedInSource.originalNameString",
83 "multilanguageText",
84 "media"
85 });
86
87
88 public DescriptionListPortalController() {
89 super();
90 setInitializationStrategy(DESCRIPTION_INIT_STRATEGY);
91 }
92
93
94 @Autowired
95 private ITermService termService;
96
97 /* (non-Javadoc)
98 * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)
99 */
100 @Override
101 @Autowired
102 public void setService(IDescriptionService service) {
103 this.service = service;
104 }
105
106 @InitBinder
107 @Override
108 public void initBinder(WebDataBinder binder) {
109 super.initBinder(binder);
110 binder.registerCustomEditor(DefinedTermBaseList.class, new TermBaseListPropertyEditor<Feature>(termService));
111 }
112 /**
113 *
114 * @param queryString
115 * @param type
116 * @param pageSize
117 * @param pageNumber
118 * @param matchMode
119 * @param request
120 * @param response
121 * @return
122 * @throws IOException
123 */
124 @RequestMapping(value = "/portal/descriptionElement/find", method = RequestMethod.GET)
125 public Pager<DescriptionElementBase> doFindDescriptionElements(
126 @RequestParam(value = "query", required = true) String queryString,
127 @RequestParam(value = "type", required = false) Class<? extends DescriptionElementBase> type,
128 @RequestParam(value = "pageSize", required = false) Integer pageSize,
129 @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
130 @RequestParam(value = "matchMode", required = false) MatchMode matchMode,
131 HttpServletRequest request,
132 HttpServletResponse response
133 )
134 throws IOException {
135
136 logger.info("doFindDescriptionElements : " + request.getRequestURI() + "?" + request.getQueryString() );
137
138 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
139 pagerParams.normalizeAndValidate(response);
140
141 Pager<DescriptionElementBase> pager = service.searchElements(type, queryString, pageSize, pageNumber, null, getInitializationStrategy());
142
143 return pager;
144 }
145
146 /**
147 * Requires the query parameter "descriptionType" to be present
148 *
149 * @param features
150 * @param descriptionType
151 * @param type
152 * @param pageSize
153 * @param pageNumber
154 * @param request
155 * @param response
156 * @return
157 * @throws IOException
158 */
159 @RequestMapping(value = "/portal/descriptionElement/byFeature", method = {RequestMethod.GET, RequestMethod.POST})
160 public Pager<DescriptionElementBase> doPageDescriptionElementsByFeature(
161 @RequestParam(value = "features", required = false) DefinedTermBaseList<Feature> features,
162 @RequestParam(value = "descriptionType", required = true) Class<? extends DescriptionBase> descriptionType,
163 @RequestParam(value = "type", required = false) Class<? extends DescriptionElementBase> type,
164 @RequestParam(value = "pageSize", required = false) Integer pageSize,
165 @RequestParam(value = "pageNumber", required = false) Integer pageNumber, HttpServletRequest request,
166 HttpServletResponse response) throws IOException {
167
168 logger.info("doPageDescriptionElementsByFeature : " + requestPathAndQuery(request));
169
170 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
171 pagerParams.normalizeAndValidate(response);
172
173 Pager<DescriptionElementBase> pager = service.pageDescriptionElements(null, descriptionType, features.asSet(),
174 type, pagerParams.getPageSize(), pagerParams.getPageIndex(), getInitializationStrategy());
175
176 return pager;
177 }
178
179 /**
180 * Requires the query parameter "taxon" to be present
181 *
182 * @param taxon_uuid
183 * @param features
184 * @param type
185 * @param pageSize
186 * @param pageNumber
187 * @param request
188 * @param response
189 * @return
190 * @throws IOException
191 */
192 @RequestMapping(value = "/portal/descriptionElement/byTaxon", method = {RequestMethod.GET, RequestMethod.POST})
193 public <T extends DescriptionElementBase> Pager<T> getDescriptionElementsForTaxon(
194 @RequestParam(value = "taxon", required = true) UUID taxon_uuid,
195 @RequestParam(value = "features", required = false) DefinedTermBaseList<Feature> features,
196 @RequestParam(value = "type", required = false) Class<T> type,
197 @RequestParam(value = "pageSize", required = false) Integer pageSize,
198 @RequestParam(value = "pageNumber", required = false) Integer pageNumber, HttpServletRequest request,
199 HttpServletResponse response) throws IOException {
200
201 logger.info("getDescriptionElementsForTaxon : " + requestPathAndQuery(request));
202
203 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
204 pagerParams.normalizeAndValidate(response);
205
206 Taxon taxon = null;
207 if( taxon_uuid!= null){
208 try {
209 taxon = (Taxon) taxonService.load(taxon_uuid);
210 } catch (Exception e) {
211 HttpStatusMessage.UUID_NOT_FOUND.send(response);
212 }
213 }
214 //TODO it seems as if the InitializationStrategy is not appropriate here !!!
215 // see #3728 (DescriptionListPortalController.getDescriptionElementsForTaxon() seems to be using inapproptiate init strategy)
216 if (logger.isDebugEnabled()){logger.debug("get pager ...");}
217 Pager<T> pager = service.pageDescriptionElementsForTaxon(
218 taxon,
219 (features != null ? features.asSet() : null),
220 type,
221 pagerParams.getPageSize(),
222 pagerParams.getPageIndex(),
223 DESCRIPTION_ELEMENT_INIT_STRATEGY
224 );
225 if (logger.isDebugEnabled()){logger.debug("get pager - DONE");}
226 return pager;
227 }
228 }