X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fblueprint%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fblueprint%2Fext%2FBindingContext.java;h=22559737860125f6a25af7427b8a4e6d6a6174d2;hb=refs%2Fchanges%2F02%2F83802%2F42;hp=e4ae3fc0ef54fadfbdff03cb0fc9bf7b1214842a;hpb=d8be13e36b4a5fca3155e7ab3e840ba9ab5a75b1;p=controller.git diff --git a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/BindingContext.java b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/BindingContext.java index e4ae3fc0ef..2255973786 100644 --- a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/BindingContext.java +++ b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/BindingContext.java @@ -9,23 +9,34 @@ package org.opendaylight.controller.blueprint.ext; import com.google.common.base.Preconditions; import com.google.common.base.Strings; +import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.Collections; +import java.net.URISyntaxException; import java.util.List; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.stream.XMLStreamException; +import javax.xml.transform.dom.DOMSource; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.Identifiable; import org.opendaylight.yangtools.yang.binding.Identifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; +import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.parser.DomToNormalizedNodeParserFactory; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; +import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.osgi.service.blueprint.container.ComponentDefinitionException; import org.w3c.dom.Element; +import org.xml.sax.SAXException; /** * Base class to abstract binding type-specific behavior. @@ -33,6 +44,7 @@ import org.w3c.dom.Element; * @author Thomas Pantelis (originally; re-factored by Michael Vorburger.ch) */ public abstract class BindingContext { + private static String GET_KEY_METHOD = "key"; public static BindingContext create(final String logName, final Class klass, final String appConfigListKeyValue) { @@ -72,8 +84,23 @@ public abstract class BindingContext { bindingQName = BindingReflections.findQName(appConfigBindingClass); } - public abstract NormalizedNode parseDataElement(Element element, DataSchemaNode dataSchema, - DomToNormalizedNodeParserFactory parserFactory); + public NormalizedNode parseDataElement(final Element element, final DataSchemaNode dataSchema, + final SchemaContext schemaContext) throws XMLStreamException, IOException, ParserConfigurationException, + SAXException, URISyntaxException { + final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); + final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); + final XmlParserStream xmlParser = XmlParserStream.create(writer, schemaContext, dataSchema); + xmlParser.traverse(new DOMSource(element)); + + final NormalizedNode result = resultHolder.getResult(); + if (result instanceof MapNode) { + final MapNode mapNode = (MapNode) result; + final MapEntryNode mapEntryNode = mapNode.getValue().iterator().next(); + return mapEntryNode; + } + + return result; + } public abstract NormalizedNode newDefaultNode(DataSchemaNode dataSchema); @@ -91,13 +118,6 @@ public abstract class BindingContext { public NormalizedNode newDefaultNode(final DataSchemaNode dataSchema) { return ImmutableNodes.containerNode(bindingQName); } - - @Override - public NormalizedNode parseDataElement(final Element element, final DataSchemaNode dataSchema, - final DomToNormalizedNodeParserFactory parserFactory) { - return parserFactory.getContainerNodeParser().parse(Collections.singletonList(element), - (ContainerSchemaNode)dataSchema); - } } /** @@ -115,11 +135,11 @@ public abstract class BindingContext { } @SuppressWarnings({ "rawtypes", "unchecked" }) - private static ListBindingContext newInstance(final Class bindingClass, + static ListBindingContext newInstance(final Class bindingClass, final String listKeyValue) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { // We assume the yang list key type is string. - Identifier keyInstance = (Identifier) bindingClass.getMethod("getKey").getReturnType() + Identifier keyInstance = (Identifier) bindingClass.getMethod(GET_KEY_METHOD).getReturnType() .getConstructor(String.class).newInstance(listKeyValue); InstanceIdentifier appConfigPath = InstanceIdentifier.builder((Class)bindingClass, keyInstance).build(); return new ListBindingContext(bindingClass, appConfigPath, listKeyValue); @@ -133,12 +153,5 @@ public abstract class BindingContext { QName listKeyQName = keys.get(0); return ImmutableNodes.mapEntryBuilder(bindingQName, listKeyQName, appConfigListKeyValue).build(); } - - @Override - public NormalizedNode parseDataElement(final Element element, final DataSchemaNode dataSchema, - final DomToNormalizedNodeParserFactory parserFactory) { - return parserFactory.getMapEntryNodeParser().parse(Collections.singletonList(element), - (ListSchemaNode)dataSchema); - } } }