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.xml.stream.XMLStreamWriter;
import org.opendaylight.yangtools.yang.data.api.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;
- XmlStringInstanceIdentifierCodec(final SchemaContext context, final XmlCodecFactory jsonCodecFactory) {
+ XmlStringInstanceIdentifierCodec(final SchemaContext context, final XmlCodecFactory xmlCodecFactory) {
this.context = Preconditions.checkNotNull(context);
this.dataContextTree = DataSchemaContextTree.from(context);
- this.codecFactory = Preconditions.checkNotNull(jsonCodecFactory);
+ this.codecFactory = Preconditions.checkNotNull(xmlCodecFactory);
}
@Override
- protected Module moduleForPrefix(final String prefix) {
- return context.findModuleByName(prefix, null);
+ protected Module moduleForPrefix(@Nonnull final String prefix) {
+ final String prefixedNS = getNamespaceContext().getNamespaceURI(prefix);
+ return context.findModuleByNamespaceAndRevision(URI.create(prefixedNS), null);
}
@Override
- protected String prefixForNamespace(final URI namespace) {
+ protected String prefixForNamespace(@Nonnull final URI namespace) {
final Module module = context.findModuleByNamespaceAndRevision(namespace, null);
return module == null ? null : module.getName();
}
+ @Nonnull
@Override
protected DataSchemaContextTree getDataContextTree() {
return dataContextTree;
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<Object> objectXmlCodec = codecFactory.codecFor(schemaNode);
- return objectXmlCodec.deserialize(value);
+ final XmlCodec<?> objectXmlCodec = codecFactory.codecFor((LeafSchemaNode) schemaNode);
+ return objectXmlCodec.parseValue(getNamespaceContext(), value);
+ }
+
+ @Override
+ public Class<YangInstanceIdentifier> getDataType() {
+ return YangInstanceIdentifier.class;
+ }
+
+ @Override
+ public YangInstanceIdentifier parseValue(final NamespaceContext ctx, final String str) {
+ pushNamespaceContext(ctx);
+ try {
+ return deserialize(str);
+ } finally {
+ popNamespaceContext();
+ }
}
- /**
- * Serialize YangInstanceIdentifier with specified XMLStreamWriter.
- *
- * @param writer XMLStreamWriter
- * @param value YangInstanceIdentifier
- */
@Override
- public void serializeToWriter(final XMLStreamWriter writer, final YangInstanceIdentifier value)
+ public void writeValue(final XMLStreamWriter ctx, final YangInstanceIdentifier value)
throws XMLStreamException {
- writer.writeCharacters(serialize(value));
+ ctx.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);
+ }
}