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.List;
23  import java.util.Locale;
24  import java.util.Map;
25  import java.util.Map.Entry;
26  import java.util.Objects;
27  import java.util.stream.Collectors;
28  
29  import org.apache.commons.lang.StringUtils;
30  import org.dussan.vaadin.dcharts.DCharts;
31  import org.dussan.vaadin.dcharts.base.elements.XYseries;
32  import org.dussan.vaadin.dcharts.data.DataSeries;
33  import org.dussan.vaadin.dcharts.options.Series;
34  import org.slf4j.Logger;
35  import org.slf4j.LoggerFactory;
36  import org.springframework.beans.factory.annotation.Autowired;
37  import org.springframework.stereotype.Service;
38  
39  import com.hack23.cia.model.internal.application.data.document.impl.RiksdagenDocumentPartySummaryEmbeddedId;
40  import com.hack23.cia.model.internal.application.data.document.impl.ViewRiksdagenPartyDocumentDailySummary;
41  import com.hack23.cia.service.api.ApplicationManager;
42  import com.hack23.cia.service.api.DataContainer;
43  import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.ChartOptions;
44  import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.PartyDocumentChartDataManager;
45  import com.vaadin.ui.AbstractOrderedLayout;
46  
47  /**
48   * The Class PartyDocumentChartDataManagerImpl.
49   */
50  @Service
51  public final class PartyDocumentChartDataManagerImpl extends AbstractChartDataManagerImpl implements PartyDocumentChartDataManager {
52  
53  	private static final String DOCUMENT_HISTORY_PARTY = "Document history party";
54  
55  	/** The Constant NO_INFO. */
56  	private static final String NO_INFO = "NoInfo";
57  
58  	/** The Constant LOG_MSG_MISSING_DATA_FOR_KEY. */
59  	private static final String LOG_MSG_MISSING_DATA_FOR_KEY = "missing data for key:{}";
60  
61  	/** The Constant EMPTY_STRING. */
62  	private static final String EMPTY_STRING = "";
63  
64  	/** The Constant UNDER_SCORE. */
65  	private static final String UNDER_SCORE = "_";
66  
67  	/** The Constant LOGGER. */
68  	private static final Logger LOGGER = LoggerFactory.getLogger(PartyDocumentChartDataManagerImpl.class);
69  
70  	/** The Constant DD_MMM_YYYY. */
71  	private static final String DD_MMM_YYYY = "dd-MMM-yyyy";
72  
73  	/** The application manager. */
74  	@Autowired
75  	private ApplicationManager applicationManager;
76  
77  	/** The chart options. */
78  	@Autowired
79  	private ChartOptions chartOptions;
80  
81  
82  	/**
83  	 * Instantiates a new party document chart data manager impl.
84  	 */
85  	public PartyDocumentChartDataManagerImpl() {
86  		super();
87  	}
88  
89  
90  	/**
91  	 * Gets the view riksdagen party document daily summary map.
92  	 *
93  	 * @return the view riksdagen party document daily summary map
94  	 */
95  	private Map<String, List<ViewRiksdagenPartyDocumentDailySummary>> getViewRiksdagenPartyDocumentDailySummaryMap() {
96  		final DataContainer<ViewRiksdagenPartyDocumentDailySummary, RiksdagenDocumentPartySummaryEmbeddedId> politicianBallotSummaryDailyDataContainer = applicationManager
97  				.getDataContainer(ViewRiksdagenPartyDocumentDailySummary.class);
98  
99  		return politicianBallotSummaryDailyDataContainer.getAll().parallelStream().filter(Objects::nonNull)
100 				.collect(Collectors.groupingBy(t -> t.getEmbeddedId().getPartyShortCode().toUpperCase(Locale.ENGLISH).replace(UNDER_SCORE, EMPTY_STRING).trim()));
101 	}
102 
103 
104 	@Override
105 	public void createDocumentHistoryPartyChart(final AbstractOrderedLayout content,final String org) {
106 		final DataSeries dataSeries = new DataSeries();
107 		final Series series = new Series();
108 
109 		final Map<String, List<ViewRiksdagenPartyDocumentDailySummary>> allMap = getViewRiksdagenPartyDocumentDailySummaryMap();
110 
111 		final List<ViewRiksdagenPartyDocumentDailySummary> itemList = allMap
112 				.get(org.toUpperCase(Locale.ENGLISH).replace(UNDER_SCORE, EMPTY_STRING).trim());
113 
114 		if (itemList != null) {
115 
116 			final Map<String, List<ViewRiksdagenPartyDocumentDailySummary>> map = itemList.parallelStream()
117 					.filter(Objects::nonNull).collect(Collectors.groupingBy(
118 							t -> StringUtils.defaultIfBlank(t.getEmbeddedId().getDocumentType(), NO_INFO)));
119 
120 			addDocumentHistoryByPartyData(dataSeries, series, map);
121 		}
122 
123 		addChart(content, DOCUMENT_HISTORY_PARTY,new DCharts().setDataSeries(dataSeries).setOptions(chartOptions.createOptionsXYDateFloatLegendOutside(series)).show());
124 	}
125 
126 
127 	/**
128 	 * Adds the document history by party data.
129 	 *
130 	 * @param dataSeries
131 	 *            the data series
132 	 * @param series
133 	 *            the series
134 	 * @param map
135 	 *            the map
136 	 */
137 	private static void addDocumentHistoryByPartyData(final DataSeries dataSeries, final Series series,
138 			final Map<String, List<ViewRiksdagenPartyDocumentDailySummary>> map) {
139 		final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DD_MMM_YYYY, Locale.ENGLISH);
140 
141 		for (final Entry<String, List<ViewRiksdagenPartyDocumentDailySummary>> entry : map.entrySet()) {
142 
143 			series.addSeries(new XYseries().setLabel(entry.getKey()));
144 
145 			dataSeries.newSeries();
146 			if (entry.getValue() != null) {
147 				for (final ViewRiksdagenPartyDocumentDailySummary item : entry.getValue()) {
148 					if (item != null) {
149 						dataSeries.add(simpleDateFormat.format(item.getEmbeddedId().getPublicDate()), item.getTotal());
150 					}
151 				}
152 			} else {
153 				LOGGER.info(LOG_MSG_MISSING_DATA_FOR_KEY, entry);
154 			}
155 
156 		}
157 	}
158 
159 }