Project

General

Profile

Download (11.5 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 io.swagger.annotations.Api;
13

    
14
import java.awt.Color;
15
import java.io.IOException;
16
import java.util.Arrays;
17
import java.util.EnumSet;
18
import java.util.List;
19
import java.util.Map;
20
import java.util.Set;
21
import java.util.UUID;
22

    
23
import javax.servlet.http.HttpServletRequest;
24
import javax.servlet.http.HttpServletResponse;
25

    
26
import org.springframework.beans.factory.annotation.Autowired;
27
import org.springframework.stereotype.Controller;
28
import org.springframework.web.bind.WebDataBinder;
29
import org.springframework.web.bind.annotation.InitBinder;
30
import org.springframework.web.bind.annotation.PathVariable;
31
import org.springframework.web.bind.annotation.RequestMapping;
32
import org.springframework.web.bind.annotation.RequestMethod;
33
import org.springframework.web.bind.annotation.RequestParam;
34
import org.springframework.web.servlet.ModelAndView;
35

    
36
import com.fasterxml.jackson.core.JsonParseException;
37
import com.fasterxml.jackson.databind.JsonMappingException;
38

    
39
import eu.etaxonomy.cdm.api.service.IDescriptionService;
40
import eu.etaxonomy.cdm.api.service.ITaxonService;
41
import eu.etaxonomy.cdm.api.service.ITermService;
42
import eu.etaxonomy.cdm.api.service.IVocabularyService;
43
import eu.etaxonomy.cdm.api.service.description.TransmissionEngineDistribution;
44
import eu.etaxonomy.cdm.api.service.description.TransmissionEngineDistribution.AggregationMode;
45
import eu.etaxonomy.cdm.api.service.dto.DistributionInfoDTO;
46
import eu.etaxonomy.cdm.api.service.dto.DistributionInfoDTO.InfoPart;
47
import eu.etaxonomy.cdm.api.service.pager.Pager;
48
import eu.etaxonomy.cdm.api.utility.DistributionOrder;
49
import eu.etaxonomy.cdm.ext.geo.CondensedDistributionRecipe;
50
import eu.etaxonomy.cdm.ext.geo.EditGeoServiceUtilities;
51
import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
52
import eu.etaxonomy.cdm.model.common.MarkerType;
53
import eu.etaxonomy.cdm.model.description.DescriptionBase;
54
import eu.etaxonomy.cdm.model.description.Feature;
55
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
56
import eu.etaxonomy.cdm.model.location.NamedArea;
57
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
58
import eu.etaxonomy.cdm.model.location.NamedAreaType;
59
import eu.etaxonomy.cdm.model.name.Rank;
60
import eu.etaxonomy.cdm.persistence.dto.TermDto;
61
import eu.etaxonomy.cdm.persistence.query.OrderHint;
62
import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
63
import eu.etaxonomy.cdm.remote.controller.util.ProgressMonitorUtil;
64
import eu.etaxonomy.cdm.remote.editor.DefinedTermBaseList;
65
import eu.etaxonomy.cdm.remote.editor.TermBaseListPropertyEditor;
66
import eu.etaxonomy.cdm.remote.editor.TermBasePropertyEditor;
67
import eu.etaxonomy.cdm.remote.l10n.LocaleContext;
68

    
69
/**
70
 * TODO write controller documentation
71
 *
72
 * @author a.kohlbecker
73
 * @date 24.03.2009
74
 */
75
@Controller
76
@Api("description")
77
@RequestMapping(value = {"/description"})
78
public class DescriptionListController extends IdentifiableListController<DescriptionBase, IDescriptionService> {
79

    
80

    
81
    @Autowired
82
    private ITermService termService;
83

    
84
    @Autowired
85
    private IVocabularyService vocabularyService ;
86

    
87
    @Autowired
88
    private ITaxonService taxonService;
89

    
90
    @Autowired
91
    private IEditGeoService geoService;
92

    
93
    @Autowired
94
    public TransmissionEngineDistribution transmissionEngineDistribution;
95

    
96
    @Autowired
97
    public ProgressMonitorController progressMonitorController;
98

    
99
    protected static final List<String> DESCRIPTION_ELEMENT_INIT_STRATEGY = Arrays.asList(new String []{
100
            "$",
101
            "multilanguageText",
102
    });
103

    
104
    /**
105
     * There should only be one longtime processes
106
     * therefore the according progress monitor uuid is stored in
107
     * this static field.
108
     */
109
    private static UUID transmissionEngineMonitorUuid = null;
110

    
111

    
112
    @Override
113
    @Autowired
114
    public void setService(IDescriptionService service) {
115
        this.service = service;
116
    }
117

    
118
    @InitBinder
119
    @Override
120
    public void initBinder(WebDataBinder binder) {
121
        super.initBinder(binder);
122
        binder.registerCustomEditor(DefinedTermBaseList.class, new TermBaseListPropertyEditor<Feature>(termService));
123
        binder.registerCustomEditor(NamedAreaLevel.class, new TermBasePropertyEditor<NamedAreaLevel>(termService));
124
        binder.registerCustomEditor(Rank.class, new TermBasePropertyEditor<Rank>(termService));
125
    }
126

    
127
    protected List<String> getDescriptionInfoInitStrategy(){
128
        return getInitializationStrategy();
129
    }
130

    
131

    
132
    /**
133
     * Runs the {@link TransmissionEngineDistribution} in a separate Thread and
134
     * responds with a redirect to a progress monitor REST service end point.
135
     * <p>
136
     *
137
     * @param mode
138
     *      one of <code>byAreas</code>, <code>byRanks</code>,
139
     *      <code>byAreasAndRanks</code>
140
     * @param frontendBaseUrl
141
     *      the cdm server instance base URL, this is needed for the a
142
     *      proper redirect URL when the service is running behind a
143
     *      reverse HTTP proxy
144
     * @param priority
145
     *      the priority for the Thread to spawn, see
146
     *      {@link Thread#setPriority(int)}, defaults to 3
147
     * @param targetAreaLevel
148
     *      The level of target areas to project the distributions to.
149
     * @param lowerRank
150
     * @param upperRank
151
     *
152
     * @param request
153
     * @param response
154
     * @return
155
     * @throws IOException
156
     */
157
    @RequestMapping(value = { "accumulateDistributions" }, method = RequestMethod.GET)
158
    public ModelAndView doAccumulateDistributions(
159
            @RequestParam(value= "mode", required = true) final AggregationMode mode,
160
            @RequestParam(value = "frontendBaseUrl", required = false) String frontendBaseUrl,
161
            @RequestParam(value = "priority", required = false) Integer priority,
162
            @RequestParam(value = "targetAreaLevel", required = true) final NamedAreaLevel targetAreaLevel,
163
            @RequestParam(value = "lowerRank", required = false) Rank lowerRank,
164
            @RequestParam(value = "upperRank", required = false) Rank upperRank,
165
            HttpServletRequest request,
166
            HttpServletResponse response) throws IOException {
167

    
168
        logger.info("doAccumulateDistributions()" + request.getRequestURI());
169

    
170
//        transmissionEngineDistribution.updatePriorities();
171

    
172
        String processLabel = "accumulating distributions";
173

    
174
        final Rank _lowerRank = lowerRank != null ? lowerRank : Rank.UNKNOWN_RANK(); // this is the lowest rank
175
        final Rank _upperRank = upperRank != null ? upperRank : Rank.GENUS();
176

    
177
        ProgressMonitorUtil progressUtil = new ProgressMonitorUtil(progressMonitorController);
178

    
179
        final List<String> term_init_strategy = Arrays.asList(new String []{
180
                "representations"
181
        });
182

    
183
        if (!progressMonitorController.isMonitorRunning(transmissionEngineMonitorUuid)) {
184
            transmissionEngineMonitorUuid = progressUtil.registerNewMonitor();
185
            Thread subThread = new Thread() {
186
                @Override
187
                public void run() {
188
                    Pager<NamedArea> areaPager = termService.list(targetAreaLevel, (NamedAreaType) null,
189
                            null, null, (List<OrderHint>) null, term_init_strategy);
190
                    transmissionEngineDistribution.accumulate(mode, areaPager.getRecords(), _lowerRank, _upperRank,
191
                            null, progressMonitorController.getMonitor(transmissionEngineMonitorUuid));
192
                }
193
            };
194
            if(priority == null) {
195
                priority = AbstractController.DEFAULT_BATCH_THREAD_PRIORITY;
196
            }
197
            subThread.setPriority(priority);
198
            subThread.start();
199
        }
200

    
201
        // send redirect "see other"
202
        return progressUtil.respondWithMonitor(frontendBaseUrl, request, response, processLabel, transmissionEngineMonitorUuid);
203
    }
204

    
205
    @RequestMapping(value = "namedAreasInUse", method = RequestMethod.GET)
206
    public Pager<TermDto> doPageNamedAreasInUse(
207
            @RequestParam(value = "includeAllParents", required = false) boolean includeAllParents,
208
            @RequestParam(value = "pageSize", required = false) Integer pageSize,
209
            @RequestParam(value = "pageNumber", required = false) Integer pageNumber, HttpServletRequest request,
210
            HttpServletResponse response) throws IOException {
211

    
212
        logger.info("doPageNamedAreasInUse : " + requestPathAndQuery(request));
213

    
214
        PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
215
        pagerParams.normalizeAndValidate(response);
216

    
217
        Pager<TermDto> pager = service.pageNamedAreasInUse(includeAllParents, pagerParams.getPageSize(), pagerParams.getPageIndex());
218

    
219
        localizeTerms(pager);
220

    
221
        return pager;
222
    }
223

    
224
    /**
225
     * @param taxonUuid
226
     * @param parts
227
     *            possible values: condensedStatus, tree, mapUriParams,
228
     *            elements,
229
     * @param subAreaPreference
230
     * @param statusOrderPreference
231
     * @param hideMarkedAreasList
232
     * @param omitLevels
233
     * @param request
234
     * @param response
235
     * @param distributionOrder
236
     *  Default is  LABEL
237
     * @param recipe
238
     *  The recipe for creating the condensed distribution status
239
     * @return
240
     * @throws IOException
241
     * @throws JsonMappingException
242
     * @throws JsonParseException
243
     */
244
    @RequestMapping(value = "distributionInfoFor/{uuid}", method = RequestMethod.GET)
245
    public ModelAndView doGetDistributionInfo(
246
            @PathVariable("uuid") UUID taxonUuid,
247
            @RequestParam("part") Set<InfoPart> partSet,
248
            @RequestParam(value = "subAreaPreference", required = false) boolean subAreaPreference,
249
            @RequestParam(value = "statusOrderPreference", required = false) boolean statusOrderPreference,
250
            @RequestParam(value = "hiddenAreaMarkerType", required = false) DefinedTermBaseList<MarkerType> hideMarkedAreasList,
251
            @RequestParam(value = "omitLevels", required = false) Set<NamedAreaLevel> omitLevels,
252
            @RequestParam(value = "statusColors", required = false) String statusColorsString,
253
            @RequestParam(value = "distributionOrder", required = false, defaultValue="LABEL") DistributionOrder distributionOrder,
254
            @RequestParam(value = "recipe", required = false, defaultValue="EuroPlusMed") CondensedDistributionRecipe recipe,
255
            HttpServletRequest request,
256
            HttpServletResponse response) throws JsonParseException, JsonMappingException, IOException {
257

    
258
            logger.info("doGetDistributionInfo() - " + requestPathAndQuery(request));
259

    
260
            ModelAndView mv = new ModelAndView();
261

    
262
            Set<MarkerType> hideMarkedAreas = null;
263
            if(hideMarkedAreasList != null){
264
                hideMarkedAreas = hideMarkedAreasList.asSet();
265
            }
266

    
267
            EnumSet<InfoPart> parts = EnumSet.copyOf(partSet);
268

    
269
            Map<PresenceAbsenceTerm, Color> presenceAbsenceTermColors = EditGeoServiceUtilities.buildStatusColorMap(statusColorsString, termService, vocabularyService);
270

    
271
            DistributionInfoDTO dto = geoService.composeDistributionInfoFor(parts, taxonUuid,
272
                    subAreaPreference, statusOrderPreference, hideMarkedAreas, omitLevels,
273
                    presenceAbsenceTermColors, LocaleContext.getLanguages(),
274
                    getDescriptionInfoInitStrategy(), recipe, distributionOrder);
275

    
276
            mv.addObject(dto);
277

    
278
            return mv;
279
    }
280

    
281
}
(20-20/62)