BUG-7983: make XmlCodecFactory a subclass of AbstractCodecFactory 65/53865/4
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 26 Mar 2017 15:49:03 +0000 (17:49 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 4 Apr 2017 15:59:51 +0000 (17:59 +0200)
AbstractCodecFactory contains everything we need for efficient caching,
the only problem we need to solve is binding to NamespaceContext. This
patch does exactly that, decoupling XmlCodec from the generic Codec
interface, so that serialization and deserialization paths are explicit.

This flushes out the fact that the codecs are not used in the egress
path at all and rely on TypeDefinitionAwareCodec instead. That deficiency
will be fixed in a subsequent patch.

Change-Id: I0bdf8af673893f2dc4fcc8842b64f9bed1bc5236
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
15 files changed:
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/UnionJSONCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/BooleanXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/EmptyXmlCodec.java [moved from yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlEmptyCodec.java with 61% similarity]
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/IdentityrefXmlCodec.java [new file with mode: 0644]
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NullXmlCodec.java [new file with mode: 0644]
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NumberXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/QuotedXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/UnionXmlCodec.java [new file with mode: 0644]
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlCodecFactory.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringIdentityrefCodec.java [deleted file]
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringInstanceIdentifierCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringUnionCodec.java [deleted file]

index 103010a9e6c9316a4489a3c22bde4acc34fb6d78..0ef7cda1925406c6863456a3db8d1717bd34f371 100644 (file)
@@ -90,7 +90,7 @@ abstract class UnionJSONCodec<T> implements JSONCodec<T> {
             return getDataClass().cast(ret);
         }
 
             return getDataClass().cast(ret);
         }
 
-        throw new IllegalArgumentException("Input '" + input +"'  did not match any codecs");
+        throw new IllegalArgumentException("Invalid value \"" + input + "\" for union type.");
     }
 
     @Override
     }
 
     @Override
index 2568cf6f319feacc7dba283d5a80671948ed311a..78e30d679c782988bf13a2f71a8e26a6eb5d48fe 100644 (file)
@@ -9,17 +9,8 @@
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import com.google.common.base.Preconditions;
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import com.google.common.base.Preconditions;
-import org.opendaylight.yangtools.concepts.Codec;
-import org.opendaylight.yangtools.yang.data.api.codec.BooleanCodec;
-import org.opendaylight.yangtools.yang.data.api.codec.DecimalCodec;
-import org.opendaylight.yangtools.yang.data.api.codec.Int16Codec;
-import org.opendaylight.yangtools.yang.data.api.codec.Int32Codec;
-import org.opendaylight.yangtools.yang.data.api.codec.Int64Codec;
-import org.opendaylight.yangtools.yang.data.api.codec.Int8Codec;
-import org.opendaylight.yangtools.yang.data.api.codec.Uint16Codec;
-import org.opendaylight.yangtools.yang.data.api.codec.Uint32Codec;
-import org.opendaylight.yangtools.yang.data.api.codec.Uint64Codec;
-import org.opendaylight.yangtools.yang.data.api.codec.Uint8Codec;
+import javax.xml.namespace.NamespaceContext;
+import org.opendaylight.yangtools.yang.data.impl.codec.DataStringCodec;
 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
 
 /**
 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
 
 /**
@@ -29,38 +20,23 @@ import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
  */
 abstract class AbstractXmlCodec<T> implements XmlCodec<T> {
 
  */
 abstract class AbstractXmlCodec<T> implements XmlCodec<T> {
 
-    private final Codec<String, T> codec;
+    private final DataStringCodec<T> codec;
 
 
-    protected AbstractXmlCodec(final Codec<String, T> codec) {
+    protected AbstractXmlCodec(final DataStringCodec<T> codec) {
         this.codec = Preconditions.checkNotNull(codec);
     }
 
         this.codec = Preconditions.checkNotNull(codec);
     }
 
-    /**
-     * Create a proper XmlCodec based on the underlying codec type
-     * @param codec underlying codec
-     * @return An XmlCodec instance
-     */
-    public static XmlCodec<?> create(final Codec<String, ?> codec) {
-        if (codec instanceof BooleanCodec) {
-            return new BooleanXmlCodec((BooleanCodec<String>) codec);
-        } else if (codec instanceof DecimalCodec || codec instanceof Int8Codec
-                || codec instanceof Int16Codec || codec instanceof Int32Codec
-                || codec instanceof Int64Codec || codec instanceof Uint8Codec
-                || codec instanceof Uint16Codec || codec instanceof Uint32Codec
-                || codec instanceof Uint64Codec) {
-            return new NumberXmlCodec(codec);
-        } else {
-            return new QuotedXmlCodec(codec);
-        }
+    @Override
+    public final Class<T> getDataClass() {
+        return codec.getInputClass();
     }
 
     @Override
     }
 
     @Override
-    public final T deserialize(final String input) {
-        return codec.deserialize(input);
+    public final T deserializeFromString(final NamespaceContext namespaceContext, final String value) {
+        return codec.deserialize(value);
     }
 
     }
 
-    @Override
-    public final String serialize(final T input) {
+    final String serialize(final T input) {
         return codec.serialize(input);
     }
 }
         return codec.serialize(input);
     }
 }
