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=dd672e411081ba2e16fbaa7504cdf704b4c888eb;hb=e84f63ee098fff5b02cbce1281ca0d1208f966fa;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..dd672e4110 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 @@ -7,25 +7,40 @@ */ package org.opendaylight.controller.blueprint.ext; -import com.google.common.base.Preconditions; +import static com.google.common.base.Preconditions.checkArgument; + import com.google.common.base.Strings; +import com.google.common.collect.Iterables; +import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.Collections; -import java.util.List; +import java.net.URISyntaxException; +import java.util.Set; +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.SchemaTreeInference; +import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement; 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 +48,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,10 +88,24 @@ 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 SchemaTreeInference dataSchema) + throws XMLStreamException, IOException, ParserConfigurationException, SAXException, URISyntaxException { + final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); + final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); + final XmlParserStream xmlParser = XmlParserStream.create(writer, dataSchema); + xmlParser.traverse(new DOMSource(element)); + + final NormalizedNode result = resultHolder.getResult(); + if (result instanceof MapNode) { + final MapNode mapNode = (MapNode) result; + final MapEntryNode mapEntryNode = mapNode.body().iterator().next(); + return mapEntryNode; + } + + return result; + } - public abstract NormalizedNode newDefaultNode(DataSchemaNode dataSchema); + public abstract NormalizedNode newDefaultNode(SchemaTreeInference dataSchema); /** * BindingContext implementation for a container binding. @@ -88,16 +118,9 @@ public abstract class BindingContext { } @Override - public NormalizedNode newDefaultNode(final DataSchemaNode dataSchema) { + public NormalizedNode newDefaultNode(final SchemaTreeInference 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,30 +138,27 @@ 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); } @Override - public NormalizedNode newDefaultNode(final DataSchemaNode dataSchema) { + public NormalizedNode newDefaultNode(final SchemaTreeInference dataSchema) { + final SchemaTreeEffectiveStatement stmt = Iterables.getLast(dataSchema.statementPath()); + // We assume there's only one key for the list. - List keys = ((ListSchemaNode)dataSchema).getKeyDefinition(); - Preconditions.checkArgument(keys.size() == 1, "Expected only 1 key for list %s", appConfigBindingClass); - QName listKeyQName = keys.get(0); - return ImmutableNodes.mapEntryBuilder(bindingQName, listKeyQName, appConfigListKeyValue).build(); - } + final Set keys = stmt.findFirstEffectiveSubstatementArgument(KeyEffectiveStatement.class) + .orElseThrow(); - @Override - public NormalizedNode parseDataElement(final Element element, final DataSchemaNode dataSchema, - final DomToNormalizedNodeParserFactory parserFactory) { - return parserFactory.getMapEntryNodeParser().parse(Collections.singletonList(element), - (ListSchemaNode)dataSchema); + checkArgument(keys.size() == 1, "Expected only 1 key for list %s", appConfigBindingClass); + QName listKeyQName = keys.iterator().next(); + return ImmutableNodes.mapEntryBuilder(bindingQName, listKeyQName, appConfigListKeyValue).build(); } } }