View Javadoc
1   /*
2    * Copyright 2014 James Pether Sörling
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   *
16   *	$Id$
17   *  $HeadURL$
18   */
19  package com.hack23.cia.web.impl.ui.application.views.common.chartfactory.impl;
20  
21  import java.text.SimpleDateFormat;
22  import java.util.Calendar;
23  import java.util.Date;
24  import java.util.GregorianCalendar;
25  import java.util.List;
26  import java.util.Locale;
27  import java.util.Map;
28  import java.util.Map.Entry;
29  import java.util.Objects;
30  import java.util.stream.Collectors;
31  
32  import org.dussan.vaadin.dcharts.DCharts;
33  import org.dussan.vaadin.dcharts.base.elements.XYseries;
34  import org.dussan.vaadin.dcharts.data.DataSeries;
35  import org.dussan.vaadin.dcharts.options.Series;
36  import org.springframework.beans.factory.annotation.Autowired;
37  import org.springframework.stereotype.Service;
38  
39  import com.hack23.cia.model.internal.application.data.committee.impl.RiksdagenCommitteeDecisionTypeOrgSummaryEmbeddedId;
40  import com.hack23.cia.model.internal.application.data.committee.impl.RiksdagenCommitteeDecisionTypeSummaryEmbeddedId;
41  import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenCommitteeDecisionTypeDailySummary;
42  import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenCommitteeDecisionTypeOrgDailySummary;
43  import com.hack23.cia.service.api.ApplicationManager;
44  import com.hack23.cia.service.api.DataContainer;
45  import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.ChartOptions;
46  import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.DecisionChartDataManager;
47  import com.vaadin.ui.AbstractOrderedLayout;
48  
49  /**
50   * The Class DecisionChartDataManagerImpl.
51   */
52  @Service
53  public final class DecisionChartDataManagerImpl extends AbstractChartDataManagerImpl implements DecisionChartDataManager {
54  
55  	/** The Constant EMPTY_STRING. */
56  	private static final String EMPTY_STRING = "";
57  
58  	/** The Constant UNDER_SCORE. */
59  	private static final String UNDER_SCORE = "_";
60  
61  	/** The Constant DD_MMM_YYYY. */
62  	private static final String DD_MMM_YYYY = "dd-MMM-yyyy";
63  
64  	/** The application manager. */
65  	@Autowired
66  	private ApplicationManager applicationManager;
67  
68  	/** The chart options. */
69  	@Autowired
70  	private ChartOptions chartOptions;
71  
72  
73  	/**
74  	 * Instantiates a new decision chart data manager impl.
75  	 */
76  	public DecisionChartDataManagerImpl() {
77  		super();
78  	}
79  
80  
81  	/**
82  	 * Gets the committee decision type map.
83  	 *
84  	 * @return the committee decision type map
85  	 */
86  	private Map<String, List<ViewRiksdagenCommitteeDecisionTypeDailySummary>> getCommitteeDecisionTypeMap() {
87  		final DataContainer<ViewRiksdagenCommitteeDecisionTypeDailySummary, RiksdagenCommitteeDecisionTypeSummaryEmbeddedId> committeeBallotDecisionPartyDataContainer = applicationManager
88  				.getDataContainer(ViewRiksdagenCommitteeDecisionTypeDailySummary.class);
89  
90  		final Date now = new Date();
91  		final Date notBefore = new GregorianCalendar(2000, Calendar.JANUARY, 1).getTime();
92  		return committeeBallotDecisionPartyDataContainer.getAll().parallelStream()
93  				.filter(t -> t != null && !t.getEmbeddedId().getDecisionDate().after(now)
94  						&& !notBefore.after(t.getEmbeddedId().getDecisionDate()))
95  				.collect(Collectors.groupingBy(t -> t.getEmbeddedId().getDecisionType()));
96  	}
97  
98  
99  	/**
100 	 * Gets the committee decision type org map.
101 	 *
102 	 * @return the committee decision type org map
103 	 */
104 	private Map<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> getCommitteeDecisionTypeOrgMap() {
105 		final DataContainer<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary, RiksdagenCommitteeDecisionTypeOrgSummaryEmbeddedId> committeeBallotDecisionPartyDataContainer = applicationManager
106 				.getDataContainer(ViewRiksdagenCommitteeDecisionTypeOrgDailySummary.class);
107 
108 		return committeeBallotDecisionPartyDataContainer.getAll().parallelStream()
109 				.filter(Objects::nonNull).collect(Collectors.groupingBy(t -> t.getEmbeddedId().getOrg()));
110 	}
111 
112 
113 	@Override
114 	public void createDecisionTypeChart(final AbstractOrderedLayout content) {
115 
116 		final Map<String, List<ViewRiksdagenCommitteeDecisionTypeDailySummary>> map = getCommitteeDecisionTypeMap();
117 
118 		final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DD_MMM_YYYY, Locale.ENGLISH);
119 
120 		final DataSeries dataSeries = new DataSeries();
121 
122 		final Series series = new Series();
123 
124 		for (final Entry<String, List<ViewRiksdagenCommitteeDecisionTypeDailySummary>> entry : map.entrySet()) {
125 
126 			if (entry.getKey() != null) {
127 				series.addSeries(new XYseries().setLabel(entry.getKey()));
128 
129 				dataSeries.newSeries();
130 				final List<ViewRiksdagenCommitteeDecisionTypeDailySummary> list = entry.getValue();
131 				for (final ViewRiksdagenCommitteeDecisionTypeDailySummary item : list) {
132 					if (item != null) {
133 						dataSeries.add(simpleDateFormat.format(item.getEmbeddedId().getDecisionDate()),
134 								item.getTotal());
135 					}
136 				}
137 			}
138 
139 		}
140 
141 		addChart(content,"Decision type daily summary", new DCharts().setDataSeries(dataSeries).setOptions(chartOptions.createOptionsXYDateFloatLegendOutside(series)).show());
142 	}
143 
144 
145 	@Override
146 	public void createDecisionTypeChart(final AbstractOrderedLayout content,final String org) {
147 
148 		final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DD_MMM_YYYY, Locale.ENGLISH);
149 
150 		final DataSeries dataSeries = new DataSeries();
151 		final Series series = new Series();
152 
153 		final Map<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> allMap = getCommitteeDecisionTypeOrgMap();
154 
155 		final List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary> itemList = allMap
156 				.get(org.toUpperCase(Locale.ENGLISH).replace(UNDER_SCORE, EMPTY_STRING).trim());
157 
158 		if (itemList != null) {
159 
160 			final Map<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> map = itemList.parallelStream()
161 					.filter(t -> t != null && t.getEmbeddedId().getDecisionDate() != null)
162 					.collect(Collectors.groupingBy(t -> t.getEmbeddedId().getDecisionType()));
163 
164 			addDecisionTypeByOrgData(simpleDateFormat, dataSeries, series, map);
165 		}
166 
167 		addChart(content,"Org Decision type daily summary", new DCharts().setDataSeries(dataSeries).setOptions(chartOptions.createOptionsXYDateFloatLegendOutside(series)).show());
168 	}
169 
170 
171 	/**
172 	 * Adds the decision type by org data.
173 	 *
174 	 * @param simpleDateFormat
175 	 *            the simple date format
176 	 * @param dataSeries
177 	 *            the data series
178 	 * @param series
179 	 *            the series
180 	 * @param map
181 	 *            the map
182 	 */
183 	private static void addDecisionTypeByOrgData(final SimpleDateFormat simpleDateFormat, final DataSeries dataSeries,
184 			final Series series, final Map<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> map) {
185 		for (final Entry<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> entry : map.entrySet()) {
186 			if (!EMPTY_STRING.equals(entry.getKey())) {
187 
188 				final XYseries label = new XYseries();
189 				label.setLabel(entry.getKey());
190 
191 				series.addSeries(label);
192 
193 				dataSeries.newSeries();
194 				for (final ViewRiksdagenCommitteeDecisionTypeOrgDailySummary item : entry.getValue()) {
195 					if (item != null) {
196 						dataSeries.add(simpleDateFormat.format(item.getEmbeddedId().getDecisionDate()),
197 								item.getTotal());
198 					}
199 				}
200 			}
201 		}
202 	}
203 
204 }