/*
* 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 ThreeParamChart extends AbstractChart {
private class ThreeParamContainer extends ChartContainer {
private Map<ColumnCoupleKey<?, ?>, Object> dataMap;
private Set secondColumnValues;
private Set firstColumnValues;
protected ThreeParamContainer(Container container) {
super(container);
this.dataMap = new HashMap<ColumnCoupleKey<?, ?>, Object>();
this.secondColumnValues = createSortSet(secondColumnSortOrder);
this.firstColumnValues = createSortSet(firstColumnSortOrder);
populateData();
}
protected void populateData() {
for (Object itemId : getContainer().getItemIds()) {
Item item = getContainer().getItem(itemId);
Object keyOfSecondColumn = item.getItemProperty(secondColumnName).getValue();
Object keyOfFirstColumn = item.getItemProperty(firstColumnName).getValue();
Object valueOfValuesColumn = item.getItemProperty(valuesColumnName).getValue();
// store data
dataMap.put(new ColumnCoupleKey(keyOfSecondColumn, keyOfFirstColumn), valueOfValuesColumn);
// sort second column values
secondColumnValues.add(keyOfSecondColumn);
// sort first column values
firstColumnValues.add(keyOfFirstColumn);
}
}
public Map<ColumnCoupleKey<?, ?>, Object> getData() {
return dataMap;
}
public Set getSecondColumnValues() {
return secondColumnValues;
}
public Set getFirstColumnValues() {
return firstColumnValues;
}
}
protected Set<?> createSortSet(SortBy sortOrder) {
Set<?> set;
if (sortOrder == SortBy.ASCENDING) {
set = new TreeSet();
} else if (sortOrder == SortBy.DESCENDING) {
set = new TreeSet(Collections.reverseOrder());
} else {
set = new HashSet();
}
return set;
}
public static class ColumnCoupleKey<C1, C2> {
private C2 secondColumnValue;
private C1 firstColumnValue;
public ColumnCoupleKey(C2 secondColumnValue, C1 firstColumnValue) {
this.secondColumnValue = secondColumnValue;
this.firstColumnValue = firstColumnValue;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ColumnCoupleKey that = (ColumnCoupleKey) o;
if (!secondColumnValue.equals(that.secondColumnValue)) return false;
if (!firstColumnValue.equals(that.firstColumnValue)) return false;
return true;
}
@Override
public int hashCode() {
int result = secondColumnValue.hashCode();
result = 31 * result + firstColumnValue.hashCode();
return result;
}
@Override
public String toString() {
return "ColumnCoupleKey{" +
"secondColumnValue=" + secondColumnValue +
", firstColumnValue=" + firstColumnValue +
'}';
}
public C2 getSecondColumnValue() {
return secondColumnValue;
}
public C1 getFirstColumnValue() {
return firstColumnValue;
}
}
private static final Logger LOG = Logger.getLogger(ThreeParamChart.class.getName());
private String firstColumnName;
private String valuesColumnName;
private String secondColumnName;
private SortBy firstColumnSortOrder;
private SortBy secondColumnSortOrder;
public ThreeParamChart(Container container) {
super(container);
}
private ThreeParamContainer chartContainer;
protected abstract void renderChart(Map<ColumnCoupleKey<?, ?>, Object> data,
Set secondColumnValues, Set firstColumnValues);
@Override
protected void initPreferences() {
DiagrammePreferenceValue firstColumn = getPreferenceValue(DiagrammePreference.FIRST_COLUMN_FIELD);
DiagrammePreferenceValue valuesColumn = getPreferenceValue(DiagrammePreference.VALUES_COLUMN_FIELD);
DiagrammePreferenceValue secondColumn = getPreferenceValue(DiagrammePreference.SECOND_COLUMN_FIELD);
this.firstColumnName = firstColumn.getId();
this.valuesColumnName = valuesColumn.getId();
this.secondColumnName = secondColumn.getId();
this.firstColumnSortOrder = getPreferenceValue(DiagrammePreference.FIRST_COLUMN_SORT_ORDER);
this.secondColumnSortOrder = getPreferenceValue(DiagrammePreference.SECOND_COLUMN_SORT_ORDER);
}
@Override
protected void renderChart() {
LOG.fine("Building three parameter chart");
this.chartContainer = new ThreeParamContainer(getContainer());
Map<ColumnCoupleKey<?, ?>, Object> data = chartContainer.getData();
Set secondColumnValues = chartContainer.getSecondColumnValues();
Set firstColumnValues = chartContainer.getFirstColumnValues();
// call the descendant, he knows what to do
renderChart(data, secondColumnValues, firstColumnValues);
}
@Override
protected void checkState() {
checkNotEmpty(firstColumnName, Translate.getMessage("first-column-not-set"));
checkNotEmpty(secondColumnName, Translate.getMessage("second-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;
}
protected String getSecondColumnName() {
return secondColumnName;
}
}