Project

General

Profile

Download (8.26 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.io.IOException;
12
import java.util.List;
13
import java.util.Set;
14
import java.util.UUID;
15

    
16
import javax.servlet.http.HttpServletRequest;
17
import javax.servlet.http.HttpServletResponse;
18

    
19
import org.hibernate.search.spatial.impl.Rectangle;
20
import org.springframework.beans.factory.annotation.Autowired;
21
import org.springframework.stereotype.Controller;
22
import org.springframework.web.bind.WebDataBinder;
23
import org.springframework.web.bind.annotation.InitBinder;
24
import org.springframework.web.bind.annotation.RequestMapping;
25
import org.springframework.web.bind.annotation.RequestMethod;
26
import org.springframework.web.bind.annotation.RequestParam;
27

    
28
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
29
import eu.etaxonomy.cdm.api.service.ITaxonService;
30
import eu.etaxonomy.cdm.api.service.ITermService;
31
import eu.etaxonomy.cdm.api.service.dto.SpecimenOrObservationBaseDTO;
32
import eu.etaxonomy.cdm.api.service.pager.Pager;
33
import eu.etaxonomy.cdm.api.service.search.LuceneParseException;
34
import eu.etaxonomy.cdm.api.service.search.SearchResult;
35
import eu.etaxonomy.cdm.api.util.TaxonRelationshipEdge;
36
import eu.etaxonomy.cdm.model.common.Language;
37
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
38
import eu.etaxonomy.cdm.model.taxon.Taxon;
39
import eu.etaxonomy.cdm.persistence.query.OrderHint;
40
import eu.etaxonomy.cdm.remote.controller.util.ControllerUtils;
41
import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
42
import eu.etaxonomy.cdm.remote.editor.RectanglePropertyEditor;
43
import eu.etaxonomy.cdm.remote.editor.UUIDListPropertyEditor;
44
import eu.etaxonomy.cdm.remote.editor.UuidList;
45
import io.swagger.annotations.Api;
46

    
47
/**
48
 * TODO write controller documentation
49
 *
50
 * @author a.kohlbecker
51
 * @since 24.03.2009
52
 */
53
@Controller
54
@Api("occurrence")
55
@RequestMapping(value = {"/occurrence"})
56
public class OccurrenceListController extends AbstractIdentifiableListController<SpecimenOrObservationBase, IOccurrenceService> {
57

    
58
    @Autowired
59
    private ITaxonService taxonService;
60

    
61
    @Autowired
62
    private ITermService termService;
63

    
64
    @Override
65
    @Autowired
66
    public void setService(IOccurrenceService service) {
67
        this.service = service;
68
    }
69

    
70
    @InitBinder
71
    @Override
72
    public void initBinder(WebDataBinder binder) {
73
        super.initBinder(binder);
74
        binder.registerCustomEditor(UuidList.class, new UUIDListPropertyEditor());
75
        binder.registerCustomEditor(Rectangle.class, new RectanglePropertyEditor());
76
    }
77

    
78
    /**
79
     * @param taxonUuid
80
     * @param relationshipUuids a comma separated list of uuids e.g. CongruentTo;  "60974c98-64ab-4574-bb5c-c110f6db634d"
81
     * @param relationshipInversUuids a comma separated list of uuids
82
     * @param maxDepth null for unlimited
83
     * @param pageNumber
84
     * @param pageSize
85
     * @param request
86
     * @param response
87
     * @return
88
     * @throws IOException
89
     */
90
    @RequestMapping(
91
            value = {"byAssociatedTaxon"},
92
            method = RequestMethod.GET)
93
    public Pager<SpecimenOrObservationBase> doListByAssociatedTaxon(
94
                @RequestParam(value = "taxonUuid", required = true) UUID taxonUuid,
95
                @RequestParam(value = "relationships", required = false) UuidList relationshipUuids,
96
                @RequestParam(value = "relationshipsInvers", required = false) UuidList relationshipInversUuids,
97
                @RequestParam(value = "maxDepth", required = false) Integer maxDepth,
98
                @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
99
                @RequestParam(value = "pageSize", required = false) Integer pageSize,
100
                HttpServletRequest request,
101
                HttpServletResponse response) throws IOException {
102

    
103
        logger.info("doListByAssociatedTaxon()" + requestPathAndQuery(request));
104

    
105
        Set<TaxonRelationshipEdge> includeRelationships = ControllerUtils.loadIncludeRelationships(relationshipUuids, relationshipInversUuids, termService);
106

    
107
        Taxon associatedTaxon = (Taxon) taxonService.find(taxonUuid);
108
        PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
109
        pagerParams.normalizeAndValidate(response);
110

    
111
        List<OrderHint> orderHints = null;
112

    
113
        return service.pageByAssociatedTaxon(null, includeRelationships, associatedTaxon,
114
                maxDepth, pagerParams.getPageSize(), pagerParams.getPageIndex(),
115
                orderHints, getInitializationStrategy());
116

    
117
    }
118

    
119
    @RequestMapping(value = "rootUnitDTOsByAssociatedTaxon", method = RequestMethod.GET)
120
    public List<SpecimenOrObservationBaseDTO> doListlistRootUnitDTOsByAssociatedTaxon(
121
            @RequestParam(value = "uuid", required = true) UUID uuid,
122
            HttpServletRequest request,
123
            HttpServletResponse response) {
124
        logger.info("doListlistRootUnitDTOByAssociatedTaxon() - " + requestPathAndQuery(request));
125

    
126
        List<SpecimenOrObservationBaseDTO> sobDTOs = service.listRootUnitDTOsByAssociatedTaxon(null, uuid, OccurrenceController.DERIVED_UNIT_INIT_STRATEGY);
127
        return sobDTOs;
128
    }
129

    
130
    /**
131
     *
132
     * @param clazz
133
     * @param queryString
134
     * @param boundingBox
135
     *            as
136
     *            minx(minlongitute),miny(minlatitute),maxx(maxlongitute),max(
137
     *            maxlatitute), e.g. 13.112,52.374,13.681,52.641 for the Berlin
138
     *            area
139
     * @param languages
140
     * @param highlighting
141
     * @param pageNumber
142
     * @param pageSize
143
     * @param request
144
     * @param response
145
     * @return
146
     * @throws IOException
147
     * @throws ParseException
148
     */
149
    @RequestMapping(method = RequestMethod.GET, value={"findByFullText"})
150
    public Pager<SearchResult<SpecimenOrObservationBase>> doFindByFullText(
151
            @RequestParam(value = "clazz", required = false) Class<? extends SpecimenOrObservationBase<?>> clazz,
152
            @RequestParam(value = "query", required = false) String queryString,
153
            @RequestParam(value = "bbox", required = false) Rectangle boundingBox,
154
            @RequestParam(value = "languages", required = false) List<Language> languages,
155
            @RequestParam(value = "hl", required = false) Boolean highlighting,
156
            @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
157
            @RequestParam(value = "pageSize", required = false) Integer pageSize,
158
            HttpServletRequest request,
159
            HttpServletResponse response
160
            )
161
             throws IOException, LuceneParseException {
162

    
163
         logger.info("doFindByFullText() " + requestPathAndQuery(request) );
164

    
165
         PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
166
         pagerParams.normalizeAndValidate(response);
167

    
168
         if(highlighting == null){
169
             highlighting = false;
170
         }
171

    
172
         if(queryString == null && boundingBox == null) {
173
             HttpStatusMessage.create("Either query or bbox must be given", 400).send(response);
174
             return null;
175
         }
176

    
177
        Pager<SearchResult<SpecimenOrObservationBase>> pager = service.findByFullText(clazz, queryString, boundingBox, languages,
178
                highlighting, pagerParams.getPageSize(), pagerParams.getPageIndex(), ((List<OrderHint>)null),
179
                initializationStrategy);
180
        return pager;
181
    }
182

    
183
    @RequestMapping(method = RequestMethod.GET, value = "byGeneticAccessionNumber" )
184
    public SpecimenOrObservationBaseDTO doGetByGeneticAccessionNumber(
185
            @RequestParam(value="accessionNumber", required = true) String accessionNumber,
186
            HttpServletRequest request,
187
            HttpServletResponse response) throws IOException {
188
        logger.info("doGetByGeneticAccessionNumber() - " + requestPathAndQuery(request));
189

    
190
       SpecimenOrObservationBaseDTO sobDto = service.findByGeneticAccessionNumber(accessionNumber, null);
191
       if(sobDto == null ) {
192
           response.setHeader("Failure", "No DNA available for accession number ");
193
           HttpStatusMessage.create("No DNA available for accession number " + accessionNumber, 400).send(response);
194
           return null;
195
       }
196
       return sobDto;
197
    }
198
}
(40-40/76)