AdminChartDataManagerImpl.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.io.Serializable;
  21. import java.util.List;
  22. import java.util.Map;
  23. import java.util.Map.Entry;
  24. import java.util.Objects;
  25. import java.util.function.ToLongFunction;
  26. import java.util.stream.Collectors;

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

  32. import com.hack23.cia.model.internal.application.data.impl.ApplicationActionEventPageElementPeriodSummaryEmbeddedId;
  33. import com.hack23.cia.model.internal.application.data.impl.ApplicationActionEventPageElementPeriodSummaryEmbeddedId_;
  34. import com.hack23.cia.model.internal.application.data.impl.ApplicationActionEventPageModePeriodSummaryEmbeddedId;
  35. import com.hack23.cia.model.internal.application.data.impl.ApplicationActionEventPageModePeriodSummaryEmbeddedId_;
  36. import com.hack23.cia.model.internal.application.data.impl.ApplicationActionEventPagePeriodSummaryEmbeddedId;
  37. import com.hack23.cia.model.internal.application.data.impl.ViewApplicationActionEventPageDailySummary;
  38. import com.hack23.cia.model.internal.application.data.impl.ViewApplicationActionEventPageElementDailySummary;
  39. import com.hack23.cia.model.internal.application.data.impl.ViewApplicationActionEventPageElementDailySummary_;
  40. import com.hack23.cia.model.internal.application.data.impl.ViewApplicationActionEventPageModeDailySummary;
  41. import com.hack23.cia.model.internal.application.data.impl.ViewApplicationActionEventPageModeDailySummary_;
  42. import com.hack23.cia.model.internal.application.system.impl.ApplicationSession;
  43. import com.hack23.cia.service.api.DataContainer;
  44. import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.AdminChartDataManager;
  45. import com.vaadin.ui.AbstractOrderedLayout;
  46. import com.vaadin.ui.VerticalLayout;

  47. /**
  48.  * The Class ChartDataManagerImpl.
  49.  */
  50. @Service
  51. public final class AdminChartDataManagerImpl extends AbstractChartDataManagerImpl implements AdminChartDataManager {

  52.     /** The Constant PAGE_HITS. */
  53.     private static final String PAGE_HITS = "Page Hits";

  54.     /** The Constant PAGE_RANK. */
  55.     private static final String PAGE_RANK = "Page Rank";

  56.     /**
  57.      * Instantiates a new admin chart data manager impl.
  58.      */
  59.     public AdminChartDataManagerImpl() {
  60.         super();
  61.     }

  62.     /**
  63.      * Adds the view application action event page element daily summary values.
  64.      *
  65.      * @param label the label
  66.      * @param series the series
  67.      * @param dailySummaries the dailySummaries
  68.      * @param dataSeries the data series
  69.      * @param t the t
  70.      */
  71.     private static void addViewApplicationActionEventPageElementDailySummaryValues(final String label,
  72.             final Series series, final List<ViewApplicationActionEventPageElementDailySummary> dailySummaries,
  73.             final DataSeries dataSeries,
  74.             final ToLongFunction<ViewApplicationActionEventPageElementDailySummary> t) {
  75.         series.addSeries(new XYseries().setLabel(label));
  76.         dataSeries.newSeries();

  77.         for (final ViewApplicationActionEventPageElementDailySummary summary : dailySummaries) {
  78.             dataSeries.add(DateUtils.formatDate(summary.getEmbeddedId().getCreatedDate()), t.applyAsLong(summary));
  79.         }
  80.     }

  81.     /**
  82.      * Creates the application action event page daily summary chart.
  83.      *
  84.      * @param layout the layout
  85.      */
  86.     @Override
  87.     public void createApplicationActionEventPageDailySummaryChart(final AbstractOrderedLayout layout) {

  88.         final Map<String, List<ViewApplicationActionEventPageDailySummary>> map = getApplicationActionEventPageDailySummaryMap();

  89.         final DataSeries dataSeries = new DataSeries();

  90.         final Series series = new Series();

  91.         for (final Entry<String, List<ViewApplicationActionEventPageDailySummary>> entry : map.entrySet()) {

  92.             if (entry.getKey() != null) {
  93.                 series.addSeries(new XYseries().setLabel(entry.getKey()));

  94.                 dataSeries.newSeries();
  95.                 final List<ViewApplicationActionEventPageDailySummary> list = entry.getValue();
  96.                 for (final ViewApplicationActionEventPageDailySummary dataSummaryDaily : list) {
  97.                     dataSeries.add(
  98.                             DateUtils.formatDate(
  99.                                     dataSummaryDaily.getEmbeddedId().getCreatedDate()),
  100.                             dataSummaryDaily.getHits());
  101.                 }
  102.             }

  103.         }

  104.         ChartUtils.addChart(layout, "Application Action Events daily Summary",
  105.                 new DCharts().setDataSeries(dataSeries)
  106.                         .setOptions(getChartOptions().createOptionsXYDateFloatLogYAxisLegendOutside(series)).show(),
  107.                 true);
  108.     }

  109.     /**
  110.      * Creates the application action event page element daily summary chart.
  111.      *
  112.      * @param layout the layout
  113.      * @param page the page
  114.      * @param elementId the element id
  115.      */
  116.     @Override
  117.     public void createApplicationActionEventPageElementDailySummaryChart(final AbstractOrderedLayout layout,
  118.             final String page, final String elementId) {
  119.         final List<ViewApplicationActionEventPageElementDailySummary> dailySummaries = getApplicationActionEventPageElementDailySummaryList(
  120.                 page, elementId);

  121.         final Series series = new Series();
  122.         final DataSeries dataSeries = new DataSeries();

  123.         addViewApplicationActionEventPageElementDailySummaryValues(PAGE_HITS, series, dailySummaries, dataSeries,
  124.                 ViewApplicationActionEventPageElementDailySummary::getHits);
  125.         addViewApplicationActionEventPageElementDailySummaryValues(PAGE_RANK, series, dailySummaries, dataSeries,
  126.                 ViewApplicationActionEventPageElementDailySummary::getRank);

  127.         ChartUtils.addChart(layout, "Page element Action Events daily Summary",
  128.                 new DCharts().setDataSeries(dataSeries)
  129.                         .setOptions(getChartOptions().createOptionsXYDateFloatLogYAxisLegendOutside(series)).show(),
  130.                 true);
  131.     }

  132.     /**
  133.      * Creates the application action event page mode daily summary chart.
  134.      *
  135.      * @param layout the layout
  136.      * @param page the page
  137.      */
  138.     @Override
  139.     public void createApplicationActionEventPageModeDailySummaryChart(final AbstractOrderedLayout layout,
  140.             final String page) {

  141.         final Map<String, List<ViewApplicationActionEventPageModeDailySummary>> map = getApplicationActionEventPageModeDailySummaryMap(
  142.                 page);

  143.         final DataSeries dataSeries = new DataSeries();

  144.         final Series series = new Series();

  145.         for (final Entry<String, List<ViewApplicationActionEventPageModeDailySummary>> entry : map.entrySet()) {

  146.             if (entry.getKey() != null) {
  147.                 series.addSeries(new XYseries().setLabel(entry.getKey()));

  148.                 dataSeries.newSeries();
  149.                 final List<ViewApplicationActionEventPageModeDailySummary> list = entry.getValue();
  150.                 for (final ViewApplicationActionEventPageModeDailySummary item : list) {
  151.                     dataSeries.add(DateUtils.formatDate(item.getEmbeddedId().getCreatedDate()), item.getHits());
  152.                 }
  153.             }

  154.         }

  155.         ChartUtils.addChart(layout, "Page Action Events daily Summary",
  156.                 new DCharts().setDataSeries(dataSeries)
  157.                         .setOptions(getChartOptions().createOptionsXYDateFloatLogYAxisLegendOutside(series)).show(),
  158.                 true);
  159.     }

  160.     /**
  161.      * Gets the application action event page daily summary map.
  162.      *
  163.      * @return the application action event page daily summary map
  164.      */
  165.     private Map<String, List<ViewApplicationActionEventPageDailySummary>> getApplicationActionEventPageDailySummaryMap() {
  166.         final DataContainer<ViewApplicationActionEventPageDailySummary, ApplicationActionEventPagePeriodSummaryEmbeddedId> documentTypeSummaryDailyDataContainer = getApplicationManager()
  167.                 .getDataContainer(ViewApplicationActionEventPageDailySummary.class);

  168.         return documentTypeSummaryDailyDataContainer.getAll().parallelStream().filter(Objects::nonNull)
  169.                 .collect(Collectors.groupingBy(t -> t.getEmbeddedId().getPage()));
  170.     }

  171.     /**
  172.      * Gets the application action event page element daily summary list.
  173.      *
  174.      * @param page the page
  175.      * @param elementId the element id
  176.      * @return the application action event page element daily summary list
  177.      */
  178.     private List<ViewApplicationActionEventPageElementDailySummary> getApplicationActionEventPageElementDailySummaryList(
  179.             final String page, final String elementId) {
  180.         final DataContainer<ViewApplicationActionEventPageElementDailySummary, ApplicationActionEventPageElementPeriodSummaryEmbeddedId> documentTypeSummaryDailyDataContainer = getApplicationManager()
  181.                 .getDataContainer(ViewApplicationActionEventPageElementDailySummary.class);

  182.         final List<ViewApplicationActionEventPageElementDailySummary> findOrderedListByEmbeddedProperty = documentTypeSummaryDailyDataContainer
  183.                 .findOrderedListByEmbeddedProperty(ViewApplicationActionEventPageElementDailySummary.class,
  184.                         ViewApplicationActionEventPageElementDailySummary_.embeddedId,
  185.                         ApplicationActionEventPageElementPeriodSummaryEmbeddedId.class,
  186.                         ApplicationActionEventPageElementPeriodSummaryEmbeddedId_.elementId, elementId,
  187.                         ApplicationActionEventPageElementPeriodSummaryEmbeddedId_.createdDate);

  188.         return findOrderedListByEmbeddedProperty.parallelStream()
  189.                 .filter(t -> t != null && t.getEmbeddedId().getPage().equals(page)).toList();
  190.     }

  191.     /**
  192.      * Gets the application action event page mode daily summary map.
  193.      *
  194.      * @param page the page
  195.      * @return the application action event page mode daily summary map
  196.      */
  197.     private Map<String, List<ViewApplicationActionEventPageModeDailySummary>> getApplicationActionEventPageModeDailySummaryMap(
  198.             final String page) {
  199.         final DataContainer<ViewApplicationActionEventPageModeDailySummary, ApplicationActionEventPageModePeriodSummaryEmbeddedId> documentTypeSummaryDailyDataContainer = getApplicationManager()
  200.                 .getDataContainer(ViewApplicationActionEventPageModeDailySummary.class);

  201.         final List<ViewApplicationActionEventPageModeDailySummary> findOrderedListByEmbeddedProperty = documentTypeSummaryDailyDataContainer
  202.                 .findOrderedListByEmbeddedProperty(ViewApplicationActionEventPageModeDailySummary.class,
  203.                         ViewApplicationActionEventPageModeDailySummary_.embeddedId,
  204.                         ApplicationActionEventPageModePeriodSummaryEmbeddedId.class,
  205.                         ApplicationActionEventPageModePeriodSummaryEmbeddedId_.page, page,
  206.                         ApplicationActionEventPageModePeriodSummaryEmbeddedId_.createdDate);

  207.         return findOrderedListByEmbeddedProperty.parallelStream().filter(Objects::nonNull)
  208.                 .collect(Collectors.groupingBy(t -> t.getEmbeddedId().getPageMode()));
  209.     }

  210.     /**
  211.      * Creates the application session page daily summary chart.
  212.      *
  213.      * @param layout the layout
  214.      */
  215.     @Override
  216.     public void createApplicationSessionPageDailySummaryChart(final VerticalLayout layout) {

  217.         final DataContainer<ApplicationSession, Serializable> dataContainer = getApplicationManager().getDataContainer(ApplicationSession.class);
  218.         final Map <String,Long> sessionByDayMap = dataContainer.getAll().stream()
  219.                     .collect(Collectors.groupingBy(p -> DateUtils.formatDate(p.getCreatedDate()), Collectors.counting()));

  220.         final DataSeries dataSeries = new DataSeries();
  221.         final Series series = new Series();
  222.         series.addSeries(new XYseries().setLabel("Daily Active Users"));
  223.         dataSeries.newSeries();
  224.         for (final Entry<String, Long> entry : sessionByDayMap.entrySet()) {
  225.             dataSeries.add(
  226.                     entry.getKey(),
  227.                         entry.getValue());
  228.         }

  229.         ChartUtils.addChart(layout, "Application Active Daily Users",
  230.                 new DCharts().setDataSeries(dataSeries)
  231.                         .setOptions(getChartOptions().createOptionsXYDateFloatLogYAxisLegendOutside(series)).show(),
  232.                 true);
  233.     }

  234. }