From 59553e55e51e0b8d4ecbe709931231195745fd62 Mon Sep 17 00:00:00 2001
From: wang--ge <wang__ge@126.com>
Date: Wed, 14 May 2025 16:16:56 +0800
Subject: [PATCH] JOHNZON-96 implement JSON-P 1.1 API
.../johnzon/core/JsonArrayBuilderImpl.java | 9 ++-
.../johnzon/core/JsonBuilderFactoryImpl.java | 13 ++++
.../johnzon/core/JsonGeneratorImpl.java | 36 +++++-----
.../johnzon/core/JsonObjectBuilderImpl.java | 24 ++++++-
.../apache/johnzon/core/JsonProviderImpl.java | 66 +++++++++++++++++++
.../johnzon/mapper/MappingParserImpl.java | 2 +-
.../org/apache/johnzon/mapper/MapperTest.java | 5 +-
pom.xml | 6 +-
8 files changed, 136 insertions(+), 25 deletions(-)
@@ -33,6 +33,13 @@ import javax.json.JsonValue;
class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable {
private List<JsonValue> tmpList;
+ public JsonArrayBuilderImpl() {
+ }
+
+ public JsonArrayBuilderImpl(JsonArray initialData) {
+ tmpList = new ArrayList<>(initialData);
+ }
+
@Override
public JsonArrayBuilder add(final JsonValue value) {
addValue(value);
@@ -105,7 +112,7 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable {
}
if(tmpList==null){
- tmpList=new ArrayList<JsonValue>();
+ tmpList=new ArrayList<>();
}
tmpList.add(value);
@@ -25,8 +25,10 @@ import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
+import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonBuilderFactory;
+import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
class JsonBuilderFactoryImpl implements JsonBuilderFactory {
@@ -55,11 +57,22 @@ class JsonBuilderFactoryImpl implements JsonBuilderFactory {
return new JsonObjectBuilderImpl();
}
+ @Override
+ public JsonObjectBuilder createObjectBuilder(JsonObject initialData) {
+ return new JsonObjectBuilderImpl(initialData);
+ }
+
@Override
public JsonArrayBuilder createArrayBuilder() {
return new JsonArrayBuilderImpl();
}
+
+ @Override
+ public JsonArrayBuilder createArrayBuilder(JsonArray initialData) {
+ return new JsonArrayBuilderImpl(initialData);
+ }
+
@Override
public Map<String, ?> getConfigInUse() {
return Collections.unmodifiableMap(internalConfig);
@@ -430,6 +430,26 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
return this;
}
+ @Override
+ public JsonGenerator writeKey(final String key) {
+ final GeneratorState currentState = currentState();
+ if (!currentState.acceptsKey) {
+ throw new JsonGenerationException("state " + currentState + " does not accept a key");
+ }
+ if (currentState == GeneratorState.IN_OBJECT) {
+ justWrite(COMMA_CHAR);
+ writeEol();
+ }
+
+ writeIndent();
+
+ writeCachedKey(key);
+ state.push(GeneratorState.AFTER_KEY);
+ return this;
+ }
+
+
+
@Override
public void close() {
try {
@@ -650,22 +670,6 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
return state.peek();
}
- private void writeKey(final String key) {
- final GeneratorState currentState = currentState();
- if (!currentState.acceptsKey) {
- throw new IllegalStateException("state " + currentState + " does not accept a key");
- }
- if (currentState == GeneratorState.IN_OBJECT) {
- justWrite(COMMA_CHAR);
- writeEol();
- }
-
- writeIndent();
-
- writeCachedKey(key);
- state.push(GeneratorState.AFTER_KEY);
- }
-
private void writeValueAsJsonString(final String value) {
prepareValue();
final GeneratorState peek = state.peek();
@@ -33,6 +33,14 @@ import javax.json.JsonValue;
class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
private Map<String, JsonValue> tmpMap;
+ public JsonObjectBuilderImpl() {
+ }
+
+ public JsonObjectBuilderImpl(JsonObject initialData) {
+ tmpMap = new LinkedHashMap<>(initialData);
+ }
+
+
@Override
public JsonObjectBuilder add(final String name, final JsonValue value) {
putValue(name, value);
@@ -98,14 +106,26 @@ class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
putValue(name, builder.build());
return this;
}
-
+
+ @Override
+ public JsonObjectBuilder addAll(JsonObjectBuilder builder) {
+ tmpMap.putAll(builder.build());
+ return this;
+ }
+
+ @Override
+ public JsonObjectBuilder remove(String name) {
+ tmpMap.remove(name);
+ return this;
+ }
+
private void putValue(String name, JsonValue value){
if(name == null || value == null) {
throw npe();
}
if(tmpMap==null){
- tmpMap=new LinkedHashMap<String, JsonValue>();
+ tmpMap = new LinkedHashMap<>();
}
tmpMap.put(name, value);
@@ -25,11 +25,17 @@ import java.io.Serializable;
import java.io.Writer;
import java.util.Map;
+import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonBuilderFactory;
import javax.json.JsonObjectBuilder;
+import javax.json.JsonPatch;
+import javax.json.JsonPatchBuilder;
+import javax.json.JsonPointer;
import javax.json.JsonReader;
import javax.json.JsonReaderFactory;
+import javax.json.JsonStructure;
+import javax.json.JsonValue;
import javax.json.JsonWriter;
import javax.json.JsonWriterFactory;
import javax.json.spi.JsonProvider;
@@ -116,6 +122,36 @@ public class JsonProviderImpl extends JsonProvider implements Serializable {
return DELEGATE.createBuilderFactory(stringMap);
}
+ //@Override
+ //public JsonPointer createJsonPointer(String path) {
+ // return DELEGATE.createJsonPointer(path);
+ //}
+
+ //@Override
+ //public JsonPatch createPatch(JsonStructure source, JsonStructure target) {
+ // return DELEGATE.createPatch(source, target);
+ //}
+
+ @Override
+ public JsonPatchBuilder createPatchBuilder() {
+ return DELEGATE.createPatchBuilder();
+ }
+
+ @Override
+ public JsonPatchBuilder createPatchBuilder(JsonArray initialData) {
+ return DELEGATE.createPatchBuilder(initialData);
+ }
+
+ //@Override
+ //public JsonValue createMergePatch(JsonValue source, JsonValue target) {
+ // return DELEGATE.createMergePatch(source, target);
+ //}
+
+ //@Override
+ //public JsonValue mergePatch(JsonValue source, JsonValue patch) {
+ // return DELEGATE.mergePatch(source, patch);
+ //}
+
static class JsonProviderDelegate extends JsonProvider {
private final JsonReaderFactory readerFactory = new JsonReaderFactoryImpl(null);
private final JsonParserFactory parserFactory = new JsonParserFactoryImpl(null);
@@ -197,5 +233,35 @@ public class JsonProviderImpl extends JsonProvider implements Serializable {
public JsonBuilderFactory createBuilderFactory(final Map<String, ?> config) {
return (config == null || config.isEmpty()) ? builderFactory : new JsonBuilderFactoryImpl(config);
}
+
+ //@Override
+ //public JsonPointer createJsonPointer(String path) {
+ // throw new UnsupportedOperationException("TODO JSON-P 1.1");
+ //}
+
+ //@Override
+ //public JsonPatch createPatch(JsonStructure source, JsonStructure target) {
+ // throw new UnsupportedOperationException("TODO JSON-P 1.1");
+ //}
+
+ @Override
+ public JsonPatchBuilder createPatchBuilder() {
+ throw new UnsupportedOperationException("TODO JSON-P 1.1");
+ }
+
+ @Override
+ public JsonPatchBuilder createPatchBuilder(JsonArray initialData) {
+ throw new UnsupportedOperationException("TODO JSON-P 1.1");
+ }
+
+ //@Override
+ //public JsonValue createMergePatch(JsonValue source, JsonValue target) {
+ // throw new UnsupportedOperationException("TODO JSON-P 1.1");
+ //}
+
+ //@Override
+ //public JsonValue mergePatch(JsonValue source, JsonValue patch) {
+ // throw new UnsupportedOperationException("TODO JSON-P 1.1");
+ //}
}
}
@@ -539,7 +539,7 @@ public class MappingParserImpl implements MappingParser {
} else if (collection.size() == 1) {
return Collection.class.cast(EnumSet.of(Enum.class.cast(collection.iterator().next())));
} else {
- final List<Enum<?>> list = List.class.cast(collection);
+ final List<Enum> list = List.class.cast(collection);
return Collection.class.cast(EnumSet.of(list.get(0), list.subList(1, list.size()).toArray(new Enum[list.size() - 1])));
}
}
@@ -184,8 +184,9 @@ public class MapperTest {
// read
assertEquals(Boolean.TRUE, simpleMapper.readObject(new ByteArrayInputStream("true".getBytes()), Object.class));
assertEquals(Boolean.FALSE, simpleMapper.readObject(new ByteArrayInputStream("false".getBytes()), Object.class));
- assertEquals(1., encodingAwareMapper
- .readObject(new ByteArrayInputStream("1".getBytes()), Object.class));
+ assertEquals(1.,
+ encodingAwareMapper.readObject(new ByteArrayInputStream("1".getBytes()), Object.class),
+ 0.1);
assertEquals("val", simpleMapper.readObject(new ByteArrayInputStream("\"val\"".getBytes()), Object.class));
assertEquals(asList("val1", "val2"), simpleMapper.readObject(new ByteArrayInputStream("[\"val1\", \"val2\"]".getBytes()), Object.class));
assertEquals(new HashMap<String, Object>() {{
@@ -40,14 +40,14 @@
<url>http://johnzon.apache.org</url>
<properties>
- <jsonspecversion>1.0-alpha-1</jsonspecversion>
+ <jsonspecversion>1.0-alpha-1</jsonspecversion>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<johnzon.site.url>https://svn.apache.org/repos/asf/johnzon/site/publish/</johnzon.site.url>
<pubsub.url>scm:svn:${johnzon.site.url}</pubsub.url>
<staging.directory>${project.build.directory}/site</staging.directory>
<felix.plugin.version>2.5.3</felix.plugin.version>
<bnd.version.policy>[$(version;==;$(@)),$(version;+;$(@)))</bnd.version.policy>
- <java-compile.version>1.6</java-compile.version>
+ <java-compile.version>1.8</java-compile.version>
<cxf.version>3.0.0</cxf.version>
<javadoc.params /> <!-- for java 8 set disable doclint (by profile) -->
<checkstyle.version>2.15</checkstyle.version> <!-- checkstyle > 2.15 version do not support java 6 -->
@@ -66,7 +66,7 @@
<dependencies>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
- <artifactId>geronimo-json_1.0_spec</artifactId>
+ <artifactId>geronimo-json_1.0_spec</artifactId>
<version>${jsonspecversion}</version>
<scope>provided</scope>
</dependency>
--
2.48.1