Author: rmannibucau
Date: Mon Feb  5 16:29:49 2018
New Revision: 1823208

URL: http://svn.apache.org/viewvc?rev=1823208&view=rev
Log:
share the jsonp provider and factories between jsonp and jsonb default providers

Modified:
    
openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/cxf/MeecrowaveBus.java

Modified: 
openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/cxf/MeecrowaveBus.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/cxf/MeecrowaveBus.java?rev=1823208&r1=1823207&r2=1823208&view=diff
==============================================================================
--- 
openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/cxf/MeecrowaveBus.java
 (original)
+++ 
openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/cxf/MeecrowaveBus.java
 Mon Feb  5 16:29:49 2018
@@ -18,14 +18,42 @@ import org.apache.meecrowave.Meecrowave;
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonBuilderFactory;
+import javax.json.JsonMergePatch;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+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.JsonString;
 import javax.json.JsonStructure;
+import javax.json.JsonValue;
+import javax.json.JsonWriter;
+import javax.json.JsonWriterFactory;
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.spi.JsonProvider;
 import javax.json.stream.JsonGenerator;
+import javax.json.stream.JsonGeneratorFactory;
+import javax.json.stream.JsonParser;
+import javax.json.stream.JsonParserFactory;
 import javax.servlet.ServletContext;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Provider;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -68,17 +96,42 @@ public class MeecrowaveBus implements Bu
                                         }
                                     })
                                     .collect(Collectors.<Object>toList()))
