Project

General

Profile

Download (13.6 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2009 EDIT European Distributed Institute of Taxonomy
3
 * http://www.e-taxonomy.eu
4
 *
5
 * The contents of this file are subject to the Mozilla Public License Version
6
 * 1.1 See LICENSE.TXT at the top of this package for the full license terms.
7
 */
8

    
9
package eu.etaxonomy.cdm.remote.controller;
10

    
11
import java.awt.Color;
12
import java.io.IOException;
13
import java.util.ArrayList;
14
import java.util.Arrays;
15
import java.util.EnumSet;
16
import java.util.List;
17
import java.util.Map;
18
import java.util.Set;
19
import java.util.UUID;
20

    
21
import javax.servlet.http.HttpServletRequest;
22
import javax.servlet.http.HttpServletResponse;
23

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

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

    
38
import eu.etaxonomy.cdm.api.application.ICdmRepository;
39
import eu.etaxonomy.cdm.api.service.IDescriptionService;
40
import eu.etaxonomy.cdm.api.service.ITermService;
41
import eu.etaxonomy.cdm.api.service.IVocabularyService;
42
import eu.etaxonomy.cdm.api.service.description.AggregationMode;
43
import eu.etaxonomy.cdm.api.service.description.DistributionAggregation;
44
import eu.etaxonomy.cdm.api.service.description.DistributionAggregationConfiguration;
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.common.JvmLimitsException;
50
import eu.etaxonomy.cdm.common.monitor.IRestServiceProgressMonitor;
51
import eu.etaxonomy.cdm.ext.geo.CondensedDistributionRecipe;
52
import eu.etaxonomy.cdm.ext.geo.EditGeoServiceUtilities;
53
import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
54
import eu.etaxonomy.cdm.filter.TaxonNodeFilter;
55
import eu.etaxonomy.cdm.model.common.MarkerType;
56
import eu.etaxonomy.cdm.model.description.DescriptionBase;
57
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
58
import eu.etaxonomy.cdm.model.location.NamedArea;
59
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
60
import eu.etaxonomy.cdm.model.location.NamedAreaType;
61
import eu.etaxonomy.cdm.model.name.Rank;
62
import eu.etaxonomy.cdm.persistence.dto.TermDto;
63
import eu.etaxonomy.cdm.persistence.query.OrderHint;
64
import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
65
import eu.etaxonomy.cdm.remote.controller.util.ProgressMonitorUtil;
66
import eu.etaxonomy.cdm.remote.editor.DefinedTermBaseList;
67
import eu.etaxonomy.cdm.remote.editor.TermBaseListPropertyEditor;
68
import eu.etaxonomy.cdm.remote.editor.TermBasePropertyEditor;
69
import eu.etaxonomy.cdm.remote.editor.UUIDListPropertyEditor;
70
import eu.etaxonomy.cdm.remote.editor.UuidList;
71
import eu.etaxonomy.cdm.remote.l10n.LocaleContext;
72
import io.swagger.annotations.Api;
73

    
74
/**
75
 * TODO write controller documentation
76
 *
77
 * @author a.kohlbecker
78
 * @since 24.03.2009
79
 */
80
@Controller
81
@Api("description")
82
@RequestMapping(value = {"/description"})
83
public class DescriptionListController
84
        extends AbstractIdentifiableListController<DescriptionBase, IDescriptionService> {
85

    
86
    @Autowired
87
    private ITermService termService;
88

    
89
    @Autowired
90
    private IVocabularyService vocabularyService ;
91

    
92
    @Autowired
93
    private IEditGeoService geoService;
94

    
95
    @Autowired
96
    @Qualifier("cdmRepository")
97
    private ICdmRepository repository;
98

    
99
    @Autowired
100
    public ProgressMonitorController progressMonitorController;
101

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

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

    
114

    
115
    @Override
116
    @Autowired
117
    public void setService(IDescriptionService service) {
118
        this.service = service;
119
    }
120

    
121
    @InitBinder
122
    @Override
123
    public void initBinder(WebDataBinder binder) {
124
        super.initBinder(binder);
125
        binder.registerCustomEditor(DefinedTermBaseList.class, new TermBaseListPropertyEditor<>(termService));
126
        binder.registerCustomEditor(NamedAreaLevel.class, new TermBasePropertyEditor<>(termService));
127
        binder.registerCustomEditor(Rank.class, new TermBasePropertyEditor<>(termService));
128
        binder.registerCustomEditor(UuidList.class, new UUIDListPropertyEditor());
129
    }
130

    
131
    protected List<String> getDescriptionInfoInitStrategy(){
132
        return getInitializationStrategy();
133
    }
134

    
135
    /**
136
     * Runs the {@link DistributionAggregation} in a separate Thread and
137
     * responds with a redirect to a progress monitor REST service end point.
138
     * <p>
139
     *
140
     * @param mode
141
     *      one of <code>byAreas</code>, <code>byRanks</code>,
142
     *      <code>byAreasAndRanks</code>
143
     * @param frontendBaseUrl
144
     *      the cdm server instance base URL, this is needed for the a
145
     *      proper redirect URL when the service is running behind a
146
     *      reverse HTTP proxy
147
     * @param priority
148
     *      the priority for the Thread to spawn, see
149
     *      {@link Thread#setPriority(int)}, defaults to 3
150
     * @param targetAreaLevel
151
     *      The level of target areas to project the distributions to.
152
     * @param lowerRank
153
     * @param upperRank
154
     *
155
     * @param request
156
     * @param response
157
     * @return
158
     * @throws IOException
159
     */
160
    @RequestMapping(value = { "accumulateDistributions" }, method = RequestMethod.GET)
161
    public ModelAndView doAccumulateDistributions(
162
            @RequestParam(value= "mode", required = true) AggregationMode mode,
163
            @RequestParam(value= "mode2", required = true) AggregationMode mode2,
164
            @RequestParam(value = "targetAreaLevel", required = true) UUID targetAreaLevelUuid,
165
            @RequestParam(value = "frontendBaseUrl", required = false) String frontendBaseUrl,
166
            @RequestParam(value = "priority", required = false, defaultValue="3") Integer priority,
167
//            @RequestParam(value = "lowerRank", required = false) Rank lowerRank,
168
//            @RequestParam(value = "upperRank", required = false) Rank upperRank,
169
            @RequestParam(value = "minRank", required = false) UUID lowerRank,
170
            @RequestParam(value = "maxRank", required = false) UUID upperRank,
171
            @RequestParam(value = "subtrees", required = false) UuidList subtreeUuids,
172
            @RequestParam(value = "classifications", required = false) UuidList classificationUuids,
173
            @RequestParam(value = "taxa", required = false) UuidList taxonUuids,
174
            @RequestParam(value = "taxonnodes", required = false) UuidList taxonNodeUuids,
175
//            @RequestParam(value = "includeUnpublished", defaultValue="false") Boolean includeUnpublished,  //for now we do not allow unpublished data to be exported via webservice as long as read authentication is not implemented
176
//            @RequestParam(value = "area", required = false) UuidList areaUuids,
177
            HttpServletRequest request,
178
            HttpServletResponse response) throws IOException {
179

    
180
        logger.info("doAccumulateDistributions()" + request.getRequestURI());
181

    
182
        String processLabel = "accumulating distributions";
183

    
184
        ProgressMonitorUtil progressUtil = new ProgressMonitorUtil(progressMonitorController);
185

    
186
        final List<String> term_init_strategy = Arrays.asList(new String []{
187
                "representations"
188
        });
189
        NamedAreaLevel targetAreaLevel = (NamedAreaLevel)termService.load(targetAreaLevelUuid, term_init_strategy);
190

    
191
        if (!progressMonitorController.isMonitorRunning(transmissionEngineMonitorUuid)) {
192
            transmissionEngineMonitorUuid = progressUtil.registerNewMonitor();
193
            Thread subThread = new Thread() {
194
                @Override
195
                public void run() {
196
                    Pager<NamedArea> areaPager = termService.list(targetAreaLevel, (NamedAreaType) null,
197
                            null, null, (List<OrderHint>) null, term_init_strategy);
198
                    try {
199
                        TaxonNodeFilter filter = TaxonNodeFilter.NewInstance(classificationUuids, subtreeUuids,
200
                                taxonNodeUuids, taxonUuids, null, lowerRank, upperRank);
201
                        List<AggregationMode> modes = Arrays.asList(new AggregationMode[]{mode, mode2});
202
                        modes.remove(null);
203
                        List<UUID> areaUuids = new ArrayList();
204
                        areaPager.getRecords().forEach(p ->areaUuids.add(p.getUuid()));
205
                        DistributionAggregationConfiguration config = DistributionAggregationConfiguration.NewInstance(
206
                                modes, areaUuids, filter, progressMonitorController.getMonitor(transmissionEngineMonitorUuid));
207
                        DistributionAggregation distrAggr = new DistributionAggregation();
208
                        distrAggr.invoke(config, repository);
209
                    } catch (JvmLimitsException e) {
210
                        IRestServiceProgressMonitor monitor = progressMonitorController.getMonitor(transmissionEngineMonitorUuid);
211
                        monitor.setIsFailed(true);
212
                        monitor.setFeedback(e);
213
                    }
214
                }
215
            };
216
            if(priority == null) {
217
                priority = AbstractController.DEFAULT_BATCH_THREAD_PRIORITY;
218
            }
219
            subThread.setPriority(priority);
220
            subThread.start();
221
        }
222

    
223
        // send redirect "see other"
224
        return progressUtil.respondWithMonitor(frontendBaseUrl, processLabel, transmissionEngineMonitorUuid, false, request, response);
225
    }
226

    
227
    @RequestMapping(value = "namedAreasInUse", method = RequestMethod.GET)
228
    public Pager<TermDto> doPageNamedAreasInUse(
229
            @RequestParam(value = "includeAllParents", required = false) boolean includeAllParents,
230
            @RequestParam(value = "pageSize", required = false) Integer pageSize,
231
            @RequestParam(value = "pageNumber", required = false) Integer pageNumber, HttpServletRequest request,
232
            HttpServletResponse response) throws IOException {
233

    
234
        logger.info("doPageNamedAreasInUse : " + requestPathAndQuery(request));
235

    
236
        PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
237
        pagerParams.normalizeAndValidate(response);
238

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

    
241
        localizeTerms(pager);
242

    
243
        return pager;
244
    }
245

    
246
    /**
247
     * @param taxonUuid
248
     * @param parts
249
     *            possible values: condensedStatus, tree, mapUriParams,
250
     *            elements,
251
     * @param subAreaPreference
252
     * @param statusOrderPreference
253
     * @param hideMarkedAreasList
254
     * @param omitLevels
255
     * @param request
256
     * @param response
257
     * @param distributionOrder
258
     *  Default is  LABEL
259
     * @param recipe
260
     *  The recipe for creating the condensed distribution status
261
     * @return
262
     * @throws IOException
263
     * @throws JsonMappingException
264
     * @throws JsonParseException
265
     */
266
    @RequestMapping(value = "distributionInfoFor/{uuid}", method = RequestMethod.GET)
267
    public ModelAndView doGetDistributionInfo(
268
            @PathVariable("uuid") UUID taxonUuid,
269
            @RequestParam("part") Set<InfoPart> partSet,
270
            @RequestParam(value = "subAreaPreference", required = false) boolean subAreaPreference,
271
            @RequestParam(value = "statusOrderPreference", required = false) boolean statusOrderPreference,
272
            @RequestParam(value = "hiddenAreaMarkerType", required = false) DefinedTermBaseList<MarkerType> hideMarkedAreasList,
273
            @RequestParam(value = "omitLevels", required = false) Set<NamedAreaLevel> omitLevels,
274
            @RequestParam(value = "statusColors", required = false) String statusColorsString,
275
            @RequestParam(value = "distributionOrder", required = false, defaultValue="LABEL") DistributionOrder distributionOrder,
276
            @RequestParam(value = "recipe", required = false, defaultValue="EuroPlusMed") CondensedDistributionRecipe recipe,
277
            HttpServletRequest request,
278
            HttpServletResponse response) throws JsonParseException, JsonMappingException, IOException {
279

    
280
            logger.info("doGetDistributionInfo() - " + requestPathAndQuery(request));
281

    
282
            ModelAndView mv = new ModelAndView();
283

    
284
            Set<MarkerType> hideMarkedAreas = null;
285
            if(hideMarkedAreasList != null){
286
                hideMarkedAreas = hideMarkedAreasList.asSet();
287
            }
288

    
289
            EnumSet<InfoPart> parts = EnumSet.copyOf(partSet);
290

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

    
293
            DistributionInfoDTO dto = geoService.composeDistributionInfoFor(parts, taxonUuid,
294
                    subAreaPreference, statusOrderPreference, hideMarkedAreas, omitLevels,
295
                    presenceAbsenceTermColors, LocaleContext.getLanguages(),
296
                    getDescriptionInfoInitStrategy(), recipe, distributionOrder);
297

    
298
            mv.addObject(dto);
299

    
300
            return mv;
301
    }
302

    
303
}
(23-23/75)