From d260faffee51cb3b5d04a2a6fc09f079e2ae990f Mon Sep 17 00:00:00 2001 From: inder123 Date: Fri, 12 Apr 2013 21:31:06 +0000 Subject: [PATCH] [maven-release-plugin] copy for tag gson-2.2.3 --- gson/Gson 2.1 notes.txt => Gson 2.1 notes.txt | 0 gson/LICENSE => LICENSE | 0 gson/README => README | 0 ...-descriptor.xml => assembly-descriptor.xml | 0 codegen/pom.xml | 182 ------- .../java/com/google/gson/codegen/CodeGen.java | 53 --- .../gson/codegen/GeneratedTypeAdapter.java | 21 - .../GeneratedTypeAdapterProcessor.java | 61 --- .../com/google/gson/codegen/JavaWriter.java | 443 ------------------ .../javax.annotation.processing.Processor | 1 - .../functional/CodeGenFunctionalTest.java | 26 - .../google/gson/codegen/functional/Order.java | 37 -- .../javadocs/allclasses-frame.html | 0 .../javadocs/allclasses-noframe.html | 0 .../com/google/gson/ExclusionStrategy.html | 0 .../com/google/gson/FieldAttributes.html | 0 .../com/google/gson/FieldNamingPolicy.html | 0 .../com/google/gson/FieldNamingStrategy.html | 0 .../javadocs/com/google/gson/Gson.html | 0 .../javadocs/com/google/gson/GsonBuilder.html | 0 .../com/google/gson/InstanceCreator.html | 0 .../javadocs/com/google/gson/JsonArray.html | 0 .../gson/JsonDeserializationContext.html | 0 .../com/google/gson/JsonDeserializer.html | 0 .../javadocs/com/google/gson/JsonElement.html | 0 .../com/google/gson/JsonIOException.html | 0 .../javadocs/com/google/gson/JsonNull.html | 0 .../javadocs/com/google/gson/JsonObject.html | 0 .../com/google/gson/JsonParseException.html | 0 .../javadocs/com/google/gson/JsonParser.html | 0 .../com/google/gson/JsonPrimitive.html | 0 .../google/gson/JsonSerializationContext.html | 0 .../com/google/gson/JsonSerializer.html | 0 .../com/google/gson/JsonStreamParser.html | 0 .../com/google/gson/JsonSyntaxException.html | 0 .../google/gson/LongSerializationPolicy.html | 0 .../javadocs/com/google/gson/TypeAdapter.html | 0 .../com/google/gson/TypeAdapterFactory.html | 0 .../com/google/gson/annotations/Expose.html | 0 .../gson/annotations/SerializedName.html | 0 .../com/google/gson/annotations/Since.html | 0 .../com/google/gson/annotations/Until.html | 0 .../gson/annotations/class-use/Expose.html | 0 .../annotations/class-use/SerializedName.html | 0 .../gson/annotations/class-use/Since.html | 0 .../gson/annotations/class-use/Until.html | 0 .../gson/annotations/package-frame.html | 0 .../gson/annotations/package-summary.html | 0 .../google/gson/annotations/package-tree.html | 0 .../google/gson/annotations/package-use.html | 0 .../gson/class-use/ExclusionStrategy.html | 0 .../gson/class-use/FieldAttributes.html | 0 .../gson/class-use/FieldNamingPolicy.html | 0 .../gson/class-use/FieldNamingStrategy.html | 0 .../com/google/gson/class-use/Gson.html | 0 .../google/gson/class-use/GsonBuilder.html | 0 .../gson/class-use/InstanceCreator.html | 0 .../com/google/gson/class-use/JsonArray.html | 0 .../class-use/JsonDeserializationContext.html | 0 .../gson/class-use/JsonDeserializer.html | 0 .../google/gson/class-use/JsonElement.html | 0 .../gson/class-use/JsonIOException.html | 0 .../com/google/gson/class-use/JsonNull.html | 0 .../com/google/gson/class-use/JsonObject.html | 0 .../gson/class-use/JsonParseException.html | 0 .../com/google/gson/class-use/JsonParser.html | 0 .../google/gson/class-use/JsonPrimitive.html | 0 .../class-use/JsonSerializationContext.html | 0 .../google/gson/class-use/JsonSerializer.html | 0 .../gson/class-use/JsonStreamParser.html | 0 .../gson/class-use/JsonSyntaxException.html | 0 .../class-use/LongSerializationPolicy.html | 0 .../google/gson/class-use/TypeAdapter.html | 0 .../gson/class-use/TypeAdapterFactory.html | 0 .../com/google/gson/package-frame.html | 0 .../com/google/gson/package-summary.html | 0 .../com/google/gson/package-tree.html | 0 .../javadocs/com/google/gson/package-use.html | 0 .../com/google/gson/reflect/TypeToken.html | 0 .../gson/reflect/class-use/TypeToken.html | 0 .../google/gson/reflect/package-frame.html | 0 .../google/gson/reflect/package-summary.html | 0 .../com/google/gson/reflect/package-tree.html | 0 .../com/google/gson/reflect/package-use.html | 0 .../com/google/gson/stream/JsonReader.html | 0 .../com/google/gson/stream/JsonToken.html | 0 .../com/google/gson/stream/JsonWriter.html | 0 .../gson/stream/MalformedJsonException.html | 0 .../gson/stream/class-use/JsonReader.html | 0 .../gson/stream/class-use/JsonToken.html | 0 .../gson/stream/class-use/JsonWriter.html | 0 .../class-use/MalformedJsonException.html | 0 .../com/google/gson/stream/package-frame.html | 0 .../google/gson/stream/package-summary.html | 0 .../com/google/gson/stream/package-tree.html | 0 .../com/google/gson/stream/package-use.html | 0 .../javadocs/constant-values.html | 0 .../javadocs/deprecated-list.html | 0 {gson/docs => docs}/javadocs/help-doc.html | 0 {gson/docs => docs}/javadocs/index-all.html | 0 {gson/docs => docs}/javadocs/index.html | 0 .../javadocs/overview-frame.html | 0 .../javadocs/overview-summary.html | 0 .../docs => docs}/javadocs/overview-tree.html | 0 {gson/docs => docs}/javadocs/package-list | 0 .../javadocs/resources/inherit.gif | Bin .../javadocs/serialized-form.html | 0 {gson/docs => docs}/javadocs/stylesheet.css | 0 .../AndroidManifest.xml | 21 - .../default.properties | 12 - .../android-proguard-example/proguard.cfg | 90 ---- .../res/drawable/icon.png | Bin 2574 -> 0 bytes .../res/layout/main.xml | 12 - .../res/values/strings.xml | 5 - .../android/GsonProguardExampleActivity.java | 60 --- .../gson/examples/android/model/Cart.java | 108 ----- .../gson/examples/android/model/LineItem.java | 57 --- extras/pom.xml | 187 -------- .../rawcollections/RawCollectionsExample.java | 55 --- .../gson/graph/GraphAdapterBuilder.java | 305 ------------ .../google/gson/interceptors/Intercept.java | 64 --- .../gson/interceptors/InterceptorFactory.java | 49 -- .../interceptors/JsonPostDeserializer.java | 33 -- .../RuntimeTypeAdapterFactory.java | 240 ---------- .../gson/graph/GraphAdapterBuilderTest.java | 197 -------- .../gson/interceptors/InterceptorTest.java | 171 ------- .../RuntimeTypeAdapterFactoryTest.java | 192 -------- lib/gson-cleanup-styles.xml | 51 -- lib/gson-formatting-styles.xml | 267 ----------- metrics/pom.xml | 141 ------ .../google/gson/metrics/BagOfPrimitives.java | 95 ---- ...gOfPrimitivesDeserializationBenchmark.java | 123 ----- .../CollectionsDeserializationBenchmark.java | 140 ------ .../google/gson/metrics/ParseBenchmark.java | 389 --------------- .../gson/metrics/ParseBenchmarkData.zip | Bin 67881 -> 0 bytes .../gson/metrics/SerializationBenchmark.java | 53 --- gson/pom.xml => pom.xml | 0 proto/pom.xml | 198 -------- .../gson/protobuf/ProtoTypeAdapter.java | 138 ------ proto/src/main/protobuf/bag.proto | 29 -- ...rotosWithComplexAndRepeatedFieldsTest.java | 64 --- .../ProtosWithPrimitiveTypesTest.java | 65 --- .../google/gson/DefaultDateTypeAdapter.java | 0 .../com/google/gson/ExclusionStrategy.java | 0 .../java/com/google/gson/FieldAttributes.java | 0 .../com/google/gson/FieldNamingPolicy.java | 0 .../com/google/gson/FieldNamingStrategy.java | 0 .../main/java/com/google/gson/Gson.java | 0 .../java/com/google/gson/GsonBuilder.java | 0 .../java/com/google/gson/InstanceCreator.java | 0 .../main/java/com/google/gson/JsonArray.java | 0 .../gson/JsonDeserializationContext.java | 0 .../com/google/gson/JsonDeserializer.java | 0 .../java/com/google/gson/JsonElement.java | 0 .../java/com/google/gson/JsonIOException.java | 0 .../main/java/com/google/gson/JsonNull.java | 0 .../main/java/com/google/gson/JsonObject.java | 0 .../com/google/gson/JsonParseException.java | 0 .../main/java/com/google/gson/JsonParser.java | 0 .../java/com/google/gson/JsonPrimitive.java | 0 .../google/gson/JsonSerializationContext.java | 0 .../java/com/google/gson/JsonSerializer.java | 0 .../com/google/gson/JsonStreamParser.java | 0 .../com/google/gson/JsonSyntaxException.java | 0 .../google/gson/LongSerializationPolicy.java | 0 .../java/com/google/gson/TreeTypeAdapter.java | 0 .../java/com/google/gson/TypeAdapter.java | 0 .../com/google/gson/TypeAdapterFactory.java | 0 .../com/google/gson/annotations/Expose.java | 0 .../gson/annotations/SerializedName.java | 0 .../com/google/gson/annotations/Since.java | 0 .../com/google/gson/annotations/Until.java | 0 .../google/gson/annotations/package-info.java | 0 .../gson/internal/$Gson$Preconditions.java | 0 .../com/google/gson/internal/$Gson$Types.java | 0 .../gson/internal/ConstructorConstructor.java | 0 .../com/google/gson/internal/Excluder.java | 0 .../internal/JsonReaderInternalAccess.java | 0 .../gson/internal/LazilyParsedNumber.java | 0 .../gson/internal/LinkedHashTreeMap.java | 0 .../gson/internal/ObjectConstructor.java | 0 .../com/google/gson/internal/Primitives.java | 0 .../com/google/gson/internal/Streams.java | 0 .../google/gson/internal/UnsafeAllocator.java | 0 .../gson/internal/bind/ArrayTypeAdapter.java | 0 .../bind/CollectionTypeAdapterFactory.java | 0 .../gson/internal/bind/DateTypeAdapter.java | 0 .../gson/internal/bind/JsonTreeReader.java | 0 .../gson/internal/bind/JsonTreeWriter.java | 0 .../internal/bind/MapTypeAdapterFactory.java | 0 .../gson/internal/bind/ObjectTypeAdapter.java | 0 .../bind/ReflectiveTypeAdapterFactory.java | 0 .../internal/bind/SqlDateTypeAdapter.java | 0 .../gson/internal/bind/TimeTypeAdapter.java | 0 .../bind/TypeAdapterRuntimeTypeWrapper.java | 0 .../gson/internal/bind/TypeAdapters.java | 0 .../google/gson/internal/package-info.java | 0 .../java/com/google/gson/package-info.java | 0 .../com/google/gson/reflect/TypeToken.java | 0 .../com/google/gson/reflect/package-info.java | 0 .../com/google/gson/stream/JsonReader.java | 0 .../com/google/gson/stream/JsonScope.java | 0 .../com/google/gson/stream/JsonToken.java | 0 .../com/google/gson/stream/JsonWriter.java | 0 .../gson/stream/MalformedJsonException.java | 0 .../java/com/google/gson/CommentsTest.java | 0 .../gson/DefaultDateTypeAdapterTest.java | 0 .../DefaultInetAddressTypeAdapterTest.java | 0 .../gson/DefaultMapJsonSerializerTest.java | 0 ...ExposeAnnotationExclusionStrategyTest.java | 0 .../com/google/gson/FieldAttributesTest.java | 0 .../com/google/gson/GenericArrayTypeTest.java | 0 .../java/com/google/gson/GsonBuilderTest.java | 0 .../com/google/gson/GsonTypeAdapterTest.java | 0 .../gson/InnerClassExclusionStrategyTest.java | 0 .../google/gson/JavaSerializationTest.java | 0 .../java/com/google/gson/JsonArrayTest.java | 0 .../java/com/google/gson/JsonNullTest.java | 0 .../java/com/google/gson/JsonObjectTest.java | 0 .../java/com/google/gson/JsonParserTest.java | 0 .../com/google/gson/JsonPrimitiveTest.java | 0 .../com/google/gson/JsonStreamParserTest.java | 0 .../gson/LongSerializationPolicyTest.java | 0 .../java/com/google/gson/MixedStreamTest.java | 0 .../google/gson/MockExclusionStrategy.java | 0 .../google/gson/ObjectTypeAdapterTest.java | 0 .../gson/OverrideCoreTypeAdaptersTest.java | 0 .../gson/ParameterizedTypeFixtures.java | 0 .../google/gson/ParameterizedTypeTest.java | 0 .../com/google/gson/PrimitiveTypeAdapter.java | 0 .../gson/VersionExclusionStrategyTest.java | 0 .../com/google/gson/common/MoreAsserts.java | 0 .../com/google/gson/common/TestTypes.java | 0 .../com/google/gson/functional/ArrayTest.java | 0 .../functional/CircularReferenceTest.java | 0 .../gson/functional/CollectionTest.java | 0 .../gson/functional/ConcurrencyTest.java | 0 .../functional/CustomDeserializerTest.java | 0 .../gson/functional/CustomSerializerTest.java | 0 .../functional/CustomTypeAdaptersTest.java | 0 .../functional/DefaultTypeAdaptersTest.java | 0 .../functional/DelegateTypeAdapterTest.java | 0 .../com/google/gson/functional/EnumTest.java | 0 .../google/gson/functional/EscapingTest.java | 0 .../ExclusionStrategyFunctionalTest.java | 0 .../gson/functional/ExposeFieldsTest.java | 0 .../gson/functional/FieldExclusionTest.java | 0 .../gson/functional/FieldNamingTest.java | 0 .../gson/functional/InheritanceTest.java | 0 .../gson/functional/InstanceCreatorTest.java | 0 .../google/gson/functional/InterfaceTest.java | 0 .../functional/InternationalizationTest.java | 0 .../gson/functional/JsonParserTest.java | 0 .../google/gson/functional/JsonTreeTest.java | 0 .../functional/MapAsArrayTypeAdapterTest.java | 0 .../com/google/gson/functional/MapTest.java | 0 .../MoreSpecificTypeSerializationTest.java | 0 .../gson/functional/NamingPolicyTest.java | 0 .../functional/NullObjectAndFieldTest.java | 0 .../google/gson/functional/ObjectTest.java | 0 .../functional/ParameterizedTypesTest.java | 0 .../gson/functional/PrettyPrintingTest.java | 0 .../functional/PrimitiveCharacterTest.java | 0 .../google/gson/functional/PrimitiveTest.java | 0 .../gson/functional/PrintFormattingTest.java | 0 .../gson/functional/RawSerializationTest.java | 0 .../gson/functional/ReadersWritersTest.java | 0 .../google/gson/functional/SecurityTest.java | 0 .../functional/StreamingTypeAdaptersTest.java | 0 .../google/gson/functional/StringTest.java | 0 .../gson/functional/TreeTypeAdaptersTest.java | 0 .../functional/TypeAdapterPrecedenceTest.java | 0 .../functional/TypeHierarchyAdapterTest.java | 0 .../gson/functional/TypeVariableTest.java | 0 .../gson/functional/UncategorizedTest.java | 0 .../gson/functional/VersioningTest.java | 0 .../gson/internal/LinkedHashTreeMapTest.java | 0 .../internal/bind/JsonElementReaderTest.java | 0 .../internal/bind/JsonTreeWriterTest.java | 0 .../google/gson/metrics/PerformanceTest.java | 0 .../google/gson/reflect/TypeTokenTest.java | 0 .../google/gson/stream/JsonReaderTest.java | 0 .../google/gson/stream/JsonWriterTest.java | 0 283 files changed, 4435 deletions(-) rename gson/Gson 2.1 notes.txt => Gson 2.1 notes.txt (100%) rename gson/LICENSE => LICENSE (100%) rename gson/README => README (100%) rename gson/assembly-descriptor.xml => assembly-descriptor.xml (100%) delete mode 100644 codegen/pom.xml delete mode 100644 codegen/src/main/java/com/google/gson/codegen/CodeGen.java delete mode 100644 codegen/src/main/java/com/google/gson/codegen/GeneratedTypeAdapter.java delete mode 100644 codegen/src/main/java/com/google/gson/codegen/GeneratedTypeAdapterProcessor.java delete mode 100644 codegen/src/main/java/com/google/gson/codegen/JavaWriter.java delete mode 100644 codegen/src/main/resources/META-INF/services/javax.annotation.processing.Processor delete mode 100644 codegen/src/test/java/com/google/gson/codegen/functional/CodeGenFunctionalTest.java delete mode 100644 codegen/src/test/java/com/google/gson/codegen/functional/Order.java rename {gson/docs => docs}/javadocs/allclasses-frame.html (100%) rename {gson/docs => docs}/javadocs/allclasses-noframe.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/ExclusionStrategy.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/FieldAttributes.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/FieldNamingPolicy.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/FieldNamingStrategy.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/Gson.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/GsonBuilder.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/InstanceCreator.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonArray.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonDeserializationContext.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonDeserializer.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonElement.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonIOException.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonNull.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonObject.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonParseException.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonParser.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonPrimitive.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonSerializationContext.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonSerializer.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonStreamParser.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/JsonSyntaxException.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/LongSerializationPolicy.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/TypeAdapter.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/TypeAdapterFactory.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/Expose.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/SerializedName.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/Since.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/Until.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/class-use/Expose.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/class-use/SerializedName.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/class-use/Since.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/class-use/Until.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/package-frame.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/package-summary.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/package-tree.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/annotations/package-use.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/ExclusionStrategy.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/FieldAttributes.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/FieldNamingPolicy.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/FieldNamingStrategy.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/Gson.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/GsonBuilder.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/InstanceCreator.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonArray.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonDeserializationContext.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonDeserializer.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonElement.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonIOException.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonNull.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonObject.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonParseException.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonParser.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonPrimitive.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonSerializationContext.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonSerializer.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonStreamParser.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/JsonSyntaxException.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/LongSerializationPolicy.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/TypeAdapter.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/class-use/TypeAdapterFactory.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/package-frame.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/package-summary.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/package-tree.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/package-use.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/reflect/TypeToken.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/reflect/class-use/TypeToken.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/reflect/package-frame.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/reflect/package-summary.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/reflect/package-tree.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/reflect/package-use.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/JsonReader.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/JsonToken.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/JsonWriter.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/MalformedJsonException.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/class-use/JsonReader.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/class-use/JsonToken.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/class-use/JsonWriter.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/class-use/MalformedJsonException.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/package-frame.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/package-summary.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/package-tree.html (100%) rename {gson/docs => docs}/javadocs/com/google/gson/stream/package-use.html (100%) rename {gson/docs => docs}/javadocs/constant-values.html (100%) rename {gson/docs => docs}/javadocs/deprecated-list.html (100%) rename {gson/docs => docs}/javadocs/help-doc.html (100%) rename {gson/docs => docs}/javadocs/index-all.html (100%) rename {gson/docs => docs}/javadocs/index.html (100%) rename {gson/docs => docs}/javadocs/overview-frame.html (100%) rename {gson/docs => docs}/javadocs/overview-summary.html (100%) rename {gson/docs => docs}/javadocs/overview-tree.html (100%) rename {gson/docs => docs}/javadocs/package-list (100%) rename {gson/docs => docs}/javadocs/resources/inherit.gif (100%) rename {gson/docs => docs}/javadocs/serialized-form.html (100%) rename {gson/docs => docs}/javadocs/stylesheet.css (100%) delete mode 100755 examples/android-proguard-example/AndroidManifest.xml delete mode 100644 examples/android-proguard-example/default.properties delete mode 100644 examples/android-proguard-example/proguard.cfg delete mode 100644 examples/android-proguard-example/res/drawable/icon.png delete mode 100644 examples/android-proguard-example/res/layout/main.xml delete mode 100644 examples/android-proguard-example/res/values/strings.xml delete mode 100644 examples/android-proguard-example/src/com/google/gson/examples/android/GsonProguardExampleActivity.java delete mode 100644 examples/android-proguard-example/src/com/google/gson/examples/android/model/Cart.java delete mode 100644 examples/android-proguard-example/src/com/google/gson/examples/android/model/LineItem.java delete mode 100644 extras/pom.xml delete mode 100644 extras/src/main/java/com/google/gson/extras/examples/rawcollections/RawCollectionsExample.java delete mode 100644 extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java delete mode 100644 extras/src/main/java/com/google/gson/interceptors/Intercept.java delete mode 100644 extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java delete mode 100644 extras/src/main/java/com/google/gson/interceptors/JsonPostDeserializer.java delete mode 100644 extras/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java delete mode 100644 extras/src/test/java/com/google/gson/graph/GraphAdapterBuilderTest.java delete mode 100644 extras/src/test/java/com/google/gson/interceptors/InterceptorTest.java delete mode 100644 extras/src/test/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactoryTest.java delete mode 100644 lib/gson-cleanup-styles.xml delete mode 100644 lib/gson-formatting-styles.xml delete mode 100644 metrics/pom.xml delete mode 100644 metrics/src/main/java/com/google/gson/metrics/BagOfPrimitives.java delete mode 100644 metrics/src/main/java/com/google/gson/metrics/BagOfPrimitivesDeserializationBenchmark.java delete mode 100644 metrics/src/main/java/com/google/gson/metrics/CollectionsDeserializationBenchmark.java delete mode 100644 metrics/src/main/java/com/google/gson/metrics/ParseBenchmark.java delete mode 100644 metrics/src/main/java/com/google/gson/metrics/ParseBenchmarkData.zip delete mode 100644 metrics/src/main/java/com/google/gson/metrics/SerializationBenchmark.java rename gson/pom.xml => pom.xml (100%) delete mode 100644 proto/pom.xml delete mode 100644 proto/src/main/java/com/google/gson/protobuf/ProtoTypeAdapter.java delete mode 100644 proto/src/main/protobuf/bag.proto delete mode 100644 proto/src/test/java/com/google/gson/protobuf/functional/ProtosWithComplexAndRepeatedFieldsTest.java delete mode 100644 proto/src/test/java/com/google/gson/protobuf/functional/ProtosWithPrimitiveTypesTest.java rename {gson/src => src}/main/java/com/google/gson/DefaultDateTypeAdapter.java (100%) rename {gson/src => src}/main/java/com/google/gson/ExclusionStrategy.java (100%) rename {gson/src => src}/main/java/com/google/gson/FieldAttributes.java (100%) rename {gson/src => src}/main/java/com/google/gson/FieldNamingPolicy.java (100%) rename {gson/src => src}/main/java/com/google/gson/FieldNamingStrategy.java (100%) rename {gson/src => src}/main/java/com/google/gson/Gson.java (100%) rename {gson/src => src}/main/java/com/google/gson/GsonBuilder.java (100%) rename {gson/src => src}/main/java/com/google/gson/InstanceCreator.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonArray.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonDeserializationContext.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonDeserializer.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonElement.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonIOException.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonNull.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonObject.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonParseException.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonParser.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonPrimitive.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonSerializationContext.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonSerializer.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonStreamParser.java (100%) rename {gson/src => src}/main/java/com/google/gson/JsonSyntaxException.java (100%) rename {gson/src => src}/main/java/com/google/gson/LongSerializationPolicy.java (100%) rename {gson/src => src}/main/java/com/google/gson/TreeTypeAdapter.java (100%) rename {gson/src => src}/main/java/com/google/gson/TypeAdapter.java (100%) rename {gson/src => src}/main/java/com/google/gson/TypeAdapterFactory.java (100%) rename {gson/src => src}/main/java/com/google/gson/annotations/Expose.java (100%) rename {gson/src => src}/main/java/com/google/gson/annotations/SerializedName.java (100%) rename {gson/src => src}/main/java/com/google/gson/annotations/Since.java (100%) rename {gson/src => src}/main/java/com/google/gson/annotations/Until.java (100%) rename {gson/src => src}/main/java/com/google/gson/annotations/package-info.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/$Gson$Preconditions.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/$Gson$Types.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/ConstructorConstructor.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/Excluder.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/JsonReaderInternalAccess.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/LazilyParsedNumber.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/LinkedHashTreeMap.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/ObjectConstructor.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/Primitives.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/Streams.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/UnsafeAllocator.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/CollectionTypeAdapterFactory.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/DateTypeAdapter.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/JsonTreeReader.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/JsonTreeWriter.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/ObjectTypeAdapter.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/SqlDateTypeAdapter.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/TimeTypeAdapter.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/bind/TypeAdapters.java (100%) rename {gson/src => src}/main/java/com/google/gson/internal/package-info.java (100%) rename {gson/src => src}/main/java/com/google/gson/package-info.java (100%) rename {gson/src => src}/main/java/com/google/gson/reflect/TypeToken.java (100%) rename {gson/src => src}/main/java/com/google/gson/reflect/package-info.java (100%) rename {gson/src => src}/main/java/com/google/gson/stream/JsonReader.java (100%) rename {gson/src => src}/main/java/com/google/gson/stream/JsonScope.java (100%) rename {gson/src => src}/main/java/com/google/gson/stream/JsonToken.java (100%) rename {gson/src => src}/main/java/com/google/gson/stream/JsonWriter.java (100%) rename {gson/src => src}/main/java/com/google/gson/stream/MalformedJsonException.java (100%) rename {gson/src => src}/test/java/com/google/gson/CommentsTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/DefaultDateTypeAdapterTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/DefaultInetAddressTypeAdapterTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/DefaultMapJsonSerializerTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/ExposeAnnotationExclusionStrategyTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/FieldAttributesTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/GenericArrayTypeTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/GsonBuilderTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/GsonTypeAdapterTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/InnerClassExclusionStrategyTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/JavaSerializationTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/JsonArrayTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/JsonNullTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/JsonObjectTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/JsonParserTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/JsonPrimitiveTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/JsonStreamParserTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/LongSerializationPolicyTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/MixedStreamTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/MockExclusionStrategy.java (100%) rename {gson/src => src}/test/java/com/google/gson/ObjectTypeAdapterTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/OverrideCoreTypeAdaptersTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/ParameterizedTypeFixtures.java (100%) rename {gson/src => src}/test/java/com/google/gson/ParameterizedTypeTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/PrimitiveTypeAdapter.java (100%) rename {gson/src => src}/test/java/com/google/gson/VersionExclusionStrategyTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/common/MoreAsserts.java (100%) rename {gson/src => src}/test/java/com/google/gson/common/TestTypes.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/ArrayTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/CircularReferenceTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/CollectionTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/ConcurrencyTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/CustomDeserializerTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/CustomSerializerTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/CustomTypeAdaptersTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/DelegateTypeAdapterTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/EnumTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/EscapingTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/ExclusionStrategyFunctionalTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/ExposeFieldsTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/FieldExclusionTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/FieldNamingTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/InheritanceTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/InstanceCreatorTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/InterfaceTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/InternationalizationTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/JsonParserTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/JsonTreeTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/MapAsArrayTypeAdapterTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/MapTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/MoreSpecificTypeSerializationTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/NamingPolicyTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/NullObjectAndFieldTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/ObjectTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/ParameterizedTypesTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/PrettyPrintingTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/PrimitiveCharacterTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/PrimitiveTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/PrintFormattingTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/RawSerializationTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/ReadersWritersTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/SecurityTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/StreamingTypeAdaptersTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/StringTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/TreeTypeAdaptersTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/TypeAdapterPrecedenceTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/TypeHierarchyAdapterTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/TypeVariableTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/UncategorizedTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/functional/VersioningTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/internal/bind/JsonElementReaderTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/internal/bind/JsonTreeWriterTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/metrics/PerformanceTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/reflect/TypeTokenTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/stream/JsonReaderTest.java (100%) rename {gson/src => src}/test/java/com/google/gson/stream/JsonWriterTest.java (100%) diff --git a/gson/Gson 2.1 notes.txt b/Gson 2.1 notes.txt similarity index 100% rename from gson/Gson 2.1 notes.txt rename to Gson 2.1 notes.txt diff --git a/gson/LICENSE b/LICENSE similarity index 100% rename from gson/LICENSE rename to LICENSE diff --git a/gson/README b/README similarity index 100% rename from gson/README rename to README diff --git a/gson/assembly-descriptor.xml b/assembly-descriptor.xml similarity index 100% rename from gson/assembly-descriptor.xml rename to assembly-descriptor.xml diff --git a/codegen/pom.xml b/codegen/pom.xml deleted file mode 100644 index c2f9499a31..0000000000 --- a/codegen/pom.xml +++ /dev/null @@ -1,182 +0,0 @@ - - 4.0.0 - com.google.code.gson - gson-codegen - jar - 1.0-SNAPSHOT - 2008 - Gson Code Gen - - org.sonatype.oss - oss-parent - 7 - - http://code.google.com/p/google-gson/ - Google Gson grab bag of utilities, type adapters, etc. - - UTF-8 - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - scm:svn:http://google-gson.googlecode.com/svn/trunk/extras - scm:svn:https://google-gson.googlecode.com/svn/trunk/extras - http://google-gson.codegoogle.com/svn/trunk/extras - - - Google Code Issue Tracking - http://code.google.com/p/google-gson/issues/list - - - Google, Inc. - http://www.google.com - - - - junit - junit - 3.8.2 - test - - - - - - release-sign-artifacts - - - performRelease - true - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.4 - - - sign-artifacts - verify - - sign - - - - - - - - - - package - - - org.apache.maven.plugins - maven-compiler-plugin - 2.5.1 - - 1.6 - 1.6 - -proc:none - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - package - - jar - - - - - - false - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - verify - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8.1 - - - attach-javadocs - - jar - - - - - - http://download.oracle.com/javase/1.5.0/docs/api/ - - true - public - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.9 - - true - true - - ../eclipse-ws/ - - - file:///${basedir}/../lib/gson-formatting-styles.xml - - - - - org.apache.maven.plugins - maven-release-plugin - - - -DenableCiProfile=true - https://google-gson.googlecode.com/svn/tags/ - - - - - - - Inderjeet Singh - Trymph Inc. - - - Joel Leitch - Google Inc. - - - Jesse Wilson - Square Inc. - - - diff --git a/codegen/src/main/java/com/google/gson/codegen/CodeGen.java b/codegen/src/main/java/com/google/gson/codegen/CodeGen.java deleted file mode 100644 index 011568ff92..0000000000 --- a/codegen/src/main/java/com/google/gson/codegen/CodeGen.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.codegen; - -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.PackageElement; -import javax.lang.model.element.TypeElement; - -public class CodeGen { - private CodeGen() { - } - - public static PackageElement getPackage(Element type) { - while (type.getKind() != ElementKind.PACKAGE) { - type = type.getEnclosingElement(); - } - return (PackageElement) type; - } - - /** - * Returns a fully qualified class name to complement {@code type}. - */ - public static String adapterName(TypeElement typeElement, String suffix) { - StringBuilder builder = new StringBuilder(); - rawTypeToString(builder, typeElement, '$'); - builder.append(suffix); - return builder.toString(); - } - - static void rawTypeToString(StringBuilder result, TypeElement type, char innerClassSeparator) { - String packageName = getPackage(type).getQualifiedName().toString(); - String qualifiedName = type.getQualifiedName().toString(); - result.append(packageName); - result.append('.'); - result.append( - qualifiedName.substring(packageName.length() + 1).replace('.', innerClassSeparator)); - } -} diff --git a/codegen/src/main/java/com/google/gson/codegen/GeneratedTypeAdapter.java b/codegen/src/main/java/com/google/gson/codegen/GeneratedTypeAdapter.java deleted file mode 100644 index 1694d88ac2..0000000000 --- a/codegen/src/main/java/com/google/gson/codegen/GeneratedTypeAdapter.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.codegen; - -public @interface GeneratedTypeAdapter { - Class[] value() default {}; -} diff --git a/codegen/src/main/java/com/google/gson/codegen/GeneratedTypeAdapterProcessor.java b/codegen/src/main/java/com/google/gson/codegen/GeneratedTypeAdapterProcessor.java deleted file mode 100644 index cd542bc353..0000000000 --- a/codegen/src/main/java/com/google/gson/codegen/GeneratedTypeAdapterProcessor.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.codegen; - -import static java.lang.reflect.Modifier.FINAL; - -import java.io.IOException; -import java.util.Set; - -import javax.annotation.processing.AbstractProcessor; -import javax.annotation.processing.RoundEnvironment; -import javax.annotation.processing.SupportedAnnotationTypes; -import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.SourceVersion; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import javax.tools.Diagnostic; -import javax.tools.JavaFileObject; - -@SupportedAnnotationTypes("com.google.gson.codegen.GeneratedTypeAdapter") -@SupportedSourceVersion(SourceVersion.RELEASE_6) -public final class GeneratedTypeAdapterProcessor extends AbstractProcessor { - @Override public boolean process(Set types, RoundEnvironment env) { - System.out.println("invoked GeneratedTypeAdapterProcessor"); - try { - for (Element element : env.getElementsAnnotatedWith(GeneratedTypeAdapter.class)) { - writeAdapter((TypeElement) element); - } - } catch (IOException e) { - processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage()); - } - return true; - } - - private void writeAdapter(TypeElement type) throws IOException { - String typeAdapterName = CodeGen.adapterName(type, "$TypeAdapter"); - JavaFileObject sourceFile = processingEnv.getFiler() - .createSourceFile(typeAdapterName, type); - System.out.println("Generating type adapter: " + typeAdapterName + " in " + sourceFile.getName()); - - JavaWriter writer = new JavaWriter(sourceFile.openWriter()); - writer.addPackage(CodeGen.getPackage(type).getQualifiedName().toString()); - writer.beginType(typeAdapterName, "class", FINAL, null); - writer.endType(); - writer.close(); - } -} diff --git a/codegen/src/main/java/com/google/gson/codegen/JavaWriter.java b/codegen/src/main/java/com/google/gson/codegen/JavaWriter.java deleted file mode 100644 index ccba6c8cd0..0000000000 --- a/codegen/src/main/java/com/google/gson/codegen/JavaWriter.java +++ /dev/null @@ -1,443 +0,0 @@ -/** - * Copyright (C) 2012 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.codegen; - -import java.io.IOException; -import java.io.Writer; -import java.lang.annotation.Annotation; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Emits Java source files. - */ -public final class JavaWriter { - private static final Pattern TYPE_PATTERN = Pattern.compile("(?:[\\w$]+\\.)*([\\w$]+)"); - private static final String INDENT = " "; - - /** Map fully qualified type names to their short names. */ - private final Map importedTypes = new HashMap(); - - private String packagePrefix; - private final List scopes = new ArrayList(); - private final Writer out; - - /** - * @param out the stream to which Java source will be written. This should be - * a buffered stream. - */ - public JavaWriter(Writer out) { - this.out = out; - } - - /** - * Emit a package declaration. - */ - public void addPackage(String packageName) throws IOException { - if (this.packagePrefix != null) { - throw new IllegalStateException(); - } - out.write("package "); - out.write(packageName); - out.write(";\n"); - this.packagePrefix = packageName + "."; - } - - /** - * Equivalent to {@code addImport(type.getName())}. - */ - public void addImport(Class type) throws IOException { - addImport(type.getName()); - } - - /** - * Emit an import for {@code type}. For the duration of the file, all - * references to this class will be automatically shortened. - */ - public void addImport(String type) throws IOException { - Matcher matcher = TYPE_PATTERN.matcher(type); - if (!matcher.matches()) { - throw new IllegalArgumentException(type); - } - if (importedTypes.put(type, matcher.group(1)) != null) { - throw new IllegalArgumentException(type); - } - out.write("import "); - out.write(type); - out.write(";\n"); - } - - /** - * Emits a name like {@code java.lang.String} or {@code - * java.util.List}, shorting it with imports if - * possible. - */ - private void type(String type) throws IOException { - if (this.packagePrefix == null) { - throw new IllegalStateException(); - } - - Matcher m = TYPE_PATTERN.matcher(type); - int pos = 0; - while (true) { - boolean found = m.find(pos); - - // copy non-matching characters like "<" - int typeStart = found ? m.start() : type.length(); - out.write(type, pos, typeStart - pos); - - if (!found) { - break; - } - - // copy a single class name, shortening it if possible - String name = m.group(0); - String imported; - if ((imported = importedTypes.get(name)) != null) { - out.write(imported); - } else if (name.startsWith(packagePrefix) - && name.indexOf('.', packagePrefix.length()) == -1) { - out.write(name.substring(packagePrefix.length())); - } else if (name.startsWith("java.lang.")) { - out.write(name.substring("java.lang.".length())); - } else { - out.write(name); - } - pos = m.end(); - } - } - - /** - * Emits a type declaration. - * - * @param kind such as "class", "interface" or "enum". - */ - public void beginType(String type, String kind, int modifiers) throws IOException { - beginType(type, kind, modifiers, null); - } - - /** - * Emits a type declaration. - * - * @param kind such as "class", "interface" or "enum". - * @param extendsType the class to extend, or null for no extends clause. - */ - public void beginType(String type, String kind, int modifiers, - String extendsType, String... implementsTypes) throws IOException { - indent(); - modifiers(modifiers); - out.write(kind); - out.write(" "); - type(type); - if (extendsType != null) { - out.write("\n"); - indent(); - out.write(" extends "); - type(extendsType); - } - if (implementsTypes.length > 0) { - out.write("\n"); - indent(); - out.write(" implements "); - for (int i = 0; i < implementsTypes.length; i++) { - if (i != 0) { - out.write(", "); - } - type(implementsTypes[i]); - } - } - out.write(" {\n"); - pushScope(Scope.TYPE_DECLARATION); - } - - /** - * Completes the current type declaration. - */ - public void endType() throws IOException { - if (popScope() != Scope.TYPE_DECLARATION) { - throw new IllegalStateException(); - } - indent(); - out.write("}\n"); - } - - /** - * Emits a field declaration. - */ - public void field(String type, String name, int modifiers) throws IOException { - field(type, name, modifiers, null); - } - - public void field(String type, String name, int modifiers, String initialValue) - throws IOException { - indent(); - modifiers(modifiers); - type(type); - out.write(" "); - out.write(name); - - if (initialValue != null) { - out.write(" = "); - out.write(initialValue); - } - out.write(";\n"); - } - - /** - * Emit a method declaration. - * - * @param returnType the method's return type, or null for constructors. - * @param parameters alternating parameter types and names. - * @param name the method name, or the fully qualified class name for - * constructors. - */ - public void beginMethod(String returnType, String name, int modifiers, String... parameters) - throws IOException { - indent(); - modifiers(modifiers); - if (returnType != null) { - type(returnType); - out.write(" "); - out.write(name); - } else { - type(name); - } - out.write("("); - for (int p = 0; p < parameters.length; ) { - if (p != 0) { - out.write(", "); - } - type(parameters[p++]); - out.write(" "); - type(parameters[p++]); - } - out.write(")"); - if ((modifiers & Modifier.ABSTRACT) != 0) { - out.write(";\n"); - pushScope(Scope.ABSTRACT_METHOD); - } else { - out.write(" {\n"); - pushScope(Scope.NON_ABSTRACT_METHOD); - } - } - - /** - * Annotates the next element with {@code annotation}. The annotation has no - * attributes. - */ - public void annotation(String annotation) throws IOException { - indent(); - out.write("@"); - type(annotation); - out.write("\n"); - } - - /** - * Equivalent to {@code annotation(annotationType.getName())}. - */ - public void annotation(Class annotationType) throws IOException { - annotation(annotationType.getName()); - } - - /** - * @param pattern a code pattern like "int i = %s". Shouldn't contain a - * trailing semicolon or newline character. - */ - public void statement(String pattern, Object... args) throws IOException { - checkInMethod(); - indent(); - out.write(String.format(pattern, args)); - out.write(";\n"); - } - - /** - * @param controlFlow the control flow construct and its code, such as - * "if (foo == 5)". Shouldn't contain braces or newline characters. - */ - public void beginControlFlow(String controlFlow) throws IOException { - checkInMethod(); - indent(); - out.write(controlFlow); - out.write(" {\n"); - pushScope(Scope.CONTROL_FLOW); - } - - /** - * @param controlFlow the control flow construct and its code, such as - * "else if (foo == 10)". Shouldn't contain braces or newline characters. - */ - public void nextControlFlow(String controlFlow) throws IOException { - if (popScope() != Scope.CONTROL_FLOW) { - throw new IllegalArgumentException(); - } - - indent(); - pushScope(Scope.CONTROL_FLOW); - out.write("} "); - out.write(controlFlow); - out.write(" {\n"); - } - - public void endControlFlow() throws IOException { - endControlFlow(null); - } - - /** - * @param controlFlow the optional control flow construct and its code, such - * as "while(foo == 20)". Only used for "do/while" control flows. - */ - public void endControlFlow(String controlFlow) throws IOException { - if (popScope() != Scope.CONTROL_FLOW) { - throw new IllegalArgumentException(); - } - - indent(); - if (controlFlow != null) { - out.write("} "); - out.write(controlFlow); - out.write(";\n"); - } else { - out.write("}\n"); - } - } - - /** - * Completes the current method declaration. - */ - public void endMethod() throws IOException { - Scope popped = popScope(); - if (popped == Scope.NON_ABSTRACT_METHOD) { - indent(); - out.write("}\n"); - } else if (popped != Scope.ABSTRACT_METHOD) { - throw new IllegalStateException(); - } - } - - /** - * Returns the string literal representing {@code data}, including wrapping - * quotes. - */ - public static String stringLiteral(String data) { - StringBuilder result = new StringBuilder(); - result.append('"'); - for (int i = 0; i < data.length(); i++) { - char c = data.charAt(i); - switch (c) { - case '"': - result.append("\\\""); - break; - case '\\': - result.append("\\\\"); - break; - case '\t': - result.append("\\\t"); - break; - case '\b': - result.append("\\\b"); - break; - case '\n': - result.append("\\\n"); - break; - case '\r': - result.append("\\\r"); - break; - case '\f': - result.append("\\\f"); - break; - default: - result.append(c); - } - } - result.append('"'); - return result.toString(); - } - - public void close() throws IOException { - out.close(); - } - - /** - * Emit modifier names. - */ - private void modifiers(int modifiers) throws IOException { - if ((modifiers & Modifier.PUBLIC) != 0) { - out.write("public "); - } - if ((modifiers & Modifier.PRIVATE) != 0) { - out.write("private "); - } - if ((modifiers & Modifier.PROTECTED) != 0) { - out.write("protected "); - } - if ((modifiers & Modifier.STATIC) != 0) { - out.write("static "); - } - if ((modifiers & Modifier.FINAL) != 0) { - out.write("final "); - } - if ((modifiers & Modifier.ABSTRACT) != 0) { - out.write("abstract "); - } - if ((modifiers & Modifier.SYNCHRONIZED) != 0) { - out.write("synchronized "); - } - if ((modifiers & Modifier.TRANSIENT) != 0) { - out.write("transient "); - } - if ((modifiers & Modifier.VOLATILE) != 0) { - out.write("volatile "); - } - } - - private void indent() throws IOException { - for (int i = 0; i < scopes.size(); i++) { - out.write(INDENT); - } - } - - private void checkInMethod() { - Scope scope = peekScope(); - if (scope != Scope.NON_ABSTRACT_METHOD && scope != Scope.CONTROL_FLOW) { - throw new IllegalArgumentException(); - } - } - - private void pushScope(Scope pushed) { - scopes.add(pushed); - } - - private Scope peekScope() { - return scopes.get(scopes.size() - 1); - } - - private Scope popScope() { - return scopes.remove(scopes.size() - 1); - } - - private enum Scope { - TYPE_DECLARATION, - ABSTRACT_METHOD, - NON_ABSTRACT_METHOD, - CONTROL_FLOW, - } -} diff --git a/codegen/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/codegen/src/main/resources/META-INF/services/javax.annotation.processing.Processor deleted file mode 100644 index a052da0c14..0000000000 --- a/codegen/src/main/resources/META-INF/services/javax.annotation.processing.Processor +++ /dev/null @@ -1 +0,0 @@ -com.google.gson.codegen.GeneratedTypeAdapterProcessor \ No newline at end of file diff --git a/codegen/src/test/java/com/google/gson/codegen/functional/CodeGenFunctionalTest.java b/codegen/src/test/java/com/google/gson/codegen/functional/CodeGenFunctionalTest.java deleted file mode 100644 index 855ee3faf5..0000000000 --- a/codegen/src/test/java/com/google/gson/codegen/functional/CodeGenFunctionalTest.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.codegen.functional; - -import junit.framework.TestCase; - -public class CodeGenFunctionalTest extends TestCase { - - public void testGeneratedJson() { - Order order = new Order("toy", 10); - // TODO: figure out how to access the generated type adapter - } -} diff --git a/codegen/src/test/java/com/google/gson/codegen/functional/Order.java b/codegen/src/test/java/com/google/gson/codegen/functional/Order.java deleted file mode 100644 index 916587f3bf..0000000000 --- a/codegen/src/test/java/com/google/gson/codegen/functional/Order.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.codegen.functional; - -import com.google.gson.codegen.GeneratedTypeAdapter; - -@GeneratedTypeAdapter -final class Order { - private final String itemName; - private final int price; - - public Order(String itemName, int price) { - this.itemName = itemName; - this.price = price; - } - - public String getItemName() { - return itemName; - } - - public int getAmount() { - return price; - } -} diff --git a/gson/docs/javadocs/allclasses-frame.html b/docs/javadocs/allclasses-frame.html similarity index 100% rename from gson/docs/javadocs/allclasses-frame.html rename to docs/javadocs/allclasses-frame.html diff --git a/gson/docs/javadocs/allclasses-noframe.html b/docs/javadocs/allclasses-noframe.html similarity index 100% rename from gson/docs/javadocs/allclasses-noframe.html rename to docs/javadocs/allclasses-noframe.html diff --git a/gson/docs/javadocs/com/google/gson/ExclusionStrategy.html b/docs/javadocs/com/google/gson/ExclusionStrategy.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/ExclusionStrategy.html rename to docs/javadocs/com/google/gson/ExclusionStrategy.html diff --git a/gson/docs/javadocs/com/google/gson/FieldAttributes.html b/docs/javadocs/com/google/gson/FieldAttributes.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/FieldAttributes.html rename to docs/javadocs/com/google/gson/FieldAttributes.html diff --git a/gson/docs/javadocs/com/google/gson/FieldNamingPolicy.html b/docs/javadocs/com/google/gson/FieldNamingPolicy.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/FieldNamingPolicy.html rename to docs/javadocs/com/google/gson/FieldNamingPolicy.html diff --git a/gson/docs/javadocs/com/google/gson/FieldNamingStrategy.html b/docs/javadocs/com/google/gson/FieldNamingStrategy.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/FieldNamingStrategy.html rename to docs/javadocs/com/google/gson/FieldNamingStrategy.html diff --git a/gson/docs/javadocs/com/google/gson/Gson.html b/docs/javadocs/com/google/gson/Gson.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/Gson.html rename to docs/javadocs/com/google/gson/Gson.html diff --git a/gson/docs/javadocs/com/google/gson/GsonBuilder.html b/docs/javadocs/com/google/gson/GsonBuilder.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/GsonBuilder.html rename to docs/javadocs/com/google/gson/GsonBuilder.html diff --git a/gson/docs/javadocs/com/google/gson/InstanceCreator.html b/docs/javadocs/com/google/gson/InstanceCreator.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/InstanceCreator.html rename to docs/javadocs/com/google/gson/InstanceCreator.html diff --git a/gson/docs/javadocs/com/google/gson/JsonArray.html b/docs/javadocs/com/google/gson/JsonArray.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonArray.html rename to docs/javadocs/com/google/gson/JsonArray.html diff --git a/gson/docs/javadocs/com/google/gson/JsonDeserializationContext.html b/docs/javadocs/com/google/gson/JsonDeserializationContext.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonDeserializationContext.html rename to docs/javadocs/com/google/gson/JsonDeserializationContext.html diff --git a/gson/docs/javadocs/com/google/gson/JsonDeserializer.html b/docs/javadocs/com/google/gson/JsonDeserializer.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonDeserializer.html rename to docs/javadocs/com/google/gson/JsonDeserializer.html diff --git a/gson/docs/javadocs/com/google/gson/JsonElement.html b/docs/javadocs/com/google/gson/JsonElement.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonElement.html rename to docs/javadocs/com/google/gson/JsonElement.html diff --git a/gson/docs/javadocs/com/google/gson/JsonIOException.html b/docs/javadocs/com/google/gson/JsonIOException.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonIOException.html rename to docs/javadocs/com/google/gson/JsonIOException.html diff --git a/gson/docs/javadocs/com/google/gson/JsonNull.html b/docs/javadocs/com/google/gson/JsonNull.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonNull.html rename to docs/javadocs/com/google/gson/JsonNull.html diff --git a/gson/docs/javadocs/com/google/gson/JsonObject.html b/docs/javadocs/com/google/gson/JsonObject.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonObject.html rename to docs/javadocs/com/google/gson/JsonObject.html diff --git a/gson/docs/javadocs/com/google/gson/JsonParseException.html b/docs/javadocs/com/google/gson/JsonParseException.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonParseException.html rename to docs/javadocs/com/google/gson/JsonParseException.html diff --git a/gson/docs/javadocs/com/google/gson/JsonParser.html b/docs/javadocs/com/google/gson/JsonParser.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonParser.html rename to docs/javadocs/com/google/gson/JsonParser.html diff --git a/gson/docs/javadocs/com/google/gson/JsonPrimitive.html b/docs/javadocs/com/google/gson/JsonPrimitive.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonPrimitive.html rename to docs/javadocs/com/google/gson/JsonPrimitive.html diff --git a/gson/docs/javadocs/com/google/gson/JsonSerializationContext.html b/docs/javadocs/com/google/gson/JsonSerializationContext.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonSerializationContext.html rename to docs/javadocs/com/google/gson/JsonSerializationContext.html diff --git a/gson/docs/javadocs/com/google/gson/JsonSerializer.html b/docs/javadocs/com/google/gson/JsonSerializer.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonSerializer.html rename to docs/javadocs/com/google/gson/JsonSerializer.html diff --git a/gson/docs/javadocs/com/google/gson/JsonStreamParser.html b/docs/javadocs/com/google/gson/JsonStreamParser.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonStreamParser.html rename to docs/javadocs/com/google/gson/JsonStreamParser.html diff --git a/gson/docs/javadocs/com/google/gson/JsonSyntaxException.html b/docs/javadocs/com/google/gson/JsonSyntaxException.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/JsonSyntaxException.html rename to docs/javadocs/com/google/gson/JsonSyntaxException.html diff --git a/gson/docs/javadocs/com/google/gson/LongSerializationPolicy.html b/docs/javadocs/com/google/gson/LongSerializationPolicy.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/LongSerializationPolicy.html rename to docs/javadocs/com/google/gson/LongSerializationPolicy.html diff --git a/gson/docs/javadocs/com/google/gson/TypeAdapter.html b/docs/javadocs/com/google/gson/TypeAdapter.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/TypeAdapter.html rename to docs/javadocs/com/google/gson/TypeAdapter.html diff --git a/gson/docs/javadocs/com/google/gson/TypeAdapterFactory.html b/docs/javadocs/com/google/gson/TypeAdapterFactory.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/TypeAdapterFactory.html rename to docs/javadocs/com/google/gson/TypeAdapterFactory.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/Expose.html b/docs/javadocs/com/google/gson/annotations/Expose.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/Expose.html rename to docs/javadocs/com/google/gson/annotations/Expose.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/SerializedName.html b/docs/javadocs/com/google/gson/annotations/SerializedName.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/SerializedName.html rename to docs/javadocs/com/google/gson/annotations/SerializedName.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/Since.html b/docs/javadocs/com/google/gson/annotations/Since.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/Since.html rename to docs/javadocs/com/google/gson/annotations/Since.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/Until.html b/docs/javadocs/com/google/gson/annotations/Until.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/Until.html rename to docs/javadocs/com/google/gson/annotations/Until.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/class-use/Expose.html b/docs/javadocs/com/google/gson/annotations/class-use/Expose.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/class-use/Expose.html rename to docs/javadocs/com/google/gson/annotations/class-use/Expose.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/class-use/SerializedName.html b/docs/javadocs/com/google/gson/annotations/class-use/SerializedName.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/class-use/SerializedName.html rename to docs/javadocs/com/google/gson/annotations/class-use/SerializedName.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/class-use/Since.html b/docs/javadocs/com/google/gson/annotations/class-use/Since.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/class-use/Since.html rename to docs/javadocs/com/google/gson/annotations/class-use/Since.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/class-use/Until.html b/docs/javadocs/com/google/gson/annotations/class-use/Until.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/class-use/Until.html rename to docs/javadocs/com/google/gson/annotations/class-use/Until.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/package-frame.html b/docs/javadocs/com/google/gson/annotations/package-frame.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/package-frame.html rename to docs/javadocs/com/google/gson/annotations/package-frame.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/package-summary.html b/docs/javadocs/com/google/gson/annotations/package-summary.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/package-summary.html rename to docs/javadocs/com/google/gson/annotations/package-summary.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/package-tree.html b/docs/javadocs/com/google/gson/annotations/package-tree.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/package-tree.html rename to docs/javadocs/com/google/gson/annotations/package-tree.html diff --git a/gson/docs/javadocs/com/google/gson/annotations/package-use.html b/docs/javadocs/com/google/gson/annotations/package-use.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/annotations/package-use.html rename to docs/javadocs/com/google/gson/annotations/package-use.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/ExclusionStrategy.html b/docs/javadocs/com/google/gson/class-use/ExclusionStrategy.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/ExclusionStrategy.html rename to docs/javadocs/com/google/gson/class-use/ExclusionStrategy.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/FieldAttributes.html b/docs/javadocs/com/google/gson/class-use/FieldAttributes.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/FieldAttributes.html rename to docs/javadocs/com/google/gson/class-use/FieldAttributes.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/FieldNamingPolicy.html b/docs/javadocs/com/google/gson/class-use/FieldNamingPolicy.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/FieldNamingPolicy.html rename to docs/javadocs/com/google/gson/class-use/FieldNamingPolicy.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/FieldNamingStrategy.html b/docs/javadocs/com/google/gson/class-use/FieldNamingStrategy.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/FieldNamingStrategy.html rename to docs/javadocs/com/google/gson/class-use/FieldNamingStrategy.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/Gson.html b/docs/javadocs/com/google/gson/class-use/Gson.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/Gson.html rename to docs/javadocs/com/google/gson/class-use/Gson.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/GsonBuilder.html b/docs/javadocs/com/google/gson/class-use/GsonBuilder.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/GsonBuilder.html rename to docs/javadocs/com/google/gson/class-use/GsonBuilder.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/InstanceCreator.html b/docs/javadocs/com/google/gson/class-use/InstanceCreator.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/InstanceCreator.html rename to docs/javadocs/com/google/gson/class-use/InstanceCreator.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonArray.html b/docs/javadocs/com/google/gson/class-use/JsonArray.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonArray.html rename to docs/javadocs/com/google/gson/class-use/JsonArray.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonDeserializationContext.html b/docs/javadocs/com/google/gson/class-use/JsonDeserializationContext.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonDeserializationContext.html rename to docs/javadocs/com/google/gson/class-use/JsonDeserializationContext.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonDeserializer.html b/docs/javadocs/com/google/gson/class-use/JsonDeserializer.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonDeserializer.html rename to docs/javadocs/com/google/gson/class-use/JsonDeserializer.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonElement.html b/docs/javadocs/com/google/gson/class-use/JsonElement.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonElement.html rename to docs/javadocs/com/google/gson/class-use/JsonElement.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonIOException.html b/docs/javadocs/com/google/gson/class-use/JsonIOException.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonIOException.html rename to docs/javadocs/com/google/gson/class-use/JsonIOException.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonNull.html b/docs/javadocs/com/google/gson/class-use/JsonNull.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonNull.html rename to docs/javadocs/com/google/gson/class-use/JsonNull.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonObject.html b/docs/javadocs/com/google/gson/class-use/JsonObject.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonObject.html rename to docs/javadocs/com/google/gson/class-use/JsonObject.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonParseException.html b/docs/javadocs/com/google/gson/class-use/JsonParseException.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonParseException.html rename to docs/javadocs/com/google/gson/class-use/JsonParseException.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonParser.html b/docs/javadocs/com/google/gson/class-use/JsonParser.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonParser.html rename to docs/javadocs/com/google/gson/class-use/JsonParser.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonPrimitive.html b/docs/javadocs/com/google/gson/class-use/JsonPrimitive.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonPrimitive.html rename to docs/javadocs/com/google/gson/class-use/JsonPrimitive.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonSerializationContext.html b/docs/javadocs/com/google/gson/class-use/JsonSerializationContext.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonSerializationContext.html rename to docs/javadocs/com/google/gson/class-use/JsonSerializationContext.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonSerializer.html b/docs/javadocs/com/google/gson/class-use/JsonSerializer.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonSerializer.html rename to docs/javadocs/com/google/gson/class-use/JsonSerializer.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonStreamParser.html b/docs/javadocs/com/google/gson/class-use/JsonStreamParser.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonStreamParser.html rename to docs/javadocs/com/google/gson/class-use/JsonStreamParser.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/JsonSyntaxException.html b/docs/javadocs/com/google/gson/class-use/JsonSyntaxException.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/JsonSyntaxException.html rename to docs/javadocs/com/google/gson/class-use/JsonSyntaxException.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/LongSerializationPolicy.html b/docs/javadocs/com/google/gson/class-use/LongSerializationPolicy.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/LongSerializationPolicy.html rename to docs/javadocs/com/google/gson/class-use/LongSerializationPolicy.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/TypeAdapter.html b/docs/javadocs/com/google/gson/class-use/TypeAdapter.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/TypeAdapter.html rename to docs/javadocs/com/google/gson/class-use/TypeAdapter.html diff --git a/gson/docs/javadocs/com/google/gson/class-use/TypeAdapterFactory.html b/docs/javadocs/com/google/gson/class-use/TypeAdapterFactory.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/class-use/TypeAdapterFactory.html rename to docs/javadocs/com/google/gson/class-use/TypeAdapterFactory.html diff --git a/gson/docs/javadocs/com/google/gson/package-frame.html b/docs/javadocs/com/google/gson/package-frame.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/package-frame.html rename to docs/javadocs/com/google/gson/package-frame.html diff --git a/gson/docs/javadocs/com/google/gson/package-summary.html b/docs/javadocs/com/google/gson/package-summary.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/package-summary.html rename to docs/javadocs/com/google/gson/package-summary.html diff --git a/gson/docs/javadocs/com/google/gson/package-tree.html b/docs/javadocs/com/google/gson/package-tree.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/package-tree.html rename to docs/javadocs/com/google/gson/package-tree.html diff --git a/gson/docs/javadocs/com/google/gson/package-use.html b/docs/javadocs/com/google/gson/package-use.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/package-use.html rename to docs/javadocs/com/google/gson/package-use.html diff --git a/gson/docs/javadocs/com/google/gson/reflect/TypeToken.html b/docs/javadocs/com/google/gson/reflect/TypeToken.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/reflect/TypeToken.html rename to docs/javadocs/com/google/gson/reflect/TypeToken.html diff --git a/gson/docs/javadocs/com/google/gson/reflect/class-use/TypeToken.html b/docs/javadocs/com/google/gson/reflect/class-use/TypeToken.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/reflect/class-use/TypeToken.html rename to docs/javadocs/com/google/gson/reflect/class-use/TypeToken.html diff --git a/gson/docs/javadocs/com/google/gson/reflect/package-frame.html b/docs/javadocs/com/google/gson/reflect/package-frame.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/reflect/package-frame.html rename to docs/javadocs/com/google/gson/reflect/package-frame.html diff --git a/gson/docs/javadocs/com/google/gson/reflect/package-summary.html b/docs/javadocs/com/google/gson/reflect/package-summary.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/reflect/package-summary.html rename to docs/javadocs/com/google/gson/reflect/package-summary.html diff --git a/gson/docs/javadocs/com/google/gson/reflect/package-tree.html b/docs/javadocs/com/google/gson/reflect/package-tree.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/reflect/package-tree.html rename to docs/javadocs/com/google/gson/reflect/package-tree.html diff --git a/gson/docs/javadocs/com/google/gson/reflect/package-use.html b/docs/javadocs/com/google/gson/reflect/package-use.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/reflect/package-use.html rename to docs/javadocs/com/google/gson/reflect/package-use.html diff --git a/gson/docs/javadocs/com/google/gson/stream/JsonReader.html b/docs/javadocs/com/google/gson/stream/JsonReader.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/JsonReader.html rename to docs/javadocs/com/google/gson/stream/JsonReader.html diff --git a/gson/docs/javadocs/com/google/gson/stream/JsonToken.html b/docs/javadocs/com/google/gson/stream/JsonToken.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/JsonToken.html rename to docs/javadocs/com/google/gson/stream/JsonToken.html diff --git a/gson/docs/javadocs/com/google/gson/stream/JsonWriter.html b/docs/javadocs/com/google/gson/stream/JsonWriter.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/JsonWriter.html rename to docs/javadocs/com/google/gson/stream/JsonWriter.html diff --git a/gson/docs/javadocs/com/google/gson/stream/MalformedJsonException.html b/docs/javadocs/com/google/gson/stream/MalformedJsonException.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/MalformedJsonException.html rename to docs/javadocs/com/google/gson/stream/MalformedJsonException.html diff --git a/gson/docs/javadocs/com/google/gson/stream/class-use/JsonReader.html b/docs/javadocs/com/google/gson/stream/class-use/JsonReader.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/class-use/JsonReader.html rename to docs/javadocs/com/google/gson/stream/class-use/JsonReader.html diff --git a/gson/docs/javadocs/com/google/gson/stream/class-use/JsonToken.html b/docs/javadocs/com/google/gson/stream/class-use/JsonToken.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/class-use/JsonToken.html rename to docs/javadocs/com/google/gson/stream/class-use/JsonToken.html diff --git a/gson/docs/javadocs/com/google/gson/stream/class-use/JsonWriter.html b/docs/javadocs/com/google/gson/stream/class-use/JsonWriter.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/class-use/JsonWriter.html rename to docs/javadocs/com/google/gson/stream/class-use/JsonWriter.html diff --git a/gson/docs/javadocs/com/google/gson/stream/class-use/MalformedJsonException.html b/docs/javadocs/com/google/gson/stream/class-use/MalformedJsonException.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/class-use/MalformedJsonException.html rename to docs/javadocs/com/google/gson/stream/class-use/MalformedJsonException.html diff --git a/gson/docs/javadocs/com/google/gson/stream/package-frame.html b/docs/javadocs/com/google/gson/stream/package-frame.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/package-frame.html rename to docs/javadocs/com/google/gson/stream/package-frame.html diff --git a/gson/docs/javadocs/com/google/gson/stream/package-summary.html b/docs/javadocs/com/google/gson/stream/package-summary.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/package-summary.html rename to docs/javadocs/com/google/gson/stream/package-summary.html diff --git a/gson/docs/javadocs/com/google/gson/stream/package-tree.html b/docs/javadocs/com/google/gson/stream/package-tree.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/package-tree.html rename to docs/javadocs/com/google/gson/stream/package-tree.html diff --git a/gson/docs/javadocs/com/google/gson/stream/package-use.html b/docs/javadocs/com/google/gson/stream/package-use.html similarity index 100% rename from gson/docs/javadocs/com/google/gson/stream/package-use.html rename to docs/javadocs/com/google/gson/stream/package-use.html diff --git a/gson/docs/javadocs/constant-values.html b/docs/javadocs/constant-values.html similarity index 100% rename from gson/docs/javadocs/constant-values.html rename to docs/javadocs/constant-values.html diff --git a/gson/docs/javadocs/deprecated-list.html b/docs/javadocs/deprecated-list.html similarity index 100% rename from gson/docs/javadocs/deprecated-list.html rename to docs/javadocs/deprecated-list.html diff --git a/gson/docs/javadocs/help-doc.html b/docs/javadocs/help-doc.html similarity index 100% rename from gson/docs/javadocs/help-doc.html rename to docs/javadocs/help-doc.html diff --git a/gson/docs/javadocs/index-all.html b/docs/javadocs/index-all.html similarity index 100% rename from gson/docs/javadocs/index-all.html rename to docs/javadocs/index-all.html diff --git a/gson/docs/javadocs/index.html b/docs/javadocs/index.html similarity index 100% rename from gson/docs/javadocs/index.html rename to docs/javadocs/index.html diff --git a/gson/docs/javadocs/overview-frame.html b/docs/javadocs/overview-frame.html similarity index 100% rename from gson/docs/javadocs/overview-frame.html rename to docs/javadocs/overview-frame.html diff --git a/gson/docs/javadocs/overview-summary.html b/docs/javadocs/overview-summary.html similarity index 100% rename from gson/docs/javadocs/overview-summary.html rename to docs/javadocs/overview-summary.html diff --git a/gson/docs/javadocs/overview-tree.html b/docs/javadocs/overview-tree.html similarity index 100% rename from gson/docs/javadocs/overview-tree.html rename to docs/javadocs/overview-tree.html diff --git a/gson/docs/javadocs/package-list b/docs/javadocs/package-list similarity index 100% rename from gson/docs/javadocs/package-list rename to docs/javadocs/package-list diff --git a/gson/docs/javadocs/resources/inherit.gif b/docs/javadocs/resources/inherit.gif similarity index 100% rename from gson/docs/javadocs/resources/inherit.gif rename to docs/javadocs/resources/inherit.gif diff --git a/gson/docs/javadocs/serialized-form.html b/docs/javadocs/serialized-form.html similarity index 100% rename from gson/docs/javadocs/serialized-form.html rename to docs/javadocs/serialized-form.html diff --git a/gson/docs/javadocs/stylesheet.css b/docs/javadocs/stylesheet.css similarity index 100% rename from gson/docs/javadocs/stylesheet.css rename to docs/javadocs/stylesheet.css diff --git a/examples/android-proguard-example/AndroidManifest.xml b/examples/android-proguard-example/AndroidManifest.xml deleted file mode 100755 index 7e9b1d8b0f..0000000000 --- a/examples/android-proguard-example/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - diff --git a/examples/android-proguard-example/default.properties b/examples/android-proguard-example/default.properties deleted file mode 100644 index 7d4fed0b2d..0000000000 --- a/examples/android-proguard-example/default.properties +++ /dev/null @@ -1,12 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "build.properties", and override values to adapt the script to your -# project structure. - -# Project target. -target=android-3 -proguard.config=proguard.cfg \ No newline at end of file diff --git a/examples/android-proguard-example/proguard.cfg b/examples/android-proguard-example/proguard.cfg deleted file mode 100644 index 9bdaa484b7..0000000000 --- a/examples/android-proguard-example/proguard.cfg +++ /dev/null @@ -1,90 +0,0 @@ -##---------------Begin: proguard configuration common for all Android apps ---------- --optimizationpasses 5 --dontusemixedcaseclassnames --dontskipnonpubliclibraryclasses --dontskipnonpubliclibraryclassmembers --dontpreverify --verbose --dump class_files.txt --printseeds seeds.txt --printusage unused.txt --printmapping mapping.txt --optimizations !code/simplification/arithmetic,!field/*,!class/merging/* - --allowaccessmodification --keepattributes *Annotation* --renamesourcefileattribute SourceFile --keepattributes SourceFile,LineNumberTable --repackageclasses '' - --keep public class * extends android.app.Activity --keep public class * extends android.app.Application --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider --keep public class * extends android.app.backup.BackupAgentHelper --keep public class * extends android.preference.Preference --keep public class com.android.vending.licensing.ILicensingService --dontnote com.android.vending.licensing.ILicensingService - -# Explicitly preserve all serialization members. The Serializable interface -# is only a marker interface, so it wouldn't save them. --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - private static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# Preserve all native method names and the names of their classes. --keepclasseswithmembernames class * { - native ; -} - --keepclasseswithmembernames class * { - public (android.content.Context, android.util.AttributeSet); -} - --keepclasseswithmembernames class * { - public (android.content.Context, android.util.AttributeSet, int); -} - -# Preserve static fields of inner classes of R classes that might be accessed -# through introspection. --keepclassmembers class **.R$* { - public static ; -} - -# Preserve the special static methods that are required in all enumeration classes. --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - --keep public class * { - public protected *; -} - --keep class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator *; -} -##---------------End: proguard configuration common for all Android apps ---------- - -##---------------Begin: proguard configuration for Gson ---------- -# Gson uses generic type information stored in a class file when working with fields. Proguard -# removes such information by default, so configure it to keep all of it. --keepattributes Signature - -# For using GSON @Expose annotation --keepattributes *Annotation* - -# Gson specific classes --keep class sun.misc.Unsafe { *; } -#-keep class com.google.gson.stream.** { *; } - -# Application classes that will be serialized/deserialized over Gson --keep class com.google.gson.examples.android.model.** { *; } - -##---------------End: proguard configuration for Gson ---------- diff --git a/examples/android-proguard-example/res/drawable/icon.png b/examples/android-proguard-example/res/drawable/icon.png deleted file mode 100644 index a07c69fa5a0f4da5d5efe96eea12a543154dbab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2574 zcmV+p3i0)cP)Q`Og{P|8RRXpj5bgrSmEzSMfBn+{{vpNxw?;5UX;iv9sYxy_`IQHs$i<61a_iv^L>h8s-`D(`e@|IgS*Fj zNGM876Gf;3D8*1UX9a%v>yJKD*QkCwW2AirU(L{qNA)JghmGItc;(H<$!ABY&gBy1vJIEUj-b8%el*o|VkG)LqNx#TG>Jvj^jIte!!+RY z)T4j$7+PoF1AkRBf}R#^T=-q|PaK1$c<4UH)Hpq3$4WA|xtr!ZQLC=*vNE>O6E9kp+5X0eKB$6>C(lPwI@3#oY zhS_%x7e|j!$yG?ECXmh~EH~^OeuK}+sWoJse3Z3?ha3n`MM9KvA?uqpEnBg4Q46)7 zM$p%a$@l;+O}vfvx%XjH`}a{(-HHth9!JaUwV0*VqGR48^gWNYN<&~7x)y$e!X>e` zZ5!6KZoxbKuV9XUDI%#M1~IVh?pNSdeb~6@$y`v|yk=XK+fHxnDqnUK4&=QRNyIVf zYbDM*cI>~qIy*a7=z7uqkw@agd(<=y-Q7L!ty_23SGdXmahO<;N=wB+j;lNm%=OHC zy zU|>La6h%92y4IPufI$9>Xu!@y`TaNgtg&41@PwMwBdmSm7)xAWDLoqjZ==P2#*k7! z3o1)cVSI3KP_!?d8G^Lg0FtLXC~JYdxi|c%h~lXEixY=%VSFF@!*3&&9>(Rb|iK54Cx5;s~PY5iaV1het%w`dgQFBAJ;aFK zImQC}(|QaCFYUm1JVfzSc)ebv=)ObI)0jwJb``}Zj9J0n0Xgn*Zc(rFM9$xh_makZbm-at_v5^SW zM1y1SW@%+FuIy*WR)i3A2N_q;(YO`O!A|Ts^%z}9ZepCj3ytlw#x%N_fNrKKtPh`< z|1{UqF`4LxHaCQ79+E=uUXCOZ35jAMRz%R%0(P!0FMv=sk>Nr8%+OzY^c-M9@+fz=G`qa@v4sF5u-2289-#$**LWnyNNDwDf1( zkUiMnw|y$tn>pQP=Vn!#|17L^5AGrjtBkN$D@v)Z7LXc5EFhLB4<;7Wehh)CMqX|W zqsiZaO^benJ_hwa&V0ub$-_HUk**?g6fm9|!@kguU6*zhK)$qn-<3*kFrYPIaqR=V zUaUvk>@F_89b@tHs8R!*QKY;INJ<2_U+K6Ca3e9Gsl2{qY0%a7J?uICWgHuLfj+MB z=GkAN1&ifT#2u}B+2S#~$5jA(Qn^;H%CCmIae4AE-Dsng|Hl*Ov!z72k3ZnJs{pp| z+pW`DDueC#mEWOf=ucJ!dTL}hzOeiS-i?m2E;`EKz4<&Lu~NnW?peqVU^@<+T3KKu z{yrI%Qy-Z%HEvLUz}n^~m?7x`xuCtNR#L2En!T>dQtIKdS#V-Hzt3RtwTeYtmQ&dR z6qXZvac*oc@BUYEH%@Ylv_1&tSjkbzzU6*h1(3^C`;1z;g_SmOtclS?KWk2VYE zM*oS<=C483XckW?GN|1jfh3Ro(h - - - - - \ No newline at end of file diff --git a/examples/android-proguard-example/res/values/strings.xml b/examples/android-proguard-example/res/values/strings.xml deleted file mode 100644 index ba3be81e86..0000000000 --- a/examples/android-proguard-example/res/values/strings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - Gson Proguard Example - - diff --git a/examples/android-proguard-example/src/com/google/gson/examples/android/GsonProguardExampleActivity.java b/examples/android-proguard-example/src/com/google/gson/examples/android/GsonProguardExampleActivity.java deleted file mode 100644 index bd54431148..0000000000 --- a/examples/android-proguard-example/src/com/google/gson/examples/android/GsonProguardExampleActivity.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.examples.android; - -import java.util.ArrayList; -import java.util.List; - -import android.app.Activity; -import android.os.Bundle; -import android.widget.TextView; - -import com.google.gson.Gson; -import com.google.gson.examples.android.model.Cart; -import com.google.gson.examples.android.model.LineItem; - -/** - * Activity class illustrating how to use proguard with Gson - * - * @author Inderjeet Singh - */ -public class GsonProguardExampleActivity extends Activity { - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - setContentView(R.layout.main); - TextView tv = (TextView) findViewById(R.id.tv); - Gson gson = new Gson(); - Cart cart = buildCart(); - StringBuilder sb = new StringBuilder(); - sb.append("Gson.toJson() example: \n"); - sb.append(" Cart Object: ").append(cart).append("\n"); - sb.append(" Cart JSON: ").append(gson.toJson(cart)).append("\n"); - sb.append("\n\nGson.fromJson() example: \n"); - String json = "{buyer:'Happy Camper',creditCard:'4111-1111-1111-1111'," - + "lineItems:[{name:'nails',priceInMicros:100000,quantity:100,currencyCode:'USD'}]}"; - sb.append("Cart JSON: ").append(json).append("\n"); - sb.append("Cart Object: ").append(gson.fromJson(json, Cart.class)).append("\n"); - tv.setText(sb.toString()); - tv.invalidate(); - } - - private Cart buildCart() { - List lineItems = new ArrayList(); - lineItems.add(new LineItem("hammer", 1, 12000000, "USD")); - return new Cart(lineItems, "Happy Buyer", "4111-1111-1111-1111"); - } -} diff --git a/examples/android-proguard-example/src/com/google/gson/examples/android/model/Cart.java b/examples/android-proguard-example/src/com/google/gson/examples/android/model/Cart.java deleted file mode 100644 index 7582036ebc..0000000000 --- a/examples/android-proguard-example/src/com/google/gson/examples/android/model/Cart.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.examples.android.model; - -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.lang.reflect.WildcardType; -import java.util.List; - -import com.google.gson.annotations.SerializedName; - -/** - * A model object representing a cart that can be posted to an order-processing server - * - * @author Inderjeet Singh - */ -public class Cart { - public final List lineItems; - - @SerializedName("buyer") - private final String buyerName; - - private final String creditCard; - - public Cart(List lineItems, String buyerName, String creditCard) { - this.lineItems = lineItems; - this.buyerName = buyerName; - this.creditCard = creditCard; - } - - public List getLineItems() { - return lineItems; - } - - public String getBuyerName() { - return buyerName; - } - - public String getCreditCard() { - return creditCard; - } - - @Override - public String toString() { - StringBuilder itemsText = new StringBuilder(); - boolean first = true; - if (lineItems != null) { - try { - Class fieldType = Cart.class.getField("lineItems").getType(); - System.out.println("LineItems CLASS: " + getSimpleTypeName(fieldType)); - } catch (SecurityException e) { - } catch (NoSuchFieldException e) { - } - for (LineItem item : lineItems) { - if (first) { - first = false; - } else { - itemsText.append("; "); - } - itemsText.append(item); - } - } - return "[BUYER: " + buyerName + "; CC: " + creditCard + "; " - + "LINE_ITEMS: " + itemsText.toString() + "]"; - } - - @SuppressWarnings("unchecked") - public static String getSimpleTypeName(Type type) { - if (type == null) { - return "null"; - } - if (type instanceof Class) { - return ((Class)type).getSimpleName(); - } else if (type instanceof ParameterizedType) { - ParameterizedType pType = (ParameterizedType) type; - StringBuilder sb = new StringBuilder(getSimpleTypeName(pType.getRawType())); - sb.append('<'); - boolean first = true; - for (Type argumentType : pType.getActualTypeArguments()) { - if (first) { - first = false; - } else { - sb.append(','); - } - sb.append(getSimpleTypeName(argumentType)); - } - sb.append('>'); - return sb.toString(); - } else if (type instanceof WildcardType) { - return "?"; - } - return type.toString(); - } - -} diff --git a/examples/android-proguard-example/src/com/google/gson/examples/android/model/LineItem.java b/examples/android-proguard-example/src/com/google/gson/examples/android/model/LineItem.java deleted file mode 100644 index 5245f448de..0000000000 --- a/examples/android-proguard-example/src/com/google/gson/examples/android/model/LineItem.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.examples.android.model; - -/** - * A line item in a cart. This is not a rest resource, just a dependent object - * - * @author Inderjeet Singh - */ -public class LineItem { - private final String name; - private final int quantity; - private final long priceInMicros; - private final String currencyCode; - - public LineItem(String name, int quantity, long priceInMicros, String currencyCode) { - this.name = name; - this.quantity = quantity; - this.priceInMicros = priceInMicros; - this.currencyCode = currencyCode; - } - - public String getName() { - return name; - } - - public int getQuantity() { - return quantity; - } - - public long getPriceInMicros() { - return priceInMicros; - } - - public String getCurrencyCode() { - return currencyCode; - } - - @Override - public String toString() { - return String.format("(item: %s, qty: %s, price: %.2f %s)", - name, quantity, priceInMicros/(double)1000000, currencyCode); - } -} diff --git a/extras/pom.xml b/extras/pom.xml deleted file mode 100644 index 170b3e7f0a..0000000000 --- a/extras/pom.xml +++ /dev/null @@ -1,187 +0,0 @@ - - 4.0.0 - com.google.code.gson - gson-extras - jar - 1.0-SNAPSHOT - 2008 - Gson Extras - - org.sonatype.oss - oss-parent - 7 - - http://code.google.com/p/google-gson/ - Google Gson grab bag of utilities, type adapters, etc. - - UTF-8 - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - scm:svn:http://google-gson.googlecode.com/svn/trunk/extras - scm:svn:https://google-gson.googlecode.com/svn/trunk/extras - http://google-gson.codegoogle.com/svn/trunk/extras - - - Google Code Issue Tracking - http://code.google.com/p/google-gson/issues/list - - - Google, Inc. - http://www.google.com - - - - com.google.code.gson - gson - 2.2.3-SNAPSHOT - compile - - - junit - junit - 3.8.2 - test - - - - - - release-sign-artifacts - - - performRelease - true - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.4 - - - sign-artifacts - verify - - sign - - - - - - - - - - package - - - org.apache.maven.plugins - maven-compiler-plugin - 2.5.1 - - 1.5 - 1.5 - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - package - - jar - - - - - - false - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - verify - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8.1 - - - attach-javadocs - - jar - - - - - - http://download.oracle.com/javase/1.5.0/docs/api/ - - true - public - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.9 - - true - true - - ../eclipse-ws/ - - - file:///${basedir}/../lib/gson-formatting-styles.xml - - - - - org.apache.maven.plugins - maven-release-plugin - - - -DenableCiProfile=true - https://google-gson.googlecode.com/svn/tags/ - - - - - - - Inderjeet Singh - Trymph Inc. - - - Joel Leitch - Google Inc. - - - Jesse Wilson - Square Inc. - - - diff --git a/extras/src/main/java/com/google/gson/extras/examples/rawcollections/RawCollectionsExample.java b/extras/src/main/java/com/google/gson/extras/examples/rawcollections/RawCollectionsExample.java deleted file mode 100644 index bd7c2d24d0..0000000000 --- a/extras/src/main/java/com/google/gson/extras/examples/rawcollections/RawCollectionsExample.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.extras.examples.rawcollections; - -import java.util.ArrayList; -import java.util.Collection; - -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonParser; - -public class RawCollectionsExample { - static class Event { - private String name; - private String source; - private Event(String name, String source) { - this.name = name; - this.source = source; - } - @Override - public String toString() { - return String.format("(name=%s, source=%s)", name, source); - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public static void main(String[] args) { - Gson gson = new Gson(); - Collection collection = new ArrayList(); - collection.add("hello"); - collection.add(5); - collection.add(new Event("GREETINGS", "guest")); - String json = gson.toJson(collection); - System.out.println("Using Gson.toJson() on a raw collection: " + json); - JsonParser parser = new JsonParser(); - JsonArray array = parser.parse(json).getAsJsonArray(); - String message = gson.fromJson(array.get(0), String.class); - int number = gson.fromJson(array.get(1), int.class); - Event event = gson.fromJson(array.get(2), Event.class); - System.out.printf("Using Gson.fromJson() to get: %s, %d, %s", message, number, event); - } -} diff --git a/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java b/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java deleted file mode 100644 index 2daa158d1e..0000000000 --- a/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.graph; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.InstanceCreator; -import com.google.gson.JsonElement; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.internal.ConstructorConstructor; -import com.google.gson.internal.ObjectConstructor; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonToken; -import com.google.gson.stream.JsonWriter; -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.Queue; - -/** - * Writes a graph of objects as a list of named nodes. - */ -// TODO: proper documentation -@SuppressWarnings("rawtypes") -public final class GraphAdapterBuilder { - private final ConstructorConstructor constructorConstructor = new ConstructorConstructor(); - private final Map> instanceCreators - = new HashMap>(); - - public GraphAdapterBuilder addType(Type type) { - final ObjectConstructor objectConstructor = constructorConstructor.get(TypeToken.get(type)); - InstanceCreator instanceCreator = new InstanceCreator() { - public Object createInstance(Type type) { - return objectConstructor.construct(); - } - }; - return addType(type, instanceCreator); - } - - public GraphAdapterBuilder addType(Type type, InstanceCreator instanceCreator) { - if (type == null || instanceCreator == null) { - throw new NullPointerException(); - } - instanceCreators.put(type, instanceCreator); - return this; - } - - public void registerOn(GsonBuilder gsonBuilder) { - Factory factory = new Factory(instanceCreators); - gsonBuilder.registerTypeAdapterFactory(factory); - for (Map.Entry> entry : instanceCreators.entrySet()) { - gsonBuilder.registerTypeAdapter(entry.getKey(), factory); - } - } - - static class Factory implements TypeAdapterFactory, InstanceCreator { - private final Map> instanceCreators; - private final ThreadLocal graphThreadLocal = new ThreadLocal(); - - Factory(Map> instanceCreators) { - this.instanceCreators = instanceCreators; - } - - public TypeAdapter create(Gson gson, TypeToken type) { - if (!instanceCreators.containsKey(type.getType())) { - return null; - } - - final TypeAdapter typeAdapter = gson.getDelegateAdapter(this, type); - final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); - return new TypeAdapter() { - @Override public void write(JsonWriter out, T value) throws IOException { - if (value == null) { - out.nullValue(); - return; - } - - Graph graph = graphThreadLocal.get(); - boolean writeEntireGraph = false; - - /* - * We have one of two cases: - * 1. We've encountered the first known object in this graph. Write - * out the graph, starting with that object. - * 2. We've encountered another graph object in the course of #1. - * Just write out this object's name. We'll circle back to writing - * out the object's value as a part of #1. - */ - - if (graph == null) { - writeEntireGraph = true; - graph = new Graph(new IdentityHashMap>()); - } - - @SuppressWarnings("unchecked") // graph.map guarantees consistency between value and T - Element element = (Element) graph.map.get(value); - if (element == null) { - element = new Element(value, graph.nextName(), typeAdapter, null); - graph.map.put(value, element); - graph.queue.add(element); - } - - if (writeEntireGraph) { - graphThreadLocal.set(graph); - try { - out.beginObject(); - Element current; - while ((current = graph.queue.poll()) != null) { - out.name(current.id); - current.write(out); - } - out.endObject(); - } finally { - graphThreadLocal.remove(); - } - } else { - out.value(element.id); - } - } - - @Override public T read(JsonReader in) throws IOException { - if (in.peek() == JsonToken.NULL) { - in.nextNull(); - return null; - } - - /* - * Again we have one of two cases: - * 1. We've encountered the first known object in this graph. Read - * the entire graph in as a map from names to their JsonElements. - * Then convert the first JsonElement to its Java object. - * 2. We've encountered another graph object in the course of #1. - * Read in its name, then deserialize its value from the - * JsonElement in our map. We need to do this lazily because we - * don't know which TypeAdapter to use until a value is - * encountered in the wild. - */ - - String currentName = null; - Graph graph = graphThreadLocal.get(); - boolean readEntireGraph = false; - - if (graph == null) { - graph = new Graph(new HashMap>()); - readEntireGraph = true; - - // read the entire tree into memory - in.beginObject(); - while (in.hasNext()) { - String name = in.nextName(); - if (currentName == null) { - currentName = name; - } - JsonElement element = elementAdapter.read(in); - graph.map.put(name, new Element(null, name, typeAdapter, element)); - } - in.endObject(); - } else { - currentName = in.nextString(); - } - - if (readEntireGraph) { - graphThreadLocal.set(graph); - } - try { - @SuppressWarnings("unchecked") // graph.map guarantees consistency between value and T - Element element = (Element) graph.map.get(currentName); - // now that we know the typeAdapter for this name, go from JsonElement to 'T' - if (element.value == null) { - element.typeAdapter = typeAdapter; - element.read(graph); - } - return element.value; - } finally { - if (readEntireGraph) { - graphThreadLocal.remove(); - } - } - } - }; - } - - /** - * Hook for the graph adapter to get a reference to a deserialized value - * before that value is fully populated. This is useful to deserialize - * values that directly or indirectly reference themselves: we can hand - * out an instance before read() returns. - * - *

