CountryMenuItemFactoryImpl.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.menufactory.impl;

  20. import java.util.AbstractMap;
  21. import java.util.AbstractMap.SimpleEntry;
  22. import java.util.Arrays;
  23. import java.util.LinkedHashMap;
  24. import java.util.List;
  25. import java.util.Map;
  26. import java.util.Map.Entry;
  27. import java.util.stream.Collectors;

  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.stereotype.Service;

  30. import com.hack23.cia.model.internal.application.data.impl.ViewWorldbankIndicatorDataCountrySummary;
  31. import com.hack23.cia.model.internal.application.data.impl.ViewWorldbankIndicatorDataCountrySummary_;
  32. import com.hack23.cia.model.internal.application.data.impl.WorldbankIndicatorDataCountrySummaryEmbeddedId;
  33. import com.hack23.cia.model.internal.application.data.impl.WorldbankIndicatorDataCountrySummaryEmbeddedId_;
  34. import com.hack23.cia.service.api.ApplicationManager;
  35. import com.hack23.cia.service.api.DataContainer;
  36. import com.hack23.cia.web.impl.ui.application.views.common.menufactory.api.ApplicationMenuItemFactory;
  37. import com.hack23.cia.web.impl.ui.application.views.common.menufactory.api.CountryMenuItemFactory;
  38. import com.hack23.cia.web.impl.ui.application.views.common.pagelinks.api.PageModeMenuCommand;
  39. import com.hack23.cia.web.impl.ui.application.views.common.sizing.ContentRatio;
  40. import com.hack23.cia.web.impl.ui.application.views.common.viewnames.PageMode;
  41. import com.hack23.cia.web.impl.ui.application.views.common.viewnames.UserViews;
  42. import com.vaadin.icons.VaadinIcons;
  43. import com.vaadin.ui.Alignment;
  44. import com.vaadin.ui.MenuBar;
  45. import com.vaadin.ui.MenuBar.MenuItem;
  46. import com.vaadin.ui.VerticalLayout;

  47. /**
  48.  * The Class CountryMenuItemFactoryImpl.
  49.  */
  50. @Service
  51. public final class CountryMenuItemFactoryImpl extends AbstractMenuItemFactoryImpl implements CountryMenuItemFactory {

  52.     /** The application manager. */
  53.     @Autowired
  54.     private ApplicationManager applicationManager;

  55.     /** The application menu item factory. */
  56.     @Autowired
  57.     private ApplicationMenuItemFactory applicationMenuItemFactory;

  58.     /**
  59.      * Instantiates a new country menu item factory impl.
  60.      */
  61.     public CountryMenuItemFactoryImpl() {
  62.         super();
  63.     }

  64.     /**
  65.      * Adds the sources and indicators to menu.
  66.      *
  67.      * @param countryIndicators
  68.      *                           the country indicators
  69.      * @param sourceIndicatorMap
  70.      *                           the source indicator map
  71.      */
  72.     private static void addSourcesAndIndicatorsToMenu(final MenuItem countryIndicators,
  73.             final Map<String, List<ViewWorldbankIndicatorDataCountrySummary>> sourceIndicatorMap) {

  74.         final Map<String, List<ViewWorldbankIndicatorDataCountrySummary>> sortedIndicatorMap = sourceIndicatorMap
  75.                 .entrySet().stream().sorted((e1, e2) -> e1.getKey().compareTo(e2.getKey()))
  76.                 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

  77.         for (final Entry<String, List<ViewWorldbankIndicatorDataCountrySummary>> entry : sortedIndicatorMap
  78.                 .entrySet()) {

  79.             final MenuItem sourceItems = countryIndicators.addItem(entry.getKey(), null, null);

  80.             final List<ViewWorldbankIndicatorDataCountrySummary> sortedEntries = entry.getValue().stream()
  81.                     .sorted((e1, e2) -> e1.getIndicatorName().compareTo(e2.getIndicatorName()))
  82.                     .toList();

  83.             for (final ViewWorldbankIndicatorDataCountrySummary indciatorSummary : sortedEntries) {
  84.                 final MenuItem addItem = sourceItems.addItem(indciatorSummary.getIndicatorName(),
  85.                         new PageModeMenuCommand(UserViews.COUNTRY_RANKING_VIEW_NAME, PageMode.INDICATORS,
  86.                                 indciatorSummary.getEmbeddedId().getIndicatorId()));
  87.                 addItem.setStyleName("RestrictedHeader");
  88.             }
  89.         }

  90.     }

  91.     @Override
  92.     public void createCountryTopicMenu(final MenuBar menuBar) {
  93.         initApplicationMenuBar(menuBar);

  94.         applicationMenuItemFactory.addRankingMenu(menuBar);

  95.         createCountryTopicMenu(menuBar.addItem(COUNTRY_RANKING_TEXT, VaadinIcons.FLAG, null));

  96.     }

  97.     @Override
  98.     public void createCountryTopicMenu(final MenuItem charts) {
  99.         charts.addItem(COUNTRY_OVERVIEW_TEXT, VaadinIcons.LINE_CHART,
  100.                 COMMAND_COUNTRY_RANKING_OVERVIEW);

  101.         final MenuItem countryIndicators = charts.addItem(COUNTRY_INDICATORS_SWEDEN, VaadinIcons.LINE_CHART, null);

  102.         addSourcesAndIndicatorsToMenu(countryIndicators, getTopicIndicatorMap());

  103.     }

  104.     @Override
  105.     public void createOverviewPage(final VerticalLayout panelContent) {
  106.         final MenuBar menuBar = new MenuBar();
  107.         panelContent.addComponent(menuBar);
  108.         panelContent.setComponentAlignment(menuBar, Alignment.TOP_LEFT);
  109.         panelContent.setExpandRatio(menuBar, ContentRatio.LARGE);

  110.         addSourcesAndIndicatorsToMenu(menuBar.addItem(BY_TOPIC, VaadinIcons.LINE_CHART, null), getTopicIndicatorMap());
  111.         menuBar.setAutoOpen(true);
  112.     }

  113.     /**
  114.      * Gets the topic indicator map.
  115.      *
  116.      * @return the topic indicator map
  117.      */
  118.     private Map<String, List<ViewWorldbankIndicatorDataCountrySummary>> getTopicIndicatorMap() {
  119.         final DataContainer<ViewWorldbankIndicatorDataCountrySummary, WorldbankIndicatorDataCountrySummaryEmbeddedId> indicatorDataCountrSummaryDailyDataContainer = applicationManager
  120.                 .getDataContainer(ViewWorldbankIndicatorDataCountrySummary.class);

  121.         return indicatorDataCountrSummaryDailyDataContainer
  122.                 .findListByEmbeddedProperty(ViewWorldbankIndicatorDataCountrySummary.class,
  123.                         ViewWorldbankIndicatorDataCountrySummary_.embeddedId,
  124.                         WorldbankIndicatorDataCountrySummaryEmbeddedId.class,
  125.                         WorldbankIndicatorDataCountrySummaryEmbeddedId_.countryId, "SE")
  126.                 .parallelStream()
  127.                 .filter(t -> t != null && t.getSourceValue() != null && t.getEndYear() > DATA_POINTS_FOR_YEAR_ABOVE
  128.                         && t.getDataPoint() > MINIMUM_NUMBER_DATA_POINTS)
  129.                 .flatMap(t -> Arrays.asList(t.getTopics().split(";")).stream()
  130.                         .map(topic -> new AbstractMap.SimpleEntry<>(topic, t)))

  131.                 .collect(Collectors.groupingBy(SimpleEntry::getKey,
  132.                         Collectors.mapping(SimpleEntry::getValue, Collectors.toList())));
  133.     }

  134. }