IDEMPIERE-6332 Implement MChart.getData to return the data used to paint the chart (#2579)

This commit is contained in:
Carlos Ruiz 2024-12-03 02:28:47 +01:00
parent 1522dd84d1
commit e5f364f391
1 changed files with 95 additions and 1 deletions

View File

@ -23,6 +23,8 @@ package org.compiere.model;
import java.awt.image.BufferedImage;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
@ -30,12 +32,19 @@ import org.adempiere.apps.graph.ChartBuilder;
import org.compiere.util.Env;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.Dataset;
import org.jfree.data.general.PieDataset;
import org.jfree.data.xy.XYDataset;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
public class MChart extends X_AD_Chart {
/**
* generated serial id
*/
private static final long serialVersionUID = 6510636131425272970L;
private static final long serialVersionUID = -6709381648397609341L;
private int windowNo=0;
@ -116,4 +125,89 @@ public class MChart extends X_AD_Chart {
return bi;
}
/**
* Get the data from the chart on JSON format
* @return
*/
public JsonObject getData() {
JsonObject json = new JsonObject();
ChartBuilder cb = new ChartBuilder(this);
Dataset ds;
JsonArray array = new JsonArray();
String type = getChartType();
if ( isTimeSeries()
&& ( MChart.CHARTTYPE_BarChart.equals(type)
|| MChart.CHARTTYPE_LineChart.equals(type)
|| MChart.CHARTTYPE_StackedBarChart.equals(type)
)
) {
ds = cb.getXYDataset();
} else if ( MChart.CHARTTYPE_3DPieChart.equals(type)
|| MChart.CHARTTYPE_PieChart.equals(type)
|| MChart.CHARTTYPE_RingChart.equals(type)
) {
ds = cb.getPieDataset();
} else {
ds = cb.getCategoryDataset();
}
if (ds instanceof CategoryDataset) {
json.addProperty("name", get_Translation(COLUMNNAME_Name));
json.addProperty("domain-label", get_Translation(COLUMNNAME_DomainLabel));
json.addProperty("range-label", get_Translation(COLUMNNAME_RangeLabel));
json.addProperty("display-legend", isDisplayLegend());
json.addProperty("orientation", getChartOrientation());
CategoryDataset cds = (CategoryDataset) ds;
int rowCount = cds.getRowCount();
int columnCount = cds.getColumnCount();
for (int row = 0; row < rowCount; row++) {
for (int col = 0; col < columnCount; col++) {
Number value = cds.getValue(row, col);
Comparable<?> rowKey = cds.getRowKey(row);
Comparable<?> colKey = cds.getColumnKey(col);
JsonObject rec = new JsonObject();
rec.addProperty("row", rowKey.toString());
rec.addProperty("column", colKey.toString());
rec.addProperty("value", value);
array.add(rec);
}
}
} else if (ds instanceof XYDataset) {
json.addProperty("name", get_Translation(COLUMNNAME_Name));
json.addProperty("domain-label", get_Translation(COLUMNNAME_DomainLabel));
json.addProperty("range-label", get_Translation(COLUMNNAME_RangeLabel));
json.addProperty("display-legend", isDisplayLegend());
json.addProperty("orientation", getChartOrientation());
XYDataset xyds = (XYDataset) ds;
int seriesCount = xyds.getSeriesCount();
for (int series = 0; series < seriesCount; series++) {
Comparable<?> seriesKey = xyds.getSeriesKey(series);
int itemCount = xyds.getItemCount(series);
for (int item = 0; item < itemCount; item++) {
Number xValue = xyds.getX(series, item);
Date date = new Date((long) xValue);
String strDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
Number yValue = xyds.getY(series, item);
JsonObject rec = new JsonObject();
rec.addProperty("series", seriesKey.toString());
rec.addProperty("x", strDate);
rec.addProperty("y", yValue);
array.add(rec);
}
}
} else if (ds instanceof PieDataset) {
json.addProperty("name", get_Translation(COLUMNNAME_Name));
json.addProperty("display-legend", isDisplayLegend());
PieDataset pds = (PieDataset) ds;
for (int i = 0; i < pds.getKeys().size(); i++) {
Comparable<?> key = pds.getKey(i);
Number value = pds.getValue(key);
JsonObject rec = new JsonObject();
rec.addProperty("key", key.toString());
rec.addProperty("value", value);
array.add(rec);
}
}
json.add("data", array);
return json;
}
}