Add CodeQL GitHub code scanning workflow (#2076)
* Add CodeQL GitHub code scanning workflow * Only compile main sources for code scanning * Move test .proto files to test sources `annotations.proto` also seems to be only relevant for tests because the test explicitly registers them as extensions. By default the Proto adapter does not consider them. * Address some code scanning findings * Fix some more findings
This commit is contained in:
parent
d19e9fe0af
commit
49ddab9eeb
46
.github/workflows/codeql-analysis.yml
vendored
Normal file
46
.github/workflows/codeql-analysis.yml
vendored
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# Based on default config generated by GitHub, see also https://github.com/github/codeql-action
|
||||||
|
|
||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
schedule:
|
||||||
|
# Run every Monday at 16:10
|
||||||
|
- cron: '10 16 * * 1'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'java' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v1
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
# Run all security queries and maintainability and reliability queries
|
||||||
|
queries: +security-and-quality
|
||||||
|
|
||||||
|
# Only compile main sources, but ignore test sources because findings for them might not
|
||||||
|
# be that relevant (though GitHub security view also allows filtering by source type)
|
||||||
|
# Can replace this with github/codeql-action/autobuild action to run complete build
|
||||||
|
- name: Compile sources
|
||||||
|
run: |
|
||||||
|
mvn compile
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v1
|
@ -12,7 +12,7 @@ import java.io.IOException;
|
|||||||
* A type adapter factory that implements {@code @Intercept}.
|
* A type adapter factory that implements {@code @Intercept}.
|
||||||
*/
|
*/
|
||||||
public final class InterceptorFactory implements TypeAdapterFactory {
|
public final class InterceptorFactory implements TypeAdapterFactory {
|
||||||
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
@Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
||||||
Intercept intercept = type.getRawType().getAnnotation(Intercept.class);
|
Intercept intercept = type.getRawType().getAnnotation(Intercept.class);
|
||||||
if (intercept == null) {
|
if (intercept == null) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -141,7 +141,7 @@ public final class InterceptorTest extends TestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static final class UserValidator implements JsonPostDeserializer<User> {
|
public static final class UserValidator implements JsonPostDeserializer<User> {
|
||||||
public void postDeserialize(User user) {
|
@Override public void postDeserialize(User user) {
|
||||||
if (user.name == null || user.password == null) {
|
if (user.name == null || user.password == null) {
|
||||||
throw new JsonSyntaxException("name and password are required fields.");
|
throw new JsonSyntaxException("name and password are required fields.");
|
||||||
}
|
}
|
||||||
@ -161,7 +161,7 @@ public final class InterceptorTest extends TestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static final class AddressValidator implements JsonPostDeserializer<Address> {
|
public static final class AddressValidator implements JsonPostDeserializer<Address> {
|
||||||
public void postDeserialize(Address address) {
|
@Override public void postDeserialize(Address address) {
|
||||||
if (address.city == null || address.state == null || address.zip == null) {
|
if (address.city == null || address.state == null || address.zip == null) {
|
||||||
throw new JsonSyntaxException("Address city, state and zip are required fields.");
|
throw new JsonSyntaxException("Address city, state and zip are required fields.");
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,7 @@ public class PostConstructAdapterFactoryTest extends TestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (o == this) {
|
if (o == this) {
|
||||||
return true;
|
return true;
|
||||||
@ -95,6 +96,7 @@ public class PostConstructAdapterFactoryTest extends TestCase {
|
|||||||
this.sandwiches = sandwiches;
|
this.sandwiches = sandwiches;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (o == this) {
|
if (o == this) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -16,18 +16,16 @@
|
|||||||
|
|
||||||
package com.google.gson.typeadapters;
|
package com.google.gson.typeadapters;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
import com.google.gson.JsonParseException;
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
|
|
||||||
public final class UtcDateTypeAdapterTest extends TestCase {
|
public final class UtcDateTypeAdapterTest extends TestCase {
|
||||||
private final Gson gson = new GsonBuilder()
|
private final Gson gson = new GsonBuilder()
|
||||||
.registerTypeAdapter(Date.class, new UtcDateTypeAdapter())
|
.registerTypeAdapter(Date.class, new UtcDateTypeAdapter())
|
||||||
@ -83,7 +81,7 @@ public final class UtcDateTypeAdapterTest extends TestCase {
|
|||||||
gson.fromJson("2017-06-20T14:32:30", Date.class);
|
gson.fromJson("2017-06-20T14:32:30", Date.class);
|
||||||
fail("No exception");
|
fail("No exception");
|
||||||
} catch (JsonParseException exe) {
|
} catch (JsonParseException exe) {
|
||||||
assertEquals(exe.getMessage(), "java.text.ParseException: Failed to parse date ['2017-06-20T14']: 2017-06-20T14");
|
assertEquals("java.text.ParseException: Failed to parse date ['2017-06-20T14']: 2017-06-20T14", exe.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,6 +187,7 @@ public final class JsonArray extends JsonElement implements Iterable<JsonElement
|
|||||||
*
|
*
|
||||||
* @return an iterator to navigate the elements of the array.
|
* @return an iterator to navigate the elements of the array.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public Iterator<JsonElement> iterator() {
|
public Iterator<JsonElement> iterator() {
|
||||||
return elements.iterator();
|
return elements.iterator();
|
||||||
}
|
}
|
||||||
@ -341,13 +342,12 @@ public final class JsonArray extends JsonElement implements Iterable<JsonElement
|
|||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public char getAsCharacter() {
|
public char getAsCharacter() {
|
||||||
if (elements.size() == 1) {
|
if (elements.size() == 1) {
|
||||||
JsonElement element = elements.get(0);
|
JsonElement element = elements.get(0);
|
||||||
@SuppressWarnings("deprecation")
|
return element.getAsCharacter();
|
||||||
char result = element.getAsCharacter();
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ public final class JsonStreamParser implements Iterator<JsonElement> {
|
|||||||
* @since 1.4
|
* @since 1.4
|
||||||
*/
|
*/
|
||||||
public JsonStreamParser(String json) {
|
public JsonStreamParser(String json) {
|
||||||
this(new StringReader(json));
|
this(new StringReader(json));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -81,6 +81,7 @@ public final class JsonStreamParser implements Iterator<JsonElement> {
|
|||||||
* @throws NoSuchElementException if no {@code JsonElement} is available.
|
* @throws NoSuchElementException if no {@code JsonElement} is available.
|
||||||
* @since 1.4
|
* @since 1.4
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public JsonElement next() throws JsonParseException {
|
public JsonElement next() throws JsonParseException {
|
||||||
if (!hasNext()) {
|
if (!hasNext()) {
|
||||||
throw new NoSuchElementException();
|
throw new NoSuchElementException();
|
||||||
@ -103,6 +104,7 @@ public final class JsonStreamParser implements Iterator<JsonElement> {
|
|||||||
* @throws JsonSyntaxException if the incoming stream is malformed JSON.
|
* @throws JsonSyntaxException if the incoming stream is malformed JSON.
|
||||||
* @since 1.4
|
* @since 1.4
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
try {
|
try {
|
||||||
@ -120,6 +122,7 @@ public final class JsonStreamParser implements Iterator<JsonElement> {
|
|||||||
* implemented.
|
* implemented.
|
||||||
* @since 1.4
|
* @since 1.4
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void remove() {
|
public void remove() {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
@ -505,15 +505,15 @@ public final class $Gson$Types {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type[] getActualTypeArguments() {
|
@Override public Type[] getActualTypeArguments() {
|
||||||
return typeArguments.clone();
|
return typeArguments.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type getRawType() {
|
@Override public Type getRawType() {
|
||||||
return rawType;
|
return rawType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type getOwnerType() {
|
@Override public Type getOwnerType() {
|
||||||
return ownerType;
|
return ownerType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -552,7 +552,7 @@ public final class $Gson$Types {
|
|||||||
this.componentType = canonicalize(componentType);
|
this.componentType = canonicalize(componentType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type getGenericComponentType() {
|
@Override public Type getGenericComponentType() {
|
||||||
return componentType;
|
return componentType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -601,11 +601,11 @@ public final class $Gson$Types {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type[] getUpperBounds() {
|
@Override public Type[] getUpperBounds() {
|
||||||
return new Type[] { upperBound };
|
return new Type[] { upperBound };
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type[] getLowerBounds() {
|
@Override public Type[] getLowerBounds() {
|
||||||
return lowerBound != null ? new Type[] { lowerBound } : EMPTY_TYPE_ARRAY;
|
return lowerBound != null ? new Type[] { lowerBound } : EMPTY_TYPE_ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ public final class Excluder implements TypeAdapterFactory, Cloneable {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) {
|
@Override public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) {
|
||||||
Class<?> rawType = type.getRawType();
|
Class<?> rawType = type.getRawType();
|
||||||
boolean excludeClass = excludeClassChecks(rawType);
|
boolean excludeClass = excludeClassChecks(rawType);
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ import java.util.Set;
|
|||||||
public final class LinkedTreeMap<K, V> extends AbstractMap<K, V> implements Serializable {
|
public final class LinkedTreeMap<K, V> extends AbstractMap<K, V> implements Serializable {
|
||||||
@SuppressWarnings({ "unchecked", "rawtypes" }) // to avoid Comparable<Comparable<Comparable<...>>>
|
@SuppressWarnings({ "unchecked", "rawtypes" }) // to avoid Comparable<Comparable<Comparable<...>>>
|
||||||
private static final Comparator<Comparable> NATURAL_ORDER = new Comparator<Comparable>() {
|
private static final Comparator<Comparable> NATURAL_ORDER = new Comparator<Comparable>() {
|
||||||
public int compare(Comparable a, Comparable b) {
|
@Override public int compare(Comparable a, Comparable b) {
|
||||||
return a.compareTo(b);
|
return a.compareTo(b);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -466,15 +466,15 @@ public final class LinkedTreeMap<K, V> extends AbstractMap<K, V> implements Seri
|
|||||||
next.prev = this;
|
next.prev = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public K getKey() {
|
@Override public K getKey() {
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
public V getValue() {
|
@Override public V getValue() {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public V setValue(V value) {
|
@Override public V setValue(V value) {
|
||||||
V oldValue = this.value;
|
V oldValue = this.value;
|
||||||
this.value = value;
|
this.value = value;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
@ -534,7 +534,7 @@ public final class LinkedTreeMap<K, V> extends AbstractMap<K, V> implements Seri
|
|||||||
LinkedTreeMapIterator() {
|
LinkedTreeMapIterator() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean hasNext() {
|
@Override public final boolean hasNext() {
|
||||||
return next != header;
|
return next != header;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -550,7 +550,7 @@ public final class LinkedTreeMap<K, V> extends AbstractMap<K, V> implements Seri
|
|||||||
return lastReturned = e;
|
return lastReturned = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void remove() {
|
@Override public final void remove() {
|
||||||
if (lastReturned == null) {
|
if (lastReturned == null) {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
@ -567,7 +567,7 @@ public final class LinkedTreeMap<K, V> extends AbstractMap<K, V> implements Seri
|
|||||||
|
|
||||||
@Override public Iterator<Entry<K, V>> iterator() {
|
@Override public Iterator<Entry<K, V>> iterator() {
|
||||||
return new LinkedTreeMapIterator<Entry<K, V>>() {
|
return new LinkedTreeMapIterator<Entry<K, V>>() {
|
||||||
public Entry<K, V> next() {
|
@Override public Entry<K, V> next() {
|
||||||
return nextNode();
|
return nextNode();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -602,7 +602,7 @@ public final class LinkedTreeMap<K, V> extends AbstractMap<K, V> implements Seri
|
|||||||
|
|
||||||
@Override public Iterator<K> iterator() {
|
@Override public Iterator<K> iterator() {
|
||||||
return new LinkedTreeMapIterator<K>() {
|
return new LinkedTreeMapIterator<K>() {
|
||||||
public K next() {
|
@Override public K next() {
|
||||||
return nextNode().key;
|
return nextNode().key;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -105,13 +105,13 @@ public final class Streams {
|
|||||||
*/
|
*/
|
||||||
static class CurrentWrite implements CharSequence {
|
static class CurrentWrite implements CharSequence {
|
||||||
char[] chars;
|
char[] chars;
|
||||||
public int length() {
|
@Override public int length() {
|
||||||
return chars.length;
|
return chars.length;
|
||||||
}
|
}
|
||||||
public char charAt(int i) {
|
@Override public char charAt(int i) {
|
||||||
return chars[i];
|
return chars[i];
|
||||||
}
|
}
|
||||||
public CharSequence subSequence(int start, int end) {
|
@Override public CharSequence subSequence(int start, int end) {
|
||||||
return new String(chars, start, end - start);
|
return new String(chars, start, end - start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1212,7 +1212,7 @@ public class JsonReader implements Closeable {
|
|||||||
/**
|
/**
|
||||||
* Closes this JSON reader and the underlying {@link java.io.Reader}.
|
* Closes this JSON reader and the underlying {@link java.io.Reader}.
|
||||||
*/
|
*/
|
||||||
public void close() throws IOException {
|
@Override public void close() throws IOException {
|
||||||
peeked = PEEKED_NONE;
|
peeked = PEEKED_NONE;
|
||||||
stack[0] = JsonScope.CLOSED;
|
stack[0] = JsonScope.CLOSED;
|
||||||
stackSize = 1;
|
stackSize = 1;
|
||||||
|
@ -571,7 +571,7 @@ public class JsonWriter implements Closeable, Flushable {
|
|||||||
* Ensures all buffered data is written to the underlying {@link Writer}
|
* Ensures all buffered data is written to the underlying {@link Writer}
|
||||||
* and flushes that writer.
|
* and flushes that writer.
|
||||||
*/
|
*/
|
||||||
public void flush() throws IOException {
|
@Override public void flush() throws IOException {
|
||||||
if (stackSize == 0) {
|
if (stackSize == 0) {
|
||||||
throw new IllegalStateException("JsonWriter is closed.");
|
throw new IllegalStateException("JsonWriter is closed.");
|
||||||
}
|
}
|
||||||
@ -583,7 +583,7 @@ public class JsonWriter implements Closeable, Flushable {
|
|||||||
*
|
*
|
||||||
* @throws IOException if the JSON document is incomplete.
|
* @throws IOException if the JSON document is incomplete.
|
||||||
*/
|
*/
|
||||||
public void close() throws IOException {
|
@Override public void close() throws IOException {
|
||||||
out.close();
|
out.close();
|
||||||
|
|
||||||
int size = stackSize;
|
int size = stackSize;
|
||||||
|
@ -130,7 +130,7 @@ public class GsonTypeAdapterTest extends TestCase {
|
|||||||
private void assertSerialized(String expected, Class<?> instanceType, boolean registerAbstractDeserializer,
|
private void assertSerialized(String expected, Class<?> instanceType, boolean registerAbstractDeserializer,
|
||||||
boolean registerAbstractHierarchyDeserializer, Object instance) {
|
boolean registerAbstractHierarchyDeserializer, Object instance) {
|
||||||
JsonDeserializer<Abstract> deserializer = new JsonDeserializer<Abstract>() {
|
JsonDeserializer<Abstract> deserializer = new JsonDeserializer<Abstract>() {
|
||||||
public Abstract deserialize(JsonElement json, Type typeOfT,
|
@Override public Abstract deserialize(JsonElement json, Type typeOfT,
|
||||||
JsonDeserializationContext context) throws JsonParseException {
|
JsonDeserializationContext context) throws JsonParseException {
|
||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ public class CircularReferenceTest extends TestCase {
|
|||||||
ClassWithSelfReference obj = new ClassWithSelfReference();
|
ClassWithSelfReference obj = new ClassWithSelfReference();
|
||||||
obj.child = obj;
|
obj.child = obj;
|
||||||
Gson gson = new GsonBuilder().registerTypeAdapter(ClassWithSelfReference.class, new JsonSerializer<ClassWithSelfReference>() {
|
Gson gson = new GsonBuilder().registerTypeAdapter(ClassWithSelfReference.class, new JsonSerializer<ClassWithSelfReference>() {
|
||||||
public JsonElement serialize(ClassWithSelfReference src, Type typeOfSrc,
|
@Override public JsonElement serialize(ClassWithSelfReference src, Type typeOfSrc,
|
||||||
JsonSerializationContext context) {
|
JsonSerializationContext context) {
|
||||||
JsonObject obj = new JsonObject();
|
JsonObject obj = new JsonObject();
|
||||||
obj.addProperty("property", "value");
|
obj.addProperty("property", "value");
|
||||||
|
@ -328,7 +328,7 @@ public class CollectionTest extends TestCase {
|
|||||||
public void testUserCollectionTypeAdapter() {
|
public void testUserCollectionTypeAdapter() {
|
||||||
Type listOfString = new TypeToken<List<String>>() {}.getType();
|
Type listOfString = new TypeToken<List<String>>() {}.getType();
|
||||||
Object stringListSerializer = new JsonSerializer<List<String>>() {
|
Object stringListSerializer = new JsonSerializer<List<String>>() {
|
||||||
public JsonElement serialize(List<String> src, Type typeOfSrc,
|
@Override public JsonElement serialize(List<String> src, Type typeOfSrc,
|
||||||
JsonSerializationContext context) {
|
JsonSerializationContext context) {
|
||||||
return new JsonPrimitive(src.get(0) + ";" + src.get(1));
|
return new JsonPrimitive(src.get(0) + ";" + src.get(1));
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ public class ConcurrencyTest extends TestCase {
|
|||||||
ExecutorService executor = Executors.newFixedThreadPool(10);
|
ExecutorService executor = Executors.newFixedThreadPool(10);
|
||||||
for (int taskCount = 0; taskCount < 10; taskCount++) {
|
for (int taskCount = 0; taskCount < 10; taskCount++) {
|
||||||
executor.execute(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
public void run() {
|
@Override public void run() {
|
||||||
MyObject myObj = new MyObject();
|
MyObject myObj = new MyObject();
|
||||||
try {
|
try {
|
||||||
startLatch.await();
|
startLatch.await();
|
||||||
@ -102,7 +102,7 @@ public class ConcurrencyTest extends TestCase {
|
|||||||
ExecutorService executor = Executors.newFixedThreadPool(10);
|
ExecutorService executor = Executors.newFixedThreadPool(10);
|
||||||
for (int taskCount = 0; taskCount < 10; taskCount++) {
|
for (int taskCount = 0; taskCount < 10; taskCount++) {
|
||||||
executor.execute(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
public void run() {
|
@Override public void run() {
|
||||||
try {
|
try {
|
||||||
startLatch.await();
|
startLatch.await();
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
|
@ -91,7 +91,7 @@ public class CustomSerializerTest extends TestCase {
|
|||||||
public void testSerializerReturnsNull() {
|
public void testSerializerReturnsNull() {
|
||||||
Gson gson = new GsonBuilder()
|
Gson gson = new GsonBuilder()
|
||||||
.registerTypeAdapter(Base.class, new JsonSerializer<Base>() {
|
.registerTypeAdapter(Base.class, new JsonSerializer<Base>() {
|
||||||
public JsonElement serialize(Base src, Type typeOfSrc, JsonSerializationContext context) {
|
@Override public JsonElement serialize(Base src, Type typeOfSrc, JsonSerializationContext context) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -470,7 +470,7 @@ public class DefaultTypeAdaptersTest extends TestCase {
|
|||||||
Gson gson = new GsonBuilder()
|
Gson gson = new GsonBuilder()
|
||||||
.setDateFormat(pattern)
|
.setDateFormat(pattern)
|
||||||
.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
|
.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
|
||||||
public Date deserialize(JsonElement json, Type typeOfT,
|
@Override public Date deserialize(JsonElement json, Type typeOfT,
|
||||||
JsonDeserializationContext context)
|
JsonDeserializationContext context)
|
||||||
throws JsonParseException {
|
throws JsonParseException {
|
||||||
return new Date(1315806903103L);
|
return new Date(1315806903103L);
|
||||||
|
@ -40,6 +40,7 @@ public class GsonVersionDiagnosticsTest extends TestCase {
|
|||||||
private Gson gson;
|
private Gson gson;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
@Override
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
gson = new GsonBuilder().registerTypeAdapter(TestType.class, new TypeAdapter<TestType>() {
|
gson = new GsonBuilder().registerTypeAdapter(TestType.class, new TypeAdapter<TestType>() {
|
||||||
@Override public void write(JsonWriter out, TestType value) {
|
@Override public void write(JsonWriter out, TestType value) {
|
||||||
|
@ -88,7 +88,7 @@ public final class JsonAdapterAnnotationOnClassesTest extends TestCase {
|
|||||||
*/
|
*/
|
||||||
public void testRegisteredSerializerOverridesJsonAdapter() {
|
public void testRegisteredSerializerOverridesJsonAdapter() {
|
||||||
JsonSerializer<A> serializer = new JsonSerializer<A>() {
|
JsonSerializer<A> serializer = new JsonSerializer<A>() {
|
||||||
public JsonElement serialize(A src, Type typeOfSrc,
|
@Override public JsonElement serialize(A src, Type typeOfSrc,
|
||||||
JsonSerializationContext context) {
|
JsonSerializationContext context) {
|
||||||
return new JsonPrimitive("registeredSerializer");
|
return new JsonPrimitive("registeredSerializer");
|
||||||
}
|
}
|
||||||
@ -107,7 +107,7 @@ public final class JsonAdapterAnnotationOnClassesTest extends TestCase {
|
|||||||
*/
|
*/
|
||||||
public void testRegisteredDeserializerOverridesJsonAdapter() {
|
public void testRegisteredDeserializerOverridesJsonAdapter() {
|
||||||
JsonDeserializer<A> deserializer = new JsonDeserializer<A>() {
|
JsonDeserializer<A> deserializer = new JsonDeserializer<A>() {
|
||||||
public A deserialize(JsonElement json, Type typeOfT,
|
@Override public A deserialize(JsonElement json, Type typeOfT,
|
||||||
JsonDeserializationContext context) throws JsonParseException {
|
JsonDeserializationContext context) throws JsonParseException {
|
||||||
return new A("registeredDeserializer");
|
return new A("registeredDeserializer");
|
||||||
}
|
}
|
||||||
|
@ -284,7 +284,7 @@ public class MapTest extends TestCase {
|
|||||||
|
|
||||||
public void testMapSubclassDeserialization() {
|
public void testMapSubclassDeserialization() {
|
||||||
Gson gson = new GsonBuilder().registerTypeAdapter(MyMap.class, new InstanceCreator<MyMap>() {
|
Gson gson = new GsonBuilder().registerTypeAdapter(MyMap.class, new InstanceCreator<MyMap>() {
|
||||||
public MyMap createInstance(Type type) {
|
@Override public MyMap createInstance(Type type) {
|
||||||
return new MyMap();
|
return new MyMap();
|
||||||
}
|
}
|
||||||
}).create();
|
}).create();
|
||||||
@ -299,7 +299,7 @@ public class MapTest extends TestCase {
|
|||||||
null, Map.class, String.class, Long.class);
|
null, Map.class, String.class, Long.class);
|
||||||
Gson gson = new GsonBuilder()
|
Gson gson = new GsonBuilder()
|
||||||
.registerTypeAdapter(type, new JsonSerializer<Map<String, Long>>() {
|
.registerTypeAdapter(type, new JsonSerializer<Map<String, Long>>() {
|
||||||
public JsonElement serialize(Map<String, Long> src, Type typeOfSrc,
|
@Override public JsonElement serialize(Map<String, Long> src, Type typeOfSrc,
|
||||||
JsonSerializationContext context) {
|
JsonSerializationContext context) {
|
||||||
JsonArray array = new JsonArray();
|
JsonArray array = new JsonArray();
|
||||||
for (long value : src.values()) {
|
for (long value : src.values()) {
|
||||||
@ -493,7 +493,7 @@ public class MapTest extends TestCase {
|
|||||||
+ "\"subs\":{\"Test\":" + subTypeJson + "}}";
|
+ "\"subs\":{\"Test\":" + subTypeJson + "}}";
|
||||||
|
|
||||||
JsonSerializer<TestTypes.Base> baseTypeAdapter = new JsonSerializer<TestTypes.Base>() {
|
JsonSerializer<TestTypes.Base> baseTypeAdapter = new JsonSerializer<TestTypes.Base>() {
|
||||||
public JsonElement serialize(TestTypes.Base src, Type typeOfSrc,
|
@Override public JsonElement serialize(TestTypes.Base src, Type typeOfSrc,
|
||||||
JsonSerializationContext context) {
|
JsonSerializationContext context) {
|
||||||
return baseTypeJsonElement;
|
return baseTypeJsonElement;
|
||||||
}
|
}
|
||||||
|
@ -298,7 +298,7 @@ public class ObjectTest extends TestCase {
|
|||||||
gson = new GsonBuilder()
|
gson = new GsonBuilder()
|
||||||
.registerTypeHierarchyAdapter(ClassWithNoFields.class,
|
.registerTypeHierarchyAdapter(ClassWithNoFields.class,
|
||||||
new JsonSerializer<ClassWithNoFields>() {
|
new JsonSerializer<ClassWithNoFields>() {
|
||||||
public JsonElement serialize(
|
@Override public JsonElement serialize(
|
||||||
ClassWithNoFields src, Type typeOfSrc, JsonSerializationContext context) {
|
ClassWithNoFields src, Type typeOfSrc, JsonSerializationContext context) {
|
||||||
return new JsonObject();
|
return new JsonObject();
|
||||||
}
|
}
|
||||||
@ -342,7 +342,7 @@ public class ObjectTest extends TestCase {
|
|||||||
final Parent p = new Parent();
|
final Parent p = new Parent();
|
||||||
Gson gson = new GsonBuilder().registerTypeAdapter(
|
Gson gson = new GsonBuilder().registerTypeAdapter(
|
||||||
Parent.Child.class, new InstanceCreator<Parent.Child>() {
|
Parent.Child.class, new InstanceCreator<Parent.Child>() {
|
||||||
public Parent.Child createInstance(Type type) {
|
@Override public Parent.Child createInstance(Type type) {
|
||||||
return p.new Child();
|
return p.new Child();
|
||||||
}
|
}
|
||||||
}).create();
|
}).create();
|
||||||
|
@ -155,7 +155,7 @@ public final class StreamingTypeAdaptersTest extends TestCase {
|
|||||||
String[] values = in.nextString().split(",");
|
String[] values = in.nextString().split(",");
|
||||||
return new Person(values[0], Integer.parseInt(values[1]));
|
return new Person(values[0], Integer.parseInt(values[1]));
|
||||||
}
|
}
|
||||||
public void write(JsonWriter out, Person person) throws IOException {
|
@Override public void write(JsonWriter out, Person person) throws IOException {
|
||||||
out.value(person.name + "," + person.age);
|
out.value(person.name + "," + person.age);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -21,9 +21,6 @@ import com.google.gson.TypeAdapter;
|
|||||||
import com.google.gson.internal.$Gson$Types;
|
import com.google.gson.internal.$Gson$Types;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import java.io.PrintStream;
|
|
||||||
import java.lang.ref.WeakReference;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test fixes for infinite recursion on {@link $Gson$Types#resolve(java.lang.reflect.Type, Class,
|
* Test fixes for infinite recursion on {@link $Gson$Types#resolve(java.lang.reflect.Type, Class,
|
||||||
* java.lang.reflect.Type)}, described at <a href="https://github.com/google/gson/issues/440">Issue #440</a>
|
* java.lang.reflect.Type)}, described at <a href="https://github.com/google/gson/issues/440">Issue #440</a>
|
||||||
|
@ -19,6 +19,7 @@ package com.google.gson.metrics;
|
|||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.fasterxml.jackson.core.JsonFactory;
|
import com.fasterxml.jackson.core.JsonFactory;
|
||||||
import com.fasterxml.jackson.core.JsonFactoryBuilder;
|
import com.fasterxml.jackson.core.JsonFactoryBuilder;
|
||||||
|
import com.fasterxml.jackson.core.JsonToken;
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
import com.fasterxml.jackson.databind.MapperFeature;
|
import com.fasterxml.jackson.databind.MapperFeature;
|
||||||
@ -224,7 +225,8 @@ public final class ParseBenchmark {
|
|||||||
com.fasterxml.jackson.core.JsonParser jp = jsonFactory.createParser(new CharArrayReader(data));
|
com.fasterxml.jackson.core.JsonParser jp = jsonFactory.createParser(new CharArrayReader(data));
|
||||||
int depth = 0;
|
int depth = 0;
|
||||||
do {
|
do {
|
||||||
switch (jp.nextToken()) {
|
JsonToken token = jp.nextToken();
|
||||||
|
switch (token) {
|
||||||
case START_OBJECT:
|
case START_OBJECT:
|
||||||
case START_ARRAY:
|
case START_ARRAY:
|
||||||
depth++;
|
depth++;
|
||||||
@ -243,6 +245,15 @@ public final class ParseBenchmark {
|
|||||||
case VALUE_NUMBER_FLOAT:
|
case VALUE_NUMBER_FLOAT:
|
||||||
jp.getLongValue();
|
jp.getLongValue();
|
||||||
break;
|
break;
|
||||||
|
case VALUE_TRUE:
|
||||||
|
case VALUE_FALSE:
|
||||||
|
jp.getBooleanValue();
|
||||||
|
break;
|
||||||
|
case VALUE_NULL:
|
||||||
|
// Do nothing; nextToken() will advance in stream
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Unexpected token " + token);
|
||||||
}
|
}
|
||||||
} while (depth > 0);
|
} while (depth > 0);
|
||||||
jp.close();
|
jp.close();
|
||||||
|
@ -75,7 +75,6 @@
|
|||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>compile</goal>
|
|
||||||
<goal>test-compile</goal>
|
<goal>test-compile</goal>
|
||||||
</goals>
|
</goals>
|
||||||
</execution>
|
</execution>
|
||||||
|
Loading…
Reference in New Issue
Block a user