Gson should only ever call this method when we're expecting it to; - * that is only when we've called back into Gson to deserialize a tree. - */ - @SuppressWarnings("unchecked") - public Object createInstance(Type type) { - Graph graph = graphThreadLocal.get(); - if (graph == null || graph.nextCreate == null) { - throw new IllegalStateException("Unexpected call to createInstance() for " + type); - } - InstanceCreator creator = instanceCreators.get(type); - Object result = creator.createInstance(type); - graph.nextCreate.value = result; - graph.nextCreate = null; - return result; - } - } - - static class Graph { - /** - * The graph elements. On serialization keys are objects (using an identity - * hash map) and on deserialization keys are the string names (using a - * standard hash map). - */ - private final Map> map; - - /** - * The queue of elements to write during serialization. Unused during - * deserialization. - */ - private final Queue queue = new LinkedList(); - - /** - * The instance currently being deserialized. Used as a backdoor between - * the graph traversal (which needs to know instances) and instance creators - * which create them. - */ - private Element nextCreate; - - private Graph(Map> map) { - this.map = map; - } - - /** - * Returns a unique name for an element to be inserted into the graph. - */ - public String nextName() { - return "0x" + Integer.toHexString(map.size() + 1); - } - } - - /** - * An element of the graph during serialization or deserialization. - */ - static class Element { - /** - * This element's name in the top level graph object. - */ - private final String id; - - /** - * The value if known. During deserialization this is lazily populated. - */ - private T value; - - /** - * This element's type adapter if known. During deserialization this is - * lazily populated. - */ - private TypeAdapter typeAdapter; - - /** - * The element to deserialize. Unused in serialization. - */ - private final JsonElement element; - - Element(T value, String id, TypeAdapter typeAdapter, JsonElement element) { - this.value = value; - this.id = id; - this.typeAdapter = typeAdapter; - this.element = element; - } - - void write(JsonWriter out) throws IOException { - typeAdapter.write(out, value); - } - - void read(Graph graph) throws IOException { - if (graph.nextCreate != null) { - throw new IllegalStateException("Unexpected recursive call to read() for " + id); - } - graph.nextCreate = this; - value = typeAdapter.fromJsonTree(element); - if (value == null) { - throw new IllegalStateException("non-null value deserialized to null: " + element); - } - } - } -} diff --git a/extras/src/main/java/com/google/gson/interceptors/Intercept.java b/extras/src/main/java/com/google/gson/interceptors/Intercept.java deleted file mode 100644 index 0c4e9043f6..0000000000 --- a/extras/src/main/java/com/google/gson/interceptors/Intercept.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.interceptors; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - - -/** - * Use this annotation to indicate various interceptors for class instances after - * they have been processed by Gson. For example, you can use it to validate an instance - * after it has been deserialized from Json. - * Here is an example of how this annotation is used: - *

Here is an example of how this annotation is used: - *

- * @Intercept(postDeserialize=UserValidator.class)
- * public class User {
- *   String name;
- *   String password;
- *   String emailAddress;
- * }
- *
- * public class UserValidator implements JsonPostDeserializer<User> {
- *   public void postDeserialize(User user) {
- *     // Do some checks on user
- *     if (user.name == null || user.password == null) {
- *       throw new JsonParseException("name and password are required fields.");
- *     }
- *     if (user.emailAddress == null) {
- *       emailAddress = "unknown"; // assign a default value.
- *     }
- *   }
- * }
- * 

- * - * @author Inderjeet Singh - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface Intercept { - - /** - * Specify the class that provides the methods that should be invoked after an instance - * has been deserialized. - */ - @SuppressWarnings("rawtypes") - public Class postDeserialize(); -} diff --git a/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java b/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java deleted file mode 100644 index 907fca3a42..0000000000 --- a/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.google.gson.interceptors; - -import com.google.gson.Gson; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; -import java.io.IOException; - -/** - * A type adapter factory that implements {@code @Intercept}. - */ -public final class InterceptorFactory implements TypeAdapterFactory { - public TypeAdapter create(Gson gson, TypeToken type) { - Intercept intercept = type.getRawType().getAnnotation(Intercept.class); - if (intercept == null) { - return null; - } - - TypeAdapter delegate = gson.getDelegateAdapter(this, type); - return new InterceptorAdapter(delegate, intercept); - } - - static class InterceptorAdapter extends TypeAdapter { - private final TypeAdapter delegate; - private final JsonPostDeserializer postDeserializer; - - @SuppressWarnings("unchecked") // ? - public InterceptorAdapter(TypeAdapter delegate, Intercept intercept) { - try { - this.delegate = delegate; - this.postDeserializer = intercept.postDeserialize().newInstance(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override public void write(JsonWriter out, T value) throws IOException { - delegate.write(out, value); - } - - @Override public T read(JsonReader in) throws IOException { - T result = delegate.read(in); - postDeserializer.postDeserialize(result); - return result; - } - } -} diff --git a/extras/src/main/java/com/google/gson/interceptors/JsonPostDeserializer.java b/extras/src/main/java/com/google/gson/interceptors/JsonPostDeserializer.java deleted file mode 100644 index 0f3a72ca82..0000000000 --- a/extras/src/main/java/com/google/gson/interceptors/JsonPostDeserializer.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.interceptors; - -import com.google.gson.InstanceCreator; - -/** - * This interface is implemented by a class that wishes to inspect or modify an object - * after it has been deserialized. You must define a no-args constructor or register an - * {@link InstanceCreator} for such a class. - * - * @author Inderjeet Singh - */ -public interface JsonPostDeserializer { - - /** - * This method is called by Gson after the object has been deserialized from Json. - */ - public void postDeserialize(T object); -} diff --git a/extras/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java b/extras/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java deleted file mode 100644 index 1111ebc642..0000000000 --- a/extras/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.typeadapters; - -import java.io.IOException; -import java.util.LinkedHashMap; -import java.util.Map; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonPrimitive; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.internal.Streams; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -/** - * Adapts values whose runtime type may differ from their declaration type. This - * is necessary when a field's type is not the same type that GSON should create - * when deserializing that field. For example, consider these types: - *
   {@code
- *   abstract class Shape {
- *     int x;
- *     int y;
- *   }
- *   class Circle extends Shape {
- *     int radius;
- *   }
- *   class Rectangle extends Shape {
- *     int width;
- *     int height;
- *   }
- *   class Diamond extends Shape {
- *     int width;
- *     int height;
- *   }
- *   class Drawing {
- *     Shape bottomShape;
- *     Shape topShape;
- *   }
- * }
- *

Without additional type information, the serialized JSON is ambiguous. Is - * the bottom shape in this drawing a rectangle or a diamond?

   {@code
- *   {
- *     "bottomShape": {
- *       "width": 10,
- *       "height": 5,
- *       "x": 0,
- *       "y": 0
- *     },
- *     "topShape": {
- *       "radius": 2,
- *       "x": 4,
- *       "y": 1
- *     }
- *   }}
- * This class addresses this problem by adding type information to the - * serialized JSON and honoring that type information when the JSON is - * deserialized:
   {@code
- *   {
- *     "bottomShape": {
- *       "type": "Diamond",
- *       "width": 10,
- *       "height": 5,
- *       "x": 0,
- *       "y": 0
- *     },
- *     "topShape": {
- *       "type": "Circle",
- *       "radius": 2,
- *       "x": 4,
- *       "y": 1
- *     }
- *   }}
- * Both the type field name ({@code "type"}) and the type labels ({@code - * "Rectangle"}) are configurable. - * - *

Registering Types

- * Create a {@code RuntimeTypeAdapter} by passing the base type and type field - * name to the {@link #of} factory method. If you don't supply an explicit type - * field name, {@code "type"} will be used.
   {@code
- *   RuntimeTypeAdapter shapeAdapter
- *       = RuntimeTypeAdapter.of(Shape.class, "type");
- * }
- * Next register all of your subtypes. Every subtype must be explicitly - * registered. This protects your application from injection attacks. If you - * don't supply an explicit type label, the type's simple name will be used. - *
   {@code
- *   shapeAdapter.registerSubtype(Rectangle.class, "Rectangle");
- *   shapeAdapter.registerSubtype(Circle.class, "Circle");
- *   shapeAdapter.registerSubtype(Diamond.class, "Diamond");
- * }
- * Finally, register the type adapter in your application's GSON builder: - *
   {@code
- *   Gson gson = new GsonBuilder()
- *       .registerTypeAdapter(Shape.class, shapeAdapter)
- *       .create();
- * }
- * Like {@code GsonBuilder}, this API supports chaining:
   {@code
- *   RuntimeTypeAdapter shapeAdapter = RuntimeTypeAdapterFactory.of(Shape.class)
- *       .registerSubtype(Rectangle.class)
- *       .registerSubtype(Circle.class)
- *       .registerSubtype(Diamond.class);
- * }
- */ -public final class RuntimeTypeAdapterFactory implements TypeAdapterFactory { - private final Class baseType; - private final String typeFieldName; - private final Map> labelToSubtype = new LinkedHashMap>(); - private final Map, String> subtypeToLabel = new LinkedHashMap, String>(); - - private RuntimeTypeAdapterFactory(Class baseType, String typeFieldName) { - if (typeFieldName == null || baseType == null) { - throw new NullPointerException(); - } - this.baseType = baseType; - this.typeFieldName = typeFieldName; - } - - /** - * Creates a new runtime type adapter using for {@code baseType} using {@code - * typeFieldName} as the type field name. Type field names are case sensitive. - */ - public static RuntimeTypeAdapterFactory of(Class baseType, String typeFieldName) { - return new RuntimeTypeAdapterFactory(baseType, typeFieldName); - } - - /** - * Creates a new runtime type adapter for {@code baseType} using {@code "type"} as - * the type field name. - */ - public static RuntimeTypeAdapterFactory of(Class baseType) { - return new RuntimeTypeAdapterFactory(baseType, "type"); - } - - /** - * Registers {@code type} identified by {@code label}. Labels are case - * sensitive. - * - * @throws IllegalArgumentException if either {@code type} or {@code label} - * have already been registered on this type adapter. - */ - public RuntimeTypeAdapterFactory registerSubtype(Class type, String label) { - if (type == null || label == null) { - throw new NullPointerException(); - } - if (subtypeToLabel.containsKey(type) || labelToSubtype.containsKey(label)) { - throw new IllegalArgumentException("types and labels must be unique"); - } - labelToSubtype.put(label, type); - subtypeToLabel.put(type, label); - return this; - } - - /** - * Registers {@code type} identified by its {@link Class#getSimpleName simple - * name}. Labels are case sensitive. - * - * @throws IllegalArgumentException if either {@code type} or its simple name - * have already been registered on this type adapter. - */ - public RuntimeTypeAdapterFactory registerSubtype(Class type) { - return registerSubtype(type, type.getSimpleName()); - } - - public TypeAdapter create(Gson gson, TypeToken type) { - if (type.getRawType() != baseType) { - return null; - } - - final Map> labelToDelegate - = new LinkedHashMap>(); - final Map, TypeAdapter> subtypeToDelegate - = new LinkedHashMap, TypeAdapter>(); - for (Map.Entry> entry : labelToSubtype.entrySet()) { - TypeAdapter delegate = gson.getDelegateAdapter(this, TypeToken.get(entry.getValue())); - labelToDelegate.put(entry.getKey(), delegate); - subtypeToDelegate.put(entry.getValue(), delegate); - } - - return new TypeAdapter() { - @Override public R read(JsonReader in) throws IOException { - JsonElement jsonElement = Streams.parse(in); - JsonElement labelJsonElement = jsonElement.getAsJsonObject().remove(typeFieldName); - if (labelJsonElement == null) { - throw new JsonParseException("cannot deserialize " + baseType - + " because it does not define a field named " + typeFieldName); - } - String label = labelJsonElement.getAsString(); - @SuppressWarnings("unchecked") // registration requires that subtype extends T - TypeAdapter delegate = (TypeAdapter) labelToDelegate.get(label); - if (delegate == null) { - throw new JsonParseException("cannot deserialize " + baseType + " subtype named " - + label + "; did you forget to register a subtype?"); - } - return delegate.fromJsonTree(jsonElement); - } - - @Override public void write(JsonWriter out, R value) throws IOException { - Class srcType = value.getClass(); - String label = subtypeToLabel.get(srcType); - @SuppressWarnings("unchecked") // registration requires that subtype extends T - TypeAdapter delegate = (TypeAdapter) subtypeToDelegate.get(srcType); - if (delegate == null) { - throw new JsonParseException("cannot serialize " + srcType.getName() - + "; did you forget to register a subtype?"); - } - JsonObject jsonObject = delegate.toJsonTree(value).getAsJsonObject(); - if (jsonObject.has(typeFieldName)) { - throw new JsonParseException("cannot serialize " + srcType.getName() - + " because it already defines a field named " + typeFieldName); - } - JsonObject clone = new JsonObject(); - clone.add(typeFieldName, new JsonPrimitive(label)); - for (Map.Entry e : jsonObject.entrySet()) { - clone.add(e.getKey(), e.getValue()); - } - Streams.write(clone, out); - } - }; - } -} diff --git a/extras/src/test/java/com/google/gson/graph/GraphAdapterBuilderTest.java b/extras/src/test/java/com/google/gson/graph/GraphAdapterBuilderTest.java deleted file mode 100644 index 8a1d7cdbfb..0000000000 --- a/extras/src/test/java/com/google/gson/graph/GraphAdapterBuilderTest.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.graph; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import junit.framework.TestCase; - -public final class GraphAdapterBuilderTest extends TestCase { - public void testSerialization() { - Roshambo rock = new Roshambo("ROCK"); - Roshambo scissors = new Roshambo("SCISSORS"); - Roshambo paper = new Roshambo("PAPER"); - rock.beats = scissors; - scissors.beats = paper; - paper.beats = rock; - - GsonBuilder gsonBuilder = new GsonBuilder(); - new GraphAdapterBuilder() - .addType(Roshambo.class) - .registerOn(gsonBuilder); - Gson gson = gsonBuilder.create(); - - assertEquals("{'0x1':{'name':'ROCK','beats':'0x2'}," + - "'0x2':{'name':'SCISSORS','beats':'0x3'}," + - "'0x3':{'name':'PAPER','beats':'0x1'}}", - gson.toJson(rock).replace('"', '\'')); - } - - public void testDeserialization() { - String json = "{'0x1':{'name':'ROCK','beats':'0x2'}," + - "'0x2':{'name':'SCISSORS','beats':'0x3'}," + - "'0x3':{'name':'PAPER','beats':'0x1'}}"; - - GsonBuilder gsonBuilder = new GsonBuilder(); - new GraphAdapterBuilder() - .addType(Roshambo.class) - .registerOn(gsonBuilder); - Gson gson = gsonBuilder.create(); - - Roshambo rock = gson.fromJson(json, Roshambo.class); - assertEquals("ROCK", rock.name); - Roshambo scissors = rock.beats; - assertEquals("SCISSORS", scissors.name); - Roshambo paper = scissors.beats; - assertEquals("PAPER", paper.name); - assertSame(rock, paper.beats); - } - - public void testSerializationDirectSelfReference() { - Roshambo suicide = new Roshambo("SUICIDE"); - suicide.beats = suicide; - - GsonBuilder gsonBuilder = new GsonBuilder(); - new GraphAdapterBuilder() - .addType(Roshambo.class) - .registerOn(gsonBuilder); - Gson gson = gsonBuilder.create(); - - assertEquals("{'0x1':{'name':'SUICIDE','beats':'0x1'}}", - gson.toJson(suicide).replace('"', '\'')); - } - - public void testDeserializationDirectSelfReference() { - String json = "{'0x1':{'name':'SUICIDE','beats':'0x1'}}"; - - GsonBuilder gsonBuilder = new GsonBuilder(); - new GraphAdapterBuilder() - .addType(Roshambo.class) - .registerOn(gsonBuilder); - Gson gson = gsonBuilder.create(); - - Roshambo suicide = gson.fromJson(json, Roshambo.class); - assertEquals("SUICIDE", suicide.name); - assertSame(suicide, suicide.beats); - } - - public void testSerializeListOfLists() { - Type listOfListsType = new TypeToken>>() {}.getType(); - Type listOfAnyType = new TypeToken>() {}.getType(); - - List> listOfLists = new ArrayList>(); - listOfLists.add(listOfLists); - listOfLists.add(new ArrayList()); - - GsonBuilder gsonBuilder = new GsonBuilder(); - new GraphAdapterBuilder() - .addType(listOfListsType) - .addType(listOfAnyType) - .registerOn(gsonBuilder); - Gson gson = gsonBuilder.create(); - - String json = gson.toJson(listOfLists, listOfListsType); - assertEquals("{'0x1':['0x1','0x2'],'0x2':[]}", json.replace('"', '\'')); - } - - public void testDeserializeListOfLists() { - Type listOfAnyType = new TypeToken>() {}.getType(); - Type listOfListsType = new TypeToken>>() {}.getType(); - - GsonBuilder gsonBuilder = new GsonBuilder(); - new GraphAdapterBuilder() - .addType(listOfListsType) - .addType(listOfAnyType) - .registerOn(gsonBuilder); - Gson gson = gsonBuilder.create(); - - List> listOfLists = gson.fromJson("{'0x1':['0x1','0x2'],'0x2':[]}", listOfListsType); - assertEquals(2, listOfLists.size()); - assertSame(listOfLists, listOfLists.get(0)); - assertEquals(Collections.emptyList(), listOfLists.get(1)); - } - - public void testSerializationWithMultipleTypes() { - Company google = new Company("Google"); - new Employee("Jesse", google); - new Employee("Joel", google); - - GsonBuilder gsonBuilder = new GsonBuilder(); - new GraphAdapterBuilder() - .addType(Company.class) - .addType(Employee.class) - .registerOn(gsonBuilder); - Gson gson = gsonBuilder.create(); - - assertEquals("{'0x1':{'name':'Google','employees':['0x2','0x3']}," - + "'0x2':{'name':'Jesse','company':'0x1'}," - + "'0x3':{'name':'Joel','company':'0x1'}}", - gson.toJson(google).replace('"', '\'')); - } - - public void testDeserializationWithMultipleTypes() { - GsonBuilder gsonBuilder = new GsonBuilder(); - new GraphAdapterBuilder() - .addType(Company.class) - .addType(Employee.class) - .registerOn(gsonBuilder); - Gson gson = gsonBuilder.create(); - - String json = "{'0x1':{'name':'Google','employees':['0x2','0x3']}," - + "'0x2':{'name':'Jesse','company':'0x1'}," - + "'0x3':{'name':'Joel','company':'0x1'}}"; - Company company = gson.fromJson(json, Company.class); - assertEquals("Google", company.name); - Employee jesse = company.employees.get(0); - assertEquals("Jesse", jesse.name); - assertEquals(company, jesse.company); - Employee joel = company.employees.get(1); - assertEquals("Joel", joel.name); - assertEquals(company, joel.company); - } - - static class Roshambo { - String name; - Roshambo beats; - Roshambo(String name) { - this.name = name; - } - } - - static class Employee { - final String name; - final Company company; - Employee(String name, Company company) { - this.name = name; - this.company = company; - this.company.employees.add(this); - } - } - - static class Company { - final String name; - final List employees = new ArrayList(); - Company(String name) { - this.name = name; - } - } -} diff --git a/extras/src/test/java/com/google/gson/interceptors/InterceptorTest.java b/extras/src/test/java/com/google/gson/interceptors/InterceptorTest.java deleted file mode 100644 index 0aab6598c3..0000000000 --- a/extras/src/test/java/com/google/gson/interceptors/InterceptorTest.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.interceptors; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSyntaxException; -import com.google.gson.TypeAdapter; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import junit.framework.TestCase; - -/** - * Unit tests for {@link Intercept} and {@link JsonPostDeserializer}. - * - * @author Inderjeet Singh - */ -public final class InterceptorTest extends TestCase { - - private Gson gson; - - @Override - public void setUp() throws Exception { - super.setUp(); - this.gson = new GsonBuilder() - .registerTypeAdapterFactory(new InterceptorFactory()) - .enableComplexMapKeySerialization() - .create(); - } - - public void testExceptionsPropagated() { - try { - gson.fromJson("{}", User.class); - fail(); - } catch (JsonParseException expected) {} - } - - public void testTopLevelClass() { - User user = gson.fromJson("{name:'bob',password:'pwd'}", User.class); - assertEquals(User.DEFAULT_EMAIL, user.email); - } - - public void testList() { - List list = gson.fromJson("[{name:'bob',password:'pwd'}]", new TypeToken>(){}.getType()); - User user = list.get(0); - assertEquals(User.DEFAULT_EMAIL, user.email); - } - - public void testCollection() { - Collection list = gson.fromJson("[{name:'bob',password:'pwd'}]", new TypeToken>(){}.getType()); - User user = list.iterator().next(); - assertEquals(User.DEFAULT_EMAIL, user.email); - } - - public void testMapKeyAndValues() { - Type mapType = new TypeToken>(){}.getType(); - try { - gson.fromJson("[[{name:'bob',password:'pwd'},{}]]", mapType); - fail(); - } catch (JsonSyntaxException expected) {} - Map map = gson.fromJson("[[{name:'bob',password:'pwd'},{city:'Mountain View',state:'CA',zip:'94043'}]]", - mapType); - Entry entry = map.entrySet().iterator().next(); - assertEquals(User.DEFAULT_EMAIL, entry.getKey().email); - assertEquals(Address.DEFAULT_FIRST_LINE, entry.getValue().firstLine); - } - - public void testField() { - UserGroup userGroup = gson.fromJson("{user:{name:'bob',password:'pwd'}}", UserGroup.class); - assertEquals(User.DEFAULT_EMAIL, userGroup.user.email); - } - - public void testCustomTypeAdapter() { - Gson gson = new GsonBuilder() - .registerTypeAdapter(User.class, new TypeAdapter() { - @Override public void write(JsonWriter out, User value) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override public User read(JsonReader in) throws IOException { - in.beginObject(); - in.nextName(); - String name = in.nextString(); - in.nextName(); - String password = in.nextString(); - in.endObject(); - return new User(name, password); - } - }) - .registerTypeAdapterFactory(new InterceptorFactory()) - .create(); - UserGroup userGroup = gson.fromJson("{user:{name:'bob',password:'pwd'}}", UserGroup.class); - assertEquals(User.DEFAULT_EMAIL, userGroup.user.email); - } - - public void testDirectInvocationOfTypeAdapter() throws Exception { - TypeAdapter adapter = gson.getAdapter(UserGroup.class); - UserGroup userGroup = adapter.fromJson("{\"user\":{\"name\":\"bob\",\"password\":\"pwd\"}}"); - assertEquals(User.DEFAULT_EMAIL, userGroup.user.email); - } - - @SuppressWarnings("unused") - private static final class UserGroup { - User user; - String city; - } - - @Intercept(postDeserialize = UserValidator.class) - @SuppressWarnings("unused") - private static final class User { - static final String DEFAULT_EMAIL = "invalid@invalid.com"; - String name; - String password; - String email; - Address address; - public User(String name, String password) { - this.name = name; - this.password = password; - } - } - - public static final class UserValidator implements JsonPostDeserializer { - public void postDeserialize(User user) { - if (user.name == null || user.password == null) { - throw new JsonSyntaxException("name and password are required fields."); - } - if (user.email == null) user.email = User.DEFAULT_EMAIL; - } - } - - @Intercept(postDeserialize = AddressValidator.class) - @SuppressWarnings("unused") - private static final class Address { - static final String DEFAULT_FIRST_LINE = "unknown"; - String firstLine; - String secondLine; - String city; - String state; - String zip; - } - - public static final class AddressValidator implements JsonPostDeserializer
{ - public void postDeserialize(Address address) { - if (address.city == null || address.state == null || address.zip == null) { - throw new JsonSyntaxException("Address city, state and zip are required fields."); - } - if (address.firstLine == null) address.firstLine = Address.DEFAULT_FIRST_LINE; - } - } -} diff --git a/extras/src/test/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactoryTest.java b/extras/src/test/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactoryTest.java deleted file mode 100644 index a9f8ebbbe7..0000000000 --- a/extras/src/test/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactoryTest.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.typeadapters; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonParseException; -import com.google.gson.TypeAdapterFactory; -import junit.framework.TestCase; - -public final class RuntimeTypeAdapterFactoryTest extends TestCase { - - public void testRuntimeTypeAdapter() { - RuntimeTypeAdapterFactory rta = RuntimeTypeAdapterFactory.of( - BillingInstrument.class) - .registerSubtype(CreditCard.class); - Gson gson = new GsonBuilder() - .registerTypeAdapterFactory(rta) - .create(); - - CreditCard original = new CreditCard("Jesse", 234); - assertEquals("{\"type\":\"CreditCard\",\"cvv\":234,\"ownerName\":\"Jesse\"}", - gson.toJson(original, BillingInstrument.class)); - BillingInstrument deserialized = gson.fromJson( - "{type:'CreditCard',cvv:234,ownerName:'Jesse'}", BillingInstrument.class); - assertEquals("Jesse", deserialized.ownerName); - assertTrue(deserialized instanceof CreditCard); - } - - public void testRuntimeTypeIsBaseType() { - TypeAdapterFactory rta = RuntimeTypeAdapterFactory.of( - BillingInstrument.class) - .registerSubtype(BillingInstrument.class); - Gson gson = new GsonBuilder() - .registerTypeAdapterFactory(rta) - .create(); - - BillingInstrument original = new BillingInstrument("Jesse"); - assertEquals("{\"type\":\"BillingInstrument\",\"ownerName\":\"Jesse\"}", - gson.toJson(original, BillingInstrument.class)); - BillingInstrument deserialized = gson.fromJson( - "{type:'BillingInstrument',ownerName:'Jesse'}", BillingInstrument.class); - assertEquals("Jesse", deserialized.ownerName); - } - - public void testNullBaseType() { - try { - RuntimeTypeAdapterFactory.of(null); - fail(); - } catch (NullPointerException expected) { - } - } - - public void testNullTypeFieldName() { - try { - RuntimeTypeAdapterFactory.of(BillingInstrument.class, null); - fail(); - } catch (NullPointerException expected) { - } - } - - public void testNullSubtype() { - RuntimeTypeAdapterFactory rta = RuntimeTypeAdapterFactory.of( - BillingInstrument.class); - try { - rta.registerSubtype(null); - fail(); - } catch (NullPointerException expected) { - } - } - - public void testNullLabel() { - RuntimeTypeAdapterFactory rta = RuntimeTypeAdapterFactory.of( - BillingInstrument.class); - try { - rta.registerSubtype(CreditCard.class, null); - fail(); - } catch (NullPointerException expected) { - } - } - - public void testDuplicateSubtype() { - RuntimeTypeAdapterFactory rta = RuntimeTypeAdapterFactory.of( - BillingInstrument.class); - rta.registerSubtype(CreditCard.class, "CC"); - try { - rta.registerSubtype(CreditCard.class, "Visa"); - fail(); - } catch (IllegalArgumentException expected) { - } - } - - public void testDuplicateLabel() { - RuntimeTypeAdapterFactory rta = RuntimeTypeAdapterFactory.of( - BillingInstrument.class); - rta.registerSubtype(CreditCard.class, "CC"); - try { - rta.registerSubtype(BankTransfer.class, "CC"); - fail(); - } catch (IllegalArgumentException expected) { - } - } - - public void testDeserializeMissingTypeField() { - TypeAdapterFactory billingAdapter = RuntimeTypeAdapterFactory.of(BillingInstrument.class) - .registerSubtype(CreditCard.class); - Gson gson = new GsonBuilder() - .registerTypeAdapterFactory(billingAdapter) - .create(); - try { - gson.fromJson("{ownerName:'Jesse'}", BillingInstrument.class); - fail(); - } catch (JsonParseException expected) { - } - } - - public void testDeserializeMissingSubtype() { - TypeAdapterFactory billingAdapter = RuntimeTypeAdapterFactory.of(BillingInstrument.class) - .registerSubtype(BankTransfer.class); - Gson gson = new GsonBuilder() - .registerTypeAdapterFactory(billingAdapter) - .create(); - try { - gson.fromJson("{type:'CreditCard',ownerName:'Jesse'}", BillingInstrument.class); - fail(); - } catch (JsonParseException expected) { - } - } - - public void testSerializeMissingSubtype() { - TypeAdapterFactory billingAdapter = RuntimeTypeAdapterFactory.of(BillingInstrument.class) - .registerSubtype(BankTransfer.class); - Gson gson = new GsonBuilder() - .registerTypeAdapterFactory(billingAdapter) - .create(); - try { - gson.toJson(new CreditCard("Jesse", 456), BillingInstrument.class); - fail(); - } catch (JsonParseException expected) { - } - } - - public void testSerializeCollidingTypeFieldName() { - TypeAdapterFactory billingAdapter = RuntimeTypeAdapterFactory.of(BillingInstrument.class, "cvv") - .registerSubtype(CreditCard.class); - Gson gson = new GsonBuilder() - .registerTypeAdapterFactory(billingAdapter) - .create(); - try { - gson.toJson(new CreditCard("Jesse", 456), BillingInstrument.class); - fail(); - } catch (JsonParseException expected) { - } - } - - static class BillingInstrument { - private final String ownerName; - BillingInstrument(String ownerName) { - this.ownerName = ownerName; - } - } - - static class CreditCard extends BillingInstrument { - int cvv; - CreditCard(String ownerName, int cvv) { - super(ownerName); - this.cvv = cvv; - } - } - - static class BankTransfer extends BillingInstrument { - int bankAccount; - BankTransfer(String ownerName, int bankAccount) { - super(ownerName); - this.bankAccount = bankAccount; - } - } -} diff --git a/lib/gson-cleanup-styles.xml b/lib/gson-cleanup-styles.xml deleted file mode 100644 index 9e20cb96f5..0000000000 --- a/lib/gson-cleanup-styles.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/gson-formatting-styles.xml b/lib/gson-formatting-styles.xml deleted file mode 100644 index 177e9997d0..0000000000 --- a/lib/gson-formatting-styles.xml +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/metrics/pom.xml b/metrics/pom.xml deleted file mode 100644 index 9a084452c0..0000000000 --- a/metrics/pom.xml +++ /dev/null @@ -1,141 +0,0 @@ - - 4.0.0 - com.google.code.gson - gson-metrics - jar - 1.0-SNAPSHOT - 2011 - Gson Metrics - - org.sonatype.oss - oss-parent - 5 - - http://code.google.com/p/google-gson/ - Performance Metrics for Google Gson library - - UTF-8 - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - scm:svn:http://google-gson.googlecode.com/svn/trunk/metrics - scm:svn:https://google-gson.googlecode.com/svn/trunk/metrics - http://google-gson.codegoogle.com/svn/trunk/metrics - - - Google Code Issue Tracking - http://code.google.com/p/google-gson/issues/list - - - Google, Inc. - http://www.google.com - - - - com.google.code.gson - gson - 1.7.2-SNAPSHOT - - - com.google.code.caliper - caliper - 1.0-SNAPSHOT - - - junit - junit - 3.8.2 - test - - - - package - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.8 - - true - true - ../eclipse-ws/ - - file:///${basedir}/../lib/gson-formatting-styles.xml - - - - - org.apache.maven.plugins - maven-release-plugin - 2.1 - - -DenableCiProfile=true - https://google-gson.googlecode.com/svn/tags/ - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.7 - - - attach-javadocs - - jar - - - - - - http://download.oracle.com/javase/1.5.0/docs/api/ - - true - public - - - - - - - Inderjeet Singh - Google Inc. - - - Joel Leitch - Google Inc. - - - Jesse Wilson - Google Inc. - - - diff --git a/metrics/src/main/java/com/google/gson/metrics/BagOfPrimitives.java b/metrics/src/main/java/com/google/gson/metrics/BagOfPrimitives.java deleted file mode 100644 index 72cd6b6d1f..0000000000 --- a/metrics/src/main/java/com/google/gson/metrics/BagOfPrimitives.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.metrics; - -/** - * Class with a bunch of primitive fields - * - * @author Inderjeet Singh - */ -public class BagOfPrimitives { - public static final long DEFAULT_VALUE = 0; - public long longValue; - public int intValue; - public boolean booleanValue; - public String stringValue; - - public BagOfPrimitives() { - this(DEFAULT_VALUE, 0, false, ""); - } - - public BagOfPrimitives(long longValue, int intValue, boolean booleanValue, String stringValue) { - this.longValue = longValue; - this.intValue = intValue; - this.booleanValue = booleanValue; - this.stringValue = stringValue; - } - - public int getIntValue() { - return intValue; - } - - public String getExpectedJson() { - StringBuilder sb = new StringBuilder(); - sb.append("{"); - sb.append("\"longValue\":").append(longValue).append(","); - sb.append("\"intValue\":").append(intValue).append(","); - sb.append("\"booleanValue\":").append(booleanValue).append(","); - sb.append("\"stringValue\":\"").append(stringValue).append("\""); - sb.append("}"); - return sb.toString(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (booleanValue ? 1231 : 1237); - result = prime * result + intValue; - result = prime * result + (int) (longValue ^ (longValue >>> 32)); - result = prime * result + ((stringValue == null) ? 0 : stringValue.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - BagOfPrimitives other = (BagOfPrimitives) obj; - if (booleanValue != other.booleanValue) - return false; - if (intValue != other.intValue) - return false; - if (longValue != other.longValue) - return false; - if (stringValue == null) { - if (other.stringValue != null) - return false; - } else if (!stringValue.equals(other.stringValue)) - return false; - return true; - } - - @Override - public String toString() { - return String.format("(longValue=%d,intValue=%d,booleanValue=%b,stringValue=%s)", - longValue, intValue, booleanValue, stringValue); - } -} diff --git a/metrics/src/main/java/com/google/gson/metrics/BagOfPrimitivesDeserializationBenchmark.java b/metrics/src/main/java/com/google/gson/metrics/BagOfPrimitivesDeserializationBenchmark.java deleted file mode 100644 index 8e6ea2b24b..0000000000 --- a/metrics/src/main/java/com/google/gson/metrics/BagOfPrimitivesDeserializationBenchmark.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.metrics; - -import java.io.IOException; -import java.io.StringReader; -import java.lang.reflect.Field; - -import com.google.caliper.Runner; -import com.google.caliper.SimpleBenchmark; -import com.google.gson.Gson; -import com.google.gson.stream.JsonReader; - -/** - * Caliper based micro benchmarks for Gson - * - * @author Inderjeet Singh - * @author Jesse Wilson - * @author Joel Leitch - */ -public class BagOfPrimitivesDeserializationBenchmark extends SimpleBenchmark { - - private Gson gson; - private String json; - - public static void main(String[] args) { - Runner.main(BagOfPrimitivesDeserializationBenchmark.class, args); - } - - @Override - protected void setUp() throws Exception { - this.gson = new Gson(); - BagOfPrimitives bag = new BagOfPrimitives(10L, 1, false, "foo"); - this.json = gson.toJson(bag); - } - - /** - * Benchmark to measure Gson performance for deserializing an object - */ - public void timeBagOfPrimitivesDefault(int reps) { - for (int i=0; i fieldType = field.getType(); - if (fieldType.equals(long.class)) { - field.setLong(bag, jr.nextLong()); - } else if (fieldType.equals(int.class)) { - field.setInt(bag, jr.nextInt()); - } else if (fieldType.equals(boolean.class)) { - field.setBoolean(bag, jr.nextBoolean()); - } else if (fieldType.equals(String.class)) { - field.set(bag, jr.nextString()); - } else { - throw new RuntimeException("Unexpected: type: " + fieldType + ", name: " + name); - } - } - } - } - jr.endObject(); - } - } -} diff --git a/metrics/src/main/java/com/google/gson/metrics/CollectionsDeserializationBenchmark.java b/metrics/src/main/java/com/google/gson/metrics/CollectionsDeserializationBenchmark.java deleted file mode 100644 index 09a5782ab5..0000000000 --- a/metrics/src/main/java/com/google/gson/metrics/CollectionsDeserializationBenchmark.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.metrics; - -import java.io.IOException; -import java.io.StringReader; -import java.lang.reflect.Field; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; - -import com.google.caliper.Runner; -import com.google.caliper.SimpleBenchmark; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; - -/** - * Caliper based micro benchmarks for Gson - * - * @author Inderjeet Singh - */ -public class CollectionsDeserializationBenchmark extends SimpleBenchmark { - - private static final Type LIST_TYPE = new TypeToken>(){}.getType(); - private Gson gson; - private String json; - - public static void main(String[] args) { - Runner.main(CollectionsDeserializationBenchmark.class, args); - } - - @Override - protected void setUp() throws Exception { - this.gson = new Gson(); - List bags = new ArrayList(); - for (int i = 0; i < 100; ++i) { - bags.add(new BagOfPrimitives(10L, 1, false, "foo")); - } - this.json = gson.toJson(bags, LIST_TYPE); - } - - /** - * Benchmark to measure Gson performance for deserializing an object - */ - public void timeCollectionsDefault(int reps) { - for (int i=0; i bags = new ArrayList(); - while(jr.hasNext()) { - jr.beginObject(); - long longValue = 0; - int intValue = 0; - boolean booleanValue = false; - String stringValue = null; - while(jr.hasNext()) { - String name = jr.nextName(); - if (name.equals("longValue")) { - longValue = jr.nextLong(); - } else if (name.equals("intValue")) { - intValue = jr.nextInt(); - } else if (name.equals("booleanValue")) { - booleanValue = jr.nextBoolean(); - } else if (name.equals("stringValue")) { - stringValue = jr.nextString(); - } else { - throw new IOException("Unexpected name: " + name); - } - } - jr.endObject(); - bags.add(new BagOfPrimitives(longValue, intValue, booleanValue, stringValue)); - } - jr.endArray(); - } - } - - /** - * This benchmark measures the ideal Gson performance: the cost of parsing a JSON stream and - * setting object values by reflection. We should strive to reduce the discrepancy between this - * and {@link #timeCollectionsDefault(int)} . - */ - public void timeCollectionsReflectionStreaming(int reps) throws Exception { - for (int i=0; i bags = new ArrayList(); - while(jr.hasNext()) { - jr.beginObject(); - BagOfPrimitives bag = new BagOfPrimitives(); - while(jr.hasNext()) { - String name = jr.nextName(); - for (Field field : BagOfPrimitives.class.getDeclaredFields()) { - if (field.getName().equals(name)) { - Class fieldType = field.getType(); - if (fieldType.equals(long.class)) { - field.setLong(bag, jr.nextLong()); - } else if (fieldType.equals(int.class)) { - field.setInt(bag, jr.nextInt()); - } else if (fieldType.equals(boolean.class)) { - field.setBoolean(bag, jr.nextBoolean()); - } else if (fieldType.equals(String.class)) { - field.set(bag, jr.nextString()); - } else { - throw new RuntimeException("Unexpected: type: " + fieldType + ", name: " + name); - } - } - } - } - jr.endObject(); - bags.add(bag); - } - jr.endArray(); - } - } -} diff --git a/metrics/src/main/java/com/google/gson/metrics/ParseBenchmark.java b/metrics/src/main/java/com/google/gson/metrics/ParseBenchmark.java deleted file mode 100644 index 68134372c4..0000000000 --- a/metrics/src/main/java/com/google/gson/metrics/ParseBenchmark.java +++ /dev/null @@ -1,389 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.metrics; - -import com.google.caliper.Param; -import com.google.caliper.Runner; -import com.google.caliper.SimpleBenchmark; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonParser; -import com.google.gson.annotations.SerializedName; -import com.google.gson.reflect.TypeToken; -import java.io.CharArrayReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.StringWriter; -import java.lang.reflect.Type; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import org.codehaus.jackson.JsonFactory; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.DeserializationConfig; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; - -/** - * Measure Gson and Jackson parsing and binding performance. - * - *

This benchmark requires that ParseBenchmarkData.zip is on the classpath. - * That file contains Twitter feed data, which is representative of what - * applications will be parsing. - */ -public final class ParseBenchmark extends SimpleBenchmark { - @Param Document document; - @Param Api api; - - private enum Document { - TWEETS(new TypeToken>() {}, new TypeReference>() {}), - READER_SHORT(new TypeToken() {}, new TypeReference() {}), - READER_LONG(new TypeToken() {}, new TypeReference() {}); - - private final Type gsonType; - private final TypeReference jacksonType; - - private Document(TypeToken typeToken, TypeReference typeReference) { - this.gsonType = typeToken.getType(); - this.jacksonType = typeReference; - } - } - - private enum Api { - JACKSON_STREAM { - @Override Parser newParser() { - return new JacksonStreamParser(); - } - }, - JACKSON_BIND { - @Override Parser newParser() { - return new JacksonBindParser(); - } - }, - GSON_STREAM { - @Override Parser newParser() { - return new GsonStreamParser(); - } - }, - GSON_SKIP { - @Override Parser newParser() { - return new GsonSkipParser(); - } - }, - GSON_DOM { - @Override Parser newParser() { - return new GsonDomParser(); - } - }, - GSON_BIND { - @Override Parser newParser() { - return new GsonBindParser(); - } - }; - abstract Parser newParser(); - } - - private char[] text; - private Parser parser; - - @Override protected void setUp() throws Exception { - text = resourceToString("/" + document.name() + ".json").toCharArray(); - parser = api.newParser(); - } - - public void timeParse(int reps) throws Exception { - for (int i = 0; i < reps; i++) { - parser.parse(text, document); - } - } - - private static String resourceToString(String path) throws Exception { - InputStream in = ParseBenchmark.class.getResourceAsStream(path); - if (in == null) { - throw new IllegalArgumentException("No such file: " + path); - } - - Reader reader = new InputStreamReader(in, "UTF-8"); - char[] buffer = new char[8192]; - StringWriter writer = new StringWriter(); - int count; - while ((count = reader.read(buffer)) != -1) { - writer.write(buffer, 0, count); - } - reader.close(); - return writer.toString(); - } - - public static void main(String[] args) throws Exception { - Runner.main(ParseBenchmark.class, args); - } - - interface Parser { - void parse(char[] data, Document document) throws Exception; - } - - private static class GsonStreamParser implements Parser { - public void parse(char[] data, Document document) throws Exception { - com.google.gson.stream.JsonReader jsonReader - = new com.google.gson.stream.JsonReader(new CharArrayReader(data)); - readToken(jsonReader); - jsonReader.close(); - } - - private void readToken(com.google.gson.stream.JsonReader reader) throws IOException { - while (true) { - switch (reader.peek()) { - case BEGIN_ARRAY: - reader.beginArray(); - break; - case END_ARRAY: - reader.endArray(); - break; - case BEGIN_OBJECT: - reader.beginObject(); - break; - case END_OBJECT: - reader.endObject(); - break; - case NAME: - reader.nextName(); - break; - case BOOLEAN: - reader.nextBoolean(); - break; - case NULL: - reader.nextNull(); - break; - case NUMBER: - reader.nextLong(); - break; - case STRING: - reader.nextString(); - break; - case END_DOCUMENT: - return; - default: - throw new IllegalArgumentException("Unexpected token" + reader.peek()); - } - } - } - } - - private static class GsonSkipParser implements Parser { - public void parse(char[] data, Document document) throws Exception { - com.google.gson.stream.JsonReader jsonReader - = new com.google.gson.stream.JsonReader(new CharArrayReader(data)); - jsonReader.skipValue(); - jsonReader.close(); - } - } - - private static class JacksonStreamParser implements Parser { - public void parse(char[] data, Document document) throws Exception { - JsonFactory jsonFactory = new JsonFactory(); - org.codehaus.jackson.JsonParser jp = jsonFactory.createJsonParser(new CharArrayReader(data)); - jp.configure(org.codehaus.jackson.JsonParser.Feature.CANONICALIZE_FIELD_NAMES, false); - int depth = 0; - do { - switch (jp.nextToken()) { - case START_OBJECT: - case START_ARRAY: - depth++; - break; - case END_OBJECT: - case END_ARRAY: - depth--; - break; - case FIELD_NAME: - jp.getCurrentName(); - break; - case VALUE_STRING: - jp.getText(); - break; - case VALUE_NUMBER_INT: - case VALUE_NUMBER_FLOAT: - jp.getLongValue(); - break; - } - } while (depth > 0); - jp.close(); - } - } - - private static class GsonDomParser implements Parser { - public void parse(char[] data, Document document) throws Exception { - new JsonParser().parse(new CharArrayReader(data)); - } - } - - private static class GsonBindParser implements Parser { - private static Gson gson = new GsonBuilder() - .setDateFormat("EEE MMM dd HH:mm:ss Z yyyy") - .create(); - - public void parse(char[] data, Document document) throws Exception { - gson.fromJson(new CharArrayReader(data), document.gsonType); - } - } - - private static class JacksonBindParser implements Parser { - private static ObjectMapper mapper = new ObjectMapper(); - - static { - mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(DeserializationConfig.Feature.AUTO_DETECT_FIELDS, true); - mapper.setDateFormat(new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy")); - } - - public void parse(char[] data, Document document) throws Exception { - mapper.readValue(new CharArrayReader(data), document.jacksonType); - } - } - - static class Tweet { - @JsonProperty String coordinates; - @JsonProperty boolean favorited; - @JsonProperty Date created_at; - @JsonProperty boolean truncated; - @JsonProperty Tweet retweeted_status; - @JsonProperty String id_str; - @JsonProperty String in_reply_to_id_str; - @JsonProperty String contributors; - @JsonProperty String text; - @JsonProperty long id; - @JsonProperty String retweet_count; - @JsonProperty String in_reply_to_status_id_str; - @JsonProperty Object geo; - @JsonProperty boolean retweeted; - @JsonProperty String in_reply_to_user_id; - @JsonProperty String in_reply_to_screen_name; - @JsonProperty Object place; - @JsonProperty User user; - @JsonProperty String source; - @JsonProperty String in_reply_to_user_id_str; - } - - static class User { - @JsonProperty String name; - @JsonProperty String profile_sidebar_border_color; - @JsonProperty boolean profile_background_tile; - @JsonProperty String profile_sidebar_fill_color; - @JsonProperty Date created_at; - @JsonProperty String location; - @JsonProperty String profile_image_url; - @JsonProperty boolean follow_request_sent; - @JsonProperty String profile_link_color; - @JsonProperty boolean is_translator; - @JsonProperty String id_str; - @JsonProperty int favourites_count; - @JsonProperty boolean contributors_enabled; - @JsonProperty String url; - @JsonProperty boolean default_profile; - @JsonProperty long utc_offset; - @JsonProperty long id; - @JsonProperty boolean profile_use_background_image; - @JsonProperty int listed_count; - @JsonProperty String lang; - @JsonProperty("protected") @SerializedName("protected") boolean isProtected; - @JsonProperty int followers_count; - @JsonProperty String profile_text_color; - @JsonProperty String profile_background_color; - @JsonProperty String time_zone; - @JsonProperty String description; - @JsonProperty boolean notifications; - @JsonProperty boolean geo_enabled; - @JsonProperty boolean verified; - @JsonProperty String profile_background_image_url; - @JsonProperty boolean defalut_profile_image; - @JsonProperty int friends_count; - @JsonProperty int statuses_count; - @JsonProperty String screen_name; - @JsonProperty boolean following; - @JsonProperty boolean show_all_inline_media; - } - - static class Feed { - @JsonProperty String id; - @JsonProperty String title; - @JsonProperty String description; - @JsonProperty("alternate") @SerializedName("alternate") List alternates; - @JsonProperty long updated; - @JsonProperty List items; - - @Override public String toString() { - StringBuilder result = new StringBuilder() - .append(id) - .append("\n").append(title) - .append("\n").append(description) - .append("\n").append(alternates) - .append("\n").append(updated); - int i = 1; - for (Item item : items) { - result.append(i++).append(": ").append(item).append("\n\n"); - } - return result.toString(); - } - } - - static class Link { - @JsonProperty String href; - - @Override public String toString() { - return href; - } - } - - static class Item { - @JsonProperty List categories; - @JsonProperty String title; - @JsonProperty long published; - @JsonProperty long updated; - @JsonProperty("alternate") @SerializedName("alternate") List alternates; - @JsonProperty Content content; - @JsonProperty String author; - @JsonProperty List likingUsers; - - @Override public String toString() { - return title - + "\nauthor: " + author - + "\npublished: " + published - + "\nupdated: " + updated - + "\n" + content - + "\nliking users: " + likingUsers - + "\nalternates: " + alternates - + "\ncategories: " + categories; - } - } - - static class Content { - @JsonProperty String content; - - @Override public String toString() { - return content; - } - } - - static class ReaderUser { - @JsonProperty String userId; - - @Override public String toString() { - return userId; - } - } -} diff --git a/metrics/src/main/java/com/google/gson/metrics/ParseBenchmarkData.zip b/metrics/src/main/java/com/google/gson/metrics/ParseBenchmarkData.zip deleted file mode 100644 index 58e08bb504761c1f54900a98d6e3a0d2ac41be83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67881 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�N$Nz?PXwhGqXoR5yb=)f{mU; zm_v2KQt@bymf$qIr9`?)@8x?!p$`V+crtlbZ{(NPDVvciPxFc4=i4|nYgI{PnAogr z6AUvUB{Hm*XO;N)aU8BTNXlZ|nuEsI@;Z77F}?ApY;m)pJ!z~PBBxXkbbrqXh&2YY}djq)DJ5*QM*u&-3K^%iZocM58 z#5p7+U_mC1Qa06iqC8Qh&O#ExUGvbgY~e<>-`C3B64iuTn6#g@4HW1d)L#mmCmF$7 zczp>xRgv2#CW`7tEUec@uOVXW_LhdX(lorlx~^M%DzRwibHjp5@chz!rpCd1dkOt+ zN$<`z_%NLi_iiE1?O~?Fy4g9>^N#f)3z{}6F)8LGCt?~HF;ilKmjHEoPMD7oZdq zx0S*Y`VxwHA7HDx2~(KdI8`c-uQ=FNguK(AlL;(a;kyD!N?(aoTum(zZL6#cvD21o zdXc|v>VJXvW$X<#*znqP|DD;aP0j_tkNTk6(sqTa#iA#{d3uI~&T?jIiUZZW2K z@g@)p%Ud2+Chx||CcyGvXUy`o^goV!X3nsjIOdZ%YW~kBV{z5W - - - - 4.0.0 - com.google.code.gson - proto - jar - 0.5 - Gson Protobuf Support - Gson support for Protobufs - - - local.repo - file repository to svn - file://${basedir}/../../mavenrepo - - - - - gson - http://google-gson.googlecode.com/svn/mavenrepo - - true - - - true - - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - scm:svn:http://google-gson.googlecode.com/svn/trunk/proto - scm:svn:https://google-gson.googlecode.com/svn/trunk/proto - http://google-gson.codegoogle.com/svn/trunk/proto - - - Google Code Issue Tracking - http://code.google.com/p/google-gson/issues/list - - - - - - - com.google.code.gson - gson - 1.7.1 - compile - - - - com.google.protobuf - protobuf-java - 2.4.0a - compile - - - - junit - junit - 3.8.2 - test - - - - - gson-proto - - - maven-antrun-plugin - - - compile-protoc - generate-sources - - - - - - - - - - - - - - - - - - run - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.8 - - true - true - ../eclipse-ws - file:///${basedir}/../lib/gson-formatting-styles.xml - - - - org.apache.maven.plugins - maven-install-plugin - - - - org.apache.maven.plugins - maven-release-plugin - 2.1 - - -DenableCiProfile=true - https://google-gson.googlecode.com/svn/tags/ - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.7 - - - attach-javadocs - - jar - - - - - - http://download.oracle.com/javase/1.5.0/docs/api/ - - true - public - - - - maven-assembly-plugin - - src/main/resources/assembly-descriptor.xml - proto-${version} - target/dist - target/assembly/work - - - - - - - Inderjeet Singh - Google Inc. - - - diff --git a/proto/src/main/java/com/google/gson/protobuf/ProtoTypeAdapter.java b/proto/src/main/java/com/google/gson/protobuf/ProtoTypeAdapter.java deleted file mode 100644 index 7a6be05f8c..0000000000 --- a/proto/src/main/java/com/google/gson/protobuf/ProtoTypeAdapter.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.protobuf; - -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; -import com.google.protobuf.Descriptors.Descriptor; -import com.google.protobuf.Descriptors.FieldDescriptor; -import com.google.protobuf.GeneratedMessage; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Gson type adapter for protocol buffers - * - * @author Inderjeet Singh - */ -public class ProtoTypeAdapter implements JsonSerializer, - JsonDeserializer { - - @Override - public JsonElement serialize(GeneratedMessage src, Type typeOfSrc, - JsonSerializationContext context) { - JsonObject ret = new JsonObject(); - final Map fields = src.getAllFields(); - - for (Map.Entry fieldPair : fields.entrySet()) { - final FieldDescriptor desc = fieldPair.getKey(); - if (desc.isRepeated()) { - List fieldList = (List) fieldPair.getValue(); - if (fieldList.size() != 0) { - JsonArray array = new JsonArray(); - for (Object o : fieldList) { - array.add(context.serialize(o)); - } - ret.add(desc.getName(), array); - } - } else { - ret.add(desc.getName(), context.serialize(fieldPair.getValue())); - } - } - return ret; - } - - @SuppressWarnings("unchecked") - @Override - public GeneratedMessage deserialize(JsonElement json, Type typeOfT, - JsonDeserializationContext context) throws JsonParseException { - try { - JsonObject jsonObject = json.getAsJsonObject(); - Class protoClass = - (Class) typeOfT; - try { - // Invoke the ProtoClass.newBuilder() method - Object protoBuilder = getCachedMethod(protoClass, "newBuilder") - .invoke(null); - Class builderClass = protoBuilder.getClass(); - - Descriptor protoDescriptor = (Descriptor) getCachedMethod( - protoClass, "getDescriptor").invoke(null); - // Call setters on all of the available fields - for (FieldDescriptor fieldDescriptor : protoDescriptor.getFields()) { - String name = fieldDescriptor.getName(); - if (jsonObject.has(name)) { - JsonElement jsonElement = jsonObject.get(name); - String fieldName = name + "_"; - Field field = protoClass.getDeclaredField(fieldName); - Type fieldType = field.getGenericType(); - Object fieldValue = context.deserialize(jsonElement, fieldType); - Method method = getCachedMethod( - builderClass, "setField", FieldDescriptor.class, Object.class); - method.invoke(protoBuilder, fieldDescriptor, fieldValue); - } - } - - // Invoke the build method to return the final proto - return (GeneratedMessage) getCachedMethod(builderClass, "build") - .invoke(protoBuilder); - } catch (SecurityException e) { - throw new JsonParseException(e); - } catch (NoSuchMethodException e) { - throw new JsonParseException(e); - } catch (IllegalArgumentException e) { - throw new JsonParseException(e); - } catch (IllegalAccessException e) { - throw new JsonParseException(e); - } catch (InvocationTargetException e) { - throw new JsonParseException(e); - } - } catch (Exception e) { - throw new JsonParseException("Error while parsing proto: ", e); - } - } - - private static Method getCachedMethod(Class clazz, String methodName, - Class... methodParamTypes) throws NoSuchMethodException { - Map, Method> mapOfMethods = mapOfMapOfMethods.get(methodName); - if (mapOfMethods == null) { - mapOfMethods = new HashMap, Method>(); - mapOfMapOfMethods.put(methodName, mapOfMethods); - } - Method method = mapOfMethods.get(clazz); - if (method == null) { - method = clazz.getMethod(methodName, methodParamTypes); - mapOfMethods.put(clazz, method); - } - return method; - } - - private static Map, Method>> mapOfMapOfMethods = - new HashMap, Method>>(); -} \ No newline at end of file diff --git a/proto/src/main/protobuf/bag.proto b/proto/src/main/protobuf/bag.proto deleted file mode 100644 index 6df147a0c3..0000000000 --- a/proto/src/main/protobuf/bag.proto +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright (C) 2010 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package com.google.gson.protobuf.generated; -option java_package = "com.google.gson.protobuf.generated"; - -message SimpleProto { - optional string msg = 1; - optional int32 count = 2; -} - -message ProtoWithRepeatedFields { - repeated int64 numbers = 1; - repeated SimpleProto simples = 2; - optional string name = 3; -} \ No newline at end of file diff --git a/proto/src/test/java/com/google/gson/protobuf/functional/ProtosWithComplexAndRepeatedFieldsTest.java b/proto/src/test/java/com/google/gson/protobuf/functional/ProtosWithComplexAndRepeatedFieldsTest.java deleted file mode 100644 index 7b9a1c6699..0000000000 --- a/proto/src/test/java/com/google/gson/protobuf/functional/ProtosWithComplexAndRepeatedFieldsTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.protobuf.functional; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.protobuf.ProtoTypeAdapter; -import com.google.gson.protobuf.generated.Bag.ProtoWithRepeatedFields; -import com.google.gson.protobuf.generated.Bag.SimpleProto; -import com.google.protobuf.GeneratedMessage; - -import junit.framework.TestCase; - -/** - * Functional tests for protocol buffers using complex and repeated fields - * - * @author Inderjeet Singh - */ -public class ProtosWithComplexAndRepeatedFieldsTest extends TestCase { - private Gson gson; - - @Override - protected void setUp() throws Exception { - super.setUp(); - gson = new GsonBuilder().registerTypeHierarchyAdapter( - GeneratedMessage.class, new ProtoTypeAdapter()).create(); - } - - public void testSerializeRepeatedFields() { - ProtoWithRepeatedFields proto = ProtoWithRepeatedFields.newBuilder() - .addNumbers(2) - .addNumbers(3) - .addSimples(SimpleProto.newBuilder().setMsg("foo").build()) - .addSimples(SimpleProto.newBuilder().setCount(3).build()) - .build(); - String json = gson.toJson(proto); - assertTrue(json.contains("[2,3]")); - assertTrue(json.contains("foo")); - assertTrue(json.contains("count")); - } - - public void testDeserializeRepeatedFieldsProto() { - String json = "{numbers:[4,6],simples:[{msg:'bar'},{count:7}]}"; - ProtoWithRepeatedFields proto = - gson.fromJson(json, ProtoWithRepeatedFields.class); - assertEquals(4, proto.getNumbers(0)); - assertEquals(6, proto.getNumbers(1)); - assertEquals("bar", proto.getSimples(0).getMsg()); - assertEquals(7, proto.getSimples(1).getCount()); - } -} diff --git a/proto/src/test/java/com/google/gson/protobuf/functional/ProtosWithPrimitiveTypesTest.java b/proto/src/test/java/com/google/gson/protobuf/functional/ProtosWithPrimitiveTypesTest.java deleted file mode 100644 index 55628bc59d..0000000000 --- a/proto/src/test/java/com/google/gson/protobuf/functional/ProtosWithPrimitiveTypesTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.gson.protobuf.functional; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.protobuf.ProtoTypeAdapter; -import com.google.gson.protobuf.generated.Bag.SimpleProto; -import com.google.protobuf.Descriptors.Descriptor; -import com.google.protobuf.GeneratedMessage; - -import junit.framework.TestCase; - -public class ProtosWithPrimitiveTypesTest extends TestCase { - private Gson gson; - - @Override - protected void setUp() throws Exception { - super.setUp(); - gson = new GsonBuilder().registerTypeHierarchyAdapter( - GeneratedMessage.class, new ProtoTypeAdapter()).create(); - } - - public void testSerializeEmptyProto() { - SimpleProto proto = SimpleProto.newBuilder().build(); - String json = gson.toJson(proto); - assertEquals("{}", json); - } - - public void testDeserializeEmptyProto() { - SimpleProto proto = gson.fromJson("{}", SimpleProto.class); - assertFalse(proto.hasCount()); - assertFalse(proto.hasMsg()); - } - - public void testSerializeProto() { - Descriptor descriptor = SimpleProto.getDescriptor(); - SimpleProto proto = SimpleProto.newBuilder() - .setCount(3) - .setMsg("foo") - .build(); - String json = gson.toJson(proto); - assertTrue(json.contains("\"msg\":\"foo\"")); - assertTrue(json.contains("\"count\":3")); - } - - public void testDeserializeProto() { - SimpleProto proto = gson.fromJson("{msg:'foo',count:3}", SimpleProto.class); - assertEquals("foo", proto.getMsg()); - assertEquals(3, proto.getCount()); - } -} diff --git a/gson/src/main/java/com/google/gson/DefaultDateTypeAdapter.java b/src/main/java/com/google/gson/DefaultDateTypeAdapter.java similarity index 100% rename from gson/src/main/java/com/google/gson/DefaultDateTypeAdapter.java rename to src/main/java/com/google/gson/DefaultDateTypeAdapter.java diff --git a/gson/src/main/java/com/google/gson/ExclusionStrategy.java b/src/main/java/com/google/gson/ExclusionStrategy.java similarity index 100% rename from gson/src/main/java/com/google/gson/ExclusionStrategy.java rename to src/main/java/com/google/gson/ExclusionStrategy.java diff --git a/gson/src/main/java/com/google/gson/FieldAttributes.java b/src/main/java/com/google/gson/FieldAttributes.java similarity index 100% rename from gson/src/main/java/com/google/gson/FieldAttributes.java rename to src/main/java/com/google/gson/FieldAttributes.java diff --git a/gson/src/main/java/com/google/gson/FieldNamingPolicy.java b/src/main/java/com/google/gson/FieldNamingPolicy.java similarity index 100% rename from gson/src/main/java/com/google/gson/FieldNamingPolicy.java rename to src/main/java/com/google/gson/FieldNamingPolicy.java diff --git a/gson/src/main/java/com/google/gson/FieldNamingStrategy.java b/src/main/java/com/google/gson/FieldNamingStrategy.java similarity index 100% rename from gson/src/main/java/com/google/gson/FieldNamingStrategy.java rename to src/main/java/com/google/gson/FieldNamingStrategy.java diff --git a/gson/src/main/java/com/google/gson/Gson.java b/src/main/java/com/google/gson/Gson.java similarity index 100% rename from gson/src/main/java/com/google/gson/Gson.java rename to src/main/java/com/google/gson/Gson.java diff --git a/gson/src/main/java/com/google/gson/GsonBuilder.java b/src/main/java/com/google/gson/GsonBuilder.java similarity index 100% rename from gson/src/main/java/com/google/gson/GsonBuilder.java rename to src/main/java/com/google/gson/GsonBuilder.java diff --git a/gson/src/main/java/com/google/gson/InstanceCreator.java b/src/main/java/com/google/gson/InstanceCreator.java similarity index 100% rename from gson/src/main/java/com/google/gson/InstanceCreator.java rename to src/main/java/com/google/gson/InstanceCreator.java diff --git a/gson/src/main/java/com/google/gson/JsonArray.java b/src/main/java/com/google/gson/JsonArray.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonArray.java rename to src/main/java/com/google/gson/JsonArray.java diff --git a/gson/src/main/java/com/google/gson/JsonDeserializationContext.java b/src/main/java/com/google/gson/JsonDeserializationContext.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonDeserializationContext.java rename to src/main/java/com/google/gson/JsonDeserializationContext.java diff --git a/gson/src/main/java/com/google/gson/JsonDeserializer.java b/src/main/java/com/google/gson/JsonDeserializer.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonDeserializer.java rename to src/main/java/com/google/gson/JsonDeserializer.java diff --git a/gson/src/main/java/com/google/gson/JsonElement.java b/src/main/java/com/google/gson/JsonElement.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonElement.java rename to src/main/java/com/google/gson/JsonElement.java diff --git a/gson/src/main/java/com/google/gson/JsonIOException.java b/src/main/java/com/google/gson/JsonIOException.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonIOException.java rename to src/main/java/com/google/gson/JsonIOException.java diff --git a/gson/src/main/java/com/google/gson/JsonNull.java b/src/main/java/com/google/gson/JsonNull.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonNull.java rename to src/main/java/com/google/gson/JsonNull.java diff --git a/gson/src/main/java/com/google/gson/JsonObject.java b/src/main/java/com/google/gson/JsonObject.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonObject.java rename to src/main/java/com/google/gson/JsonObject.java diff --git a/gson/src/main/java/com/google/gson/JsonParseException.java b/src/main/java/com/google/gson/JsonParseException.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonParseException.java rename to src/main/java/com/google/gson/JsonParseException.java diff --git a/gson/src/main/java/com/google/gson/JsonParser.java b/src/main/java/com/google/gson/JsonParser.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonParser.java rename to src/main/java/com/google/gson/JsonParser.java diff --git a/gson/src/main/java/com/google/gson/JsonPrimitive.java b/src/main/java/com/google/gson/JsonPrimitive.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonPrimitive.java rename to src/main/java/com/google/gson/JsonPrimitive.java diff --git a/gson/src/main/java/com/google/gson/JsonSerializationContext.java b/src/main/java/com/google/gson/JsonSerializationContext.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonSerializationContext.java rename to src/main/java/com/google/gson/JsonSerializationContext.java diff --git a/gson/src/main/java/com/google/gson/JsonSerializer.java b/src/main/java/com/google/gson/JsonSerializer.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonSerializer.java rename to src/main/java/com/google/gson/JsonSerializer.java diff --git a/gson/src/main/java/com/google/gson/JsonStreamParser.java b/src/main/java/com/google/gson/JsonStreamParser.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonStreamParser.java rename to src/main/java/com/google/gson/JsonStreamParser.java diff --git a/gson/src/main/java/com/google/gson/JsonSyntaxException.java b/src/main/java/com/google/gson/JsonSyntaxException.java similarity index 100% rename from gson/src/main/java/com/google/gson/JsonSyntaxException.java rename to src/main/java/com/google/gson/JsonSyntaxException.java diff --git a/gson/src/main/java/com/google/gson/LongSerializationPolicy.java b/src/main/java/com/google/gson/LongSerializationPolicy.java similarity index 100% rename from gson/src/main/java/com/google/gson/LongSerializationPolicy.java rename to src/main/java/com/google/gson/LongSerializationPolicy.java diff --git a/gson/src/main/java/com/google/gson/TreeTypeAdapter.java b/src/main/java/com/google/gson/TreeTypeAdapter.java similarity index 100% rename from gson/src/main/java/com/google/gson/TreeTypeAdapter.java rename to src/main/java/com/google/gson/TreeTypeAdapter.java diff --git a/gson/src/main/java/com/google/gson/TypeAdapter.java b/src/main/java/com/google/gson/TypeAdapter.java similarity index 100% rename from gson/src/main/java/com/google/gson/TypeAdapter.java rename to src/main/java/com/google/gson/TypeAdapter.java diff --git a/gson/src/main/java/com/google/gson/TypeAdapterFactory.java b/src/main/java/com/google/gson/TypeAdapterFactory.java similarity index 100% rename from gson/src/main/java/com/google/gson/TypeAdapterFactory.java rename to src/main/java/com/google/gson/TypeAdapterFactory.java diff --git a/gson/src/main/java/com/google/gson/annotations/Expose.java b/src/main/java/com/google/gson/annotations/Expose.java similarity index 100% rename from gson/src/main/java/com/google/gson/annotations/Expose.java rename to src/main/java/com/google/gson/annotations/Expose.java diff --git a/gson/src/main/java/com/google/gson/annotations/SerializedName.java b/src/main/java/com/google/gson/annotations/SerializedName.java similarity index 100% rename from gson/src/main/java/com/google/gson/annotations/SerializedName.java rename to src/main/java/com/google/gson/annotations/SerializedName.java diff --git a/gson/src/main/java/com/google/gson/annotations/Since.java b/src/main/java/com/google/gson/annotations/Since.java similarity index 100% rename from gson/src/main/java/com/google/gson/annotations/Since.java rename to src/main/java/com/google/gson/annotations/Since.java diff --git a/gson/src/main/java/com/google/gson/annotations/Until.java b/src/main/java/com/google/gson/annotations/Until.java similarity index 100% rename from gson/src/main/java/com/google/gson/annotations/Until.java rename to src/main/java/com/google/gson/annotations/Until.java diff --git a/gson/src/main/java/com/google/gson/annotations/package-info.java b/src/main/java/com/google/gson/annotations/package-info.java similarity index 100% rename from gson/src/main/java/com/google/gson/annotations/package-info.java rename to src/main/java/com/google/gson/annotations/package-info.java diff --git a/gson/src/main/java/com/google/gson/internal/$Gson$Preconditions.java b/src/main/java/com/google/gson/internal/$Gson$Preconditions.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/$Gson$Preconditions.java rename to src/main/java/com/google/gson/internal/$Gson$Preconditions.java diff --git a/gson/src/main/java/com/google/gson/internal/$Gson$Types.java b/src/main/java/com/google/gson/internal/$Gson$Types.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/$Gson$Types.java rename to src/main/java/com/google/gson/internal/$Gson$Types.java diff --git a/gson/src/main/java/com/google/gson/internal/ConstructorConstructor.java b/src/main/java/com/google/gson/internal/ConstructorConstructor.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/ConstructorConstructor.java rename to src/main/java/com/google/gson/internal/ConstructorConstructor.java diff --git a/gson/src/main/java/com/google/gson/internal/Excluder.java b/src/main/java/com/google/gson/internal/Excluder.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/Excluder.java rename to src/main/java/com/google/gson/internal/Excluder.java diff --git a/gson/src/main/java/com/google/gson/internal/JsonReaderInternalAccess.java b/src/main/java/com/google/gson/internal/JsonReaderInternalAccess.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/JsonReaderInternalAccess.java rename to src/main/java/com/google/gson/internal/JsonReaderInternalAccess.java diff --git a/gson/src/main/java/com/google/gson/internal/LazilyParsedNumber.java b/src/main/java/com/google/gson/internal/LazilyParsedNumber.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/LazilyParsedNumber.java rename to src/main/java/com/google/gson/internal/LazilyParsedNumber.java diff --git a/gson/src/main/java/com/google/gson/internal/LinkedHashTreeMap.java b/src/main/java/com/google/gson/internal/LinkedHashTreeMap.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/LinkedHashTreeMap.java rename to src/main/java/com/google/gson/internal/LinkedHashTreeMap.java diff --git a/gson/src/main/java/com/google/gson/internal/ObjectConstructor.java b/src/main/java/com/google/gson/internal/ObjectConstructor.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/ObjectConstructor.java rename to src/main/java/com/google/gson/internal/ObjectConstructor.java diff --git a/gson/src/main/java/com/google/gson/internal/Primitives.java b/src/main/java/com/google/gson/internal/Primitives.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/Primitives.java rename to src/main/java/com/google/gson/internal/Primitives.java diff --git a/gson/src/main/java/com/google/gson/internal/Streams.java b/src/main/java/com/google/gson/internal/Streams.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/Streams.java rename to src/main/java/com/google/gson/internal/Streams.java diff --git a/gson/src/main/java/com/google/gson/internal/UnsafeAllocator.java b/src/main/java/com/google/gson/internal/UnsafeAllocator.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/UnsafeAllocator.java rename to src/main/java/com/google/gson/internal/UnsafeAllocator.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java b/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java rename to src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/CollectionTypeAdapterFactory.java b/src/main/java/com/google/gson/internal/bind/CollectionTypeAdapterFactory.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/CollectionTypeAdapterFactory.java rename to src/main/java/com/google/gson/internal/bind/CollectionTypeAdapterFactory.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/DateTypeAdapter.java b/src/main/java/com/google/gson/internal/bind/DateTypeAdapter.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/DateTypeAdapter.java rename to src/main/java/com/google/gson/internal/bind/DateTypeAdapter.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java b/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java rename to src/main/java/com/google/gson/internal/bind/JsonTreeReader.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/JsonTreeWriter.java b/src/main/java/com/google/gson/internal/bind/JsonTreeWriter.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/JsonTreeWriter.java rename to src/main/java/com/google/gson/internal/bind/JsonTreeWriter.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java b/src/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java rename to src/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/ObjectTypeAdapter.java b/src/main/java/com/google/gson/internal/bind/ObjectTypeAdapter.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/ObjectTypeAdapter.java rename to src/main/java/com/google/gson/internal/bind/ObjectTypeAdapter.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java b/src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java rename to src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/SqlDateTypeAdapter.java b/src/main/java/com/google/gson/internal/bind/SqlDateTypeAdapter.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/SqlDateTypeAdapter.java rename to src/main/java/com/google/gson/internal/bind/SqlDateTypeAdapter.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/TimeTypeAdapter.java b/src/main/java/com/google/gson/internal/bind/TimeTypeAdapter.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/TimeTypeAdapter.java rename to src/main/java/com/google/gson/internal/bind/TimeTypeAdapter.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper.java b/src/main/java/com/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper.java rename to src/main/java/com/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper.java diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/src/main/java/com/google/gson/internal/bind/TypeAdapters.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java rename to src/main/java/com/google/gson/internal/bind/TypeAdapters.java diff --git a/gson/src/main/java/com/google/gson/internal/package-info.java b/src/main/java/com/google/gson/internal/package-info.java similarity index 100% rename from gson/src/main/java/com/google/gson/internal/package-info.java rename to src/main/java/com/google/gson/internal/package-info.java diff --git a/gson/src/main/java/com/google/gson/package-info.java b/src/main/java/com/google/gson/package-info.java similarity index 100% rename from gson/src/main/java/com/google/gson/package-info.java rename to src/main/java/com/google/gson/package-info.java diff --git a/gson/src/main/java/com/google/gson/reflect/TypeToken.java b/src/main/java/com/google/gson/reflect/TypeToken.java similarity index 100% rename from gson/src/main/java/com/google/gson/reflect/TypeToken.java rename to src/main/java/com/google/gson/reflect/TypeToken.java diff --git a/gson/src/main/java/com/google/gson/reflect/package-info.java b/src/main/java/com/google/gson/reflect/package-info.java similarity index 100% rename from gson/src/main/java/com/google/gson/reflect/package-info.java rename to src/main/java/com/google/gson/reflect/package-info.java diff --git a/gson/src/main/java/com/google/gson/stream/JsonReader.java b/src/main/java/com/google/gson/stream/JsonReader.java similarity index 100% rename from gson/src/main/java/com/google/gson/stream/JsonReader.java rename to src/main/java/com/google/gson/stream/JsonReader.java diff --git a/gson/src/main/java/com/google/gson/stream/JsonScope.java b/src/main/java/com/google/gson/stream/JsonScope.java similarity index 100% rename from gson/src/main/java/com/google/gson/stream/JsonScope.java rename to src/main/java/com/google/gson/stream/JsonScope.java diff --git a/gson/src/main/java/com/google/gson/stream/JsonToken.java b/src/main/java/com/google/gson/stream/JsonToken.java similarity index 100% rename from gson/src/main/java/com/google/gson/stream/JsonToken.java rename to src/main/java/com/google/gson/stream/JsonToken.java diff --git a/gson/src/main/java/com/google/gson/stream/JsonWriter.java b/src/main/java/com/google/gson/stream/JsonWriter.java similarity index 100% rename from gson/src/main/java/com/google/gson/stream/JsonWriter.java rename to src/main/java/com/google/gson/stream/JsonWriter.java diff --git a/gson/src/main/java/com/google/gson/stream/MalformedJsonException.java b/src/main/java/com/google/gson/stream/MalformedJsonException.java similarity index 100% rename from gson/src/main/java/com/google/gson/stream/MalformedJsonException.java rename to src/main/java/com/google/gson/stream/MalformedJsonException.java diff --git a/gson/src/test/java/com/google/gson/CommentsTest.java b/src/test/java/com/google/gson/CommentsTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/CommentsTest.java rename to src/test/java/com/google/gson/CommentsTest.java diff --git a/gson/src/test/java/com/google/gson/DefaultDateTypeAdapterTest.java b/src/test/java/com/google/gson/DefaultDateTypeAdapterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/DefaultDateTypeAdapterTest.java rename to src/test/java/com/google/gson/DefaultDateTypeAdapterTest.java diff --git a/gson/src/test/java/com/google/gson/DefaultInetAddressTypeAdapterTest.java b/src/test/java/com/google/gson/DefaultInetAddressTypeAdapterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/DefaultInetAddressTypeAdapterTest.java rename to src/test/java/com/google/gson/DefaultInetAddressTypeAdapterTest.java diff --git a/gson/src/test/java/com/google/gson/DefaultMapJsonSerializerTest.java b/src/test/java/com/google/gson/DefaultMapJsonSerializerTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/DefaultMapJsonSerializerTest.java rename to src/test/java/com/google/gson/DefaultMapJsonSerializerTest.java diff --git a/gson/src/test/java/com/google/gson/ExposeAnnotationExclusionStrategyTest.java b/src/test/java/com/google/gson/ExposeAnnotationExclusionStrategyTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/ExposeAnnotationExclusionStrategyTest.java rename to src/test/java/com/google/gson/ExposeAnnotationExclusionStrategyTest.java diff --git a/gson/src/test/java/com/google/gson/FieldAttributesTest.java b/src/test/java/com/google/gson/FieldAttributesTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/FieldAttributesTest.java rename to src/test/java/com/google/gson/FieldAttributesTest.java diff --git a/gson/src/test/java/com/google/gson/GenericArrayTypeTest.java b/src/test/java/com/google/gson/GenericArrayTypeTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/GenericArrayTypeTest.java rename to src/test/java/com/google/gson/GenericArrayTypeTest.java diff --git a/gson/src/test/java/com/google/gson/GsonBuilderTest.java b/src/test/java/com/google/gson/GsonBuilderTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/GsonBuilderTest.java rename to src/test/java/com/google/gson/GsonBuilderTest.java diff --git a/gson/src/test/java/com/google/gson/GsonTypeAdapterTest.java b/src/test/java/com/google/gson/GsonTypeAdapterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/GsonTypeAdapterTest.java rename to src/test/java/com/google/gson/GsonTypeAdapterTest.java diff --git a/gson/src/test/java/com/google/gson/InnerClassExclusionStrategyTest.java b/src/test/java/com/google/gson/InnerClassExclusionStrategyTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/InnerClassExclusionStrategyTest.java rename to src/test/java/com/google/gson/InnerClassExclusionStrategyTest.java diff --git a/gson/src/test/java/com/google/gson/JavaSerializationTest.java b/src/test/java/com/google/gson/JavaSerializationTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/JavaSerializationTest.java rename to src/test/java/com/google/gson/JavaSerializationTest.java diff --git a/gson/src/test/java/com/google/gson/JsonArrayTest.java b/src/test/java/com/google/gson/JsonArrayTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/JsonArrayTest.java rename to src/test/java/com/google/gson/JsonArrayTest.java diff --git a/gson/src/test/java/com/google/gson/JsonNullTest.java b/src/test/java/com/google/gson/JsonNullTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/JsonNullTest.java rename to src/test/java/com/google/gson/JsonNullTest.java diff --git a/gson/src/test/java/com/google/gson/JsonObjectTest.java b/src/test/java/com/google/gson/JsonObjectTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/JsonObjectTest.java rename to src/test/java/com/google/gson/JsonObjectTest.java diff --git a/gson/src/test/java/com/google/gson/JsonParserTest.java b/src/test/java/com/google/gson/JsonParserTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/JsonParserTest.java rename to src/test/java/com/google/gson/JsonParserTest.java diff --git a/gson/src/test/java/com/google/gson/JsonPrimitiveTest.java b/src/test/java/com/google/gson/JsonPrimitiveTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/JsonPrimitiveTest.java rename to src/test/java/com/google/gson/JsonPrimitiveTest.java diff --git a/gson/src/test/java/com/google/gson/JsonStreamParserTest.java b/src/test/java/com/google/gson/JsonStreamParserTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/JsonStreamParserTest.java rename to src/test/java/com/google/gson/JsonStreamParserTest.java diff --git a/gson/src/test/java/com/google/gson/LongSerializationPolicyTest.java b/src/test/java/com/google/gson/LongSerializationPolicyTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/LongSerializationPolicyTest.java rename to src/test/java/com/google/gson/LongSerializationPolicyTest.java diff --git a/gson/src/test/java/com/google/gson/MixedStreamTest.java b/src/test/java/com/google/gson/MixedStreamTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/MixedStreamTest.java rename to src/test/java/com/google/gson/MixedStreamTest.java diff --git a/gson/src/test/java/com/google/gson/MockExclusionStrategy.java b/src/test/java/com/google/gson/MockExclusionStrategy.java similarity index 100% rename from gson/src/test/java/com/google/gson/MockExclusionStrategy.java rename to src/test/java/com/google/gson/MockExclusionStrategy.java diff --git a/gson/src/test/java/com/google/gson/ObjectTypeAdapterTest.java b/src/test/java/com/google/gson/ObjectTypeAdapterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/ObjectTypeAdapterTest.java rename to src/test/java/com/google/gson/ObjectTypeAdapterTest.java diff --git a/gson/src/test/java/com/google/gson/OverrideCoreTypeAdaptersTest.java b/src/test/java/com/google/gson/OverrideCoreTypeAdaptersTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/OverrideCoreTypeAdaptersTest.java rename to src/test/java/com/google/gson/OverrideCoreTypeAdaptersTest.java diff --git a/gson/src/test/java/com/google/gson/ParameterizedTypeFixtures.java b/src/test/java/com/google/gson/ParameterizedTypeFixtures.java similarity index 100% rename from gson/src/test/java/com/google/gson/ParameterizedTypeFixtures.java rename to src/test/java/com/google/gson/ParameterizedTypeFixtures.java diff --git a/gson/src/test/java/com/google/gson/ParameterizedTypeTest.java b/src/test/java/com/google/gson/ParameterizedTypeTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/ParameterizedTypeTest.java rename to src/test/java/com/google/gson/ParameterizedTypeTest.java diff --git a/gson/src/test/java/com/google/gson/PrimitiveTypeAdapter.java b/src/test/java/com/google/gson/PrimitiveTypeAdapter.java similarity index 100% rename from gson/src/test/java/com/google/gson/PrimitiveTypeAdapter.java rename to src/test/java/com/google/gson/PrimitiveTypeAdapter.java diff --git a/gson/src/test/java/com/google/gson/VersionExclusionStrategyTest.java b/src/test/java/com/google/gson/VersionExclusionStrategyTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/VersionExclusionStrategyTest.java rename to src/test/java/com/google/gson/VersionExclusionStrategyTest.java diff --git a/gson/src/test/java/com/google/gson/common/MoreAsserts.java b/src/test/java/com/google/gson/common/MoreAsserts.java similarity index 100% rename from gson/src/test/java/com/google/gson/common/MoreAsserts.java rename to src/test/java/com/google/gson/common/MoreAsserts.java diff --git a/gson/src/test/java/com/google/gson/common/TestTypes.java b/src/test/java/com/google/gson/common/TestTypes.java similarity index 100% rename from gson/src/test/java/com/google/gson/common/TestTypes.java rename to src/test/java/com/google/gson/common/TestTypes.java diff --git a/gson/src/test/java/com/google/gson/functional/ArrayTest.java b/src/test/java/com/google/gson/functional/ArrayTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/ArrayTest.java rename to src/test/java/com/google/gson/functional/ArrayTest.java diff --git a/gson/src/test/java/com/google/gson/functional/CircularReferenceTest.java b/src/test/java/com/google/gson/functional/CircularReferenceTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/CircularReferenceTest.java rename to src/test/java/com/google/gson/functional/CircularReferenceTest.java diff --git a/gson/src/test/java/com/google/gson/functional/CollectionTest.java b/src/test/java/com/google/gson/functional/CollectionTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/CollectionTest.java rename to src/test/java/com/google/gson/functional/CollectionTest.java diff --git a/gson/src/test/java/com/google/gson/functional/ConcurrencyTest.java b/src/test/java/com/google/gson/functional/ConcurrencyTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/ConcurrencyTest.java rename to src/test/java/com/google/gson/functional/ConcurrencyTest.java diff --git a/gson/src/test/java/com/google/gson/functional/CustomDeserializerTest.java b/src/test/java/com/google/gson/functional/CustomDeserializerTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/CustomDeserializerTest.java rename to src/test/java/com/google/gson/functional/CustomDeserializerTest.java diff --git a/gson/src/test/java/com/google/gson/functional/CustomSerializerTest.java b/src/test/java/com/google/gson/functional/CustomSerializerTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/CustomSerializerTest.java rename to src/test/java/com/google/gson/functional/CustomSerializerTest.java diff --git a/gson/src/test/java/com/google/gson/functional/CustomTypeAdaptersTest.java b/src/test/java/com/google/gson/functional/CustomTypeAdaptersTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/CustomTypeAdaptersTest.java rename to src/test/java/com/google/gson/functional/CustomTypeAdaptersTest.java diff --git a/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java b/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java rename to src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java diff --git a/gson/src/test/java/com/google/gson/functional/DelegateTypeAdapterTest.java b/src/test/java/com/google/gson/functional/DelegateTypeAdapterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/DelegateTypeAdapterTest.java rename to src/test/java/com/google/gson/functional/DelegateTypeAdapterTest.java diff --git a/gson/src/test/java/com/google/gson/functional/EnumTest.java b/src/test/java/com/google/gson/functional/EnumTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/EnumTest.java rename to src/test/java/com/google/gson/functional/EnumTest.java diff --git a/gson/src/test/java/com/google/gson/functional/EscapingTest.java b/src/test/java/com/google/gson/functional/EscapingTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/EscapingTest.java rename to src/test/java/com/google/gson/functional/EscapingTest.java diff --git a/gson/src/test/java/com/google/gson/functional/ExclusionStrategyFunctionalTest.java b/src/test/java/com/google/gson/functional/ExclusionStrategyFunctionalTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/ExclusionStrategyFunctionalTest.java rename to src/test/java/com/google/gson/functional/ExclusionStrategyFunctionalTest.java diff --git a/gson/src/test/java/com/google/gson/functional/ExposeFieldsTest.java b/src/test/java/com/google/gson/functional/ExposeFieldsTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/ExposeFieldsTest.java rename to src/test/java/com/google/gson/functional/ExposeFieldsTest.java diff --git a/gson/src/test/java/com/google/gson/functional/FieldExclusionTest.java b/src/test/java/com/google/gson/functional/FieldExclusionTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/FieldExclusionTest.java rename to src/test/java/com/google/gson/functional/FieldExclusionTest.java diff --git a/gson/src/test/java/com/google/gson/functional/FieldNamingTest.java b/src/test/java/com/google/gson/functional/FieldNamingTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/FieldNamingTest.java rename to src/test/java/com/google/gson/functional/FieldNamingTest.java diff --git a/gson/src/test/java/com/google/gson/functional/InheritanceTest.java b/src/test/java/com/google/gson/functional/InheritanceTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/InheritanceTest.java rename to src/test/java/com/google/gson/functional/InheritanceTest.java diff --git a/gson/src/test/java/com/google/gson/functional/InstanceCreatorTest.java b/src/test/java/com/google/gson/functional/InstanceCreatorTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/InstanceCreatorTest.java rename to src/test/java/com/google/gson/functional/InstanceCreatorTest.java diff --git a/gson/src/test/java/com/google/gson/functional/InterfaceTest.java b/src/test/java/com/google/gson/functional/InterfaceTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/InterfaceTest.java rename to src/test/java/com/google/gson/functional/InterfaceTest.java diff --git a/gson/src/test/java/com/google/gson/functional/InternationalizationTest.java b/src/test/java/com/google/gson/functional/InternationalizationTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/InternationalizationTest.java rename to src/test/java/com/google/gson/functional/InternationalizationTest.java diff --git a/gson/src/test/java/com/google/gson/functional/JsonParserTest.java b/src/test/java/com/google/gson/functional/JsonParserTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/JsonParserTest.java rename to src/test/java/com/google/gson/functional/JsonParserTest.java diff --git a/gson/src/test/java/com/google/gson/functional/JsonTreeTest.java b/src/test/java/com/google/gson/functional/JsonTreeTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/JsonTreeTest.java rename to src/test/java/com/google/gson/functional/JsonTreeTest.java diff --git a/gson/src/test/java/com/google/gson/functional/MapAsArrayTypeAdapterTest.java b/src/test/java/com/google/gson/functional/MapAsArrayTypeAdapterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/MapAsArrayTypeAdapterTest.java rename to src/test/java/com/google/gson/functional/MapAsArrayTypeAdapterTest.java diff --git a/gson/src/test/java/com/google/gson/functional/MapTest.java b/src/test/java/com/google/gson/functional/MapTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/MapTest.java rename to src/test/java/com/google/gson/functional/MapTest.java diff --git a/gson/src/test/java/com/google/gson/functional/MoreSpecificTypeSerializationTest.java b/src/test/java/com/google/gson/functional/MoreSpecificTypeSerializationTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/MoreSpecificTypeSerializationTest.java rename to src/test/java/com/google/gson/functional/MoreSpecificTypeSerializationTest.java diff --git a/gson/src/test/java/com/google/gson/functional/NamingPolicyTest.java b/src/test/java/com/google/gson/functional/NamingPolicyTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/NamingPolicyTest.java rename to src/test/java/com/google/gson/functional/NamingPolicyTest.java diff --git a/gson/src/test/java/com/google/gson/functional/NullObjectAndFieldTest.java b/src/test/java/com/google/gson/functional/NullObjectAndFieldTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/NullObjectAndFieldTest.java rename to src/test/java/com/google/gson/functional/NullObjectAndFieldTest.java diff --git a/gson/src/test/java/com/google/gson/functional/ObjectTest.java b/src/test/java/com/google/gson/functional/ObjectTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/ObjectTest.java rename to src/test/java/com/google/gson/functional/ObjectTest.java diff --git a/gson/src/test/java/com/google/gson/functional/ParameterizedTypesTest.java b/src/test/java/com/google/gson/functional/ParameterizedTypesTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/ParameterizedTypesTest.java rename to src/test/java/com/google/gson/functional/ParameterizedTypesTest.java diff --git a/gson/src/test/java/com/google/gson/functional/PrettyPrintingTest.java b/src/test/java/com/google/gson/functional/PrettyPrintingTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/PrettyPrintingTest.java rename to src/test/java/com/google/gson/functional/PrettyPrintingTest.java diff --git a/gson/src/test/java/com/google/gson/functional/PrimitiveCharacterTest.java b/src/test/java/com/google/gson/functional/PrimitiveCharacterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/PrimitiveCharacterTest.java rename to src/test/java/com/google/gson/functional/PrimitiveCharacterTest.java diff --git a/gson/src/test/java/com/google/gson/functional/PrimitiveTest.java b/src/test/java/com/google/gson/functional/PrimitiveTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/PrimitiveTest.java rename to src/test/java/com/google/gson/functional/PrimitiveTest.java diff --git a/gson/src/test/java/com/google/gson/functional/PrintFormattingTest.java b/src/test/java/com/google/gson/functional/PrintFormattingTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/PrintFormattingTest.java rename to src/test/java/com/google/gson/functional/PrintFormattingTest.java diff --git a/gson/src/test/java/com/google/gson/functional/RawSerializationTest.java b/src/test/java/com/google/gson/functional/RawSerializationTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/RawSerializationTest.java rename to src/test/java/com/google/gson/functional/RawSerializationTest.java diff --git a/gson/src/test/java/com/google/gson/functional/ReadersWritersTest.java b/src/test/java/com/google/gson/functional/ReadersWritersTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/ReadersWritersTest.java rename to src/test/java/com/google/gson/functional/ReadersWritersTest.java diff --git a/gson/src/test/java/com/google/gson/functional/SecurityTest.java b/src/test/java/com/google/gson/functional/SecurityTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/SecurityTest.java rename to src/test/java/com/google/gson/functional/SecurityTest.java diff --git a/gson/src/test/java/com/google/gson/functional/StreamingTypeAdaptersTest.java b/src/test/java/com/google/gson/functional/StreamingTypeAdaptersTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/StreamingTypeAdaptersTest.java rename to src/test/java/com/google/gson/functional/StreamingTypeAdaptersTest.java diff --git a/gson/src/test/java/com/google/gson/functional/StringTest.java b/src/test/java/com/google/gson/functional/StringTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/StringTest.java rename to src/test/java/com/google/gson/functional/StringTest.java diff --git a/gson/src/test/java/com/google/gson/functional/TreeTypeAdaptersTest.java b/src/test/java/com/google/gson/functional/TreeTypeAdaptersTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/TreeTypeAdaptersTest.java rename to src/test/java/com/google/gson/functional/TreeTypeAdaptersTest.java diff --git a/gson/src/test/java/com/google/gson/functional/TypeAdapterPrecedenceTest.java b/src/test/java/com/google/gson/functional/TypeAdapterPrecedenceTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/TypeAdapterPrecedenceTest.java rename to src/test/java/com/google/gson/functional/TypeAdapterPrecedenceTest.java diff --git a/gson/src/test/java/com/google/gson/functional/TypeHierarchyAdapterTest.java b/src/test/java/com/google/gson/functional/TypeHierarchyAdapterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/TypeHierarchyAdapterTest.java rename to src/test/java/com/google/gson/functional/TypeHierarchyAdapterTest.java diff --git a/gson/src/test/java/com/google/gson/functional/TypeVariableTest.java b/src/test/java/com/google/gson/functional/TypeVariableTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/TypeVariableTest.java rename to src/test/java/com/google/gson/functional/TypeVariableTest.java diff --git a/gson/src/test/java/com/google/gson/functional/UncategorizedTest.java b/src/test/java/com/google/gson/functional/UncategorizedTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/UncategorizedTest.java rename to src/test/java/com/google/gson/functional/UncategorizedTest.java diff --git a/gson/src/test/java/com/google/gson/functional/VersioningTest.java b/src/test/java/com/google/gson/functional/VersioningTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/functional/VersioningTest.java rename to src/test/java/com/google/gson/functional/VersioningTest.java diff --git a/gson/src/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java b/src/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java rename to src/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java diff --git a/gson/src/test/java/com/google/gson/internal/bind/JsonElementReaderTest.java b/src/test/java/com/google/gson/internal/bind/JsonElementReaderTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/internal/bind/JsonElementReaderTest.java rename to src/test/java/com/google/gson/internal/bind/JsonElementReaderTest.java diff --git a/gson/src/test/java/com/google/gson/internal/bind/JsonTreeWriterTest.java b/src/test/java/com/google/gson/internal/bind/JsonTreeWriterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/internal/bind/JsonTreeWriterTest.java rename to src/test/java/com/google/gson/internal/bind/JsonTreeWriterTest.java diff --git a/gson/src/test/java/com/google/gson/metrics/PerformanceTest.java b/src/test/java/com/google/gson/metrics/PerformanceTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/metrics/PerformanceTest.java rename to src/test/java/com/google/gson/metrics/PerformanceTest.java diff --git a/gson/src/test/java/com/google/gson/reflect/TypeTokenTest.java b/src/test/java/com/google/gson/reflect/TypeTokenTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/reflect/TypeTokenTest.java rename to src/test/java/com/google/gson/reflect/TypeTokenTest.java diff --git a/gson/src/test/java/com/google/gson/stream/JsonReaderTest.java b/src/test/java/com/google/gson/stream/JsonReaderTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/stream/JsonReaderTest.java rename to src/test/java/com/google/gson/stream/JsonReaderTest.java diff --git a/gson/src/test/java/com/google/gson/stream/JsonWriterTest.java b/src/test/java/com/google/gson/stream/JsonWriterTest.java similarity index 100% rename from gson/src/test/java/com/google/gson/stream/JsonWriterTest.java rename to src/test/java/com/google/gson/stream/JsonWriterTest.java