cleanup
[cdmlib.git] / cdmlib-remote / src / main / java / eu / etaxonomy / cdm / remote / controller / AgentController.java
1 /**
2 * Copyright (C) 2007 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
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.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.PathVariable;
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.IAgentService;
30 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
31 import eu.etaxonomy.cdm.api.service.pager.Pager;
32 import eu.etaxonomy.cdm.database.UpdatableRoutingDataSource;
33 import eu.etaxonomy.cdm.model.agent.AgentBase;
34 import eu.etaxonomy.cdm.model.common.Annotation;
35 import eu.etaxonomy.cdm.model.name.Rank;
36 import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation;
37 import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;
38 import eu.etaxonomy.cdm.remote.editor.RankPropertyEditor;
39 import io.swagger.annotations.Api;
40
41 /**
42 * The AgentController class is a Spring MVC Controller.
43 * <p>
44 * The syntax of the mapped service URIs contains the the {datasource-name} path element.
45 * The available {datasource-name}s are defined in a configuration file which
46 * is loaded by the {@link UpdatableRoutingDataSource}. If the
47 * UpdatableRoutingDataSource is not being used in the actual application
48 * context any arbitrary {datasource-name} may be used.
49 * <p>
50 * Methods mapped at type level, inherited from super classes ({@link BaseController}):
51 * <blockquote>
52 * URI: <b>&#x002F;{datasource-name}&#x002F;agent&#x002F;name&#x002F;{agent-uuid}</b>
53 *
54 * Get the {@link AgentBase} instance identified by the <code>{agent-uuid}</code>.
55 * The returned AgentBase is initialized by
56 * the default initialization strategy: {@link #DEFAULT_INIT_STRATEGY}
57 * </blockquote>
58 * <blockquote>
59 * URI: <b>&#x002F;{datasource-name}&#x002F;agent&#x002F;name&#x002F;{agent-uuid}&#x002F;annotation</b>
60 *
61 * Returns a {@link Pager} on the {@link Annotation}s for the {@link AgentBase} instance identified by the
62 * <code>{agent-uuid}</code>.
63 * The returned AgentBase instances are initialized by
64 * the following strategy: {@link #ANNOTATION_INIT_STRATEGY}
65 * </blockquote>
66 *
67 * @author a.kohlbecker
68 * @date 24.03.2009
69 */
70 @Controller
71 @Api(value = "agent")
72 @RequestMapping(value = {"/agent/{uuid}"})
73 public class AgentController extends AbstractIdentifiableController<AgentBase, IAgentService>
74 {
75
76 private static final List<String> TAXONNODEAGENTRELATIONS_INIT_STRATEGY = Arrays.asList(new String[]{
77 // NOTE: all other cases are covered in the TaxonNodeDaoHibernateImpl method
78 // which is using join fetches
79 "taxonNode.taxon.name.nomenclaturalReference",
80 });
81
82 public List<String> getTaxonNodeAgentRelationsInitStrategy() {
83 return TAXONNODEAGENTRELATIONS_INIT_STRATEGY;
84 }
85
86 @Autowired
87 private ITaxonNodeService nodeService;
88
89 @Autowired
90 @Override
91 public void setService(IAgentService service) {
92 this.service = service;
93 }
94
95 @Override
96 @InitBinder
97 public void initBinder(WebDataBinder binder) {
98 super.initBinder(binder);
99 binder.registerCustomEditor(Rank.class, new RankPropertyEditor());
100 }
101
102 /**
103 *
104 * See also {@link TaxonController#doGetTaxonNodeAgentRelations(UUID, UUID, Integer, Integer, HttpServletRequest, HttpServletResponse)}
105 *
106 * @param uuid
107 * @param classificationUuid
108 * @param pageNumber
109 * @param pageSize
110 * @param request
111 * @param response
112 * @return
113 * @throws IOException
114 *
115 */
116 @RequestMapping(value = "taxonNodeAgentRelations", method = RequestMethod.GET)
117 public Pager<TaxonNodeAgentRelation> doGetTaxonNodeAgentRelations(
118 @PathVariable("uuid") UUID uuid,
119 @RequestParam(value = "classification_uuid" , required = false) UUID classificationUuid,
120 @RequestParam(value = "taxon_uuid" , required = false) UUID taxonUuid,
121 @RequestParam(value = "relType_uuid" , required = false) UUID relTypeUuid,
122 @RequestParam(value = "rank" , required = false) Rank rank,
123 @RequestParam(value = "pageNumber", required = false) Integer pageNumber,
124 @RequestParam(value = "pageSize", required = false) Integer pageSize,
125 HttpServletRequest request,
126 HttpServletResponse response) throws IOException {
127
128 PagerParameters pagerParams = new PagerParameters(pageSize, pageNumber);
129 pagerParams.normalizeAndValidate(response);
130
131 UUID rankUuid = null;
132 if(rank != null) {
133 rankUuid = rank.getUuid();
134 }
135 Pager<TaxonNodeAgentRelation> pager = nodeService.pageTaxonNodeAgentRelations(taxonUuid, classificationUuid, uuid,
136 rankUuid, relTypeUuid, pagerParams.getPageSize(), pagerParams.getPageIndex(), getTaxonNodeAgentRelationsInitStrategy());
137 return pager;
138 }
139
140 }