// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataprofiler.core.ui.events;
import java.util.ArrayList;
import java.util.List;
import org.talend.commons.utils.SpecialValueDisplay;
import org.talend.dataprofiler.common.ui.editor.preview.CustomerDefaultCategoryDataset;
import org.talend.dataprofiler.common.ui.editor.preview.ICustomerDataset;
import org.talend.dataprofiler.core.ui.editor.preview.ColumnIndicatorUnit;
import org.talend.dataprofiler.core.ui.editor.preview.IndicatorUnit;
import org.talend.dataprofiler.core.ui.editor.preview.model.TableWithData;
import org.talend.dataprofiler.core.ui.editor.preview.model.states.freq.FrequencyStatisticsState;
import org.talend.dataprofiler.core.ui.editor.preview.model.states.utils.FrequencyTypeStateUtil;
import org.talend.dataprofiler.core.ui.utils.TOPChartUtils;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dataquality.indicators.IndicatorParameters;
import org.talend.dataquality.indicators.ModeIndicator;
import org.talend.dq.indicators.ext.FrequencyExt;
import org.talend.dq.indicators.preview.table.ChartDataEntity;
import org.talend.dq.nodes.indicator.type.IndicatorEnum;
/**
* created by yyin on 2014-7-11 Detailled comment
*
*/
public class FrequencyDynamicChartEventReceiver extends DynamicChartEventReceiver {
@Override
public boolean handle(Object value) {
Object indValue = value;
if (value == null) {
indValue = 0;
}
if (dataset != null) {
// no sort needed here
if (indValue instanceof FrequencyExt[]) {
FrequencyExt[] frequencyExt = (FrequencyExt[]) indValue;
setFrequecyToDataset(dataset, frequencyExt, indicator);
}
}
if (tableViewer != null && dataset != null) {
TableWithData input = (TableWithData) tableViewer.getInput();
if (input != null) {
if (this.indicator instanceof ModeIndicator) {
ChartDataEntity entity = new ChartDataEntity();
entity.setIndicator(indicator);
entity.setLabel(this.indicatorName);
entity.setValue(String.valueOf(indValue));
// mode indicator has not a chart so that no dataset too
input.setEntities(new ChartDataEntity[] { entity });
} else {
ICustomerDataset customerDataset = TOPChartUtils.getInstance().getCustomerDataset(dataset);
if (customerDataset != null) {
input.setEntities((customerDataset).getDataEntities());
} else {
input.setEntities(((ICustomerDataset) dataset).getDataEntities());
}
}
}
if (!tableViewer.getTable().isDisposed()) {
tableViewer.getTable().clearAll();
tableViewer.setInput(input);
}
}
if (registerChart != TOPChartUtils.getInstance().getChartFromChartComposite(parentChartComposite)) {
restoreChart();
}
// need to refresh the parent composite of the chart to show the changes
if (!(indicator instanceof ModeIndicator)) {
EventManager.getInstance().publish(chartComposite, EventEnum.DQ_DYNAMIC_REFRESH_DYNAMIC_CHART, null);
}
return true;
}
private void setFrequecyToDataset(Object customerdataset, FrequencyExt[] frequencyExt, Indicator indicator) {
int numOfShown = frequencyExt.length;
IndicatorParameters parameters = indicator.getParameters();
if (parameters != null) {
if (parameters.getTopN() < numOfShown) {
numOfShown = parameters.getTopN();
}
}
FrequencyExt[] tempFreq = handleFrequency(frequencyExt);
clearDataEntity(customerdataset);
boolean withRowCountIndicator = FrequencyTypeStateUtil.isWithRowCountIndicator(indicator);
//Added TDQ-12870
List columnKeys = TOPChartUtils.getInstance().getColumnKeys(customerdataset);
FrequencyExt freqE = tempFreq[0];
if(!columnKeys.contains(String.valueOf(freqE.getKey()))){
//columnKeys.clear();
TOPChartUtils.getInstance().clearDataset(customerdataset);
ICustomerDataset customerDataset = TOPChartUtils.getInstance().getCustomerDataset(customerdataset);
if (customerDataset != null && customerDataset instanceof CustomerDefaultCategoryDataset) {
((CustomerDefaultCategoryDataset) customerDataset).clearAll();
}
}
for (int i = 0; i < numOfShown; i++) {
FrequencyExt freqExt = tempFreq[i];
String keyLabel = String.valueOf(freqExt.getKey());
if ("null".equals(keyLabel)) { //$NON-NLS-1$
keyLabel = SpecialValueDisplay.NULL_FIELD;
}
if ("".equals(keyLabel)) { //$NON-NLS-1$
keyLabel = SpecialValueDisplay.EMPTY_FIELD;
}
ChartDataEntity entity = FrequencyTypeStateUtil
.createChartEntity(indicator, freqExt, keyLabel, withRowCountIndicator);
if (customerdataset instanceof CustomerDefaultCategoryDataset) {
((CustomerDefaultCategoryDataset) customerdataset).addDataEntity(entity);
addValueToDataset(((CustomerDefaultCategoryDataset) customerdataset).getDataset(), freqExt, keyLabel);
} else {
ICustomerDataset customerDataset = TOPChartUtils.getInstance().getCustomerDataset(customerdataset);
if (customerDataset != null && customerDataset instanceof CustomerDefaultCategoryDataset) {
customerDataset.addDataEntity(entity);
addValueToDataset(((CustomerDefaultCategoryDataset) customerDataset).getDataset(), freqExt, keyLabel);
}
}
}
}
/**
* Clear DataEntity becuase of there maybe have a empty string when init it.
*
* @param customerdataset
*/
private void clearDataEntity(Object customerdataset) {
if (customerdataset instanceof CustomerDefaultCategoryDataset) {
((CustomerDefaultCategoryDataset) customerdataset).clearDataEnities();
} else {
ICustomerDataset customerDataset = TOPChartUtils.getInstance().getCustomerDataset(customerdataset);
if (customerDataset != null && customerDataset instanceof CustomerDefaultCategoryDataset) {
((CustomerDefaultCategoryDataset) customerDataset).clearDataEnities();
}
}
}
private void restoreChart() {
if (registerChart == null) {
return;
}
if (this.parentChartComposite != null) {
TOPChartUtils.getInstance().refrechChart(this.parentChartComposite, registerChart);
}
EventManager.getInstance().publish(chartComposite, EventEnum.DQ_DYNAMIC_REFRESH_DYNAMIC_CHART, null);
}
@Override
public void refreshChart() {
List<IndicatorUnit> indicatorUnits = new ArrayList<IndicatorUnit>();
indicatorUnits.add(new ColumnIndicatorUnit(IndicatorEnum.findIndicatorEnum(this.getIndicator().eClass()), this
.getIndicator(), null));
// indicators
FrequencyStatisticsState state = new FrequencyStatisticsState(indicatorUnits);
state.setSupportDynamicChart(true);
Object chart = state.getChart();
TOPChartUtils.getInstance().decorateChart(chart, false);
if (this.parentChartComposite != null) {
TOPChartUtils.getInstance().refrechChart(this.parentChartComposite, chart);
}
EventManager.getInstance().publish(chartComposite, EventEnum.DQ_DYNAMIC_REFRESH_DYNAMIC_CHART, null);
}
@Override
public void clearValue() {
if (dataset != null) {// clear old data
if (dataset instanceof CustomerDefaultCategoryDataset) {
((CustomerDefaultCategoryDataset) dataset).clearAll();
} else {
TOPChartUtils.getInstance().clearDataset(dataset);
}
}
if (tableViewer != null) {
TableWithData input = (TableWithData) tableViewer.getInput();
input.setEntities(null);
tableViewer.getTable().clearAll();
}
}
/**
* DOC yyin Comment method "handleFrequency".
*
* @param frequencyExt
* @param indicator
* @return
*/
protected FrequencyExt[] handleFrequency(FrequencyExt[] frequencyExt) {
return frequencyExt;
}
/**
* DOC yyin Comment method "addValueToDataset".
*
* @param customerdataset
* @param indicator
* @param freqExt
* @param keyLabel
*/
protected void addValueToDataset(Object customerdataset, FrequencyExt freqExt, String keyLabel) {
TOPChartUtils.getInstance().addValueToCategoryDataset(customerdataset, freqExt.getValue(), "1", keyLabel); //$NON-NLS-1$
}
}