Merge branch 'release/5.45.0'
[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 package eu.etaxonomy.cdm.remote.controller;
10
11 import java.io.IOException;
12 import java.util.Arrays;
13 import java.util.List;
14 import java.util.UUID;
15
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletResponse;
18
19 import org.apache.logging.log4j.LogManager;
20 import org.apache.logging.log4j.Logger;
21 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.stereotype.Controller;
23 import org.springframework.web.bind.WebDataBinder;
24 import org.springframework.web.bind.annotation.InitBinder;
25 import org.springframework.web.bind.annotation.PathVariable;
26 import org.springframework.web.bind.annotation.RequestMapping;
27 import org.springframework.web.bind.annotation.RequestMethod;
28 import org.springframework.web.bind.annotation.RequestParam;
29
30 import eu.etaxonomy.cdm.api.service.IAgentService;
31 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
32 import eu.etaxonomy.cdm.api.service.pager.Pager;
33 import eu.etaxonomy.cdm.database.UpdatableRoutingDataSource;
34 import eu.etaxonomy.cdm.model.agent.AgentBase;
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 * @since 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 private static final Logger logger = LogManager.getLogger();
76
77 private static final List<String> TAXONNODEAGENTRELATIONS_INIT_STRATEGY = Arrays.asList(new String[]{
78 // NOTE: all other cases are covered in the TaxonNodeDaoHibernateImpl method
79 // which is using join fetches
80 "taxonNode.taxon.name.nomenclaturalSource.citation",
81 });
82
83 public List<String> getTaxonNodeAgentRelationsInitStrategy() {
84 return TAXONNODEAGENTRELATIONS_INIT_STRATEGY;
85 }
86
87 @Autowired
88 private ITaxonNodeService nodeService;
89
90 @Autowired
91 @Override
92 public void setService(IAgentService service) {
93 this.service = service;
94 }
95
96 @Override
97 @InitBinder
98 public void initBinder(WebDataBinder binder) {
99 super.initBinder(binder);
100 binder.registerCustomEditor(Rank.class, new RankPropertyEditor());
101 }
102
103 /**
104 * See also {@link TaxonController#doGetTaxonNodeAgentRelations(UUID, UUID, Integer, Integer, HttpServletRequest, HttpServletResponse)}
105 */
106 @RequestMapping(value = "taxonNodeAgentRelations", method = RequestMethod.GET)
107 public Pager<TaxonNodeAgentRelation> doGetTaxonNodeAgentRelations(
108 @PathVariable("uuid") UUID uuid,
109 @RequestParam(value = "classification_uuid" , required = false) UUID classificationUuid,
110 @RequestParam(value = "taxon_uuid" , required = false) UUID taxonUuid,
111 @RequestParam(value = "relType_uuid" , required = false) UUID relTypeUuid,
112 @RequestParam(value = "rank" , required = false) Rank rank,
113 @RequestParam(value = "pageIndex", required = false) Integer pageIndex,
114 @RequestParam(value = "pageSize", required = false) Integer pageSize,
115 HttpServletRequest request,
116 HttpServletResponse response) throws IOException {
117
118 logger.info("doGetTaxonNodeAgentRelations" + requestPathAndQuery(request));
119
120 PagerParameters pagerParams = new PagerParameters(pageSize, pageIndex);
121 pagerParams.normalizeAndValidate(response);
122
123 UUID rankUuid = null;
124 if(rank != null) {
125 rankUuid = rank.getUuid();
126 }
127 Pager<TaxonNodeAgentRelation> pager = nodeService.pageTaxonNodeAgentRelations(taxonUuid, classificationUuid, uuid,
128 rankUuid, relTypeUuid, pagerParams.getPageSize(), pagerParams.getPageIndex(), getTaxonNodeAgentRelationsInitStrategy());
129 return pager;
130 }
131
132 }