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.util.List;
22  import java.util.Locale;
23  import java.util.Map;
24  import java.util.Map.Entry;
25  import java.util.Objects;
26  import java.util.stream.Collectors;
27  
28  import org.apache.commons.lang.StringUtils;
29  import org.apache.commons.lang3.StringEscapeUtils;
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.RiksdagenDocumentOrgSummaryEmbeddedId;
40  import com.hack23.cia.model.internal.application.data.document.impl.ViewRiksdagenOrgDocumentDailySummary;
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.OrgDocumentChartDataManager;
45  import com.vaadin.ui.AbstractOrderedLayout;
46  
47  /**
48   * The Class OrgDocumentChartDataManagerImpl.
49   */
50  @Service
51  public final class OrgDocumentChartDataManagerImpl extends AbstractChartDataManagerImpl implements OrgDocumentChartDataManager {
52  
53  	private static final String DOCUMENT_HISTORY_BY_ORG = "Document History by Org";
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 YEAR_PREFIX. */
62  	private static final String YEAR_PREFIX = "19";
63  
64  	/** The Constant MINUS_SIGN. */
65  	private static final String MINUS_SIGN = "-";
66  
67  	/** The Constant EMPTY_STRING. */
68  	private static final String EMPTY_STRING = "";
69  
70  	/** The Constant UNDER_SCORE. */
71  	private static final String UNDER_SCORE = "_";
72  
73  	/** The Constant LOGGER. */
74  	private static final Logger LOGGER = LoggerFactory.getLogger(OrgDocumentChartDataManagerImpl.class);
75  
76  	/** The application manager. */
77  	@Autowired
78  	private ApplicationManager applicationManager;
79  
80  	/** The chart options. */
81  	@Autowired
82  	private ChartOptions chartOptions;
83  
84  
85  	/**
86  	 * Instantiates a new org document chart data manager impl.
87  	 */
88  	public OrgDocumentChartDataManagerImpl() {
89  		super();
90  	}
91  
92  
93  	/**
94  	 * Gets the view riksdagen org document daily summary map.
95  	 *
96  	 * @return the view riksdagen org document daily summary map
97  	 */
98  	private Map<String, List<ViewRiksdagenOrgDocumentDailySummary>> getViewRiksdagenOrgDocumentDailySummaryMap() {
99  		final DataContainer<ViewRiksdagenOrgDocumentDailySummary, RiksdagenDocumentOrgSummaryEmbeddedId> politicianBallotSummaryDailyDataContainer = applicationManager
100 				.getDataContainer(ViewRiksdagenOrgDocumentDailySummary.class);
101 
102 		return politicianBallotSummaryDailyDataContainer.getAll().parallelStream()
103 				.filter(t -> t != null && !t.getEmbeddedId().getPublicDate().startsWith(YEAR_PREFIX))
104 				.collect(Collectors.groupingBy(t -> StringEscapeUtils.unescapeHtml4(t.getEmbeddedId().getOrg()).toUpperCase(Locale.ENGLISH).replace(UNDER_SCORE, EMPTY_STRING).replace(MINUS_SIGN, EMPTY_STRING).trim()));
105 	}
106 
107 
108 	@Override
109 	public void createDocumentHistoryChartByOrg(final AbstractOrderedLayout content,final String org) {
110 		final String searchOrg = org.toUpperCase(Locale.ENGLISH).replace(UNDER_SCORE, EMPTY_STRING).replace(MINUS_SIGN, EMPTY_STRING).trim();
111 
112 		final DataSeries dataSeries = new DataSeries();
113 
114 		final Series series = new Series();
115 
116 		final Map<String, List<ViewRiksdagenOrgDocumentDailySummary>> allMap = getViewRiksdagenOrgDocumentDailySummaryMap();
117 
118 		final List<ViewRiksdagenOrgDocumentDailySummary> itemList = allMap
119 				.get(searchOrg);
120 
121 		if (itemList != null) {
122 
123 			addDocumentHistoryByOrgData(dataSeries, series, itemList);
124 		}
125 
126 		addChart(content,DOCUMENT_HISTORY_BY_ORG, new DCharts().setDataSeries(dataSeries).setOptions(chartOptions.createOptionsXYDateFloatLegendOutside(series)).show());
127 	}
128 
129 
130 	/**
131 	 * Adds the document history by org data.
132 	 *
133 	 * @param dataSeries
134 	 *            the data series
135 	 * @param series
136 	 *            the series
137 	 * @param itemList
138 	 *            the item list
139 	 */
140 	private static void addDocumentHistoryByOrgData(final DataSeries dataSeries, final Series series,
141 			final List<ViewRiksdagenOrgDocumentDailySummary> itemList) {
142 		final Map<String, List<ViewRiksdagenOrgDocumentDailySummary>> map = itemList.parallelStream()
143 				.filter(Objects::nonNull)
144 				.collect(Collectors.groupingBy(t -> StringUtils.defaultIfBlank(t.getDocumentType(), NO_INFO)));
145 
146 		for (final Entry<String, List<ViewRiksdagenOrgDocumentDailySummary>> entry : map.entrySet()) {
147 
148 			series.addSeries(new XYseries().setLabel(entry.getKey()));
149 
150 			dataSeries.newSeries();
151 			if (entry.getValue() != null) {
152 				for (final ViewRiksdagenOrgDocumentDailySummary item : entry.getValue()) {
153 					if (item != null) {
154 						dataSeries.add(item.getEmbeddedId().getPublicDate(), item.getTotal());
155 					}
156 				}
157 			} else {
158 				LOGGER.info(LOG_MSG_MISSING_DATA_FOR_KEY, entry);
159 			}
160 
161 		}
162 	}
163 
164 }