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.RiksdagenDocumentPersonSummaryEmbeddedId;
40  import com.hack23.cia.model.internal.application.data.document.impl.ViewRiksdagenPoliticianDocumentDailySummary;
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.PersonDocumentChartDataManager;
45  import com.vaadin.ui.AbstractOrderedLayout;
46  
47  /**
48   * The Class PersonDocumentChartDataManagerImpl.
49   */
50  @Service
51  public final class PersonDocumentChartDataManagerImpl extends AbstractChartDataManagerImpl implements PersonDocumentChartDataManager {
52  
53  	private static final String DOCUMENT_HISTORY = "Document history";
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(PersonDocumentChartDataManagerImpl.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 person document chart data manager impl.
84  	 */
85  	public PersonDocumentChartDataManagerImpl() {
86  		super();
87  	}
88  
89  
90  	/**
91  	 * Gets the view riksdagen politician document daily summary map.
92  	 *
93  	 * @return the view riksdagen politician document daily summary map
94  	 */
95  	private Map<String, List<ViewRiksdagenPoliticianDocumentDailySummary>> getViewRiksdagenPoliticianDocumentDailySummaryMap() {
96  		final DataContainer<ViewRiksdagenPoliticianDocumentDailySummary, RiksdagenDocumentPersonSummaryEmbeddedId> politicianBallotSummaryDailyDataContainer = applicationManager
97  				.getDataContainer(ViewRiksdagenPoliticianDocumentDailySummary.class);
98  
99  		return politicianBallotSummaryDailyDataContainer.getAll().parallelStream().filter(Objects::nonNull)
100 				.collect(Collectors.groupingBy(t -> t.getEmbeddedId().getPersonId()));
101 	}
102 
103 
104 
105 	@Override
106 	public void createPersonDocumentHistoryChart(final AbstractOrderedLayout content,final String personId) {
107 
108 		final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DD_MMM_YYYY, Locale.ENGLISH);
109 
110 		final DataSeries dataSeries = new DataSeries();
111 
112 		final Series series = new Series();
113 
114 		final Map<String, List<ViewRiksdagenPoliticianDocumentDailySummary>> allMap = getViewRiksdagenPoliticianDocumentDailySummaryMap();
115 
116 		final List<ViewRiksdagenPoliticianDocumentDailySummary> itemList = allMap
117 				.get(personId.toUpperCase(Locale.ENGLISH).replace(UNDER_SCORE, EMPTY_STRING).trim());
118 
119 		if (itemList != null) {
120 
121 			final Map<String, List<ViewRiksdagenPoliticianDocumentDailySummary>> map = itemList.parallelStream()
122 					.filter(Objects::nonNull).collect(Collectors.groupingBy(
123 							t -> StringUtils.defaultIfBlank(t.getEmbeddedId().getDocumentType(), NO_INFO)));
124 
125 			addDocumentHistoryByPersonData(simpleDateFormat, dataSeries, series, map);
126 		}
127 
128 		addChart(content,DOCUMENT_HISTORY, new DCharts().setDataSeries(dataSeries).setOptions(chartOptions.createOptionsXYDateFloatLegendOutside(series)).show());
129 	}
130 
131 
132 	/**
133 	 * Adds the document history by person data.
134 	 *
135 	 * @param simpleDateFormat
136 	 *            the simple date format
137 	 * @param dataSeries
138 	 *            the data series
139 	 * @param series
140 	 *            the series
141 	 * @param map
142 	 *            the map
143 	 */
144 	private static void addDocumentHistoryByPersonData(final SimpleDateFormat simpleDateFormat, final DataSeries dataSeries,
145 			final Series series, final Map<String, List<ViewRiksdagenPoliticianDocumentDailySummary>> map) {
146 		for (final Entry<String, List<ViewRiksdagenPoliticianDocumentDailySummary>> entry : map.entrySet()) {
147 
148 			series.addSeries(new XYseries().setLabel(entry.getKey()));
149 
150 			dataSeries.newSeries();
151 			if (entry.getValue() != null) {
152 				for (final ViewRiksdagenPoliticianDocumentDailySummary item : entry.getValue()) {
153 					if (item != null) {
154 						dataSeries.add(simpleDateFormat.format(item.getEmbeddedId().getPublicDate()),
155 								item.getTotal());
156 					}
157 				}
158 			} else {
159 				LOGGER.info(LOG_MSG_MISSING_DATA_FOR_KEY, entry);
160 			}
161 
162 		}
163 	}
164 
165 }