/* * Copyright (c) 2011-2015 Marat Gubaidullin. * * This file is part of HYBRIDBPM. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * */ package com.hybridbpm.ui.component.chart; import com.hybridbpm.core.data.chart.DiagrammePreference; import com.hybridbpm.core.data.chart.DiagrammePreferenceValue; import com.hybridbpm.core.data.chart.SortBy; import static com.hybridbpm.ui.component.chart.util.DiagrammeUtil.checkNotEmpty; import com.hybridbpm.ui.util.Translate; import com.vaadin.data.Container; import com.vaadin.data.Item; import java.util.*; import java.util.logging.Logger; @SuppressWarnings("serial") public abstract class TwoParamChart extends AbstractChart { protected class FirstColumnOrderedContainer extends TwoParamContainer { FirstColumnOrderedContainer(Container container, SortBy sortOrder) { super(container, sortOrder); } @Override public Map getData() { SortBy sortOrder = getSortOrder(); Map dataMap = populateDataMap(createSortMap(sortOrder)); return dataMap; } protected Map createSortMap(SortBy sortOrder) { Map map; if (sortOrder == SortBy.ASCENDING) { map = new TreeMap(); } else if (sortOrder == SortBy.DESCENDING) { map = new TreeMap(Collections.reverseOrder()); } else { map = new HashMap(); } return map; } } protected class ValuesColumnOrderedContainer extends TwoParamContainer { ValuesColumnOrderedContainer(Container container, SortBy sortOrder) { super(container, sortOrder); } @Override public Map getData() { Map unsortedMap = populateDataMap(new HashMap()); SortBy sortOrder = getSortOrder(); if (sortOrder != null) { Map sortedMap = createSortMap(unsortedMap, sortOrder); return sortedMap; } else { return unsortedMap; } } protected Map createSortMap(Map unsortedMap, SortBy sortOrder) { ValueComparator comparator = new ValueComparator(unsortedMap, sortOrder); Map sortedMap = new TreeMap(comparator); sortedMap.putAll(unsortedMap); return sortedMap; } } protected abstract class TwoParamContainer extends ChartContainer { private SortBy sortOrder; TwoParamContainer(Container container, SortBy sortOrder) { super(container); this.sortOrder = sortOrder; } public abstract Map getData(); protected Map populateDataMap(Map dataMap) { for (Object itemId : getContainer().getItemIds()) { Item item = getContainer().getItem(itemId); Object keyOfFirstColumn = item.getItemProperty(firstColumnName).getValue(); Object valueOfValuesColumn = item.getItemProperty(valuesColumnName).getValue(); dataMap.put(keyOfFirstColumn, valueOfValuesColumn); } return dataMap; } protected SortBy getSortOrder() { return sortOrder; } } private static class ValueComparator implements Comparator { Map base; SortBy sortOrder; public ValueComparator(Map base, SortBy sortOrder) { this.base = base; this.sortOrder = sortOrder; } public int compare(Object a, Object b) { Comparable compA = (Comparable) base.get(a); Comparable compB = (Comparable) base.get(b); int compare = compA.compareTo(compB); if (compare * sortOrder.getCoef() >= 0) { return 1; } else { return -1; } // don't return 0 or keys will merge } } private static final Logger LOG = Logger.getLogger(TwoParamChart.class.getName()); public TwoParamChart(Container container) { super(container); } private String firstColumnName; private String valuesColumnName; private SortBy firstColumnSortOrder; private SortBy valuesColumnSortOrder; private TwoParamContainer chartContainer; @Override protected void initPreferences() { DiagrammePreferenceValue firstColumn = getPreferenceValue(DiagrammePreference.FIRST_COLUMN_FIELD); DiagrammePreferenceValue valuesColumn = getPreferenceValue(DiagrammePreference.VALUES_COLUMN_FIELD); this.firstColumnName = firstColumn.getId(); this.valuesColumnName = valuesColumn.getId(); this.firstColumnSortOrder = getPreferenceValue(DiagrammePreference.FIRST_COLUMN_SORT_ORDER); this.valuesColumnSortOrder = getPreferenceValue(DiagrammePreference.VALUES_COLUMN_SORT_ORDER); } protected abstract void renderChart(Map data); protected void renderChart() { LOG.fine("Building two parameter chart"); createContainer(); Map data = chartContainer.getData(); // call descendant, he knows what to do renderChart(data); } private void createContainer() { if (firstColumnSortOrder != null) { this.chartContainer = new FirstColumnOrderedContainer(getContainer(), firstColumnSortOrder); } else { this.chartContainer = new ValuesColumnOrderedContainer(getContainer(), valuesColumnSortOrder); } } @Override protected void checkState() { checkNotEmpty(firstColumnName, Translate.getMessage("first-column-not-set")); checkNotEmpty(valuesColumnName, Translate.getMessage("values-column-not-set")); checkNotEmpty(getContainer(), Translate.getMessage("container-not-set")); } protected String getFirstColumnName() { return firstColumnName; } protected String getValuesColumnName() { return valuesColumnName; } }