index b83df131bc67945d6178638952da0280963191d4..14b1404be6370c82b66e2385b08437680bc371e0 100644 (file)
@@ -10,22 +10,15 @@ package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
-import org.opendaylight.yangtools.concepts.Codec;
+import org.opendaylight.yangtools.yang.data.impl.codec.DataStringCodec;
 
 final class BooleanXmlCodec extends AbstractXmlCodec<Boolean> {
 
 final class BooleanXmlCodec extends AbstractXmlCodec<Boolean> {
-
-    BooleanXmlCodec(final Codec<String, Boolean> codec) {
+    BooleanXmlCodec(final DataStringCodec<Boolean> codec) {
         super(codec);
     }
 
         super(codec);
     }
 
-    /**
-     * Serialize specified value with specified XMLStreamWriter.
-     *
-     * @param writer XMLStreamWriter
-     * @param value value which will be serialized to the writer
-     */
     @Override
     @Override
-    public void serializeToWriter(XMLStreamWriter writer, Boolean value) throws XMLStreamException {
+    public void serializeToWriter(final XMLStreamWriter writer, final Boolean value) throws XMLStreamException {
         writer.writeCharacters(String.valueOf(value));
     }
 }
         writer.writeCharacters(String.valueOf(value));
     }
 }
similarity index 61%
rename from yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlEmptyCodec.java
rename to yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/EmptyXmlCodec.java
index 1d7abc628f241be098f971c3f40e4a658d8b1c56..626626a4e8e0c324eee498b639afa1d82afd8bb0 100644 (file)
@@ -8,29 +8,30 @@
 
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
 
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
+import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-final class XmlEmptyCodec implements XmlCodec<Object> {
+final class EmptyXmlCodec implements XmlCodec<Void> {
 
 
-    static final XmlEmptyCodec INSTANCE = new XmlEmptyCodec();
+    static final EmptyXmlCodec INSTANCE = new EmptyXmlCodec();
 
 
-    private XmlEmptyCodec() {
+    private EmptyXmlCodec() {
 
     }
 
     @Override
 
     }
 
     @Override
-    public Object deserialize(final String input) {
-        return null;
+    public Class<Void> getDataClass() {
+        return Void.class;
     }
 
     @Override
     }
 
     @Override
-    public String serialize(final Object input) {
+    public Void deserializeFromString(final NamespaceContext namespaceContext, final String value) {
         return null;
     }
 
     @Override
         return null;
     }
 
     @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final Object value) throws XMLStreamException {
+    public void serializeToWriter(final XMLStreamWriter writer, final Void value) throws XMLStreamException {
         writer.writeCharacters("");
     }
 }
         writer.writeCharacters("");
     }
 }
diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/IdentityrefXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/IdentityrefXmlCodec.java
new file mode 100644 (file)
index 0000000..21df404
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.yangtools.yang.data.codec.xml;
+
+import java.net.URI;
+import java.util.ArrayDeque;
+import java.util.Deque;
+import javax.annotation.Nonnull;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.data.util.ModuleStringIdentityrefCodec;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+
+final class IdentityrefXmlCodec extends ModuleStringIdentityrefCodec implements XmlCodec<QName> {
+    private static final ThreadLocal<Deque<NamespaceContext>> TL_NSCONTEXT = new ThreadLocal<>();
+
+    IdentityrefXmlCodec(final SchemaContext context, final QNameModule parentModule) {
+        super(context, parentModule);
+    }
+
+    @Override
+    protected Module moduleForPrefix(@Nonnull final String prefix) {
+        if (prefix.isEmpty()) {
+            return context.findModuleByNamespaceAndRevision(parentModuleQname.getNamespace(),
+                    parentModuleQname.getRevision());
+        }
+
+        final String prefixedNS = getNamespaceContext().getNamespaceURI(prefix);
+        return context.findModuleByNamespaceAndRevision(URI.create(prefixedNS), null);
+    }
+
+    @Override
+    public Class<QName> getDataClass() {
+        return QName.class;
+    }
+
+    /**
+     * Serialize QName with specified XMLStreamWriter.
+     *
+     * @param writer XMLStreamWriter
+     * @param value QName
+     */
+    @Override
+    public void serializeToWriter(final XMLStreamWriter writer, final QName value) throws XMLStreamException {
+        // FIXME: this does not work correctly, as we need to populate entries into the namespace context
+        writer.writeCharacters(serialize(value));
+    }
+
+    @Override
+    public QName deserializeFromString(final NamespaceContext namespaceContext, final String value) {
+        pushNamespaceContext(namespaceContext);
+        try {
+            return deserialize(value);
+        } finally {
+            popNamespaceContext();
+        }
+    }
+
+    private static NamespaceContext getNamespaceContext() {
+        return TL_NSCONTEXT.get().getFirst();
+    }
+
+    private static void popNamespaceContext() {
+        final Deque<NamespaceContext> stack = TL_NSCONTEXT.get();
+        stack.pop();
+        if (stack.isEmpty()) {
+            TL_NSCONTEXT.set(null);
+        }
+    }
+
+    private static void pushNamespaceContext(final NamespaceContext context) {
+        Deque<NamespaceContext> stack = TL_NSCONTEXT.get();
+        if (stack == null) {
+            stack = new ArrayDeque<>(1);
+            TL_NSCONTEXT.set(stack);
+        }
+        stack.push(context);
+    }
+}
diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NullXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NullXmlCodec.java
new file mode 100644 (file)
index 0000000..5abad0b
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.codec.xml;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+final class NullXmlCodec implements XmlCodec<Object> {
+    static final NullXmlCodec INSTANCE = new NullXmlCodec();
+    private static final Logger LOG = LoggerFactory.getLogger(NullXmlCodec.class);
+
+    private NullXmlCodec() {
+
+    }
+
+    @Override
+    public Class<Object> getDataClass() {
+        return Object.class;
+    }
+
+    @Override
+    public void serializeToWriter(final XMLStreamWriter writer, final Object value) throws XMLStreamException {
+        // NOOP since codec is unkwown.
+        LOG.warn("Call of the serializeToWriter method on null codec. No operation performed.");
+    }
+
+    @Override
+    public Object deserializeFromString(final NamespaceContext namespaceContext, final String value) {
+        LOG.warn("Call of the deserializeString method on null codec. No operation performed.");
+        return null;
+    }
+
+}
index 3343832eddea0a284ad82133cd5509398503bfa7..161ae8afecbd396b570e01760a631da7a23c2555 100644 (file)
@@ -10,22 +10,15 @@ package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
-import org.opendaylight.yangtools.concepts.Codec;
+import org.opendaylight.yangtools.yang.data.impl.codec.DataStringCodec;
 
 
-final class NumberXmlCodec<T extends Number> extends AbstractXmlCodec<T>{
-
-    NumberXmlCodec(final Codec<String, T> codec) {
+final class NumberXmlCodec<T extends Number> extends AbstractXmlCodec<T> {
+    NumberXmlCodec(final DataStringCodec<T> codec) {
         super(codec);
     }
 
         super(codec);
     }
 
-    /**
-     * Serialize specified value with specified XMLStreamWriter.
-     *
-     * @param writer XMLStreamWriter
-     * @param value value which will be serialized to the writer
-     */
     @Override
     @Override
-    public void serializeToWriter(XMLStreamWriter writer, T value) throws XMLStreamException {
+    public void serializeToWriter(final XMLStreamWriter writer, final T value) throws XMLStreamException {
         writer.writeCharacters(String.valueOf(value));
     }
 }
         writer.writeCharacters(String.valueOf(value));
     }
 }
