Skip to content

Commit 698fc8a

Browse files
authored
chore!: Change Dependency.toJson() to return Jackson ObjectNode (#22653)
Server-side code now uses Jackson's automatic bean serialization via valueToTree(). Client-side GWT tests use helper methods to manually construct elemental JSON when needed for testing.
1 parent e68a499 commit 698fc8a

File tree

7 files changed

+151
-81
lines changed

7 files changed

+151
-81
lines changed

flow-client/src/test-gwt/java/com/vaadin/client/GwtDependencyLoaderTest.java

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import elemental.json.JsonArray;
3434
import elemental.json.JsonObject;
3535

36+
import static com.vaadin.client.DependencyTestHelper.createDependencyJson;
37+
3638
/**
3739
* This class is used to test {@link DependencyLoader} GWT functionality, that
3840
* is required to process dependencies with load mode {@link LoadMode#LAZY}.
@@ -151,15 +153,15 @@ public void testAllEagerDependenciesAreLoadedFirst() {
151153
String lazyCssUrl = "https://foo.bar/style.css";
152154

153155
new DependencyLoader(registry).loadDependencies(createDependenciesMap(
154-
new Dependency(Dependency.Type.JAVASCRIPT, lazyJsUrl,
155-
LoadMode.LAZY).toJson(),
156-
new Dependency(Dependency.Type.STYLESHEET, lazyCssUrl,
157-
LoadMode.LAZY).toJson(),
156+
createDependencyJson(Dependency.Type.JAVASCRIPT, lazyJsUrl,
157+
LoadMode.LAZY),
158+
createDependencyJson(Dependency.Type.STYLESHEET, lazyCssUrl,
159+
LoadMode.LAZY),
158160

159-
new Dependency(Dependency.Type.JAVASCRIPT, eagerJsUrl,
160-
LoadMode.EAGER).toJson(),
161-
new Dependency(Dependency.Type.STYLESHEET, eagerCssUrl,
162-
LoadMode.EAGER).toJson()));
161+
createDependencyJson(Dependency.Type.JAVASCRIPT, eagerJsUrl,
162+
LoadMode.EAGER),
163+
createDependencyJson(Dependency.Type.STYLESHEET, eagerCssUrl,
164+
LoadMode.EAGER)));
163165

164166
assertEquals(Arrays.asList(eagerJsUrl, lazyJsUrl),
165167
mockResourceLoader.loadingScripts);
@@ -176,14 +178,14 @@ public void testEnsureLazyDependenciesLoadedInOrder() {
176178
String cssUrl2 = "/2.css";
177179

178180
new DependencyLoader(registry).loadDependencies(createDependenciesMap(
179-
new Dependency(Dependency.Type.JAVASCRIPT, jsUrl1,
180-
LoadMode.LAZY).toJson(),
181-
new Dependency(Dependency.Type.JAVASCRIPT, jsUrl2,
182-
LoadMode.LAZY).toJson(),
183-
new Dependency(Dependency.Type.STYLESHEET, cssUrl1,
184-
LoadMode.LAZY).toJson(),
185-
new Dependency(Dependency.Type.STYLESHEET, cssUrl2,
186-
LoadMode.LAZY).toJson()));
181+
createDependencyJson(Dependency.Type.JAVASCRIPT, jsUrl1,
182+
LoadMode.LAZY),
183+
createDependencyJson(Dependency.Type.JAVASCRIPT, jsUrl2,
184+
LoadMode.LAZY),
185+
createDependencyJson(Dependency.Type.STYLESHEET, cssUrl1,
186+
LoadMode.LAZY),
187+
createDependencyJson(Dependency.Type.STYLESHEET, cssUrl2,
188+
LoadMode.LAZY)));
187189

188190
assertEquals(
189191
"jsUrl1 should come before jsUrl2, because it was added earlier",
@@ -208,17 +210,17 @@ public void testDependenciesWithAllLoadModesAreProcessed() {
208210
new DependencyLoader(registry).loadDependencies(createDependenciesMap(
209211
createInlineDependency(Dependency.Type.JAVASCRIPT,
210212
inlineJsContents),
211-
new Dependency(Dependency.Type.JAVASCRIPT, lazyJsUrl,
212-
LoadMode.LAZY).toJson(),
213-
new Dependency(Dependency.Type.JAVASCRIPT, eagerJsUrl,
214-
LoadMode.EAGER).toJson(),
213+
createDependencyJson(Dependency.Type.JAVASCRIPT, lazyJsUrl,
214+
LoadMode.LAZY),
215+
createDependencyJson(Dependency.Type.JAVASCRIPT, eagerJsUrl,
216+
LoadMode.EAGER),
215217

216218
createInlineDependency(Dependency.Type.STYLESHEET,
217219
inlineCssContents),
218-
new Dependency(Dependency.Type.STYLESHEET, lazyCssUrl,
219-
LoadMode.LAZY).toJson(),
220-
new Dependency(Dependency.Type.STYLESHEET, eagerCssUrl,
221-
LoadMode.EAGER).toJson()));
220+
createDependencyJson(Dependency.Type.STYLESHEET, lazyCssUrl,
221+
LoadMode.LAZY),
222+
createDependencyJson(Dependency.Type.STYLESHEET, eagerCssUrl,
223+
LoadMode.EAGER)));
222224

223225
// When multiple LoadModes are used, no guarantees on the order can be
224226
// made except
@@ -264,8 +266,7 @@ private JsonArray mergeArrays(JsonArray jsonArray1, JsonArray jsonArray2) {
264266

265267
private JsonObject createInlineDependency(Dependency.Type dependencyType,
266268
String contents) {
267-
JsonObject json = new Dependency(dependencyType, "", LoadMode.INLINE)
268-
.toJson();
269+
JsonObject json = createDependencyJson(dependencyType, "", LoadMode.INLINE);
269270
json.remove(Dependency.KEY_URL);
270271
json.put(Dependency.KEY_CONTENTS, contents);
271272
return json;

flow-client/src/test/java/com/vaadin/client/DependencyLoaderTest.java

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import elemental.json.JsonArray;
3232
import elemental.json.JsonObject;
3333

34+
import static com.vaadin.client.DependencyTestHelper.createDependencyJson;
3435
import static org.junit.Assert.assertEquals;
3536

3637
/**
@@ -139,9 +140,9 @@ public void inlineStyleSheet(String styleSheetContents,
139140
public void loadStylesheet() {
140141
String TEST_URL = "http://foo.bar/baz";
141142

142-
new DependencyLoader(registry).loadDependencies(
143-
createDependenciesMap(new Dependency(Dependency.Type.STYLESHEET,
144-
TEST_URL, LoadMode.EAGER).toJson()));
143+
new DependencyLoader(registry)
144+
.loadDependencies(createDependenciesMap(createDependencyJson(
145+
Dependency.Type.STYLESHEET, TEST_URL, LoadMode.EAGER)));
145146

146147
assertEquals(Collections.singletonList(TEST_URL),
147148
mockResourceLoader.loadingStyles);
@@ -151,9 +152,9 @@ public void loadStylesheet() {
151152
public void loadScript() {
152153
String TEST_URL = "http://foo.bar/baz.js";
153154

154-
new DependencyLoader(registry).loadDependencies(
155-
createDependenciesMap(new Dependency(Dependency.Type.JAVASCRIPT,
156-
TEST_URL, LoadMode.EAGER).toJson()));
155+
new DependencyLoader(registry)
156+
.loadDependencies(createDependenciesMap(createDependencyJson(
157+
Dependency.Type.JAVASCRIPT, TEST_URL, LoadMode.EAGER)));
157158

158159
assertEquals(Collections.singletonList(TEST_URL),
159160
mockResourceLoader.loadingScripts);
@@ -166,12 +167,12 @@ public void loadMultiple() {
166167
String TEST_CSS_URL = "https://x.yz/styles.css";
167168

168169
new DependencyLoader(registry).loadDependencies(createDependenciesMap(
169-
new Dependency(Dependency.Type.JAVASCRIPT, TEST_JS_URL,
170-
LoadMode.EAGER).toJson(),
171-
new Dependency(Dependency.Type.JAVASCRIPT, TEST_JS_URL2,
172-
LoadMode.EAGER).toJson(),
173-
new Dependency(Dependency.Type.STYLESHEET, TEST_CSS_URL,
174-
LoadMode.EAGER).toJson()));
170+
createDependencyJson(Dependency.Type.JAVASCRIPT, TEST_JS_URL,
171+
LoadMode.EAGER),
172+
createDependencyJson(Dependency.Type.JAVASCRIPT, TEST_JS_URL2,
173+
LoadMode.EAGER),
174+
createDependencyJson(Dependency.Type.STYLESHEET, TEST_CSS_URL,
175+
LoadMode.EAGER)));
175176

176177
assertEquals(Arrays.asList(TEST_JS_URL, TEST_JS_URL2),
177178
mockResourceLoader.loadingScripts);
@@ -187,14 +188,14 @@ public void ensureEagerDependenciesLoadedInOrder() {
187188
String cssUrl2 = "/2.css";
188189

189190
new DependencyLoader(registry).loadDependencies(createDependenciesMap(
190-
new Dependency(Dependency.Type.JAVASCRIPT, jsUrl1,
191-
LoadMode.EAGER).toJson(),
192-
new Dependency(Dependency.Type.JAVASCRIPT, jsUrl2,
193-
LoadMode.EAGER).toJson(),
194-
new Dependency(Dependency.Type.STYLESHEET, cssUrl1,
195-
LoadMode.EAGER).toJson(),
196-
new Dependency(Dependency.Type.STYLESHEET, cssUrl2,
197-
LoadMode.EAGER).toJson()));
191+
createDependencyJson(Dependency.Type.JAVASCRIPT, jsUrl1,
192+
LoadMode.EAGER),
193+
createDependencyJson(Dependency.Type.JAVASCRIPT, jsUrl2,
194+
LoadMode.EAGER),
195+
createDependencyJson(Dependency.Type.STYLESHEET, cssUrl1,
196+
LoadMode.EAGER),
197+
createDependencyJson(Dependency.Type.STYLESHEET, cssUrl2,
198+
LoadMode.EAGER)));
198199

199200
assertEquals(
200201
"jsUrl1 should come before jsUrl2, because it was added earlier",
@@ -264,8 +265,8 @@ private JsonArray mergeArrays(JsonArray jsonArray1, JsonArray jsonArray2) {
264265

265266
private JsonObject createInlineDependency(Dependency.Type dependencyType,
266267
String contents) {
267-
JsonObject json = new Dependency(dependencyType, "", LoadMode.INLINE)
268-
.toJson();
268+
JsonObject json = createDependencyJson(dependencyType, "",
269+
LoadMode.INLINE);
269270
json.remove(Dependency.KEY_URL);
270271
json.put(Dependency.KEY_CONTENTS, contents);
271272
return json;
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
* Copyright 2000-2025 Vaadin Ltd.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
5+
* use this file except in compliance with the License. You may obtain a copy of
6+
* the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations under
14+
* the License.
15+
*/
16+
package com.vaadin.client;
17+
18+
import com.vaadin.flow.shared.ui.Dependency;
19+
import com.vaadin.flow.shared.ui.LoadMode;
20+
21+
import elemental.json.Json;
22+
import elemental.json.JsonObject;
23+
24+
/**
25+
* Test helper for creating Dependency JSON objects. Since Dependency no longer
26+
* has toJson() method, this helper provides convenient methods for tests to
27+
* create JSON representations.
28+
*/
29+
public class DependencyTestHelper {
30+
31+
/**
32+
* Converts a Dependency object to its JSON representation.
33+
*
34+
* @param dependency
35+
* the dependency to convert
36+
* @return JSON representation of the dependency
37+
*/
38+
public static JsonObject dependencyToJson(Dependency dependency) {
39+
JsonObject json = Json.createObject();
40+
json.put(Dependency.KEY_URL, dependency.getUrl());
41+
json.put(Dependency.KEY_TYPE, dependency.getType().name());
42+
json.put(Dependency.KEY_LOAD_MODE, dependency.getLoadMode().name());
43+
if (dependency.getId() != null) {
44+
json.put(Dependency.KEY_ID, dependency.getId());
45+
}
46+
return json;
47+
}
48+
49+
/**
50+
* Creates a JSON representation of a dependency with the given parameters.
51+
* Convenience method that creates a Dependency object and converts it to
52+
* JSON.
53+
*
54+
* @param type
55+
* the dependency type
56+
* @param url
57+
* the dependency URL
58+
* @param loadMode
59+
* the load mode
60+
* @return JSON representation of the dependency
61+
*/
62+
public static JsonObject createDependencyJson(Dependency.Type type,
63+
String url, LoadMode loadMode) {
64+
return dependencyToJson(new Dependency(type, url, loadMode));
65+
}
66+
67+
/**
68+
* Creates a JSON representation of a dependency with the given parameters
69+
* and ID. Convenience method that creates a Dependency object and converts
70+
* it to JSON.
71+
*
72+
* @param type
73+
* the dependency type
74+
* @param url
75+
* the dependency URL
76+
* @param loadMode
77+
* the load mode
78+
* @param id
79+
* the dependency ID
80+
* @return JSON representation of the dependency
81+
*/
82+
public static JsonObject createDependencyJson(Dependency.Type type,
83+
String url, LoadMode loadMode, String id) {
84+
return dependencyToJson(new Dependency(type, url, loadMode, id));
85+
}
86+
}

flow-server/src/main/java/com/vaadin/flow/server/communication/UidlWriter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ private static Map<LoadMode, ArrayNode> groupDependenciesByLoadMode(
248248

249249
private static ObjectNode dependencyToJson(Dependency dependency,
250250
ResolveContext context) {
251-
ObjectNode dependencyJson = JacksonUtils
252-
.mapElemental(dependency.toJson());
251+
ObjectNode dependencyJson = JacksonUtils.getMapper()
252+
.valueToTree(dependency);
253253
if (dependency.getLoadMode() == LoadMode.INLINE) {
254254
dependencyJson.put(Dependency.KEY_CONTENTS,
255255
getDependencyContents(dependency.getUrl(), context));

flow-server/src/main/java/com/vaadin/flow/shared/ui/Dependency.java

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
import java.util.Objects;
2020
import java.util.stream.Stream;
2121

22-
import elemental.json.Json;
23-
import elemental.json.JsonObject;
24-
2522
/**
2623
* Represents an html import, stylesheet or JavaScript to include on the page.
2724
*
@@ -32,7 +29,7 @@ public class Dependency implements Serializable {
3229

3330
public static final String KEY_URL = "url";
3431
public static final String KEY_TYPE = "type";
35-
public static final String KEY_LOAD_MODE = "mode";
32+
public static final String KEY_LOAD_MODE = "loadMode";
3633
public static final String KEY_CONTENTS = "contents";
3734
public static final String KEY_ID = "id";
3835

@@ -169,22 +166,6 @@ public String getId() {
169166
return id;
170167
}
171168

172-
/**
173-
* Converts the object into json representation.
174-
*
175-
* @return json representation of the object
176-
*/
177-
public JsonObject toJson() {
178-
JsonObject jsonObject = Json.createObject();
179-
jsonObject.put(KEY_URL, url);
180-
jsonObject.put(KEY_TYPE, type.name());
181-
jsonObject.put(KEY_LOAD_MODE, loadMode.name());
182-
if (id != null) {
183-
jsonObject.put(KEY_ID, id);
184-
}
185-
return jsonObject;
186-
}
187-
188169
@Override
189170
public int hashCode() {
190171
return Objects.hash(type, url, loadMode, id);

flow-server/src/test/java/com/vaadin/flow/internal/nodefeature/DependencyListTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,17 +122,17 @@ private void validateDependency(String url, Type dependencyType,
122122
expectedJson.put(Dependency.KEY_TYPE, dependencyType.name());
123123
expectedJson.put(Dependency.KEY_LOAD_MODE, loadMode.name());
124124

125-
elemental.json.JsonObject actualJson = dependency.toJson();
126-
ObjectNode actualMapped = JacksonUtils.mapElemental(actualJson);
125+
ObjectNode actualJson = JacksonUtils.getMapper()
126+
.valueToTree(dependency);
127127

128128
// Remove the ID field from comparison since it's auto-generated for
129129
// some dependencies
130-
actualMapped.remove(Dependency.KEY_ID);
130+
actualJson.remove(Dependency.KEY_ID);
131131

132132
assertTrue(String.format(
133133
"Dependencies' json representations are different, expected = \n'%s'\n, actual = \n'%s'",
134-
expectedJson.toString(), actualMapped.toString()),
135-
JacksonUtils.jsonEquals(expectedJson, actualMapped));
134+
expectedJson.toString(), actualJson.toString()),
135+
JacksonUtils.jsonEquals(expectedJson, actualJson));
136136
}
137137

138138
@Test

flow-server/src/test/java/com/vaadin/flow/shared/ui/DependencyTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717

1818
import org.hamcrest.CoreMatchers;
1919
import org.junit.Test;
20+
import tools.jackson.databind.JsonNode;
2021

21-
import elemental.json.JsonObject;
22+
import com.vaadin.flow.internal.JacksonUtils;
2223

2324
import static org.hamcrest.MatcherAssert.assertThat;
2425
import static org.hamcrest.core.Is.is;
@@ -61,20 +62,20 @@ public void checkJsonSerialization_2ArgsCTor() {
6162
}
6263

6364
private void assertDependency(Dependency dependency) {
64-
JsonObject dependencyJson = dependency.toJson();
65+
JsonNode dependencyJson = JacksonUtils.createNode(dependency);
6566

6667
assertThat("No contents should be present in json now",
67-
dependencyJson.hasKey(Dependency.KEY_CONTENTS), is(false));
68+
dependencyJson.has(Dependency.KEY_CONTENTS), is(false));
6869
assertThat(
6970
"Dependency type should match corresponding enum name in pojo",
70-
dependencyJson.getString(Dependency.KEY_TYPE),
71+
dependencyJson.get(Dependency.KEY_TYPE).asText(),
7172
is(dependency.getType().name()));
7273
assertThat("Dependency url should match corresponding url in pojo",
73-
dependencyJson.getString(Dependency.KEY_URL),
74+
dependencyJson.get(Dependency.KEY_URL).asText(),
7475
is(dependency.getUrl()));
7576
assertThat(
7677
"Dependency load mode should match corresponding enum name in pojo",
77-
dependencyJson.getString(Dependency.KEY_LOAD_MODE),
78+
dependencyJson.get(Dependency.KEY_LOAD_MODE).asText(),
7879
is(dependency.getLoadMode().name()));
7980
}
8081

0 commit comments

Comments
 (0)