-                            .orElseGet(() -> Stream.<Object>of(
-                                    new ConfiguredJsonbJaxrsProvider(
-                                            builder.getJsonbEncoding(), 
builder.isJsonbNulls(),
-                                            builder.isJsonbIJson(), 
builder.isJsonbPrettify(),
-                                            builder.getJsonbBinaryStrategy(), 
builder.getJsonbNamingStrategy(),
-                                            builder.getJsonbOrderStrategy()),
-                                    new ConfiguredJsrProvider(
-                                            builder.getJsonpBufferStrategy(), 
builder.getJsonpMaxStringLen(),
-                                            
builder.getJsonpMaxReadBufferLen(), builder.getJsonpMaxWriteBufferLen(),
-                                            builder.isJsonpSupportsComment(), 
builder.isJsonpPrettify()))
-                                    .collect(toList()));
+                            .orElseGet(() -> {
+                                // ensure both providers share the same memory 
reuse logic
+                                final JsonProvider provider = 
JsonProvider.provider();
+                                final JsonReaderFactory readerFactory = 
provider.createReaderFactory(
+                                        new HashMap<String, Object>() {{
+                                            
put(JsonParserFactoryImpl.SUPPORTS_COMMENTS, builder.isJsonpSupportsComment());
+                                            
of(builder.getJsonpMaxStringLen()).filter(v -> v > 0)
+                                                            .ifPresent(s -> 
put(JsonParserFactoryImpl.MAX_STRING_LENGTH,
+                                                                    s));
+                                            
of(builder.getJsonpMaxReadBufferLen()).filter(v -> v > 0)
+                                                                .ifPresent(s 
-> put(JsonParserFactoryImpl.BUFFER_LENGTH,
+                                                                        s));
+                                            
ofNullable(builder.getJsonpBufferStrategy()).ifPresent(
+                                                    s -> 
put(AbstractJsonFactory.BUFFER_STRATEGY, s));
+                                        }});
+                                final JsonWriterFactory writerFactory = 
provider.createWriterFactory(
+                                        new HashMap<String, Object>() {{
+                                            put(JsonGenerator.PRETTY_PRINTING, 
builder.isJsonpPrettify());
+                                            
of(builder.getJsonpMaxWriteBufferLen()).filter(v -> v > 0)
+                                                                 .ifPresent(v 
-> put(
+                                                                         
JsonGeneratorFactoryImpl
+                                                                               
  .GENERATOR_BUFFER_LENGTH,
+                                                                         v));
+                                            
ofNullable(builder.getJsonpBufferStrategy()).ifPresent(
+                                                    s -> 
put(AbstractJsonFactory.BUFFER_STRATEGY, s));
+                                        }});
+                                return Stream.<Object>of(
+                                        new ConfiguredJsonbJaxrsProvider(
+                                                builder.getJsonbEncoding(), 
builder.isJsonbNulls(),
+                                                builder.isJsonbIJson(), 
builder.isJsonbPrettify(),
+                                                
builder.getJsonbBinaryStrategy(), builder.getJsonbNamingStrategy(),
+                                                
builder.getJsonbOrderStrategy(),
+                                                new 
DelegateJsonProvider(provider, readerFactory, writerFactory)),
+                                        new 
ConfiguredJsrProvider(readerFactory, writerFactory))
+                                        .collect(toList());
+                            });
 
             if (builder.isJaxrsAutoActivateBeanValidation()) {
                 try { // we don't need the jaxrsbeanvalidationfeature since 
bean validation cdi extension handles it normally
@@ -218,17 +271,20 @@ public class MeecrowaveBus implements Bu
     @Produces({MediaType.APPLICATION_JSON, "*/*+json"})
     @Consumes({MediaType.APPLICATION_JSON, "*/*+json"})
     public static class ConfiguredJsonbJaxrsProvider<T> extends 
JsonbJaxrsProvider<T> {
+        private final JsonProvider provider;
+
         private ConfiguredJsonbJaxrsProvider(final String encoding,
                                              final boolean nulls,
                                              final boolean iJson,
                                              final boolean pretty,
                                              final String binaryStrategy,
                                              final String namingStrategy,
-                                             final String orderStrategy) {
+                                             final String orderStrategy,
+                                             final JsonProvider provider) {
             // ATTENTION this is only a workaround for MEECROWAVE-49 and shall 
get removed after Johnzon has a fix for it!
             // We add byte[] to the ignored types.
             super(Arrays.asList("[B"));
-
+            this.provider = provider;
             ofNullable(encoding).ifPresent(this::setEncoding);
             
ofNullable(namingStrategy).ifPresent(this::setPropertyNamingStrategy);
             
ofNullable(orderStrategy).ifPresent(this::setPropertyOrderStrategy);
@@ -237,25 +293,193 @@ public class MeecrowaveBus implements Bu
             setIJson(iJson);
             setPretty(pretty);
         }
+
+        protected Jsonb createJsonb() {
+            return JsonbBuilder.newBuilder()
+                               .withProvider(provider)
+                               .withConfig(config).build();
+        }
     }
 
     @Provider
     @Produces({MediaType.APPLICATION_JSON, "application/*+json"})
     @Consumes({MediaType.APPLICATION_JSON, "application/*+json"})
     public static class ConfiguredJsrProvider extends 
DelegateProvider<JsonStructure> { // TODO: probably wire the encoding in johnzon
-        private ConfiguredJsrProvider(final String bufferStrategy, final int 
maxStringLen,
-                                      final int maxReadBufferLen, final int 
maxWriteBufferLen,
-                                      final boolean supportsComment, final 
boolean pretty) {
-            super(new JsrMessageBodyReader(Json.createReaderFactory(new 
HashMap<String, Object>() {{
-                put(JsonParserFactoryImpl.SUPPORTS_COMMENTS, supportsComment);
-                of(maxStringLen).filter(v -> v > 0).ifPresent(s -> 
put(JsonParserFactoryImpl.MAX_STRING_LENGTH, s));
-                of(maxReadBufferLen).filter(v -> v > 0).ifPresent(s -> 
put(JsonParserFactoryImpl.BUFFER_LENGTH, s));
-                ofNullable(bufferStrategy).ifPresent(s -> 
put(AbstractJsonFactory.BUFFER_STRATEGY, s));
-            }}), false), new JsrMessageBodyWriter(Json.createWriterFactory(new 
HashMap<String, Object>() {{
-                put(JsonGenerator.PRETTY_PRINTING, pretty);
-                of(maxWriteBufferLen).filter(v -> v > 0).ifPresent(v -> 
put(JsonGeneratorFactoryImpl.GENERATOR_BUFFER_LENGTH, v));
-                ofNullable(bufferStrategy).ifPresent(s -> 
put(AbstractJsonFactory.BUFFER_STRATEGY, s));
-            }}), false));
+        private ConfiguredJsrProvider(final JsonReaderFactory readerFactory,
+                                      final JsonWriterFactory writerFactory) {
+            super(new JsrMessageBodyReader(readerFactory, false), new 
JsrMessageBodyWriter(writerFactory, false));
+        }
+    }
+
+    private static class DelegateJsonProvider extends JsonProvider {
+        private final JsonReaderFactory readerFactory;
+        private final JsonWriterFactory writerFactory;
+        private final JsonProvider provider;
+
+        private DelegateJsonProvider(final JsonProvider provider, final 
JsonReaderFactory readerFactory, final JsonWriterFactory writerFactory) {
+            this.provider = provider;
+            this.readerFactory = readerFactory;
+            this.writerFactory = writerFactory;
+        }
+
+        @Override
+        public JsonWriterFactory createWriterFactory(final Map<String, ?> 
config) {
+            return writerFactory;
+        }
+
+        @Override
+        public JsonReaderFactory createReaderFactory(final Map<String, ?> 
config) {
+            return readerFactory;
+        }
+
+        @Override
+        public JsonParser createParser(final Reader reader) {
+            return provider.createParser(reader);
+        }
+
+        @Override
+        public JsonParser createParser(final InputStream in) {
+            return provider.createParser(in);
+        }
+
+        @Override
+        public JsonParserFactory createParserFactory( final Map<String, ?> 
config) {
+            return provider.createParserFactory(config);
+        }
+
+        @Override
+        public JsonGenerator createGenerator(final Writer writer) {
+            return provider.createGenerator(writer);
+        }
+
+        @Override
+        public JsonGenerator createGenerator(final OutputStream out) {
+            return provider.createGenerator(out);
+        }
+
+        @Override
+        public JsonGeneratorFactory createGeneratorFactory(final Map<String, 
?> config) {
+            return provider.createGeneratorFactory(config);
+        }
+
+        @Override
+        public JsonReader createReader(final Reader reader) {
+            return provider.createReader(reader);
+        }
+
+        @Override
+        public JsonReader createReader(final InputStream in) {
+            return provider.createReader(in);
+        }
+
+        @Override
+        public JsonWriter createWriter(final Writer writer) {
+            return provider.createWriter(writer);
+        }
+
+        @Override
+        public JsonWriter createWriter(final OutputStream out) {
+            return provider.createWriter(out);
+        }
+
+        @Override
+        public JsonObjectBuilder createObjectBuilder() {
+            return provider.createObjectBuilder();
+        }
+
+        @Override
+        public JsonObjectBuilder createObjectBuilder(final JsonObject 
jsonObject) {
+            return provider.createObjectBuilder(jsonObject);
+        }
+
+        @Override
+        public JsonObjectBuilder createObjectBuilder(final Map<String, Object> 
map) {
+            return provider.createObjectBuilder(map);
+        }
+
+        @Override
+        public JsonArrayBuilder createArrayBuilder() {
+            return provider.createArrayBuilder();
+        }
+
+        @Override
+        public JsonArrayBuilder createArrayBuilder(final JsonArray 
initialData) {
+            return provider.createArrayBuilder(initialData);
+        }
+
+        @Override
+        public JsonArrayBuilder createArrayBuilder(final Collection<?> 
initialData) {
+            return provider.createArrayBuilder(initialData);
+        }
+
+        @Override
+        public JsonPointer createPointer(final String path) {
+            return provider.createPointer(path);
+        }
+
+        @Override
+        public JsonBuilderFactory createBuilderFactory(final Map<String, ?> 
config) {
+            return provider.createBuilderFactory(config);
+        }
+
+        @Override
+        public JsonString createValue(final String value) {
+            return provider.createValue(value);
+        }
+
+        @Override
+        public JsonNumber createValue(final int value) {
+            return provider.createValue(value);
+        }
+
+        @Override
+        public JsonNumber createValue(final long value) {
+            return provider.createValue(value);
+        }
+
+        @Override
+        public JsonNumber createValue(final double value) {
+            return provider.createValue(value);
+        }
+
+        @Override
+        public JsonNumber createValue(final BigDecimal value) {
+            return provider.createValue(value);
+        }
+
+        @Override
+        public JsonNumber createValue(final BigInteger value) {
+            return provider.createValue(value);
+        }
+
+        @Override
+        public JsonPatch createPatch(final JsonArray array) {
+            return provider.createPatch(array);
+        }
+
+        @Override
+        public JsonPatch createDiff(final JsonStructure source, final 
JsonStructure target) {
+            return provider.createDiff(source, target);
+        }
+
+        @Override
+        public JsonPatchBuilder createPatchBuilder() {
+            return provider.createPatchBuilder();
+        }
+
+        @Override
+        public JsonPatchBuilder createPatchBuilder(final JsonArray 
initialData) {
+            return provider.createPatchBuilder(initialData);
+        }
+
+        @Override
+        public JsonMergePatch createMergePatch(final JsonValue patch) {
+            return provider.createMergePatch(patch);
+        }
+
+        @Override
+        public JsonMergePatch createMergeDiff(final JsonValue source, final 
JsonValue target) {
+            return provider.createMergeDiff(source, target);
         }
     }
 }


Reply via email to