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;
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<Object> LEAFREF_DEFAULT_CODEC = new JSONLeafrefCodec();
private static final JSONCodec<Object> NULL_CODEC = new JSONCodec<Object>() {
@Override
}
});
+ 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<Object> codecFor(final TypeDefinition<?> typeDefinition) {
+ SchemaContext getSchemaContext() {
+ return schemaContext;
+ }
+
+ JSONCodec<Object> codecFor(final TypeDefinition<?> typeDefinition) {
return codecs.getUnchecked(typeDefinition);
}
}
*/
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");
} 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);
}
* @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);
}
/**
* @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);
}
/**
*/
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);
}
/**
* @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
final LeafSchemaNode schema = tracker.leafNode(name);
final JSONCodec<Object> 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());
}
final LeafListSchemaNode schema = tracker.leafSetEntryNode();
final JSONCodec<Object> codec = codecs.codecFor(schema.getType());
- context.emittingChild(schemaContext, writer, indent);
+ context.emittingChild(codecs.getSchemaContext(), writer, indent);
writeValue(codec.serialize(value), codec.needQuotes());
}
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 {