]> source.dussan.org Git - sonarqube.git/commitdiff
NO-JIRA Make Gson usage more type-safe
authorMarcono1234 <Marcono1234@users.noreply.github.com>
Tue, 23 Jan 2024 23:59:14 +0000 (00:59 +0100)
committersonartech <sonartech@sonarsource.com>
Mon, 29 Jan 2024 20:03:17 +0000 (20:03 +0000)
Uses `Gson.fromJson(..., TypeToken<T>)` instead of `fromJson(..., Type)`

Also replaces some usage of the deprecated `JsonParser()` constructor.

14 files changed:
server/sonar-alm-client/src/main/java/org/sonar/alm/client/github/GithubApplicationClientImpl.java
server/sonar-alm-client/src/main/java/org/sonar/alm/client/gitlab/GitlabApplicationClient.java
server/sonar-alm-client/src/main/java/org/sonar/alm/client/gitlab/Project.java
server/sonar-alm-client/src/test/java/org/sonar/alm/client/GenericPaginatedHttpClientImplTest.java
server/sonar-auth-github/src/main/java/org/sonar/auth/github/GsonEmail.java
server/sonar-auth-github/src/main/java/org/sonar/auth/github/GsonTeam.java
server/sonar-auth-gitlab/src/main/java/org/sonar/auth/gitlab/GsonGroup.java
server/sonar-server-common/src/main/java/org/sonar/server/qualityprofile/QPMeasureData.java
server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/OAuth2AuthenticationParametersImpl.java
server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/TreeActionIT.java
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SetAction.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/DefaultScannerWsClient.java
sonar-testing-harness/src/main/java/org/sonar/test/JsonAssert.java

