Skip to content

Commit

Permalink
IDEMPIERE-6332 Implement MChart.getData to return the data used to pa…
Browse files Browse the repository at this point in the history
…int the chart (idempiere#2579)
  • Loading branch information
CarlosRuiz-globalqss authored Dec 3, 2024
1 parent bba3e47 commit 31a0051
Showing 1 changed file with 95 additions and 1 deletion.
96 changes: 95 additions & 1 deletion org.adempiere.base/src/org/compiere/model/MChart.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,22 @@

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;

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;

/**
* Extended model class for AD_Chart
Expand All @@ -38,7 +47,7 @@ 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;

Expand Down Expand Up @@ -119,4 +128,89 @@ public BufferedImage getChartImage(int width, int height) {
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;
}
}

0 comments on commit 31a0051

Please sign in to comment.