index 200094bf3f2000d8f1a27b9769acae89f6dd9a93..3d1002661bd6a0b47d4103ccade6ef398a8eff8b 100644 (file)
@@ -10,11 +10,10 @@ package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
-import org.opendaylight.yangtools.concepts.Codec;
+import org.opendaylight.yangtools.yang.data.impl.codec.DataStringCodec;
 
 final class QuotedXmlCodec<T> extends AbstractXmlCodec<T> {
 
 final class QuotedXmlCodec<T> extends AbstractXmlCodec<T> {
-
-    QuotedXmlCodec(final Codec<String, T> codec) {
+    QuotedXmlCodec(final DataStringCodec<T> codec) {
         super(codec);
     }
 
         super(codec);
     }
 
@@ -25,8 +24,7 @@ final class QuotedXmlCodec<T> extends AbstractXmlCodec<T> {
      * @param value value which will be serialized to the writer
      */
     @Override
      * @param value value which will be serialized to the writer
      */
     @Override
-    public void serializeToWriter(XMLStreamWriter writer, T value) throws XMLStreamException {
+    public void serializeToWriter(final XMLStreamWriter writer, final T value) throws XMLStreamException {
         writer.writeCharacters(serialize(value));
     }
         writer.writeCharacters(serialize(value));
     }
-
 }
 }
diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/UnionXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/UnionXmlCodec.java
new file mode 100644 (file)
index 0000000..e244617
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2016 Intel Corporation and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.yangtools.yang.data.codec.xml;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Verify;
+import com.google.common.collect.ImmutableList;
+import java.util.Iterator;
+import java.util.List;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+abstract class UnionXmlCodec<T> implements XmlCodec<T> {
+    private static final class Diverse extends UnionXmlCodec<Object> {
+        Diverse(final List<XmlCodec<?>> codecs) {
+            super(codecs);
+        }
+
+        @Override
+        public Class<Object> getDataClass() {
+            return Object.class;
+        }
+    }
+
+    private static final class SingleType<T> extends UnionXmlCodec<T> {
+        private final Class<T> dataClass;
+
+        SingleType(final Class<T> dataClass, final List<XmlCodec<?>> codecs) {
+            super(codecs);
+            this.dataClass = Preconditions.checkNotNull(dataClass);
+        }
+
+        @Override
+        public Class<T> getDataClass() {
+            return dataClass;
+        }
+    }
+
+    private static final Logger LOG = LoggerFactory.getLogger(UnionXmlCodec.class);
+
+    private final List<XmlCodec<?>> codecs;
+
+    UnionXmlCodec(final List<XmlCodec<?>> codecs) {
+        this.codecs = ImmutableList.copyOf(codecs);
+    }
+
+    static UnionXmlCodec<?> create(final UnionTypeDefinition type, final List<XmlCodec<?>> codecs) {
+        final Iterator<XmlCodec<?>> it = codecs.iterator();
+        Verify.verify(it.hasNext(), "Union %s has no subtypes", type);
+
+        Class<?> dataClass = it.next().getDataClass();
+        while (it.hasNext()) {
+            final Class<?> next = it.next().getDataClass();
+            if (!dataClass.equals(next)) {
+                LOG.debug("Type {} has diverse data classes: {} and {}", type, dataClass, next);
+                return new Diverse(codecs);
+            }
+        }
+
+        LOG.debug("Type {} has single data class {}", type, dataClass);
+        return new SingleType<>(dataClass, codecs);
+    }
+
+    @Override
+    public final T deserializeFromString(final NamespaceContext namespaceContext, final String input) {
+        for (XmlCodec<?> codec : codecs) {
+            final Object ret;
+            try {
+                ret = codec.deserializeFromString(namespaceContext, input);
+            } catch (RuntimeException e) {
+                LOG.debug("Codec {} did not accept input '{}'", codec, input, e);
+                continue;
+            }
+
+            return getDataClass().cast(ret);
+        }
+
+        throw new IllegalArgumentException("Invalid value \"" + input + "\" for union type.");
+    }
+
+    @Override
+    public void serializeToWriter(final XMLStreamWriter writer, final Object value) throws XMLStreamException {
+        for (XmlCodec<?> codec : codecs) {
+            if (!codec.getDataClass().isInstance(value)) {
+                LOG.debug("Codec {} cannot accept input {}, skipping it", codec, value);
+                continue;
+            }
+
+            @SuppressWarnings("unchecked")
+            final XmlCodec<Object> objCodec = (XmlCodec<Object>) codec;
+            try {
+                objCodec.serializeToWriter(writer, value);
+                return;
+            } catch (RuntimeException e) {
+                LOG.debug("Codec {} failed to serialize {}", codec, value, e);
+            }
+        }
+
+        throw new IllegalArgumentException("No codecs could serialize" + value);
+    }
+}
index d8307aec56b2b3df24ec7fcabcc4483787e65a61..93ee13e782d6eaf7427cdfa371de223343a01fc1 100644 (file)
@@ -8,11 +8,14 @@
 
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
 
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
+import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
-import org.opendaylight.yangtools.concepts.Codec;
 
 
-interface XmlCodec<T> extends Codec<String, T> {
+interface XmlCodec<T> {
+    Class<T> getDataClass();
+
+    T deserializeFromString(NamespaceContext namespaceContext, String value);
 
     /**
      * Serialize specified value with specified XMLStreamWriter.
 
     /**
      * Serialize specified value with specified XMLStreamWriter.
index 726f013912bab857120cf4904ab4d3923bf34c54..ee1ec83d87952946505c6ab3b933cc44a5930c66 100644 (file)
@@ -9,72 +9,39 @@
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import com.google.common.annotations.Beta;
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import com.google.common.annotations.Beta;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Verify;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import java.util.AbstractMap.SimpleImmutableEntry;
-import java.util.Map.Entry;
-import javax.annotation.Nonnull;
+import java.util.List;
 import javax.annotation.concurrent.ThreadSafe;
 import javax.annotation.concurrent.ThreadSafe;
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.data.impl.codec.AbstractIntegerStringCodec;
+import org.opendaylight.yangtools.yang.data.impl.codec.BinaryStringCodec;
+import org.opendaylight.yangtools.yang.data.impl.codec.BitsStringCodec;
+import org.opendaylight.yangtools.yang.data.impl.codec.BooleanStringCodec;
+import org.opendaylight.yangtools.yang.data.impl.codec.DecimalStringCodec;
+import org.opendaylight.yangtools.yang.data.impl.codec.EnumStringCodec;
+import org.opendaylight.yangtools.yang.data.impl.codec.StringStringCodec;
+import org.opendaylight.yangtools.yang.data.util.codec.AbstractCodecFactory;
+import org.opendaylight.yangtools.yang.data.util.codec.SharedCodecCache;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
-import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yangtools.yang.model.api.type.UnknownTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
 
 @Beta
 @ThreadSafe
 
 @Beta
 @ThreadSafe
-public final class XmlCodecFactory {
-
-    private static final Logger LOG = LoggerFactory.getLogger(XmlCodecFactory.class);
-    private static final XmlCodec<Object> NULL_CODEC = new XmlCodec<Object>() {
-        @Override
-        public Object deserialize(final String input) {
-            return null;
-        }
-
-        @Override
-        public String serialize(final Object input) {
-            return null;
-        }
-
-        @Override
-        public void serializeToWriter(final XMLStreamWriter writer, final Object value) throws XMLStreamException {
-            // NOOP since codec is unkwown.
-            LOG.warn("Call of the serializeToWriter method on XmlCodecFactory.NULL_CODEC object. No operation " +
-                    "performed.");
-        }
-    };
-
-    private final LoadingCache<Entry<TypedSchemaNode, NamespaceContext>, XmlCodec<?>> codecs = CacheBuilder.newBuilder()
-            .softValues().build(new CacheLoader<Entry<TypedSchemaNode, NamespaceContext>, XmlCodec<?>>() {
-                @Override
-                public XmlCodec<?> load(@Nonnull final Entry<TypedSchemaNode, NamespaceContext> pair) {
-                    final TypedSchemaNode schemaNode = pair.getKey();
-                    final TypeDefinition<?> type = schemaNode.getType();
-                    return createCodec(schemaNode, type, pair.getValue());
-                }
-            });
-
-    private final SchemaContext schemaContext;
+public final class XmlCodecFactory extends AbstractCodecFactory<XmlCodec<?>> {
 
     private XmlCodecFactory(final SchemaContext context) {
 
     private XmlCodecFactory(final SchemaContext context) {
-        this.schemaContext = Preconditions.checkNotNull(context);
+        super(context, new SharedCodecCache<>());
     }
 
     /**
     }
 
     /**
@@ -87,71 +54,68 @@ public final class XmlCodecFactory {
         return new XmlCodecFactory(context);
     }
 
         return new XmlCodecFactory(context);
     }
 
-    private XmlCodec<?> createCodec(final DataSchemaNode key, final TypeDefinition<?> type,
-                                    final NamespaceContext namespaceContext) {
-        if (type instanceof LeafrefTypeDefinition) {
-            return createReferencedTypeCodec(key, (LeafrefTypeDefinition) type, namespaceContext);
-        } else if (type instanceof IdentityrefTypeDefinition) {
-            return createIdentityrefTypeCodec(key, namespaceContext);
-        } else if (type instanceof UnionTypeDefinition) {
-            return createUnionTypeCodec(key, (UnionTypeDefinition)type, namespaceContext);
-        }
-        return createFromSimpleType(key, type, namespaceContext);
+    @Override
+    protected XmlCodec<?> binaryCodec(final BinaryTypeDefinition type) {
+        return new QuotedXmlCodec<>(BinaryStringCodec.from(type));
     }
 
     }
 
-    private XmlCodec<?> createReferencedTypeCodec(final DataSchemaNode schema, final LeafrefTypeDefinition type,
-                                                  final NamespaceContext namespaceContext) {
-        // FIXME: Verify if this does indeed support leafref of leafref
-        final TypeDefinition<?> referencedType =
-                SchemaContextUtil.getBaseTypeForLeafRef(type, getSchemaContext(), schema);
-        Verify.verifyNotNull(referencedType, "Unable to find base type for leafref node '%s'.", schema.getPath());
-        return createCodec(schema, referencedType, namespaceContext);
+    @Override
+    protected XmlCodec<?> booleanCodec(final BooleanTypeDefinition type) {
+        return new BooleanXmlCodec(BooleanStringCodec.from(type));
     }
 
     }
 
-    public XmlCodec<QName> createIdentityrefTypeCodec(final DataSchemaNode schema,
-                                                      final NamespaceContext namespaceContext) {
-        final XmlCodec<QName> xmlStringIdentityrefCodec =
-                new XmlStringIdentityrefCodec(getSchemaContext(), schema.getQName().getModule(), namespaceContext);
-        return xmlStringIdentityrefCodec;
+    @Override
+    protected XmlCodec<?> bitsCodec(final BitsTypeDefinition type) {
+        return new QuotedXmlCodec<>(BitsStringCodec.from(type));
     }
 
     }
 
-    private XmlCodec<Object> createUnionTypeCodec(final DataSchemaNode schema, final UnionTypeDefinition type,
-                                                  final NamespaceContext namespaceContext) {
-        final XmlCodec<Object> xmlStringUnionCodec = new XmlStringUnionCodec(schema, type, this, namespaceContext);
-        return xmlStringUnionCodec;
+    @Override
+    protected XmlCodec<?> emptyCodec(final EmptyTypeDefinition type) {
+        return EmptyXmlCodec.INSTANCE;
     }
 
     }
 
-    private XmlCodec<?> createFromSimpleType(
-        final DataSchemaNode schema, final TypeDefinition<?> type,
-        final NamespaceContext namespaceContext) {
-        if (type instanceof InstanceIdentifierTypeDefinition) {
-            final XmlCodec<YangInstanceIdentifier> iidCodec = new XmlStringInstanceIdentifierCodec(schemaContext, this,
-                    namespaceContext);
-            return iidCodec;
-        }
-        if (type instanceof EmptyTypeDefinition) {
-            return XmlEmptyCodec.INSTANCE;
-        }
-
-        final TypeDefinitionAwareCodec<Object, ?> codec = TypeDefinitionAwareCodec.from(type);
-        if (codec == null) {
-            LOG.debug("Codec for type \"{}\" is not implemented yet.", type.getQName().getLocalName());
-            return NULL_CODEC;
-        }
-        return AbstractXmlCodec.create(codec);
+    @Override
+    protected XmlCodec<?> enumCodec(final EnumTypeDefinition type) {
+        return new QuotedXmlCodec<>(EnumStringCodec.from(type));
     }
 
     }
 
-    SchemaContext getSchemaContext() {
-        return schemaContext;
+    @Override
+    protected XmlCodec<?> identityRefCodec(final IdentityrefTypeDefinition type, final QNameModule module) {
+        return new IdentityrefXmlCodec(getSchemaContext(), module);
     }
 
     }
 
-    XmlCodec<?> codecFor(final DataSchemaNode schema, final NamespaceContext namespaceContext) {
-        Preconditions.checkArgument(schema instanceof TypedSchemaNode, "Unsupported node type %s", schema.getClass());
-        return codecs.getUnchecked(new SimpleImmutableEntry<>((TypedSchemaNode)schema, namespaceContext));
+    @Override
+    protected XmlCodec<?> instanceIdentifierCodec(final InstanceIdentifierTypeDefinition type) {
+        return new XmlStringInstanceIdentifierCodec(getSchemaContext(), this);
     }
 
     }
 
-    XmlCodec<?> codecFor(final DataSchemaNode schema, final TypeDefinition<?> unionSubType,
-                         final NamespaceContext namespaceContext) {
-        return createCodec(schema, unionSubType, namespaceContext);
+    @Override
+    protected XmlCodec<?> intCodec(final IntegerTypeDefinition type) {
+        return new NumberXmlCodec<>(AbstractIntegerStringCodec.from(type));
+    }
+
+    @Override
+    protected XmlCodec<?> decimalCodec(final DecimalTypeDefinition type) {
+        return new NumberXmlCodec<>(DecimalStringCodec.from(type));
+    }
+
+    @Override
+    protected XmlCodec<?> stringCodec(final StringTypeDefinition type) {
+        return new QuotedXmlCodec<>(StringStringCodec.from(type));
+    }
+
+    @Override
+    protected XmlCodec<?> uintCodec(final UnsignedIntegerTypeDefinition type) {
+        return new NumberXmlCodec<>(AbstractIntegerStringCodec.from(type));
+    }
+
+    @Override
+    protected XmlCodec<?> unionCodec(final UnionTypeDefinition type, final List<XmlCodec<?>> codecs) {
+        return UnionXmlCodec.create(type, codecs);
+    }
+
+    @Override
+    protected XmlCodec<?> unknownCodec(final UnknownTypeDefinition type) {
+        return NullXmlCodec.INSTANCE;
     }
 }
     }
 }
index 4c8ebbbefe382974badfc80885b43d13d7cbd2ff..c6d11a1ce1c43266c52ca661e17b93c4bb930b9a 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode;
 import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode;
 import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
@@ -259,7 +260,8 @@ public final class XmlParserStream implements Closeable, Flushable {
             return new DOMSource(doc.getDocumentElement());
         }
 
             return new DOMSource(doc.getDocumentElement());
         }
 
-        return codecs.codecFor(node, namespaceCtx).deserialize(value);
+        Preconditions.checkArgument(node instanceof TypedSchemaNode);
+        return codecs.codecFor((TypedSchemaNode) node).deserializeFromString(namespaceCtx, value);
     }
 
     private static AbstractNodeDataWithSchema newEntryNode(final AbstractNodeDataWithSchema parent) {
     }
 
     private static AbstractNodeDataWithSchema newEntryNode(final AbstractNodeDataWithSchema parent) {
diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringIdentityrefCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringIdentityrefCodec.java
deleted file mode 100644 (file)
index fab629d..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.yangtools.yang.data.codec.xml;
-
-import com.google.common.base.Preconditions;
-import java.net.URI;
-import javax.annotation.Nonnull;
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.data.util.ModuleStringIdentityrefCodec;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-
-final class XmlStringIdentityrefCodec extends ModuleStringIdentityrefCodec implements XmlCodec<QName> {
-
-    private final NamespaceContext namespaceContext;
-
-    XmlStringIdentityrefCodec(final SchemaContext context, final QNameModule parentModule,
-                              final NamespaceContext namespaceContext) {
-        super(context, parentModule);
-        this.namespaceContext = Preconditions.checkNotNull(namespaceContext);
-    }
-
-    @Override
-    protected Module moduleForPrefix(@Nonnull final String prefix) {
-        if (prefix.isEmpty()) {
-            return context.findModuleByNamespaceAndRevision(parentModuleQname.getNamespace(),
-                    parentModuleQname.getRevision());
-        } else {
-            final String prefixedNS = namespaceContext.getNamespaceURI(prefix);
-            return context.findModuleByNamespaceAndRevision(URI.create(prefixedNS), null);
-        }
-    }
-
-    /**
-     * Serialize QName with specified XMLStreamWriter.
-     *
-     * @param writer XMLStreamWriter
-     * @param value QName
-     */
-    @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final QName value) throws XMLStreamException {
-        writer.writeCharacters(serialize(value));
-    }
-}
index c9aa69e939a42fee71eae440c388b6947876f32e..292078f4588cf1117b650e7fdb54afa69ce72de9 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import com.google.common.base.Preconditions;
 import java.net.URI;
 
 import com.google.common.base.Preconditions;
 import java.net.URI;
+import java.util.ArrayDeque;
+import java.util.Deque;
 import javax.annotation.Nonnull;
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.XMLStreamException;
 import javax.annotation.Nonnull;
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.XMLStreamException;
@@ -25,22 +27,21 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 final class XmlStringInstanceIdentifierCodec  extends AbstractModuleStringInstanceIdentifierCodec
         implements XmlCodec<YangInstanceIdentifier> {
 
 final class XmlStringInstanceIdentifierCodec  extends AbstractModuleStringInstanceIdentifierCodec
         implements XmlCodec<YangInstanceIdentifier> {
 
+    private static final ThreadLocal<Deque<NamespaceContext>> TL_CONTEXT = new ThreadLocal<>();
+
     private final DataSchemaContextTree dataContextTree;
     private final XmlCodecFactory codecFactory;
     private final SchemaContext context;
     private final DataSchemaContextTree dataContextTree;
     private final XmlCodecFactory codecFactory;
     private final SchemaContext context;
-    private final NamespaceContext namespaceContext;
 
 
-    XmlStringInstanceIdentifierCodec(final SchemaContext context, final XmlCodecFactory xmlCodecFactory,
-                                     final NamespaceContext namespaceContext) {
+    XmlStringInstanceIdentifierCodec(final SchemaContext context, final XmlCodecFactory xmlCodecFactory) {
         this.context = Preconditions.checkNotNull(context);
         this.dataContextTree = DataSchemaContextTree.from(context);
         this.codecFactory = Preconditions.checkNotNull(xmlCodecFactory);
         this.context = Preconditions.checkNotNull(context);
         this.dataContextTree = DataSchemaContextTree.from(context);
         this.codecFactory = Preconditions.checkNotNull(xmlCodecFactory);
-        this.namespaceContext = Preconditions.checkNotNull(namespaceContext);
     }
 
     @Override
     protected Module moduleForPrefix(@Nonnull final String prefix) {
     }
 
     @Override
     protected Module moduleForPrefix(@Nonnull final String prefix) {
-        final String prefixedNS = namespaceContext.getNamespaceURI(prefix);
+        final String prefixedNS = getNamespaceContext().getNamespaceURI(prefix);
         return context.findModuleByNamespaceAndRevision(URI.create(prefixedNS), null);
     }
 
         return context.findModuleByNamespaceAndRevision(URI.create(prefixedNS), null);
     }
 
@@ -60,20 +61,49 @@ final class XmlStringInstanceIdentifierCodec  extends AbstractModuleStringInstan
     protected Object deserializeKeyValue(final DataSchemaNode schemaNode, final String value) {
         Preconditions.checkNotNull(schemaNode, "schemaNode cannot be null");
         Preconditions.checkArgument(schemaNode instanceof LeafSchemaNode, "schemaNode must be of type LeafSchemaNode");
     protected Object deserializeKeyValue(final DataSchemaNode schemaNode, final String value) {
         Preconditions.checkNotNull(schemaNode, "schemaNode cannot be null");
         Preconditions.checkArgument(schemaNode instanceof LeafSchemaNode, "schemaNode must be of type LeafSchemaNode");
-        final XmlCodec<?> objectXmlCodec = codecFactory.codecFor(schemaNode, namespaceContext);
-        return objectXmlCodec.deserialize(value);
+        final XmlCodec<?> objectXmlCodec = codecFactory.codecFor((LeafSchemaNode) schemaNode);
+        return objectXmlCodec.deserializeFromString(getNamespaceContext(), value);
+    }
+
+    @Override
+    public Class<YangInstanceIdentifier> getDataClass() {
+        return YangInstanceIdentifier.class;
+    }
+
+    @Override
+    public YangInstanceIdentifier deserializeFromString(final NamespaceContext namespaceContext, final String value) {
+        pushNamespaceContext(namespaceContext);
+        try {
+            return deserialize(value);
+        } finally {
+            popNamespaceContext();
+        }
     }
 
     }
 
-    /**
-     * Serialize YangInstanceIdentifier with specified XMLStreamWriter.
-     *
-     * @param writer XMLStreamWriter
-     * @param value YangInstanceIdentifier
-     */
     @Override
     public void serializeToWriter(final XMLStreamWriter writer, final YangInstanceIdentifier value)
             throws XMLStreamException {
         writer.writeCharacters(serialize(value));
     }
 
     @Override
     public void serializeToWriter(final XMLStreamWriter writer, final YangInstanceIdentifier value)
             throws XMLStreamException {
         writer.writeCharacters(serialize(value));
     }
 
+    private static NamespaceContext getNamespaceContext() {
+        return TL_CONTEXT.get().getFirst();
+    }
+
+    private static void popNamespaceContext() {
+        final Deque<NamespaceContext> stack = TL_CONTEXT.get();
+        stack.pop();
+        if (stack.isEmpty()) {
+            TL_CONTEXT.set(null);
+        }
+    }
+
+    private static void pushNamespaceContext(final NamespaceContext context) {
+        Deque<NamespaceContext> stack = TL_CONTEXT.get();
+        if (stack == null) {
+            stack = new ArrayDeque<>(1);
+            TL_CONTEXT.set(stack);
+        }
+        stack.push(context);
+    }
 }
 }
diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringUnionCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringUnionCodec.java
deleted file mode 100644 (file)
index 0b4b82b..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2016 Intel Corporation and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.yangtools.yang.data.codec.xml;
-
-import com.google.common.base.Preconditions;
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-
-import org.opendaylight.yangtools.concepts.Codec;
-import org.opendaylight.yangtools.yang.data.util.AbstractStringUnionCodec;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-final class XmlStringUnionCodec extends AbstractStringUnionCodec implements XmlCodec<Object> {
-    private static final Logger LOG = LoggerFactory.getLogger(XmlStringUnionCodec.class);
-
-    private final XmlCodecFactory codecFactory;
-    private final NamespaceContext namespaceContext;
-
-    XmlStringUnionCodec(final DataSchemaNode schema, final UnionTypeDefinition typeDefinition,
-                        final XmlCodecFactory xmlCodecFactory, final NamespaceContext namespaceContext) {
-        super(schema, typeDefinition);
-        this.codecFactory = Preconditions.checkNotNull(xmlCodecFactory);
-        this.namespaceContext = Preconditions.checkNotNull(namespaceContext);
-    }
-
-    @Override
-    public void serializeToWriter(XMLStreamWriter writer, Object value) throws XMLStreamException {
-        writer.writeCharacters(serialize(value));
-    }
-
-    @Override
-    protected Codec<String, Object> codecFor(final TypeDefinition<?> type) {
-        return (Codec<String, Object>) codecFactory.codecFor(schema, type, namespaceContext);
-    }
-}