Skip to content

Commit 3dd6eab

Browse files
committed
update: distinguish charts live update
1 parent 8cb46d5 commit 3dd6eab

File tree

8 files changed

+136
-20
lines changed

8 files changed

+136
-20
lines changed

echarts4j-chart-server/src/main/java/com/github/koooooo7/echarts4j/chart/server/DynamicChartLiveUpdater.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.github.koooooo7.echarts4j.chart.Canvas;
44
import com.github.koooooo7.echarts4j.type.FuncStr;
5+
import com.github.koooooo7.echarts4j.util.ChartUtil;
6+
import com.github.koooooo7.echarts4j.util.JsonUtil;
57
import net.sf.cglib.proxy.Enhancer;
68
import net.sf.cglib.proxy.MethodInterceptor;
79
import net.sf.cglib.proxy.MethodProxy;
@@ -10,6 +12,8 @@
1012
import java.io.Writer;
1113
import java.lang.reflect.Method;
1214
import java.net.InetSocketAddress;
15+
import java.util.HashMap;
16+
import java.util.Map;
1317
import java.util.Objects;
1418
import java.util.function.Consumer;
1519

@@ -27,13 +31,17 @@ public class DynamicChartLiveUpdater {
2731
"console.log(\"echarts4j live update setup!\");" +
2832
"};\n" +
2933
"\n" +
34+
"\n" +
3035
"ws.onmessage = function(evt) {\n" +
31-
" %MY_ECHARTS%.setOption(JSON.parse(evt.data));" +
36+
"const data = JSON.parse(evt.data);" +
37+
"const option = data['%MY_ECHARTS%'];" +
38+
"option&&%MY_ECHARTS%.setOption(JSON.parse(option));" +
3239
"};\n" +
3340
"\n" +
41+
"\n" +
3442
"ws.onclose = function(evt) {\n" +
3543
" console.log(\"Connection closed.\");\n" +
36-
"}; ";
44+
"};";
3745

3846
public static Canvas liveUpdateBoxed(Canvas canvas, Consumer<Canvas> updater) {
3947
if (!websocketSetup) {
@@ -92,11 +100,16 @@ private static void setWebsocketSetup(Canvas target) {
92100
server.start();
93101
while (true) {
94102
if (liveUpdateChangeFound) {
95-
target.getCharts().values().stream()
96-
.findFirst().ifPresent(s -> {
97-
server.broadcast(s.getOptions());
98-
});
99-
liveUpdateChangeFound = false;
103+
try {
104+
final Map<String, String> options = new HashMap<>();
105+
target.getCharts().forEach((id, c) -> {
106+
options.put(ChartUtil.getFullEchartsChartId(id), c.getOptions());
107+
});
108+
server.broadcast(JsonUtil.writeValueAsString(options));
109+
} catch (Exception ignore) {
110+
} finally {
111+
liveUpdateChangeFound = false;
112+
}
100113
}
101114
}
102115
});

echarts4j-chart-server/src/test/java/com/github/koooooo7/echarts4j/chart/server/SimpleChartServerRenderTest.java

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.koooooo7.echarts4j.chart.server;
22

33

4+
import com.github.koooooo7.echarts4j.chart.BarChart;
45
import com.github.koooooo7.echarts4j.chart.Canvas;
56
import com.github.koooooo7.echarts4j.chart.LineChart;
67
import com.github.koooooo7.echarts4j.option.ChartOption;
@@ -90,7 +91,67 @@ void shouldServerChart_WhenUseTheChartServer_GivenChartAndCallTheRender() throws
9091
Assertions.fail();
9192
}
9293

93-
// not stop the main process
94+
// not stop the main process, local test
95+
// live.await();
96+
}
97+
98+
@Test
99+
void shouldServerChart_WhenUseTheChartServer_Given2ChartAndCallTheRender() throws InterruptedException {
100+
final String chartTitle = "My Live Update Chart";
101+
final String seriesName = "seriesName";
102+
final String seriesName2 = "seriesName2";
103+
final String chartId = "cId";
104+
final String chartId2 = "cId2";
105+
final LineChart c = LineChart.builder()
106+
.chartId(chartId)
107+
.options(ChartOption.builder()
108+
.animation(false)
109+
.title(Title.builder()
110+
.text(chartTitle).build())
111+
.legend(Legend.builder().build())
112+
.xAxis(XAxis.builder()
113+
.data(x)
114+
.build())
115+
.yAxis(YAxis.builder().build())
116+
.build()
117+
.addSeries(ListChartSeriesOption.builder()
118+
.name(seriesName)
119+
.data(data1)
120+
.build())
121+
)
122+
.build();
123+
final BarChart b = BarChart.builder()
124+
.chartId(chartId2)
125+
.options(ChartOption.builder()
126+
.animation(false)
127+
.title(Title.builder()
128+
.text(chartTitle).build())
129+
.legend(Legend.builder().build())
130+
.xAxis(XAxis.builder()
131+
.data(x)
132+
.build())
133+
.yAxis(YAxis.builder().build())
134+
.build()
135+
.addSeries(BarChartSeriesOption.builder()
136+
.name(seriesName2)
137+
.data(data2)
138+
.build())
139+
)
140+
.build();
141+
final Canvas canvas = Canvas.builder()
142+
.addCharts(c)
143+
.addCharts(b)
144+
.build();
145+
146+
try {
147+
final Canvas boxed = DynamicChartLiveUpdater.liveUpdateBoxed(canvas, updater2(chartId, chartId2));
148+
final Render render = boxed.extractRender();
149+
render.render(boxed);
150+
} catch (Exception e) {
151+
Assertions.fail();
152+
}
153+
154+
// not stop the main process, local test
94155
// live.await();
95156
}
96157

