merge-update from trunk
[cdmlib.git] / cdmlib-remote / src / main / java / eu / etaxonomy / cdm / remote / controller / StatisticsController.java
1 package eu.etaxonomy.cdm.remote.controller;
2
3 import java.io.IOException;
4 import java.util.ArrayList;
5 import java.util.HashSet;
6 import java.util.List;
7 import java.util.Set;
8 import java.util.UUID;
9
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 import org.apache.log4j.Logger;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.stereotype.Controller;
16 import org.springframework.web.bind.annotation.RequestMapping;
17 import org.springframework.web.bind.annotation.RequestMethod;
18 import org.springframework.web.bind.annotation.RequestParam;
19 import org.springframework.web.servlet.ModelAndView;
20
21 import eu.etaxonomy.cdm.api.service.IClassificationService;
22 import eu.etaxonomy.cdm.api.service.IStatisticsService;
23 import eu.etaxonomy.cdm.api.service.statistics.Statistics;
24 import eu.etaxonomy.cdm.api.service.statistics.StatisticsConfigurator;
25 import eu.etaxonomy.cdm.api.service.statistics.StatisticsPartEnum;
26 import eu.etaxonomy.cdm.api.service.statistics.StatisticsTypeEnum;
27 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
28 import eu.etaxonomy.cdm.model.taxon.Classification;
29 import eu.etaxonomy.cdm.persistence.query.MatchMode;
30
31 /**
32 * this controller provides a method to count different entities in the entire
33 * database as well as from a particular classification items of different types
34 * can be chosen have a look at doStatistics method
35 *
36 * @author s.buers
37 * @created 07.11.2012
38 *
39 */
40 @Controller
41 @RequestMapping(value = { "/statistics" })
42 public class StatisticsController {
43
44 private static final Logger logger = Logger
45 .getLogger(StatisticsController.class);
46
47 @Autowired
48 private IClassificationService classificationService;
49
50 private IStatisticsService service;
51
52 @Autowired
53 public void setService(IStatisticsService service) {
54 this.service = service;
55 }
56
57 /**
58 * example query:
59 *
60 * <pre>
61 * part=ALL&part=CLASSIFICATION&type=DESCRIPTIVE_SOURCE_REFERENCES&type=ALL_TAXA&type=ACCEPTED_TAXA&type=SYNONYMS&type=TAXON_NAMES&type=ALL_REFERENCES&type=NOMENCLATURAL_REFERENCES
62 * </pre>
63 *
64 * @param part
65 * @param type
66 * @param request
67 * @param response
68 * @return
69 * @throws IOException
70 */
71 @RequestMapping(method = RequestMethod.GET)
72 public ModelAndView doStatistics(
73 @RequestParam(value = "part", required = false) String[] part,
74 @RequestParam(value = "type", required = false) String[] type,
75 @RequestParam(value = "classificationName", required = false) String[] classificationName,
76 @RequestParam(value = "classificationUuid", required = false) String[] classificationUuid,
77 HttpServletRequest request, HttpServletResponse response)
78 throws IOException {
79
80 ModelAndView mv = new ModelAndView();
81
82 List<StatisticsConfigurator> configuratorList = createConfiguratorList(
83 part, type, classificationName, classificationUuid);
84 List<Statistics> statistics = service
85 .getCountStatistics(configuratorList);
86 logger.info("doStatistics() - " + request.getRequestURI());
87
88 mv.addObject(statistics);
89 return mv;
90 }
91
92 private List<StatisticsConfigurator> createConfiguratorList(String[] part,
93 String[] type, String[] classificationName,
94 String[] classificationUuid) {
95
96 ArrayList<StatisticsConfigurator> configuratorList = new ArrayList<StatisticsConfigurator>();
97
98 // 1. get types for configurators:
99 // in our case all the configurators will have the same types
100 // so we calculate the types once and save them in a helperConfigurator
101 StatisticsConfigurator helperConfigurator = new StatisticsConfigurator();
102
103 if (type != null) {
104 for (String string : type) {
105 helperConfigurator.addType(StatisticsTypeEnum.valueOf(string));
106 }
107 } else { // if nothing is chosen, count all:
108 for (StatisticsTypeEnum enumValue : StatisticsTypeEnum.values()) {
109 helperConfigurator.addType(enumValue);
110 }
111 }
112
113 // 2. determine the search areas (entire db, all classifications or
114 // specific classifications) and put
115 // each of them in a configurator:
116
117 // gather classifications from names and uuids:
118
119 Set<Classification> classificationFilters = new HashSet<Classification>();
120
121 if (classificationName != null) {
122 for (String string : classificationName) {
123 List <Classification> classifications = classificationService
124 .listByTitle(Classification.class, string,
125 MatchMode.EXACT, null, null, null, null,
126 null);
127 classificationFilters.addAll(classifications);
128
129 }
130 }
131 if (classificationUuid != null && classificationUuid.length > 0) {
132 for (String string : classificationUuid) {
133 if (classificationService.exists(UUID.fromString(string))) {
134 classificationFilters.add(classificationService.find(UUID
135 .fromString(string)));
136 }
137 }
138 }
139
140 // if no part at all was given:
141 if (part == null && classificationFilters.isEmpty()) {
142 helperConfigurator.addFilter(service.getFilterALL_DB());
143 configuratorList.add(helperConfigurator);
144 }
145
146 // else parse list of parts and create configurator for each:
147 if (part != null) {
148 helperConfigurator.addFilter(service.getFilterALL_DB());
149 for (String string : part) {
150 // System.out.println(StatisticsPartEnum.ALL.toString());
151 if (string.equals(StatisticsPartEnum.ALL.toString())) {
152 configuratorList.add(helperConfigurator);
153 } else if (string.equals(StatisticsPartEnum.CLASSIFICATION
154 .toString())) {
155 List<Classification> classificationsList = classificationService
156 .listClassifications(null, 0, null, null);
157 classificationFilters.addAll(classificationsList);
158
159 }
160 }
161 }
162 for (Classification classification : classificationFilters) {
163
164 StatisticsConfigurator newConfigurator = new StatisticsConfigurator();
165 newConfigurator.setType(helperConfigurator.getType());
166 newConfigurator.getFilter().addAll(helperConfigurator.getFilter());
167 newConfigurator.addFilter(classification);
168 configuratorList.add(newConfigurator);
169 }
170
171 return configuratorList;
172 }
173
174 }