OrgDocumentChartDataManagerImpl.java

  1. /*
  2.  * Copyright 2010-2024 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. import java.text.ParseException;
  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. import org.apache.commons.lang3.StringUtils;
  29. import org.apache.commons.text.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.stereotype.Service;

  37. import com.hack23.cia.model.internal.application.data.document.impl.RiksdagenDocumentOrgSummaryEmbeddedId;
  38. import com.hack23.cia.model.internal.application.data.document.impl.ViewRiksdagenOrgDocumentDailySummary;
  39. import com.hack23.cia.service.api.DataContainer;
  40. import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.OrgDocumentChartDataManager;
  41. import com.vaadin.ui.AbstractOrderedLayout;

  42. /**
  43.  * The Class OrgDocumentChartDataManagerImpl.
  44.  */
  45. @Service
  46. public final class OrgDocumentChartDataManagerImpl extends AbstractChartDataManagerImpl
  47.         implements OrgDocumentChartDataManager {

  48.     private static final String DD_MMM_YYYY = "dd-MMM-yyyy";

  49.     private static final String DOCUMENT_HISTORY_BY_ORG = "Document History by Org";

  50.     /** The Constant EMPTY_STRING. */
  51.     private static final String EMPTY_STRING = "";

  52.     /** The Constant LOGGER. */
  53.     private static final Logger LOGGER = LoggerFactory.getLogger(OrgDocumentChartDataManagerImpl.class);

  54.     /** The Constant MINUS_SIGN. */
  55.     private static final String MINUS_SIGN = "-";

  56.     /** The Constant NO_INFO. */
  57.     private static final String NO_INFO = "NoInfo";

  58.     /** The Constant UNDER_SCORE. */
  59.     private static final String UNDER_SCORE = "_";

  60.     /** The Constant YEAR_PREFIX. */
  61.     private static final String YEAR_PREFIX = "19";

  62.     /**
  63.      * Instantiates a new org document chart data manager impl.
  64.      */
  65.     public OrgDocumentChartDataManagerImpl() {
  66.         super();
  67.     }

  68.     /**
  69.      * Adds the data item.
  70.      *
  71.      * @param dataSeries              the data series
  72.      * @param simpleDateFormat        the simple date format
  73.      * @param parseIncomingDateFormat the parse incoming date format
  74.      * @param item                    the item
  75.      */
  76.     private static void addDataItem(final DataSeries dataSeries, final SimpleDateFormat simpleDateFormat,
  77.             final SimpleDateFormat parseIncomingDateFormat, final ViewRiksdagenOrgDocumentDailySummary item) {
  78.         if (item != null && item.getEmbeddedId().getPublicDate().length() > 0) {

  79.             try {
  80.                 dataSeries.add(
  81.                         simpleDateFormat
  82.                                 .format(parseIncomingDateFormat.parse(item.getEmbeddedId().getPublicDate())),
  83.                         item.getTotal());
  84.             } catch (final ParseException e) {
  85.                 LOGGER.warn("Problem parsing date:{}", item.getEmbeddedId().getPublicDate());
  86.             }
  87.         }
  88.     }

  89.     /**
  90.      * Adds the document history by org data.
  91.      *
  92.      * @param dataSeries
  93.      *            the data series
  94.      * @param series
  95.      *            the series
  96.      * @param itemList
  97.      *            the item list
  98.      */
  99.     private static void addDocumentHistoryByOrgData(final DataSeries dataSeries, final Series series,
  100.             final List<ViewRiksdagenOrgDocumentDailySummary> itemList) {
  101.         final Map<String, List<ViewRiksdagenOrgDocumentDailySummary>> map = itemList.parallelStream()
  102.                 .filter(Objects::nonNull)
  103.                 .collect(Collectors.groupingBy(t -> StringUtils.defaultIfBlank(t.getDocumentType(), NO_INFO)));
  104.         final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DD_MMM_YYYY, Locale.ENGLISH);
  105.         final SimpleDateFormat parseIncomingDateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.ENGLISH);

  106.         for (final Entry<String, List<ViewRiksdagenOrgDocumentDailySummary>> entry : map.entrySet()) {
  107.             addNewDataSerie(dataSeries, series, simpleDateFormat, parseIncomingDateFormat, entry);
  108.         }
  109.     }

  110.     /**
  111.      * Adds the new data serie.
  112.      *
  113.      * @param dataSeries              the data series
  114.      * @param series                  the series
  115.      * @param simpleDateFormat        the simple date format
  116.      * @param parseIncomingDateFormat the parse incoming date format
  117.      * @param entry                   the entry
  118.      */
  119.     private static void addNewDataSerie(final DataSeries dataSeries, final Series series,
  120.             final SimpleDateFormat simpleDateFormat, final SimpleDateFormat parseIncomingDateFormat,
  121.             final Entry<String, List<ViewRiksdagenOrgDocumentDailySummary>> entry) {

  122.         series.addSeries(new XYseries().setLabel(entry.getKey()));
  123.         dataSeries.newSeries();

  124.         if (entry.getValue() != null) {
  125.             for (final ViewRiksdagenOrgDocumentDailySummary item : entry.getValue()) {
  126.                 addDataItem(dataSeries, simpleDateFormat, parseIncomingDateFormat, item);
  127.             }
  128.         }
  129.     }

  130.     @Override
  131.     public void createDocumentHistoryChartByOrg(final AbstractOrderedLayout content, final String org) {
  132.         final String searchOrg = org.toUpperCase(Locale.ENGLISH).replace(UNDER_SCORE, EMPTY_STRING)
  133.                 .replace(MINUS_SIGN, EMPTY_STRING).trim();

  134.         final DataSeries dataSeries = new DataSeries();
  135.         final Series series = new Series();

  136.         final Map<String, List<ViewRiksdagenOrgDocumentDailySummary>> allMap = getViewRiksdagenOrgDocumentDailySummaryMap();

  137.         final List<ViewRiksdagenOrgDocumentDailySummary> itemList = allMap.get(searchOrg);

  138.         if (itemList != null) {
  139.             addDocumentHistoryByOrgData(dataSeries, series, itemList);
  140.         }

  141.         addChart(content, DOCUMENT_HISTORY_BY_ORG,
  142.                 new DCharts().setDataSeries(dataSeries)
  143.                         .setOptions(getChartOptions().createOptionsXYDateFloatLegendInsideOneColumn(series)).show(),
  144.                 true);
  145.     }

  146.     /**
  147.      * Gets the view riksdagen org document daily summary map.
  148.      *
  149.      * @return the view riksdagen org document daily summary map
  150.      */
  151.     private Map<String, List<ViewRiksdagenOrgDocumentDailySummary>> getViewRiksdagenOrgDocumentDailySummaryMap() {
  152.         final DataContainer<ViewRiksdagenOrgDocumentDailySummary, RiksdagenDocumentOrgSummaryEmbeddedId> politicianBallotSummaryDailyDataContainer = getApplicationManager()
  153.                 .getDataContainer(ViewRiksdagenOrgDocumentDailySummary.class);

  154.         return politicianBallotSummaryDailyDataContainer.getAll().parallelStream()
  155.                 .filter(t -> t != null && !t.getEmbeddedId().getPublicDate().startsWith(YEAR_PREFIX))
  156.                 .collect(Collectors.groupingBy(
  157.                         t -> StringEscapeUtils.unescapeHtml4(t.getEmbeddedId().getOrg()).toUpperCase(Locale.ENGLISH)
  158.                                 .replace(UNDER_SCORE, EMPTY_STRING).replace(MINUS_SIGN, EMPTY_STRING).trim()));
  159.     }

  160. }