From: Robert Varga Date: Tue, 9 Sep 2014 12:58:47 +0000 (+0200) Subject: BUG-1768: expose JSONCodecFactory for sharing X-Git-Tag: release/helium~51^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=fc117c17e5b3428d69c5eb80e16ff72e31dbd085;p=yangtools.git BUG-1768: expose JSONCodecFactory for sharing Codecs can be cached for a particular schema context instance, and used by multiple writers in parallel. Change-Id: I3672c44d899d8d7e59d63bfbfa037298bac4900d Signed-off-by: Robert Varga --- diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/CodecFactory.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java similarity index 76% rename from yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/CodecFactory.java rename to yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java index e755925af2..8ee9517ec2 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/CodecFactory.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.data.codec.gson; import com.google.common.annotations.Beta; +import com.google.common.base.Preconditions; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -22,11 +23,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * This class is implementation-internal and subject to change. Please do not use it. + * Factory for creating JSON equivalents of codecs. Each instance of this object is bound to + * a particular {@link SchemaContext}, but can be reused by multiple {@link JSONNormalizedNodeStreamWriter}s. */ @Beta -final class CodecFactory { - private static final Logger LOG = LoggerFactory.getLogger(CodecFactory.class); +public final class JSONCodecFactory { + private static final Logger LOG = LoggerFactory.getLogger(JSONCodecFactory.class); private static final JSONCodec LEAFREF_DEFAULT_CODEC = new JSONLeafrefCodec(); private static final JSONCodec NULL_CODEC = new JSONCodec() { @Override @@ -80,19 +82,31 @@ final class CodecFactory { } }); + private final SchemaContext schemaContext; private final JSONCodec iidCodec; private final JSONCodec idrefCodec; - private CodecFactory(final SchemaContext context) { + private JSONCodecFactory(final SchemaContext context) { + this.schemaContext = Preconditions.checkNotNull(context); iidCodec = new JSONStringInstanceIdentifierCodec(context); idrefCodec = new JSONStringIdentityrefCodec(context); } - public static CodecFactory create(final SchemaContext context) { - return new CodecFactory(context); + /** + * Instantiate a new codec factory attached to a particular context. + * + * @param context SchemaContext to which the factory should be bound + * @return A codec factory instance. + */ + public static JSONCodecFactory create(final SchemaContext context) { + return new JSONCodecFactory(context); } - public final JSONCodec codecFor(final TypeDefinition typeDefinition) { + SchemaContext getSchemaContext() { + return schemaContext; + } + + JSONCodec codecFor(final TypeDefinition typeDefinition) { return codecs.getUnchecked(typeDefinition); } } diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java index a0488ee6ae..058ad5b78e 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java @@ -41,21 +41,14 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite */ private static final boolean DEFAULT_EMIT_EMPTY_CONTAINERS = true; - private final SchemaContext schemaContext; private final SchemaTracker tracker; - private final CodecFactory codecs; + private final JSONCodecFactory codecs; private final Writer writer; private final String indent; private JSONStreamWriterContext context; - private JSONNormalizedNodeStreamWriter(final SchemaContext schemaContext, - final Writer writer, final int indentSize) { - this(schemaContext, SchemaPath.ROOT, writer, null, indentSize); - } - - private JSONNormalizedNodeStreamWriter(final SchemaContext schemaContext, final SchemaPath path, + private JSONNormalizedNodeStreamWriter(final JSONCodecFactory codecFactory, final SchemaPath path, final Writer writer, final URI initialNs, final int indentSize) { - this.schemaContext = Preconditions.checkNotNull(schemaContext); this.writer = Preconditions.checkNotNull(writer); Preconditions.checkArgument(indentSize >= 0, "Indent size must be non-negative"); @@ -64,8 +57,8 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite } else { indent = null; } - this.codecs = CodecFactory.create(schemaContext); - this.tracker = SchemaTracker.create(schemaContext, path); + this.codecs = Preconditions.checkNotNull(codecFactory); + this.tracker = SchemaTracker.create(codecFactory.getSchemaContext(), path); this.context = new JSONStreamWriterRootContext(initialNs); } @@ -77,7 +70,7 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite * @return A stream writer instance */ public static NormalizedNodeStreamWriter create(final SchemaContext schemaContext, final Writer writer) { - return new JSONNormalizedNodeStreamWriter(schemaContext, writer, 0); + return new JSONNormalizedNodeStreamWriter(JSONCodecFactory.create(schemaContext), SchemaPath.ROOT, writer, null, 0); } /** @@ -89,7 +82,7 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite * @return A stream writer instance */ public static NormalizedNodeStreamWriter create(final SchemaContext schemaContext, final SchemaPath path, final Writer writer) { - return new JSONNormalizedNodeStreamWriter(schemaContext, path, writer, null, 0); + return new JSONNormalizedNodeStreamWriter(JSONCodecFactory.create(schemaContext), path, writer, null, 0); } /** @@ -103,7 +96,7 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite */ public static NormalizedNodeStreamWriter create(final SchemaContext schemaContext, final SchemaPath path, final URI initialNs, final Writer writer) { - return new JSONNormalizedNodeStreamWriter(schemaContext, path, writer, initialNs, 0); + return new JSONNormalizedNodeStreamWriter(JSONCodecFactory.create(schemaContext), path, writer, initialNs, 0); } /** @@ -115,7 +108,20 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite * @return A stream writer instance */ public static NormalizedNodeStreamWriter create(final SchemaContext schemaContext, final Writer writer, final int indentSize) { - return new JSONNormalizedNodeStreamWriter(schemaContext, writer, indentSize); + return new JSONNormalizedNodeStreamWriter(JSONCodecFactory.create(schemaContext), SchemaPath.ROOT, writer, null, indentSize); + } + + /** + * Create a new stream writer, which writes to the specified output stream. The codec factory + * can be reused between multiple writers. + * + * @param codecFactor JSON codec factory + * @param writer Output writer + * @param indentSize indentation size + * @return A stream writer instance + */ + public static NormalizedNodeStreamWriter create(final JSONCodecFactory codecFactory, final Writer writer, final int indentSize) { + return new JSONNormalizedNodeStreamWriter(codecFactory, SchemaPath.ROOT, writer, null, indentSize); } @Override @@ -123,8 +129,8 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite final LeafSchemaNode schema = tracker.leafNode(name); final JSONCodec codec = codecs.codecFor(schema.getType()); - context.emittingChild(schemaContext, writer, indent); - context.writeJsonIdentifier(schemaContext, writer, name.getNodeType()); + context.emittingChild(codecs.getSchemaContext(), writer, indent); + context.writeJsonIdentifier(codecs.getSchemaContext(), writer, name.getNodeType()); writeValue(codec.serialize(value), codec.needQuotes()); } @@ -139,7 +145,7 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite final LeafListSchemaNode schema = tracker.leafSetEntryNode(); final JSONCodec codec = codecs.codecFor(schema.getType()); - context.emittingChild(schemaContext, writer, indent); + context.emittingChild(codecs.getSchemaContext(), writer, indent); writeValue(codec.serialize(value), codec.needQuotes()); } @@ -202,15 +208,15 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite final AnyXmlSchemaNode schema = tracker.anyxmlNode(name); // FIXME: should have a codec based on this :) - context.emittingChild(schemaContext, writer, indent); - context.writeJsonIdentifier(schemaContext, writer, name.getNodeType()); + context.emittingChild(codecs.getSchemaContext(), writer, indent); + context.writeJsonIdentifier(codecs.getSchemaContext(), writer, name.getNodeType()); writeValue(String.valueOf(value), true); } @Override public void endNode() throws IOException { tracker.endNode(); - context = context.endNode(schemaContext, writer, indent); + context = context.endNode(codecs.getSchemaContext(), writer, indent); } private void writeValue(final String str, final boolean needQuotes) throws IOException { diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java index 65c234aae4..cea3fa683c 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java @@ -50,13 +50,13 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; public final class JsonParserStream implements Closeable, Flushable { private final Deque namespaces = new ArrayDeque<>(); private final NormalizedNodeStreamWriter writer; - private final CodecFactory codecs; + private final JSONCodecFactory codecs; private final SchemaContext schema; private JsonParserStream(final NormalizedNodeStreamWriter writer, final SchemaContext schemaContext) { this.schema = Preconditions.checkNotNull(schemaContext); this.writer = Preconditions.checkNotNull(writer); - this.codecs = CodecFactory.create(schemaContext); + this.codecs = JSONCodecFactory.create(schemaContext); } public static JsonParserStream create(final NormalizedNodeStreamWriter writer, final SchemaContext schemaContext) {