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 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)
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})
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})
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
}
(16-16/56)