index 8e855dbd19a9510bcfb4cf897afd6f97b35258f1..b730be0f32d249ce3715edc0787a390133e1fcd2 100644 (file)
@@ -73,9 +73,12 @@ public class GithubApplicationClientImpl implements GithubApplicationClient {
   protected static final String WRITE_PERMISSION_NAME = "write";
   protected static final String READ_PERMISSION_NAME = "read";
   protected static final String FAILED_TO_REQUEST_BEGIN_MSG = "Failed to request ";
-  private static final Type REPOSITORY_TEAM_LIST_TYPE = TypeToken.getParameterized(List.class, GsonRepositoryTeam.class).getType();
-  private static final Type REPOSITORY_COLLABORATORS_LIST_TYPE = TypeToken.getParameterized(List.class, GsonRepositoryCollaborator.class).getType();
-  private static final Type ORGANIZATION_LIST_TYPE = TypeToken.getParameterized(List.class, GithubBinding.GsonInstallation.class).getType();
+  private static final TypeToken<List<GsonRepositoryTeam>> REPOSITORY_TEAM_LIST_TYPE = new TypeToken<>() {
+  };
+  private static final TypeToken<List<GsonRepositoryCollaborator>> REPOSITORY_COLLABORATORS_LIST_TYPE = new TypeToken<>() {
+  };
+  private static final TypeToken<List<GithubBinding.GsonInstallation>> ORGANIZATION_LIST_TYPE = new TypeToken<>() {
+  };
   protected final GithubApplicationHttpClient githubApplicationHttpClient;
   protected final GithubAppSecurity appSecurity;
   private final GitHubSettings gitHubSettings;
index 661cb439d556f46738b8bcb332a65808ea647846..4db9851c99da56c57aec30105a3830728e714fb4 100644 (file)
@@ -58,8 +58,10 @@ import static java.nio.charset.StandardCharsets.UTF_8;
 public class GitlabApplicationClient {
   private static final Logger LOG = LoggerFactory.getLogger(GitlabApplicationClient.class);
   private static final Gson GSON = new Gson();
-  private static final Type GITLAB_GROUP = TypeToken.getParameterized(List.class, GsonGroup.class).getType();
-  private static final Type GITLAB_USER = TypeToken.getParameterized(List.class, GsonUser.class).getType();
+  private static final TypeToken<List<GsonGroup>> GITLAB_GROUP = new TypeToken<>() {
+  };
+  private static final TypeToken<List<GsonUser>> GITLAB_USER = new TypeToken<>() {
+  };
 
   protected static final String PRIVATE_TOKEN = "Private-Token";
   private static final String GITLAB_GROUPS_MEMBERS_ENDPOINT = "/groups/%s/members";
index f2721a47be32c2a00bf7f154eccc6ebffb699f86..c9bd8e664df0f5633fc52c00b5a4885d5693b85d 100644 (file)
@@ -75,7 +75,7 @@ public class Project {
   public static List<Project> parseJsonArray(String json) {
     Gson gson = new Gson();
     return gson.fromJson(json, new TypeToken<LinkedList<Project>>() {
-    }.getType());
+    });
   }
 
   public long getId() {
index 1d3785333ef4dfad4c5ed7e7e3d2812958e57b3d..54ba48fa24d8b7ddd772bb22f140b97461862100 100644 (file)
@@ -54,7 +54,8 @@ public class GenericPaginatedHttpClientImplTest {
 
   private static final String ENDPOINT = "/test-endpoint";
 
-  private static final Type STRING_LIST_TYPE = TypeToken.getParameterized(List.class, String.class).getType();
+  private static final TypeToken<List<String>> STRING_LIST_TYPE = new TypeToken<>() {
+  };
 
   private Gson gson = new Gson();
 
index f8f0076bdbddd79956a0e904400af596f85362f0..57f73236311c3a45829fd4d582fddfd8d25c56e0 100644 (file)
@@ -58,9 +58,8 @@ public class GsonEmail {
   }
 
   public static List<GsonEmail> parse(String json) {
-    Type collectionType = new TypeToken<Collection<GsonEmail>>() {
-    }.getType();
     Gson gson = new Gson();
-    return gson.fromJson(json, collectionType);
+    return gson.fromJson(json, new TypeToken<List<GsonEmail>>() {
+    });
   }
 }
index 84137f98499b72068a40e0f81e4c4ba7880e48f1..cd5bd25a938191b524dc3f75f08c7c744c3b178f 100644 (file)
@@ -52,10 +52,9 @@ public class GsonTeam {
   }
 
   public static List<GsonTeam> parse(String json) {
-    Type collectionType = new TypeToken<Collection<GsonTeam>>() {
-    }.getType();
     Gson gson = new Gson();
-    return gson.fromJson(json, collectionType);
+    return gson.fromJson(json, new TypeToken<List<GsonTeam>>() {
+    });
   }
 
   public static class GsonOrganization {
index be8a58103341ffbf687fccba95aec1b17de13d23..aaf940d147538a7ba91ee48eb1234c81aee81640 100644 (file)
@@ -55,9 +55,9 @@ public class GsonGroup {
   }
 
   static List<GsonGroup> parse(String json) {
-    Type collectionType = new TypeToken<Collection<GsonGroup>>() {}.getType();
     Gson gson = new Gson();
-    return gson.fromJson(json, collectionType);
+    return gson.fromJson(json, new TypeToken<List<GsonGroup>>() {
+    });
   }
 
 }
index d2d8ea1a62c1273dfa76820101c8202fd17dbe51..4b3866d3ee68f06090e8f21ad599f400aae2cee1 100644 (file)
@@ -48,7 +48,7 @@ public class QPMeasureData {
   }
 
   public static QPMeasureData fromJson(String json) {
-    return new QPMeasureData(StreamSupport.stream(new JsonParser().parse(json).getAsJsonArray().spliterator(), false)
+    return new QPMeasureData(StreamSupport.stream(JsonParser.parseString(json).getAsJsonArray().spliterator(), false)
       .map(jsonElement -> {
         JsonObject jsonProfile = jsonElement.getAsJsonObject();
         return new QualityProfile(
index a02b3e3c364a89bdb394afa6c172b1c5271c464d..d65e483a2219acb6e30db711373b9e81877f8a2a 100644 (file)
 package org.sonar.server.authentication;
 
 import com.google.common.base.Strings;
-import com.google.common.reflect.TypeToken;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
 import java.io.UnsupportedEncodingException;
-import java.lang.reflect.Type;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
@@ -53,8 +52,8 @@ public class OAuth2AuthenticationParametersImpl implements OAuth2AuthenticationP
    */
   private static final String RETURN_TO_PARAMETER = "return_to";
 
-  private static final Type JSON_MAP_TYPE = new TypeToken<HashMap<String, String>>() {
-  }.getType();
+  private static final TypeToken<Map<String, String>> JSON_MAP_TYPE = new TypeToken<>() {
+  };
 
   @Override
   public void init(HttpRequest request, HttpResponse response) {
index b13f6d31c1047d5694afb4481bcb803b21797e6a..cbd822d74ac7779a9f0a10c2d0c94d45e533f62b 100644 (file)
@@ -565,8 +565,7 @@ public class TreeActionIT {
     db.components().insertSnapshot(projectData.getMainBranchComponent());
 
     Date now = new Date();
-    JsonParser jsonParser = new JsonParser();
-    JsonElement jsonTree = jsonParser.parseString(IOUtils.toString(getClass().getResource("tree-example.json"), UTF_8));
+    JsonElement jsonTree = JsonParser.parseString(IOUtils.toString(getClass().getResource("tree-example.json"), UTF_8));
     JsonArray components = jsonTree.getAsJsonObject().getAsJsonArray("components");
     for (int i = 0; i < components.size(); i++) {
       JsonElement componentAsJsonElement = components.get(i);
index 64359dda0ddfb626527a5d1d675e986bfd89e3c9..9060e79de8f613b8b4d79e2fc8b08cca6db4e479 100644 (file)
@@ -1358,7 +1358,7 @@ public class SearchActionIT {
       .setParam("asc", "false")
       .execute();
 
-    JsonElement parse = new JsonParser().parse(response.getInput());
+    JsonElement parse = JsonParser.parseString(response.getInput());
 
     assertThat(parse.getAsJsonObject().get("issues").getAsJsonArray())
       .extracting(o -> o.getAsJsonObject().get("key").getAsString())
index 0a1a8c56cf28bb504c8489c7a9ecc413e784b105..769d44b167179344b82324fff21190e48ab011eb 100644 (file)
@@ -24,7 +24,6 @@ import com.google.common.collect.ListMultimap;
 import com.google.gson.Gson;
 import com.google.gson.JsonSyntaxException;
 import com.google.gson.reflect.TypeToken;
-import java.lang.reflect.Type;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -70,6 +69,8 @@ public class SetAction implements SettingsWsAction {
   private static final Collector<CharSequence, ?, String> COMMA_JOINER = Collectors.joining(",");
   private static final String MSG_NO_EMPTY_VALUE = "A non empty value must be provided";
   private static final int VALUE_MAXIMUM_LENGTH = 4000;
+  private static final TypeToken<Map<String, String>> MAP_TYPE_TOKEN = new TypeToken<>() {
+  };
 
   private final PropertyDefinitions propertyDefinitions;
   private final DbClient dbClient;
@@ -305,11 +306,9 @@ public class SetAction implements SettingsWsAction {
   }
 
   private static Map<String, String> readOneFieldValues(String json, String key) {
-    Type type = new TypeToken<Map<String, String>>() {
-    }.getType();
     Gson gson = GsonHelper.create();
     try {
-      return gson.fromJson(json, type);
+      return gson.fromJson(json, MAP_TYPE_TOKEN);
     } catch (JsonSyntaxException e) {
       throw BadRequestException.create(format("JSON '%s' does not respect expected format for setting '%s'. Ex: {\"field1\":\"value1\", \"field2\":\"value2\"}", json, key));
     }
index 64f32c7fbeed3b28a9b8a04b7305d36afed88c30..7c536195a8c90c1615a5efd6233f329a90d77eea 100644 (file)
@@ -189,8 +189,7 @@ public class DefaultScannerWsClient implements ScannerWsClient {
   @CheckForNull
   private static String tryParseAsJsonError(String responseContent) {
     try {
-      JsonParser parser = new JsonParser();
-      JsonObject obj = parser.parse(responseContent).getAsJsonObject();
+      JsonObject obj = JsonParser.parseString(responseContent).getAsJsonObject();
       JsonArray errors = obj.getAsJsonArray("errors");
       List<String> errorMessages = new ArrayList<>();
       for (JsonElement e : errors) {
index 299bbc9ceebb3440201443591d3f8177f48f0d1e..a24ca30b8e01250d80326f09a619cc27c6c6c903 100644 (file)
@@ -123,7 +123,7 @@ public class JsonAssert {
   }
 
   private static String pretty(String json) {
-    JsonElement gson = new JsonParser().parse(json);
+    JsonElement gson = JsonParser.parseString(json);
     return new GsonBuilder().setPrettyPrinting().serializeNulls().create().toJson(gson);
   }
 }