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=fb950b8a58c2fa1e7a3fe1a1847ca3056ad93417;hpb=93b203c3e2223018000af3472e8eca5363152910;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 fb950b8a58..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,20 +7,22 @@ */ 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.net.URISyntaxException; -import java.util.List; +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; @@ -33,7 +35,9 @@ 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.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; @@ -44,6 +48,7 @@ import org.xml.sax.SAXException; * @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) { @@ -83,25 +88,24 @@ public abstract class BindingContext { bindingQName = BindingReflections.findQName(appConfigBindingClass); } - public NormalizedNode parseDataElement(final Element element, final DataSchemaNode dataSchema, - final SchemaContext schemaContext) throws XMLStreamException, IOException, ParserConfigurationException, - SAXException, URISyntaxException { + 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, schemaContext, dataSchema); + final XmlParserStream xmlParser = XmlParserStream.create(writer, dataSchema); xmlParser.traverse(new DOMSource(element)); - final NormalizedNode result = resultHolder.getResult(); + final NormalizedNode result = resultHolder.getResult(); if (result instanceof MapNode) { final MapNode mapNode = (MapNode) result; - final MapEntryNode mapEntryNode = mapNode.getValue().iterator().next(); + 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. @@ -114,7 +118,7 @@ public abstract class BindingContext { } @Override - public NormalizedNode newDefaultNode(final DataSchemaNode dataSchema) { + public NormalizedNode newDefaultNode(final SchemaTreeInference dataSchema) { return ImmutableNodes.containerNode(bindingQName); } } @@ -134,22 +138,26 @@ 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); + final Set keys = stmt.findFirstEffectiveSubstatementArgument(KeyEffectiveStatement.class) + .orElseThrow(); + + checkArgument(keys.size() == 1, "Expected only 1 key for list %s", appConfigBindingClass); + QName listKeyQName = keys.iterator().next(); return ImmutableNodes.mapEntryBuilder(bindingQName, listKeyQName, appConfigListKeyValue).build(); } }