Skip to content

Commit c3bbb0b

Browse files
javier-godoypaodb
authored andcommitted
feat: add compatibility with Vaadin 25
Close #4
1 parent d608670 commit c3bbb0b

2 files changed

Lines changed: 37 additions & 3 deletions

File tree

src/main/java/com/flowingcode/vaadin/addons/litetemplate/LitRendererBuilder.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* #%L
33
* Lite Renderer Add-On
44
* %%
5-
* Copyright (C) 2024 Flowing Code
5+
* Copyright (C) 2024 - 2026 Flowing Code
66
* %%
77
* Licensed under the Apache License, Version 2.0 (the "License");
88
* you may not use this file except in compliance with the License.
@@ -19,23 +19,29 @@
1919
*/
2020
package com.flowingcode.vaadin.addons.litetemplate;
2121

22+
import com.flowingcode.vaadin.jsonmigration.JsonMigration;
2223
import com.vaadin.flow.component.ClickEvent;
2324
import com.vaadin.flow.component.Component;
2425
import com.vaadin.flow.component.button.Button;
2526
import com.vaadin.flow.data.renderer.LitRenderer;
2627
import com.vaadin.flow.dom.Element;
2728
import com.vaadin.flow.function.SerializableBiConsumer;
2829
import com.vaadin.flow.function.ValueProvider;
30+
import com.vaadin.flow.server.Version;
2931
import elemental.json.JsonArray;
3032
import elemental.json.JsonBoolean;
3133
import elemental.json.JsonNumber;
3234
import elemental.json.JsonString;
3335
import elemental.json.JsonValue;
36+
import java.lang.invoke.MethodHandle;
37+
import java.lang.invoke.MethodHandles;
38+
import java.lang.invoke.MethodType;
3439
import java.util.HashMap;
3540
import java.util.List;
3641
import java.util.Map;
3742
import java.util.function.Consumer;
3843
import lombok.NonNull;
44+
import lombok.SneakyThrows;
3945

4046
final class LitRendererBuilder<SOURCE> {
4147

@@ -86,13 +92,38 @@ private LitRenderer<SOURCE> build(
8692

8793
String templateExpression = sb.toString() + "\n";
8894
var renderer = LitRenderer.<SOURCE>of(templateExpression);
89-
functions.forEach((n, v) -> renderer.withFunction(n, v));
95+
functions.forEach((n, v) -> withFunction(renderer, n, v));
9096
properties.forEach((n, v) -> renderer.withProperty(n, v));
9197

9298
setTemplateExpression.accept(templateExpression);
9399
return renderer;
94100
}
95101

102+
@SneakyThrows
103+
private LitRenderer<SOURCE> withFunction(LitRenderer<SOURCE> renderer, String name,
104+
SerializableBiConsumer<SOURCE, JsonArray> handler) {
105+
SerializableBiConsumer<SOURCE, ?> c = handler;
106+
if (Version.getMajorVersion() >= 25) {
107+
c = (source, array) -> handler.accept(source,
108+
(JsonArray) JsonMigration.convertToJsonValue(array));
109+
}
110+
return (LitRenderer<SOURCE>) LitRenderer_withFunction.invokeExact(renderer, name, c);
111+
}
112+
113+
private static final MethodHandle LitRenderer_withFunction = lookup_withFunction();
114+
115+
@SneakyThrows
116+
private static MethodHandle lookup_withFunction() {
117+
MethodHandles.Lookup lookup = MethodHandles.lookup();
118+
MethodType methodType = MethodType.methodType(
119+
LitRenderer.class,
120+
String.class,
121+
SerializableBiConsumer.class
122+
);
123+
124+
return lookup.findVirtual(LitRenderer.class, "withFunction", methodType);
125+
}
126+
96127
private String addFunction(SerializableBiConsumer<SOURCE, JsonArray> handler) {
97128
String name = "function" + functions.size();
98129
functions.put(name, handler);

src/main/java/com/flowingcode/vaadin/addons/litetemplate/LiteComponent.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* #%L
33
* Lite Renderer Add-On
44
* %%
5-
* Copyright (C) 2024 Flowing Code
5+
* Copyright (C) 2024 - 2026 Flowing Code
66
* %%
77
* Licensed under the Apache License, Version 2.0 (the "License");
88
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
1919
*/
2020
package com.flowingcode.vaadin.addons.litetemplate;
2121

22+
import com.flowingcode.vaadin.jsonmigration.JsonMigration;
2223
import com.vaadin.flow.component.Component;
2324
import com.vaadin.flow.component.ComponentEventBus;
2425
import com.vaadin.flow.dom.Element;
@@ -31,6 +32,7 @@
3132
import java.util.List;
3233
import java.util.Map;
3334
import lombok.NonNull;
35+
import lombok.experimental.ExtensionMethod;
3436

3537
/**
3638
* Wrapper around a {@code Component} that provides fluent methods for managing attributes,
@@ -40,6 +42,7 @@
4042
* @author Javier Godoy
4143
*/
4244
@SuppressWarnings("serial")
45+
@ExtensionMethod(value = JsonMigration.class, suppressBaseMethods = true)
4346
public final class LiteComponent<COMPONENT extends Component> extends Component {
4447

4548
// The wrapped component that is being managed.

0 commit comments

Comments
 (0)