Skip to content

Commit 60adb20

Browse files
committed
Remove GSON from the configuration classes
1 parent 977422e commit 60adb20

File tree

9 files changed

+103
-171
lines changed

9 files changed

+103
-171
lines changed

java/client/src/org/openqa/selenium/json/InstanceCoercer.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
import java.lang.reflect.Modifier;
2424
import java.lang.reflect.ParameterizedType;
2525
import java.lang.reflect.Type;
26+
import java.util.Arrays;
27+
import java.util.LinkedList;
28+
import java.util.List;
2629
import java.util.Map;
2730
import java.util.Objects;
2831
import java.util.function.BiConsumer;
@@ -91,7 +94,12 @@ public BiFunction<JsonInput, PropertySetting, Object> apply(Type type) {
9194
}
9295

9396
private Map<String, TypeAndWriter> getFieldWriters(Constructor<?> constructor) {
94-
return Stream.of(constructor.getDeclaringClass().getDeclaredFields())
97+
List<Field> fields = new LinkedList<>();
98+
for (Class current = constructor.getDeclaringClass(); current != Object.class; current = current.getSuperclass()) {
99+
fields.addAll(Arrays.asList(current.getDeclaredFields()));
100+
}
101+
102+
return fields.stream()
95103
.filter(field -> !Modifier.isFinal(field.getModifiers()))
96104
.filter(field -> !Modifier.isTransient(field.getModifiers()))
97105
.peek(field -> field.setAccessible(true))

java/client/src/org/openqa/selenium/json/JsonInput.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,11 @@ public String nextString() {
163163
}
164164

165165
public <T> T read(Type type) {
166-
return coercer.coerce(this, type, PropertySetting.BY_NAME);
166+
return read(type, PropertySetting.BY_NAME);
167+
}
168+
169+
public <T> T read(Type type, PropertySetting setter) {
170+
return coercer.coerce(this, type, setter);
167171
}
168172

169173
public void skipValue() {

java/server/src/org/openqa/grid/internal/utils/SelfRegisteringRemote.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,32 @@
1818
package org.openqa.grid.internal.utils;
1919

2020
import static java.nio.charset.StandardCharsets.UTF_8;
21+
import static org.openqa.selenium.json.Json.MAP_TYPE;
2122
import static org.openqa.selenium.remote.http.HttpMethod.GET;
2223
import static org.openqa.selenium.remote.http.HttpMethod.POST;
2324

24-
import com.google.gson.JsonObject;
25-
import com.google.gson.JsonParser;
26-
2725
import org.openqa.grid.common.RegistrationRequest;
2826
import org.openqa.grid.common.exception.GridConfigurationException;
2927
import org.openqa.grid.common.exception.GridException;
3028
import org.openqa.grid.internal.utils.configuration.GridHubConfiguration;
3129
import org.openqa.grid.internal.utils.configuration.GridNodeConfiguration;
30+
import org.openqa.grid.internal.utils.configuration.StandaloneConfiguration;
3231
import org.openqa.grid.shared.GridNodeServer;
3332
import org.openqa.grid.web.servlet.DisplayHelpServlet;
3433
import org.openqa.grid.web.servlet.NodeW3CStatusServlet;
3534
import org.openqa.grid.web.servlet.ResourceServlet;
3635
import org.openqa.grid.web.utils.ExtraServletUtil;
3736
import org.openqa.selenium.Platform;
3837
import org.openqa.selenium.json.Json;
38+
import org.openqa.selenium.json.JsonInput;
3939
import org.openqa.selenium.remote.DesiredCapabilities;
4040
import org.openqa.selenium.remote.http.HttpClient;
4141
import org.openqa.selenium.remote.http.HttpRequest;
4242
import org.openqa.selenium.remote.http.HttpResponse;
4343
import org.openqa.selenium.remote.server.log.LoggingManager;
4444

45+
import java.io.Reader;
46+
import java.io.StringReader;
4547
import java.net.MalformedURLException;
4648
import java.net.URL;
4749
import java.security.InvalidParameterException;
@@ -324,7 +326,7 @@ private void fixUpId() {
324326
hasId = true;
325327
}
326328

327-
void updateConfigWithRealPort() throws MalformedURLException {
329+
void updateConfigWithRealPort() {
328330
if (registrationRequest.getConfiguration().port != 0) {
329331
return;
330332
}
@@ -334,7 +336,6 @@ void updateConfigWithRealPort() throws MalformedURLException {
334336
/**
335337
* uses the hub API to get some of its configuration.
336338
* @return json object of the current hub configuration
337-
* @throws Exception
338339
*/
339340
private GridHubConfiguration getHubConfiguration() throws Exception {
340341
String hubApi =
@@ -347,7 +348,10 @@ private GridHubConfiguration getHubConfiguration() throws Exception {
347348
HttpRequest request = new HttpRequest(GET, url);
348349

349350
HttpResponse response = client.execute(request);
350-
return GridHubConfiguration.loadFromJSON(extractObject(response));
351+
try (Reader reader = new StringReader(response.getContentString());
352+
JsonInput jsonInput = new Json().newInput(reader)) {
353+
return StandaloneConfiguration.loadFromJson(jsonInput, GridHubConfiguration.class);
354+
}
351355
}
352356

353357
private boolean isAlreadyRegistered(RegistrationRequest node) {
@@ -368,14 +372,14 @@ private boolean isAlreadyRegistered(RegistrationRequest node) {
368372
if (response.getStatus() != 200) {
369373
throw new GridException(String.format("The hub responded with %s", response.getStatus()));
370374
}
371-
JsonObject o = extractObject(response);
372-
return o.get("success").getAsBoolean();
375+
Map<String, Object> o = extractObject(response);
376+
return (Boolean) o.get("success");
373377
} catch (Exception e) {
374378
throw new GridException("The hub is down or not responding: " + e.getMessage());
375379
}
376380
}
377381

378-
private static JsonObject extractObject(HttpResponse resp) {
379-
return new JsonParser().parse(resp.getContentString()).getAsJsonObject();
382+
private static Map<String, Object> extractObject(HttpResponse resp) {
383+
return new Json().toType(resp.getContentString(), MAP_TYPE);
380384
}
381385
}

java/server/src/org/openqa/grid/internal/utils/configuration/GridHubConfiguration.java

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,12 @@
1717

1818
package org.openqa.grid.internal.utils.configuration;
1919

20-
import com.google.gson.GsonBuilder;
21-
import com.google.gson.JsonObject;
22-
import com.google.gson.TypeAdapter;
2320
import com.google.gson.annotations.Expose;
24-
import com.google.gson.stream.JsonReader;
25-
import com.google.gson.stream.JsonWriter;
2621

27-
import org.openqa.grid.common.exception.GridConfigurationException;
2822
import org.openqa.grid.internal.listeners.Prioritizer;
2923
import org.openqa.grid.internal.utils.CapabilityMatcher;
3024
import org.openqa.grid.internal.utils.DefaultCapabilityMatcher;
3125

32-
import java.io.IOException;
33-
3426
public class GridHubConfiguration extends GridConfiguration {
3527
public static final String DEFAULT_HUB_CONFIG_FILE = "org/openqa/grid/common/defaults/DefaultHub.json";
3628

@@ -123,22 +115,7 @@ public GridHubConfiguration() {
123115
* @param filePath hub config json file to load configuration from
124116
*/
125117
public static GridHubConfiguration loadFromJSON(String filePath) {
126-
return loadFromJSON(loadJSONFromResourceOrFile(filePath));
127-
}
128-
129-
/**
130-
* @param json JsonObject to load configuration from
131-
*/
132-
public static GridHubConfiguration loadFromJSON(JsonObject json) {
133-
try {
134-
GsonBuilder builder = new GsonBuilder();
135-
GridHubConfiguration.staticAddJsonTypeAdapter(builder);
136-
return builder.excludeFieldsWithoutExposeAnnotation().create()
137-
.fromJson(json, GridHubConfiguration.class);
138-
} catch (Throwable e) {
139-
throw new GridConfigurationException("Error with the JSON of the config : " + e.getMessage(),
140-
e);
141-
}
118+
return StandaloneConfiguration.loadFromJson(filePath, GridHubConfiguration.class);
142119
}
143120

144121
/**
@@ -189,36 +166,4 @@ public String toString(String format) {
189166

190167
return sb.toString();
191168
}
192-
193-
@Override
194-
protected void addJsonTypeAdapter(GsonBuilder builder) {
195-
super.addJsonTypeAdapter(builder);
196-
GridHubConfiguration.staticAddJsonTypeAdapter(builder);
197-
}
198-
protected static void staticAddJsonTypeAdapter(GsonBuilder builder) {
199-
builder.registerTypeAdapter(CapabilityMatcher.class, new CapabilityMatcherAdapter().nullSafe());
200-
builder.registerTypeAdapter(Prioritizer.class, new PrioritizerAdapter().nullSafe());
201-
}
202-
203-
protected static class SimpleClassNameAdapter<T> extends TypeAdapter<T> {
204-
@Override
205-
public void write(JsonWriter out, T value) throws IOException {
206-
out.value(value.getClass().getCanonicalName());
207-
}
208-
@Override
209-
public T read(JsonReader in) throws IOException {
210-
String value = in.nextString();
211-
try {
212-
return (T) Class.forName(value).newInstance();
213-
} catch (Exception e) {
214-
throw new RuntimeException(String.format("String %s could not be coerced to class: %s", value, Class.class.getName()), e);
215-
}
216-
}
217-
}
218-
219-
protected static class CapabilityMatcherAdapter extends SimpleClassNameAdapter<CapabilityMatcher> {
220-
}
221-
222-
protected static class PrioritizerAdapter extends SimpleClassNameAdapter<Prioritizer> {
223-
}
224169
}

java/server/src/org/openqa/grid/internal/utils/configuration/GridNodeConfiguration.java

Lines changed: 17 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,14 @@
1717

1818
package org.openqa.grid.internal.utils.configuration;
1919

20-
import com.google.common.reflect.TypeToken;
20+
import static org.openqa.selenium.json.Json.MAP_TYPE;
21+
2122
import com.google.gson.GsonBuilder;
22-
import com.google.gson.JsonArray;
2323
import com.google.gson.JsonDeserializationContext;
2424
import com.google.gson.JsonDeserializer;
2525
import com.google.gson.JsonElement;
2626
import com.google.gson.JsonObject;
2727
import com.google.gson.JsonParseException;
28-
import com.google.gson.JsonSerializationContext;
29-
import com.google.gson.JsonSerializer;
3028
import com.google.gson.annotations.Expose;
3129

3230
import org.openqa.grid.common.RegistrationRequest;
@@ -35,6 +33,7 @@
3533
import org.openqa.selenium.MutableCapabilities;
3634
import org.openqa.selenium.Platform;
3735
import org.openqa.selenium.json.Json;
36+
import org.openqa.selenium.json.JsonInput;
3837
import org.openqa.selenium.net.NetworkUtils;
3938
import org.openqa.selenium.remote.CapabilityType;
4039
import org.openqa.selenium.remote.DesiredCapabilities;
@@ -43,7 +42,9 @@
4342
import java.net.MalformedURLException;
4443
import java.net.URL;
4544
import java.util.ArrayList;
45+
import java.util.Collection;
4646
import java.util.List;
47+
import java.util.Map;
4748
import java.util.Optional;
4849
import java.util.UUID;
4950
import java.util.stream.Collectors;
@@ -115,14 +116,19 @@ public class GridNodeConfiguration extends GridConfiguration {
115116
/**
116117
* Default DesiredCapabilites
117118
*/
119+
// TODO: Is this really necessary?
118120
static final class DefaultDesiredCapabilitiesBuilder {
119121
static List<MutableCapabilities> getCapabilities() {
120-
JsonObject defaults = loadJSONFromResourceOrFile(DEFAULT_NODE_CONFIG_FILE);
121-
List<MutableCapabilities> caps = new ArrayList<>();
122-
for (JsonElement el : defaults.getAsJsonArray("capabilities")) {
123-
caps.add(new Json().toType(el.toString(), DesiredCapabilities.class));
122+
try (JsonInput jsonInput = loadJsonFromResourceOrFile(DEFAULT_NODE_CONFIG_FILE)) {
123+
Map<String, Object> defaults = jsonInput.read(MAP_TYPE);
124+
List<MutableCapabilities> caps = new ArrayList<>();
125+
for (Object el : (Collection<?>) defaults.get("capabilities")) {
126+
@SuppressWarnings("unchecked")
127+
Map<String, Object> map = (Map<String, Object>) el;
128+
caps.add(new MutableCapabilities(map));
129+
}
130+
return caps;
124131
}
125-
return caps;
126132
}
127133
}
128134

@@ -382,7 +388,7 @@ public String toString(String format) {
382388
* @param filePath node config json file to load configuration from
383389
*/
384390
public static GridNodeConfiguration loadFromJSON(String filePath) {
385-
return loadFromJSON(loadJSONFromResourceOrFile(filePath));
391+
return StandaloneConfiguration.loadFromJson(filePath, GridNodeConfiguration.class);
386392
}
387393

388394
/**
@@ -391,7 +397,6 @@ public static GridNodeConfiguration loadFromJSON(String filePath) {
391397
public static GridNodeConfiguration loadFromJSON(JsonObject json) {
392398
try {
393399
GsonBuilder builder = new GsonBuilder();
394-
GridNodeConfiguration.staticAddJsonTypeAdapter(builder);
395400
GridNodeConfiguration config =
396401
builder.excludeFieldsWithoutExposeAnnotation().create().fromJson(json, GridNodeConfiguration.class);
397402

@@ -410,36 +415,7 @@ public static GridNodeConfiguration loadFromJSON(JsonObject json) {
410415
}
411416
}
412417

413-
@Override
414-
protected void addJsonTypeAdapter(GsonBuilder builder) {
415-
super.addJsonTypeAdapter(builder);
416-
GridNodeConfiguration.staticAddJsonTypeAdapter(builder);
417-
}
418-
419-
protected static void staticAddJsonTypeAdapter(GsonBuilder builder) {
420-
builder.registerTypeAdapter(new TypeToken<List<MutableCapabilities>>(){}.getType(),
421-
new CollectionOfDesiredCapabilitiesSerializer());
422-
builder.registerTypeAdapter(new TypeToken<List<MutableCapabilities>>(){}.getType(),
423-
new CollectionOfDesiredCapabilitiesDeSerializer());
424-
}
425-
426-
public static class CollectionOfDesiredCapabilitiesSerializer
427-
implements JsonSerializer<List<MutableCapabilities>> {
428-
429-
@Override
430-
public JsonElement serialize(List<MutableCapabilities> desiredCapabilities, Type type,
431-
JsonSerializationContext jsonSerializationContext) {
432-
433-
JsonArray capabilities = new JsonArray();
434-
Json json = new Json();
435-
for (MutableCapabilities dc : desiredCapabilities) {
436-
capabilities.add(json.toJsonElement(dc));
437-
}
438-
return capabilities;
439-
}
440-
}
441-
442-
public static class CollectionOfDesiredCapabilitiesDeSerializer
418+
public static class CollectionOfDesiredCapabilitiesDeSerializer
443419
implements JsonDeserializer<List<MutableCapabilities>> {
444420

445421
@Override

0 commit comments

Comments
 (0)