DecisionChartDataManagerImpl.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.util.Calendar;
  21. import java.util.Date;
  22. import java.util.GregorianCalendar;
  23. import java.util.List;
  24. import java.util.Locale;
  25. import java.util.Map;
  26. import java.util.Map.Entry;
  27. import java.util.Objects;
  28. import java.util.stream.Collectors;

  29. import org.dussan.vaadin.dcharts.DCharts;
  30. import org.dussan.vaadin.dcharts.base.elements.XYseries;
  31. import org.dussan.vaadin.dcharts.data.DataSeries;
  32. import org.dussan.vaadin.dcharts.options.Series;
  33. import org.springframework.stereotype.Service;

  34. import com.hack23.cia.model.internal.application.data.committee.impl.RiksdagenCommitteeDecisionTypeOrgSummaryEmbeddedId;
  35. import com.hack23.cia.model.internal.application.data.committee.impl.RiksdagenCommitteeDecisionTypeSummaryEmbeddedId;
  36. import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenCommitteeDecisionTypeDailySummary;
  37. import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenCommitteeDecisionTypeOrgDailySummary;
  38. import com.hack23.cia.service.api.DataContainer;
  39. import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.DecisionChartDataManager;
  40. import com.vaadin.ui.AbstractOrderedLayout;

  41. /**
  42.  * The Class DecisionChartDataManagerImpl.
  43.  */
  44. @Service
  45. public final class DecisionChartDataManagerImpl extends AbstractChartDataManagerImpl
  46.         implements DecisionChartDataManager {

  47.     /** The Constant EMPTY_STRING. */
  48.     private static final String EMPTY_STRING = "";

  49.     /** The Constant UNDER_SCORE. */
  50.     private static final String UNDER_SCORE = "_";

  51.     /**
  52.      * Instantiates a new decision chart data manager impl.
  53.      */
  54.     public DecisionChartDataManagerImpl() {
  55.         super();
  56.     }

  57.     /**
  58.      * Adds the decision type by org data.
  59.      *
  60.      * @param dataSeries the data series
  61.      * @param series the series
  62.      * @param decisionTypeMap the decision type map
  63.      */
  64.     private static void addDecisionTypeByOrgData(final DataSeries dataSeries,
  65.             final Series series, final Map<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> decisionTypeMap) {
  66.         for (final Entry<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> decisionTypeEntry : decisionTypeMap.entrySet()) {
  67.             if (!EMPTY_STRING.equals(decisionTypeEntry.getKey())) {

  68.                 final XYseries label = new XYseries();
  69.                 label.setLabel(decisionTypeEntry.getKey());

  70.                 series.addSeries(label);

  71.                 dataSeries.newSeries();
  72.                 for (final ViewRiksdagenCommitteeDecisionTypeOrgDailySummary item : decisionTypeEntry.getValue()) {
  73.                         dataSeries.add(DateUtils.formatDate(item.getEmbeddedId().getDecisionDate()),
  74.                                 item.getTotal());
  75.                 }
  76.             }
  77.         }
  78.     }

  79.     /**
  80.      * Creates the decision type chart.
  81.      *
  82.      * @param content the content
  83.      */
  84.     @Override
  85.     public void createDecisionTypeChart(final AbstractOrderedLayout content) {
  86.         final Map<String, List<ViewRiksdagenCommitteeDecisionTypeDailySummary>> decisionTypeMap = getCommitteeDecisionTypeMap();
  87.         final DataSeries dataSeries = new DataSeries();
  88.         final Series series = new Series();
  89.         addDecisionTypeData(decisionTypeMap, dataSeries, series);
  90.         addChart(content, "Decision type daily summary",
  91.                 new DCharts().setDataSeries(dataSeries)
  92.                         .setOptions(getChartOptions().createOptionsXYDateFloatLegendInsideOneColumn(series)).show(),
  93.                 true);
  94.     }

  95.     /**
  96.      * Adds the decision type data.
  97.      *
  98.      * @param decisionTypeMap the decision type map
  99.      * @param dataSeries the data series
  100.      * @param series the series
  101.      */
  102.     private void addDecisionTypeData(final Map<String, List<ViewRiksdagenCommitteeDecisionTypeDailySummary>> decisionTypeMap,
  103.             final DataSeries dataSeries, final Series series) {
  104.         for (final Entry<String, List<ViewRiksdagenCommitteeDecisionTypeDailySummary>> decisionTypeEntry : decisionTypeMap.entrySet()) {
  105.             if (decisionTypeEntry.getKey() != null) {
  106.                 series.addSeries(new XYseries().setLabel(decisionTypeEntry.getKey()));
  107.                 dataSeries.newSeries();
  108.                 final List<ViewRiksdagenCommitteeDecisionTypeDailySummary> list = decisionTypeEntry.getValue();
  109.                 for (final ViewRiksdagenCommitteeDecisionTypeDailySummary item : list) {
  110.                     dataSeries.add(DateUtils.formatDate(item.getEmbeddedId().getDecisionDate()), item.getTotal());
  111.                 }
  112.             }
  113.         }
  114.     }

  115.     /**
  116.      * Creates the decision type chart.
  117.      *
  118.      * @param content the content
  119.      * @param org the org
  120.      */
  121.     @Override
  122.     public void createDecisionTypeChart(final AbstractOrderedLayout content, final String org) {
  123.         final DataSeries dataSeries = new DataSeries();
  124.         final Series series = new Series();
  125.         final Map<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> allMap = getCommitteeDecisionTypeOrgMap();
  126.         final List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary> itemList = allMap
  127.                 .get(org.toUpperCase(Locale.ENGLISH).replace(UNDER_SCORE, EMPTY_STRING).trim());
  128.         if (itemList != null) {
  129.             final Map<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> decisionTypeMap = itemList.parallelStream()
  130.                     .filter(t -> t != null && t.getEmbeddedId().getDecisionDate() != null)
  131.                     .collect(Collectors.groupingBy(t -> t.getEmbeddedId().getDecisionType()));
  132.             addDecisionTypeByOrgData(dataSeries, series, decisionTypeMap);
  133.         }
  134.         addChart(content, "Org Decision type daily summary",
  135.                 new DCharts().setDataSeries(dataSeries)
  136.                         .setOptions(getChartOptions().createOptionsXYDateFloatLegendInsideOneColumn(series)).show(),
  137.                 true);
  138.     }

  139.     /**
  140.      * Gets the committee decision type map.
  141.      *
  142.      * @return the committee decision type map
  143.      */
  144.     private Map<String, List<ViewRiksdagenCommitteeDecisionTypeDailySummary>> getCommitteeDecisionTypeMap() {
  145.         final DataContainer<ViewRiksdagenCommitteeDecisionTypeDailySummary, RiksdagenCommitteeDecisionTypeSummaryEmbeddedId> committeeBallotDecisionPartyDataContainer = getApplicationManager()
  146.                 .getDataContainer(ViewRiksdagenCommitteeDecisionTypeDailySummary.class);
  147.         final Date now = new Date();
  148.         final Date notBefore = new GregorianCalendar(2000, Calendar.JANUARY, 1).getTime();
  149.         return committeeBallotDecisionPartyDataContainer.getAll().parallelStream()
  150.                 .filter(t -> t != null && !t.getEmbeddedId().getDecisionDate().after(now)
  151.                         && !notBefore.after(t.getEmbeddedId().getDecisionDate()))
  152.                 .collect(Collectors.groupingBy(t -> t.getEmbeddedId().getDecisionType()));
  153.     }

  154.     /**
  155.      * Gets the committee decision type org map.
  156.      *
  157.      * @return the committee decision type org map
  158.      */
  159.     private Map<String, List<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary>> getCommitteeDecisionTypeOrgMap() {
  160.         final DataContainer<ViewRiksdagenCommitteeDecisionTypeOrgDailySummary, RiksdagenCommitteeDecisionTypeOrgSummaryEmbeddedId> committeeBallotDecisionPartyDataContainer = getApplicationManager()
  161.                 .getDataContainer(ViewRiksdagenCommitteeDecisionTypeOrgDailySummary.class);
  162.         return committeeBallotDecisionPartyDataContainer.getAll().parallelStream().filter(Objects::nonNull)
  163.                 .collect(Collectors.groupingBy(t -> t.getEmbeddedId().getOrg()));
  164.     }

  165. }