Project

General

Profile

Download (16.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 EDIT
3
* 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 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.remote.controller.dto;
10

    
11
import io.swagger.annotations.Api;
12

    
13
import java.io.IOException;
14
import java.util.ArrayList;
15
import java.util.Arrays;
16
import java.util.HashMap;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.UUID;
20

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

    
24
import org.apache.log4j.Logger;
25
import org.springframework.beans.factory.annotation.Autowired;
26
import org.springframework.stereotype.Controller;
27
import org.springframework.web.bind.annotation.PathVariable;
28
import org.springframework.web.bind.annotation.RequestMapping;
29
import org.springframework.web.bind.annotation.RequestMethod;
30
import org.springframework.web.bind.annotation.RequestParam;
31
import org.springframework.web.servlet.ModelAndView;
32

    
33
import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
34
import eu.etaxonomy.cdm.api.service.ITaxonService;
35
import eu.etaxonomy.cdm.api.service.pager.Pager;
36
import eu.etaxonomy.cdm.model.common.Language;
37
import eu.etaxonomy.cdm.model.common.LanguageString;
38
import eu.etaxonomy.cdm.model.common.MultilanguageTextHelper;
39
import eu.etaxonomy.cdm.model.description.Feature;
40
import eu.etaxonomy.cdm.model.description.KeyStatement;
41
import eu.etaxonomy.cdm.model.description.PolytomousKey;
42
import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
43
import eu.etaxonomy.cdm.model.taxon.Taxon;
44
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
45
import eu.etaxonomy.cdm.remote.controller.AbstractController;
46
import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
47
import eu.etaxonomy.cdm.remote.dto.polytomouskey.AbstractLinkDto;
48
import eu.etaxonomy.cdm.remote.dto.polytomouskey.LinkedPolytomousKeyNodeRowDto;
49
import eu.etaxonomy.cdm.remote.dto.polytomouskey.PolytomousKeyNodeLinkDto;
50
import eu.etaxonomy.cdm.remote.dto.polytomouskey.TaxonLinkDto;
51
import eu.etaxonomy.cdm.remote.l10n.LocaleContext;
52

    
53
/**
54
 * @author l.morris
55
 * @since Feb 21, 2013
56
 *
57
 */
58
@Controller
59
@Api("polytomousKeyDTO")
60
@RequestMapping(value = {"/dto/polytomousKey/"})
61
public class PolytomousKeyNodeDtoController extends AbstractController<PolytomousKey, IPolytomousKeyService> {
62

    
63
    public static final Logger logger = Logger
64
            .getLogger(PolytomousKeyNodeDtoController.class);
65

    
66
    private static final List<String> KEY_INIT_STRATEGY = Arrays.asList(new String[]{
67
            "root.children"
68
    });
69

    
70
    private static final List<String> NODE_INIT_STRATEGY = Arrays.asList(new String[]{
71
            "*",
72
            "question.label",
73
            "statement.label",
74
            "taxon.name.$"
75
    });
76

    
77
    public PolytomousKeyNodeDtoController() {
78
        super();
79
        setInitializationStrategy(NODE_INIT_STRATEGY);
80
    }
81

    
82
    private ITaxonService taxonService;
83

    
84
    /* (non-Javadoc)
85
     * @see eu.etaxonomy.cdm.remote.controller.AbstractController#setService(eu.etaxonomy.cdm.api.service.IService)
86
     */
87
    @Override
88
    @Autowired
89
    public void setService(IPolytomousKeyService service) {
90
        this.service = service;
91
    }
92

    
93
    @Autowired
94
    public void setService(ITaxonService taxonService) {
95
        this.taxonService = taxonService;
96
    }
97

    
98

    
99
    @RequestMapping(value = {"{uuid}/linkedStyle"}, method = RequestMethod.GET)
100
    public ModelAndView doLinkedStyle(
101
            @PathVariable("uuid") UUID uuid,
102
            HttpServletRequest request,
103
            HttpServletResponse response) throws IOException {
104

    
105
        logger.info("doLinkedStyle() - " + requestPathAndQuery(request));
106

    
107
        ModelAndView mv = new ModelAndView();
108
        List<LinkedPolytomousKeyNodeRowDto> polytomousKeyNodeRowList = new ArrayList<LinkedPolytomousKeyNodeRowDto>();
109

    
110
        List<String> nodePaths = new ArrayList<String>();
111
        nodePaths.add("$");//initialize all to 1 relations e.g. subkey, statement
112
        nodePaths.add("statement.$");
113
        //nodePaths.add("taxon.name.nomenclaturalReference");
114
        nodePaths.add("taxon.name.$");
115

    
116
        List<String> propertyPaths = new ArrayList<String>();
117
        propertyPaths.add("sources");
118
        propertyPaths.add("annotations");
119

    
120
        //PolytomousKeyListController - don't want a pager and how do we use property paths.
121
        //create ticket for portal implementation of key stuff so appears in roadmap.
122

    
123
        //TaxonBase taxon = taxonService.find(taxonUuid);
124
        //Pager<PolytomousKey> pager = service.findByTaxonomicScope(taxon, pagerParameters.getPageSize(), pagerParameters.getPageIndex(), null);
125

    
126
        //PolytomousKey key = service.findByTaxonomicScope(taxon, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE, initializationStrategy);
127
        //request mapping /dto/polytomousKey/{uuid}/linkedStyle
128

    
129
        PolytomousKey key = service.loadWithNodes(uuid, propertyPaths, nodePaths);
130
        PolytomousKeyNode keyNode = key.getRoot();
131

    
132
        processPolytomousKeyNode(keyNode, polytomousKeyNodeRowList);
133
        logger.info("size of polytomousKeyNodeRowList - " + polytomousKeyNodeRowList.size());
134

    
135
        //return a List of LinkedPolytomousKeyNodeRowDto
136
        mv.addObject(polytomousKeyNodeRowList);
137
        return mv;
138
    }
139

    
140
    @RequestMapping(value = {"linkedStyle"}, method = RequestMethod.GET)
141
    public ModelAndView doLinkedStyleByTaxonomicScope(
142
            @RequestParam(value = "findByTaxonomicScope") UUID taxonUuid,
143
            @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
144
            @RequestParam(value = "pageSize", required = false) Integer pageSize,
145
            HttpServletRequest request,
146
            HttpServletResponse response) throws IOException {
147

    
148
        logger.info("doLinkedStyle() - " + requestPathAndQuery(request));
149

    
150
        ModelAndView mv = new ModelAndView();
151
        List<LinkedPolytomousKeyNodeRowDto> polytomousKeyNodeRowList = new ArrayList<LinkedPolytomousKeyNodeRowDto>();
152

    
153
        List<String> nodePaths = new ArrayList<String>();
154
        nodePaths.add("$");//initialize all to 1 relations e.g. subkey, statement
155
        nodePaths.add("statement.$");
156
        //nodePaths.add("taxon.name.nomenclaturalReference");
157
        nodePaths.add("taxon.name.$");
158

    
159
        List<String> propertyPaths = new ArrayList<String>();
160
        propertyPaths.add("sources");
161
        propertyPaths.add("annotations");
162

    
163
        //PolytomousKeyListController - don't want a pager and how do we use property paths.
164
        //create ticket for portal implementation of key stuff so appears in roadmap.
165

    
166
        TaxonBase taxon = taxonService.find(taxonUuid);
167
        //TaxonBase taxon = taxonService.find(taxonUuid);
168
        logger.error("The taxon uuid " + taxonUuid + " and taxon is " + taxon);
169
        //Pager<PolytomousKey> pager = service.findByTaxonomicScope(taxon, pagerParameters.getPageSize(), pagerParameters.getPageIndex(), null);
170

    
171
        //not getting a result when I use the method findByTaxonomicScope. Maybe I'm giving it the wrong taxonUUID. Ask andreas for a taxon that works
172
      PagerParameters pagerParameters = new PagerParameters(pageSize, pageNumber);
173
      pagerParameters.normalizeAndValidate(response);
174

    
175

    
176
        Pager<PolytomousKey> pager = service.findByTaxonomicScope(taxon, pagerParameters.getPageSize(), pagerParameters.getPageIndex(), initializationStrategy, NODE_INIT_STRATEGY);
177

    
178
        List<PolytomousKey> keyList = pager.getRecords(); // a pager is returned containing 1 key but pager.getRecords is empty
179

    
180
        for(PolytomousKey key : keyList) {
181
            //request mapping /dto/polytomousKey/{uuid}/linkedStyle
182
            //PolytomousKey key = service.loadWithNodes(uuid, propertyPaths, nodePaths);
183
            PolytomousKeyNode keyNode = key.getRoot();
184
            processPolytomousKeyNode(keyNode, polytomousKeyNodeRowList);
185
            logger.info("size of polytomousKeyNodeRowList - " + polytomousKeyNodeRowList.size());
186
            logger.error("The key is " + key.getTitleCache());//TODO: Need to add this to the mv
187
            //return a List of LinkedPolytomousKeyNodeRowDto
188

    
189
            Map<String, Object> modelMap = new HashMap<String, Object>();
190
            modelMap.put("titleCache", key.getTitleCache());
191
            modelMap.put("records", polytomousKeyNodeRowList);
192

    
193
            //mv.addObject(polytomousKeyNodeRowList);
194
            //mv contains the list of LinkedPolytomousKeyNodeRowDto objects and the titleCache of the key.
195
            mv.addObject(modelMap);
196
            //mv.addAllObjects(modelMap);
197
        }
198
        return mv;
199
    }
200

    
201
    /**
202
     * @param keyNode
203
     */
204
    private void processPolytomousKeyNode(PolytomousKeyNode keyNode, List<LinkedPolytomousKeyNodeRowDto> polytomousKeyNodeRowList) {
205

    
206
        KeyStatement rowQuestion = null;
207
        Integer nodeNumber = null;
208
        Integer edgeNumber = null;
209
        Feature rowFeature = null;
210
        KeyStatement childStatement = null;
211

    
212
        int childIndex = 1;
213

    
214
        // Get edges of the current node.
215
        for(PolytomousKeyNode childKeyNode : keyNode.getChildren()){
216

    
217
            List<AbstractLinkDto> links = new ArrayList<AbstractLinkDto>();
218
            childStatement = childKeyNode.getStatement(); //is this the correct statement
219
            Taxon taxon = childKeyNode.getTaxon();
220
            UUID taxonUuid = (taxon == null) ? null : taxon.getUuid();
221

    
222
            // Skip node with empty statements (see below for explanation: "Special Case")
223
            if (childStatement == null && taxonUuid != null) {
224
                logger.info("Continuing - nodeNumber " + keyNode.getNodeNumber() + "Child nodeNumber " + childKeyNode.getNodeNumber());
225
                continue;
226
            }
227

    
228
            /*
229
             * Special case: Child nodes with empty statements but taxa as leaf are to treated as if
230
             * all those taxa where direct children of the source node.
231
             */
232
            List<PolytomousKeyNode> children = childKeyNode.getChildren();
233
            boolean islinkToManyTaxa = false;
234

    
235
            if (children != null && children.size() > 0) {
236

    
237
                Taxon childTaxon = children.get(0).getTaxon();
238
                if (childTaxon != null) {
239
                    islinkToManyTaxa = children.get(0).getStatement() != null && childTaxon.getUuid() == null;
240
                    //logger.info("islinkToManyTaxa " + islinkToManyTaxa + " node number " + keyNode.getNodeNumber());
241
                }
242
            }
243

    
244
            boolean islinkToTaxon = (taxonUuid == null) ? false : true;
245
            boolean islinkToSubKey = false;
246
            if (childKeyNode.getSubkey() != null)
247
            {
248
                islinkToSubKey = (childKeyNode.getSubkey().getUuid() == null) ? false : true;
249
            }
250
            boolean islinkToOtherNode = (childKeyNode.getOtherNode() == null) ? false : true;
251
            boolean islinkToNode = ((childKeyNode.getNodeNumber() != null) && !islinkToManyTaxa && !islinkToOtherNode) ? true : false;
252

    
253
            AbstractLinkDto link;
254

    
255
            // a PolytomousKeyNode can either link to Taxa or to Nodes
256
            if (islinkToManyTaxa || islinkToTaxon) {
257
                if (islinkToManyTaxa) {
258
                    for(PolytomousKeyNode child : childKeyNode.getChildren()){
259
                        logger.info("islinkToManyTaxa " + islinkToManyTaxa + " node number " + keyNode.getNodeNumber());
260
                        link = new TaxonLinkDto(child.getTaxon().getName());
261
                        link.setUuid(taxonUuid);
262
                        links.add(link);
263
                    }
264
                } else {
265
                    if (islinkToTaxon) {
266
                        logger.info("islinkToTaxon " + islinkToTaxon + " node number " + keyNode.getNodeNumber());
267
                        link = new TaxonLinkDto(childKeyNode.getTaxon().getName());
268
                        link.setUuid(childKeyNode.getTaxon().getUuid());
269
                        links.add(link);
270
                    }
271
                }
272
            } else {
273
                if (islinkToNode) {
274
                    logger.info("islinkToNode " + islinkToNode + " node number " + keyNode.getNodeNumber());
275
                    link = new PolytomousKeyNodeLinkDto(childKeyNode.getNodeNumber());
276
                    link.setUuid(childKeyNode.getUuid());
277
                    links.add(link);
278
                }
279
                if (islinkToOtherNode) {
280
                    logger.info("islinkToOtherNode " + islinkToOtherNode + " node number " + keyNode.getNodeNumber());
281
                    link = new PolytomousKeyNodeLinkDto(childKeyNode.getOtherNode().getNodeNumber());
282
                    link.setUuid(childKeyNode.getOtherNode().getUuid());
283
                    links.add(link);
284
                }
285
            }
286

    
287
            /*if (islinkToManyTaxa) {
288
                for(PolytomousKeyNode child : childKeyNode.getChildren()){
289
                    logger.info("islinkToManyTaxa " + islinkToManyTaxa + " node number " + keyNode.getNodeNumber());
290
                    link = new TaxonLinkDto(child.getTaxon().getName());
291
                    link.setUuid(taxonUuid);
292
                    links.add(link);
293
                }
294
            } else {
295
                if (islinkToTaxon) {
296
                    logger.info("islinkToTaxon " + islinkToTaxon + " node number " + keyNode.getNodeNumber());
297
                    link = new TaxonLinkDto(childKeyNode.getTaxon().getName());
298
                    link.setUuid(childKeyNode.getTaxon().getUuid());
299
                    links.add(link);
300
                }
301
            }*/
302
            //TODO: isLinkToSubkey
303

    
304
            boolean hasQuestion = false;
305
            if (keyNode.getQuestion() != null)
306
            {
307
                hasQuestion = (keyNode.getQuestion().getLabel() == null) ? false : true;
308
            }
309
            rowQuestion = keyNode.getQuestion();
310
            logger.info("rowQuestion " + rowQuestion + " node number " + keyNode.getNodeNumber());
311

    
312
            boolean hasFeature = (keyNode.getFeature() == null) ? false : true;
313
            rowFeature = keyNode.getFeature();
314
            logger.info("rowFeature " + rowFeature + " node number " + keyNode.getNodeNumber());
315

    
316
            if (childStatement != null) {
317
            logger.info("childStatement " + childStatement.getLabel() + " node number " + keyNode.getNodeNumber());
318
            }
319

    
320
            nodeNumber = keyNode.getNodeNumber();
321

    
322
            //set the parameters in the LinkedPolytomousKeyodeRowDto and add it to the list
323
            LinkedPolytomousKeyNodeRowDto keyRow = new LinkedPolytomousKeyNodeRowDto();
324
            keyRow.setKeyNodeUuid(keyNode.getUuid());
325
            keyRow.setEdgeNumber(new Integer(childIndex));
326

    
327
            List<Language> languages = LocaleContext.getLanguages();
328

    
329
            //if(Hibernate.isInitialized(childStatement.getLabel())){
330
            if (childStatement != null) {
331
                LanguageString label = MultilanguageTextHelper.getPreferredLanguageString(childStatement.getLabel(), languages);
332
                keyRow.setChildStatement(label.getText());
333
            }
334

    
335
            keyRow.setRowFeature(rowFeature);
336
            keyRow.setRowQuestion(rowQuestion);
337
            keyRow.setNodeNumber(nodeNumber);
338
            //set links
339
            keyRow.setLinks(links);
340
            polytomousKeyNodeRowList.add(keyRow);
341

    
342
            childIndex++;
343
        }
344

    
345
        //edgeNumber = new Integer(childIndex);
346
        //set the parameters in the LinkedPolytomousKeyodeRowDto and add it to the list
347
        /*LinkedPolytomousKeyNodeRowDto keyRow = new LinkedPolytomousKeyNodeRowDto();
348
        keyRow.setKey(keyNode);
349
        keyRow.setEdgeNumber(edgeNumber);
350
        keyRow.setChildStatement(childStatement);
351
        keyRow.setRowFeature(rowFeature);
352
        keyRow.setRowQuestion(rowQuestion);
353
        keyRow.setNodeNumber(nodeNumber);//isLinkToManyTaxa
354
        //set links
355
        keyRow.setLinks(links);*/
356

    
357
        // Recurse into child nodes.
358
        for(PolytomousKeyNode childKeyNode : keyNode.getChildren()) {
359
            processPolytomousKeyNode(childKeyNode, polytomousKeyNodeRowList);
360
        }
361

    
362
    }
363
}
(3-3/3)