BallotChartsPageModContentFactoryImpl.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.user.ballot.pagemode;

  20. import java.util.ArrayList;
  21. import java.util.Collections;
  22. import java.util.Comparator;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. import java.util.Map;

  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.security.access.annotation.Secured;
  28. import org.springframework.stereotype.Component;

  29. import com.hack23.cia.model.internal.application.data.committee.impl.RiksdagenVoteDataBallotPartyEmbeddedId;
  30. import com.hack23.cia.model.internal.application.data.committee.impl.RiksdagenVoteDataBallotPartyEmbeddedId_;
  31. import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenCommitteeBallotDecisionEmbeddedId;
  32. import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenCommitteeBallotDecisionSummary;
  33. import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenCommitteeBallotDecisionSummary_;
  34. import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummary;
  35. import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummary_;
  36. import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotSummary;
  37. import com.hack23.cia.model.internal.application.system.impl.ApplicationEventGroup;
  38. import com.hack23.cia.service.api.DataContainer;
  39. import com.hack23.cia.web.impl.ui.application.action.ViewAction;
  40. import com.hack23.cia.web.impl.ui.application.views.common.chartfactory.api.BallotChartDataManager;
  41. import com.hack23.cia.web.impl.ui.application.views.common.menufactory.api.pagecommands.PageCommandBallotConstants;
  42. import com.hack23.cia.web.impl.ui.application.views.common.pagemode.CardInfoRowUtil;
  43. import com.hack23.cia.web.impl.ui.application.views.common.sizing.ContentRatio;
  44. import com.vaadin.server.Sizeable.Unit;
  45. import com.vaadin.ui.HorizontalLayout;
  46. import com.vaadin.ui.Layout;
  47. import com.vaadin.ui.MenuBar;
  48. import com.vaadin.ui.Panel;
  49. import com.vaadin.ui.TabSheet;
  50. import com.vaadin.ui.TabSheet.Tab;
  51. import com.vaadin.ui.VerticalLayout;

  52. /**
  53.  * The Class BallotChartsPageModContentFactoryImpl.
  54.  */
  55. @Component
  56. public final class BallotChartsPageModContentFactoryImpl extends AbstractBallotPageModContentFactoryImpl {

  57.     /** The ballot chart data manager. */
  58.     @Autowired
  59.     private BallotChartDataManager ballotChartDataManager;

  60.     /**
  61.      * Instantiates a new ballot charts page mod content factory impl.
  62.      */
  63.     public BallotChartsPageModContentFactoryImpl() {
  64.         super();
  65.     }

  66.     /**
  67.      * Creates the issue concern map.
  68.      *
  69.      * @param partyBallotList the party ballot list
  70.      * @return the map
  71.      */
  72.     private static Map<String, List<ViewRiksdagenVoteDataBallotPartySummary>> createIssueConcernMap(
  73.             final List<ViewRiksdagenVoteDataBallotPartySummary> partyBallotList) {
  74.         final Map<String, List<ViewRiksdagenVoteDataBallotPartySummary>> concernIssuePartyBallotSummaryMap = new HashMap<>();
  75.         for (final ViewRiksdagenVoteDataBallotPartySummary partySummary : partyBallotList) {

  76.             if (partySummary.getEmbeddedId().getIssue() != null || partySummary.getEmbeddedId().getConcern() != null) {
  77.                 final String key = partySummary.getEmbeddedId().getIssue() + partySummary.getEmbeddedId().getConcern();
  78.                 final List<ViewRiksdagenVoteDataBallotPartySummary> partySummarList = concernIssuePartyBallotSummaryMap
  79.                         .computeIfAbsent(key, k -> new ArrayList<>());
  80.                 partySummarList.add(partySummary);
  81.             }
  82.         }

  83.         return concernIssuePartyBallotSummaryMap;
  84.     }

  85.     @Secured({ "ROLE_ANONYMOUS", "ROLE_USER", "ROLE_ADMIN" })
  86.     @Override
  87.     public Layout createContent(final String parameters, final MenuBar menuBar, final Panel panel) {
  88.         final VerticalLayout panelContent = createPanelContent();

  89.         final String pageId = getPageId(parameters);

  90.         final List<ViewRiksdagenVoteDataBallotSummary> ballots = getItem(parameters);

  91.         if (!ballots.isEmpty()) {
  92.             getBallotMenuItemFactory().createBallotMenuBar(menuBar, pageId);

  93.             final DataContainer<ViewRiksdagenVoteDataBallotPartySummary, RiksdagenVoteDataBallotPartyEmbeddedId> dataPartyContainer = getApplicationManager()
  94.                     .getDataContainer(ViewRiksdagenVoteDataBallotPartySummary.class);

  95.             final List<ViewRiksdagenVoteDataBallotPartySummary> partyBallotList = dataPartyContainer
  96.                     .findListByEmbeddedProperty(ViewRiksdagenVoteDataBallotPartySummary.class,
  97.                             ViewRiksdagenVoteDataBallotPartySummary_.embeddedId,
  98.                             RiksdagenVoteDataBallotPartyEmbeddedId.class,
  99.                             RiksdagenVoteDataBallotPartyEmbeddedId_.ballotId, pageId);

  100.             final DataContainer<ViewRiksdagenCommitteeBallotDecisionSummary, ViewRiksdagenCommitteeBallotDecisionEmbeddedId> dataDecisionContainer = getApplicationManager()
  101.                     .getDataContainer(ViewRiksdagenCommitteeBallotDecisionSummary.class);
  102.             final List<ViewRiksdagenCommitteeBallotDecisionSummary> decisionSummaries = dataDecisionContainer
  103.                     .getAllBy(ViewRiksdagenCommitteeBallotDecisionSummary_.ballotId, pageId);

  104.             if (!decisionSummaries.isEmpty()) {
  105.                 CardInfoRowUtil.createPageHeader(panel, panelContent,
  106.                         BallotViewConstants.CHARTS_TITLE_PREFIX + decisionSummaries.get(0).getTitle() + " - "
  107.                                 + decisionSummaries.get(0).getSubTitle(),
  108.                         BallotViewConstants.CHARTS_SUBTITLE,
  109.                         BallotViewConstants.CHARTS_DESCRIPTION);
  110.             } else {
  111.                 CardInfoRowUtil.createPageHeader(panel, panelContent,
  112.                         BallotViewConstants.CHARTS_TITLE_PREFIX + ballots.get(0).getEmbeddedId().getConcern(),
  113.                         BallotViewConstants.CHARTS_SUBTITLE,
  114.                         BallotViewConstants.CHARTS_DESCRIPTION);
  115.             }

  116.             final TabSheet tabsheet = new TabSheet();
  117.             tabsheet.setWidth(100, Unit.PERCENTAGE);
  118.             tabsheet.setHeight(100, Unit.PERCENTAGE);

  119.             panelContent.addComponent(tabsheet);
  120.             panelContent.setExpandRatio(tabsheet, ContentRatio.LARGE);

  121.             Collections.sort(ballots,
  122.                     (Comparator<ViewRiksdagenVoteDataBallotSummary>) (o1,
  123.                             o2) -> (o1.getEmbeddedId().getIssue() + o2.getEmbeddedId().getConcern())
  124.                                     .compareTo(o1.getEmbeddedId().getIssue() + o2.getEmbeddedId().getConcern()));

  125.             for (final ViewRiksdagenVoteDataBallotSummary viewRiksdagenVoteDataBallotSummary : ballots) {
  126.                 final HorizontalLayout tabContent = new HorizontalLayout();
  127.                 tabContent.setWidth(100, Unit.PERCENTAGE);
  128.                 tabContent.setHeight(100, Unit.PERCENTAGE);
  129.                 final Tab tab = tabsheet.addTab(tabContent);

  130.                 ballotChartDataManager.createChart(tab, tabContent, viewRiksdagenVoteDataBallotSummary);
  131.             }

  132.             final Map<String, List<ViewRiksdagenVoteDataBallotPartySummary>> concernIssuePartyBallotSummaryMap = createIssueConcernMap(
  133.                     partyBallotList);

  134.             for (final List<ViewRiksdagenVoteDataBallotPartySummary> partyBallotSummaryList : concernIssuePartyBallotSummaryMap
  135.                     .values()) {
  136.                 final HorizontalLayout tabContent = new HorizontalLayout();
  137.                 tabContent.setWidth(100, Unit.PERCENTAGE);
  138.                 tabContent.setHeight(100, Unit.PERCENTAGE);
  139.                 final Tab tab = tabsheet.addTab(tabContent);

  140.                 ballotChartDataManager.createChart(tab, tabContent, partyBallotSummaryList);
  141.             }

  142.             getPageActionEventHelper().createPageEvent(ViewAction.VISIT_BALLOT_VIEW, ApplicationEventGroup.USER, NAME,
  143.                     parameters, pageId);
  144.         }
  145.         return panelContent;

  146.     }

  147.     @Override
  148.     public boolean matches(final String page, final String parameters) {
  149.         return PageCommandBallotConstants.COMMAND_BALLOT_CHARTS.matches(page, parameters);
  150.     }

  151. }