@@ -117,4 +178,43 @@ private Consumer<Canvas> updater(String chartId) {
117178
}, 5, 5, TimeUnit.SECONDS);
118179
}
119180

181+
private Consumer<Canvas> updater2(String chartId, String chartId2) {
182+
return proxy -> scheduler.scheduleAtFixedRate(() -> {
183+
// refresh data
184+
proxy.asBuilder().updateChart(chartId, c1 -> c1.ifPresent(it -> {
185+
setup();
186+
final ChartOption chartOptions = it.getChartOptions();
187+
final Title title = chartOptions.getTitle();
188+
title.setSubtext("LastUpdateTime: " + LocalDateTime.now().format(DATE_TIME_FORMATTER));
189+
boolean first = true;
190+
final List<SeriesOption> series = chartOptions.getSeries();
191+
for (SeriesOption so : series) {
192+
if (first) {
193+
so.setData(data1);
194+
} else {
195+
so.setData(data2);
196+
}
197+
first = false;
198+
199+
}
200+
})).updateChart(chartId2, c1 -> c1.ifPresent(it -> {
201+
setup();
202+
final ChartOption chartOptions = it.getChartOptions();
203+
final Title title = chartOptions.getTitle();
204+
title.setSubtext("LastUpdateTime: " + LocalDateTime.now().format(DATE_TIME_FORMATTER));
205+
boolean first = true;
206+
final List<SeriesOption> series = chartOptions.getSeries();
207+
for (SeriesOption so : series) {
208+
if (first) {
209+
so.setData(data1);
210+
} else {
211+
so.setData(data2);
212+
}
213+
first = false;
214+
215+
}
216+
}));
217+
}, 5, 1, TimeUnit.SECONDS);
218+
}
219+
120220
}

echarts4j-project/src/main/java/com/github/koooooo7/echarts4j/chart/BaseChart.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import lombok.experimental.SuperBuilder;
1515
import org.apache.commons.lang3.StringUtils;
1616

