Project

General

Profile

Download (9.12 KB) Statistics
| Branch: | Tag: | Revision:
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 com.wordnik.swagger.annotations.Api;
30

    
31
import eu.etaxonomy.cdm.api.service.IDescriptionService;
32
import eu.etaxonomy.cdm.api.service.ITaxonService;
33
import eu.etaxonomy.cdm.api.service.ITermService;
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.taxon.Taxon;
39
import eu.etaxonomy.cdm.persistence.query.MatchMode;
40
import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
41
import eu.etaxonomy.cdm.remote.editor.DefinedTermBaseList;
42
import eu.etaxonomy.cdm.remote.editor.TermBaseListPropertyEditor;
43

    
44
/**
45
 * IMPORTANT:
46
 *
47
 * This controller is mostly a 1:1 copy of the DescriptionListController
48
 * and this provides identical end points which only differ in the depth of the
49
 * object graphs returned.
50
 * An exception is the doAccumulateDistributions() method, which is not repeated
51
 * here
52
 *
53
 * @author a.kohlbecker
54
 * @date Jun 25, 2013
55
 *
56
 */
57
@Controller
58
@Api("portal_description")
59
@RequestMapping(value = {"/portal/description"})
60
public class DescriptionListPortalController extends IdentifiableListController<DescriptionBase, IDescriptionService> {
61

    
62
   public static final Logger logger = Logger.getLogger(DescriptionListPortalController.class);
63

    
64
    @Autowired
65
    private ITaxonService taxonService;
66

    
67
    protected static final List<String> DESCRIPTION_INIT_STRATEGY = Arrays.asList(new String []{
68
            "$",
69
            "elements.$",
70
            "elements.annotations",
71
            "elements.markers",
72
            "elements.stateData.$",
73
            "elements.sources.citation.authorship",
74
            "elements.sources.nameUsedInSource",
75
            "elements.multilanguageText",
76
            "elements.media",
77
            "elements.kindOfUnit"
78
    });
79

    
80
    protected static final List<String> DESCRIPTION_ELEMENT_INIT_STRATEGY = Arrays.asList(new String []{
81
            "$",
82
            "annotations",
83
            "markers",
84
            "stateData.$",
85
            "statisticalValues.*",
86
            "sources.citation.authorship",
87
            "sources.nameUsedInSource",
88
            "multilanguageText",
89
            "media",
90
            "name.$",
91
            "name.rank.representations",
92
            "name.status.type.representations",
93
            "taxon2.name"
94
    });
95

    
96

    
97
    public DescriptionListPortalController() {
98
        super();
99
        setInitializationStrategy(DESCRIPTION_INIT_STRATEGY);
100
    }
101

    
102

    
103
    @Autowired
104
    private ITermService termService;
105

    
106
    /* (non-Javadoc)
107
     * @see eu.etaxonomy.cdm.remote.controller.BaseListController#setService(eu.etaxonomy.cdm.api.service.IService)
108
     */
109
    @Override
110
    @Autowired
111
    public void setService(IDescriptionService service) {
112
        this.service = service;
113
    }
114

    
115
    @InitBinder
116
    @Override
117
    public void initBinder(WebDataBinder binder) {
118
        super.initBinder(binder);
119
        binder.registerCustomEditor(DefinedTermBaseList.class, new TermBaseListPropertyEditor<Feature>(termService));
120
    }
121
    /**
122
    *
123
    * @param queryString
124
    * @param type
125
    * @param pageSize
126
    * @param pageNumber
127
    * @param matchMode
128
    * @param request
129
    * @param response
130
    * @return
131
    * @throws IOException
132
    */
133
   @RequestMapping(value = "//portal/descriptionElement/find", method = RequestMethod.GET) // mapped as absolute path, see CdmAntPathMatcher
134
   public Pager<DescriptionElementBase> doFindDescriptionElements(
135
           @RequestParam(value = "query", required = true) String queryString,
136
           @RequestParam(value = "type", required = false) Class<? extends DescriptionElementBase> type,
137
           @RequestParam(value = "pageSize", required = false) Integer pageSize,
138
           @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
139
           @RequestParam(value = "matchMode", required = false) MatchMode matchMode,
140
           HttpServletRequest request,
141
           HttpServletResponse response
142
           )
143
            throws IOException {
144

    
145
       logger.info("doFindDescriptionElements : " + request.getRequestURI() + "?" + request.getQueryString() );
146

    
147
       PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
148
       pagerParams.normalizeAndValidate(response);
149

    
150
       Pager<DescriptionElementBase> pager = service.searchElements(type, queryString, pageSize, pageNumber, null, getInitializationStrategy());
151

    
152
       return pager;
153
   }
154

    
155
   /**
156
    * Requires the query parameter "descriptionType" to be present
157
    *
158
    * @param features
159
    * @param descriptionType
160
    * @param type
161
    * @param pageSize
162
    * @param pageNumber
163
    * @param request
164
    * @param response
165
    * @return
166
    * @throws IOException
167
    */
168
   @RequestMapping(value = "//portal/descriptionElement/byFeature", method = {RequestMethod.GET, RequestMethod.POST}) // mapped as absolute path, see CdmAntPathMatcher
169
   public Pager<DescriptionElementBase> doPageDescriptionElementsByFeature(
170
           @RequestParam(value = "features", required = false) DefinedTermBaseList<Feature> features,
171
           @RequestParam(value = "descriptionType", required = true) Class<? extends DescriptionBase> descriptionType,
172
           @RequestParam(value = "type", required = false) Class<? extends DescriptionElementBase> type,
173
           @RequestParam(value = "pageSize", required = false) Integer pageSize,
174
           @RequestParam(value = "pageNumber", required = false) Integer pageNumber, HttpServletRequest request,
175
           HttpServletResponse response) throws IOException {
176

    
177
       logger.info("doPageDescriptionElementsByFeature : " + requestPathAndQuery(request));
178

    
179
       PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
180
       pagerParams.normalizeAndValidate(response);
181

    
182
       if(features == null){
183
           features = new DefinedTermBaseList<Feature>();
184
       }
185

    
186
       Pager pager = service.pageDescriptionElements(null, descriptionType, features.asSet(),
187
               type, pagerParams.getPageSize(), pagerParams.getPageIndex(), DESCRIPTION_ELEMENT_INIT_STRATEGY);
188

    
189
       return pager;
190
   }
191

    
192
   /**
193
    * Requires the query parameter "taxon"  to be present
194
    *
195
    * @param taxon_uuid
196
    * @param features
197
    * @param type
198
    * @param pageSize
199
    * @param pageNumber
200
    * @param request
201
    * @param response
202
    * @return
203
    * @throws IOException
204
    */
205
   @RequestMapping(value = "//portal/descriptionElement/byTaxon", method = {RequestMethod.GET, RequestMethod.POST}) // mapped as absolute path, see CdmAntPathMatcher
206
   public <T extends DescriptionElementBase> Pager<T> getDescriptionElementsForTaxon(
207
           @RequestParam(value = "taxon", required = true) UUID taxon_uuid,
208
           @RequestParam(value = "features", required = false) DefinedTermBaseList<Feature> features,
209
           @RequestParam(value = "type", required = false) Class<T> type,
210
           @RequestParam(value = "pageSize", required = false) Integer pageSize,
211
           @RequestParam(value = "pageNumber", required = false) Integer pageNumber, HttpServletRequest request,
212
           HttpServletResponse response) throws IOException {
213

    
214
       logger.info("getDescriptionElementsForTaxon : " + requestPathAndQuery(request));
215

    
216
       PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
217
       pagerParams.normalizeAndValidate(response);
218

    
219
       Taxon taxon = null;
220
       if( taxon_uuid!= null){
221
           try {
222
               taxon = (Taxon) taxonService.load(taxon_uuid);
223
           } catch (Exception e) {
224
               HttpStatusMessage.UUID_NOT_FOUND.send(response);
225
           }
226
       }
227
       //TODO it seems as if the InitializationStrategy is not appropriate here !!!
228
       //   see #3728 (DescriptionListPortalController.getDescriptionElementsForTaxon() seems to be using in-appropriate init strategy)
229
       if (logger.isDebugEnabled()){logger.debug("get pager ...");}
230
       Pager<T> pager = service.pageDescriptionElementsForTaxon(
231
               taxon,
232
               (features != null ? features.asSet() : null),
233
               type,
234
               pagerParams.getPageSize(),
235
               pagerParams.getPageIndex(),
236
               DESCRIPTION_ELEMENT_INIT_STRATEGY
237
              );
238
       if (logger.isDebugEnabled()){logger.debug("get pager - DONE");}
239
       return pager;
240
   }
241
}
(17-17/58)