OrgDocumentChartDataManagerImpl.java

  1. /*
  2.  * Copyright 2010-2025 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.     /** The Constant DD_MMM_YYYY. */
  49.     private static final String DD_MMM_YYYY = "dd-MMM-yyyy";

  50.     /** The Constant DOCUMENT_HISTORY_BY_ORG. */
  51.     private static final String DOCUMENT_HISTORY_BY_ORG = "Document History by Org";

  52.     /** The Constant EMPTY_STRING. */
  53.     private static final String EMPTY_STRING = "";

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

  56.     /** The Constant MINUS_SIGN. */
  57.     private static final String MINUS_SIGN = "-";

  58.     /** The Constant NO_INFO. */
  59.     private static final String NO_INFO = "NoInfo";

  60.     /** The Constant UNDER_SCORE. */
  61.     private static final String UNDER_SCORE = "_";

  62.     /** The Constant YEAR_PREFIX. */
  63.     private static final String YEAR_PREFIX = "19";

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

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

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

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

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

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

  124.         series.addSeries(new XYseries().setLabel(entry.getKey()));
  125.         dataSeries.newSeries();

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

  132.     /**
  133.      * Creates the document history chart by org.
  134.      *
  135.      * @param content the content
  136.      * @param org the org
  137.      */
  138.     @Override
  139.     public void createDocumentHistoryChartByOrg(final AbstractOrderedLayout content, final String org) {
  140.         final String searchOrg = org.toUpperCase(Locale.ENGLISH).replace(UNDER_SCORE, EMPTY_STRING)
  141.                 .replace(MINUS_SIGN, EMPTY_STRING).trim();

  142.         final DataSeries dataSeries = new DataSeries();
  143.         final Series series = new Series();

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

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

  146.         if (itemList != null) {
  147.             addDocumentHistoryByOrgData(dataSeries, series, itemList);
  148.         }

  149.         addChart(content, DOCUMENT_HISTORY_BY_ORG,
  150.                 new DCharts().setDataSeries(dataSeries)
  151.                         .setOptions(getChartOptions().createOptionsXYDateFloatLegendInsideOneColumn(series)).show(),
  152.                 true);
  153.     }

  154.     /**
  155.      * Gets the view riksdagen org document daily summary map.
  156.      *
  157.      * @return the view riksdagen org document daily summary map
  158.      */
  159.     private Map<String, List<ViewRiksdagenOrgDocumentDailySummary>> getViewRiksdagenOrgDocumentDailySummaryMap() {
  160.         final DataContainer<ViewRiksdagenOrgDocumentDailySummary, RiksdagenDocumentOrgSummaryEmbeddedId> politicianBallotSummaryDailyDataContainer = getApplicationManager()
  161.                 .getDataContainer(ViewRiksdagenOrgDocumentDailySummary.class);

  162.         return politicianBallotSummaryDailyDataContainer.getAll().parallelStream()
  163.                 .filter(t -> t != null && !t.getEmbeddedId().getPublicDate().startsWith(YEAR_PREFIX))
  164.                 .collect(Collectors.groupingBy(
  165.                         t -> StringEscapeUtils.unescapeHtml4(t.getEmbeddedId().getOrg()).toUpperCase(Locale.ENGLISH)
  166.                                 .replace(UNDER_SCORE, EMPTY_STRING).replace(MINUS_SIGN, EMPTY_STRING).trim()));
  167.     }

  168. }