17-
import java.util.LinkedList;
17+
import java.util.ArrayList;
1818
import java.util.List;
1919
import java.util.Objects;
2020
import java.util.stream.Collectors;
@@ -26,8 +26,8 @@
2626
public abstract class BaseChart<T extends Chart<T>> extends Container implements Chart<T> {
2727
private String chartId;
2828
private ChartOption options;
29-
private final List<String> functions = new LinkedList<>();
30-
private final List<Listener> listeners = new LinkedList<>();
29+
private final List<String> functions = new ArrayList<>();
30+
private final List<Listener> listeners = new ArrayList<>();
3131

3232
@Override
3333
public T addJSFunction(FuncStr funcStr) {

echarts4j-project/src/main/java/com/github/koooooo7/echarts4j/chart/Canvas.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public CanvasBuilder addCharts(Chart<?>... charts) {
121121
* @return the {@link CanvasBuilder} to do further operations.
122122
*/
123123
@SuppressWarnings("unchecked")
124-
public <T extends Chart<T>> CanvasBuilder updateChart(String chartId, Consumer<Optional<T>> chartModifier) {
124+
public <T extends Chart<T>> CanvasBuilder updateChart(String chartId, Consumer<Optional<Chart<T>>> chartModifier) {
125125
chartModifier.accept(Optional.ofNullable((T) (canvas.getCharts().get(chartId))));
126126
return this;
127127
}

echarts4j-project/src/main/java/com/github/koooooo7/echarts4j/helper/DataHelper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import java.util.ArrayList;
77
import java.util.LinkedHashMap;
8-
import java.util.LinkedList;
98
import java.util.List;
109
import java.util.function.Consumer;
1110
import java.util.stream.IntStream;
@@ -18,7 +17,7 @@ public class DataHelper {
1817
public static final String FIELD_VALUE = "value";
1918
private final List<String> dataModelFieldNames;
2019
private final List<Class<?>> dataModelFieldTypes;
21-
private final List<LinkedHashMap<String, Object>> data = new LinkedList<>();
20+
private final List<LinkedHashMap<String, Object>> data = new ArrayList<>();
2221

2322

2423
DataHelper(Builder builder) {

echarts4j-project/src/main/java/com/github/koooooo7/echarts4j/option/ChartOption.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import lombok.Data;
1414
import lombok.experimental.SuperBuilder;
1515

16+
import java.util.ArrayList;
1617
import java.util.LinkedList;
1718
import java.util.List;
1819

@@ -32,7 +33,7 @@ public class ChartOption {
3233
private Object color;
3334
private Boolean animation;
3435
private Boolean useUTC;
35-
private final List<SeriesOption> series = new LinkedList<>();
36+
private final List<SeriesOption> series = new ArrayList<>();
3637

3738
public final ChartOption addSeries(SeriesOption seriesOption) {
3839
series.add(seriesOption);

echarts4j-project/src/main/java/com/github/koooooo7/echarts4j/util/ChartUtil.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ public class ChartUtil {
1212
private static final String INSTANCE_PREFIX = "echarts4j_";
1313
private static final String INSTANCE_PLACEHOLDER = "%MY_ECHARTS%";
1414

15-
public static String injectInstance(String funcStr, Chart chart) {
15+
public static String injectInstance(String funcStr, Chart<?> chart) {
1616
return funcStr.replaceAll(INSTANCE_PLACEHOLDER, INSTANCE_PREFIX + chart.getChartId());
1717
}
1818

19+
public static String getFullEchartsChartId(String rawChartId) {
20+
return INSTANCE_PREFIX + rawChartId;
21+
}
22+
1923
public static String generateChartId() {
2024
return RandomStringUtils.random(10, true, true);
2125
}

echarts4j-project/src/test/java/com/github/koooooo7/echarts4j/canvas/CanvasTests.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import java.io.PrintWriter;
2929
import java.io.StringWriter;
3030
import java.util.ArrayList;
31-
import java.util.LinkedList;
3231
import java.util.List;
3332
import java.util.concurrent.ThreadLocalRandom;
3433
import java.util.regex.Matcher;
@@ -230,7 +229,7 @@ void shouldRenderCorrect_WhenCallTheCanvas_GivenConfigAndTwoCharts() throws IOEx
230229
final String legendFormatter = "'Legend {name}'";
231230
final String seriesName = "seriesName";
232231
final String seriesName2 = "seriesName2";
233-
final LinkedList<String> chartTypes = new LinkedList<>();
232+
final List<String> chartTypes = new ArrayList<>();
234233
chartTypes.add("line");
235234
chartTypes.add("bar");
236235
chartTypes.add("line");
@@ -249,7 +248,7 @@ void shouldRenderCorrect_WhenCallTheCanvas_GivenConfigAndTwoCharts() throws IOEx
249248
.build()
250249
.addSeries(GenericSeriesOption.builder()
251250
.name(seriesName2)
252-
.type(chartTypes.pop())
251+
.type(chartTypes.remove(0))
253252
.data(data2)
254253
.build())
255254
)
@@ -268,7 +267,7 @@ void shouldRenderCorrect_WhenCallTheCanvas_GivenConfigAndTwoCharts() throws IOEx
268267
.build()
269268
.addSeries(GenericSeriesOption.builder()
270269
.name(seriesName)
271-
.type(chartTypes.pop())
270+
.type(chartTypes.remove(0))
272271
.data(data1)
273272
.build())
274273
)

0 commit comments

Comments
 (0)