From 396cfb3692d1db20e429462cc1862e5eeb7fe4a4 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Thu, 11 Jun 2015 16:39:29 +0200 Subject: [PATCH] BUG-3675 Support non-prefixed identityrefs in config subsystem If a non prefixed but valid identityref was submitted as e.g. service type, netconf connector for config subsystem failed. Change-Id: I59dbb7dc83da9558db06118bdf1296f1ab9d782f Signed-off-by: Maros Marsalek --- .../ObjectNameAttributeReadingStrategy.java | 20 ++++++----- ...leIdentityRefAttributeReadingStrategy.java | 17 ++++++---- .../operations/editconfig/EditConfig.java | 2 +- ...entityRefAttributeReadingStrategyTest.java | 34 +++++++++++++++++++ 4 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleIdentityRefAttributeReadingStrategyTest.java diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectNameAttributeReadingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectNameAttributeReadingStrategy.java index f85fe298b3..709c8d23b8 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectNameAttributeReadingStrategy.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectNameAttributeReadingStrategy.java @@ -8,7 +8,6 @@ package org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml; import com.google.common.base.Preconditions; -import com.google.common.base.Strings; import java.util.List; import java.util.Map; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; @@ -50,15 +49,18 @@ public class ObjectNameAttributeReadingStrategy extends AbstractAttributeReading public static String checkPrefixAndExtractServiceName(XmlElement typeElement, Map.Entry prefixNamespace) throws NetconfDocumentedException { String serviceName = typeElement.getTextContent(); - // FIXME: comparing Entry with String: - Preconditions.checkState(!Strings.isNullOrEmpty(prefixNamespace.getKey()), "Service %s value not prefixed with namespace", + Preconditions.checkNotNull(prefixNamespace.getKey(), "Service %s value cannot be linked to namespace", XmlNetconfConstants.TYPE_KEY); - String prefix = prefixNamespace.getKey() + PREFIX_SEPARATOR; - Preconditions.checkState(serviceName.startsWith(prefix), - "Service %s not correctly prefixed, expected %s, but was %s", XmlNetconfConstants.TYPE_KEY, prefix, - serviceName); - serviceName = serviceName.substring(prefix.length()); - return serviceName; + if(prefixNamespace.getKey().isEmpty()) { + return serviceName; + } else { + String prefix = prefixNamespace.getKey() + PREFIX_SEPARATOR; + Preconditions.checkState(serviceName.startsWith(prefix), + "Service %s not correctly prefixed, expected %s, but was %s", XmlNetconfConstants.TYPE_KEY, prefix, + serviceName); + serviceName = serviceName.substring(prefix.length()); + return serviceName; + } } } diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleIdentityRefAttributeReadingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleIdentityRefAttributeReadingStrategy.java index 23e67b381f..6d702ef59f 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleIdentityRefAttributeReadingStrategy.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleIdentityRefAttributeReadingStrategy.java @@ -33,15 +33,20 @@ public class SimpleIdentityRefAttributeReadingStrategy extends SimpleAttributeRe @Override protected String readElementContent(XmlElement xmlElement) throws NetconfDocumentedException { - // TODO test Map.Entry namespaceOfTextContent = xmlElement.findNamespaceOfTextContent(); String content = xmlElement.getTextContent(); - String prefix = namespaceOfTextContent.getKey() + ":"; - Preconditions.checkArgument(content.startsWith(prefix), "Identity ref should be prefixed"); - - String localName = content.substring(prefix.length()); - String namespace = namespaceOfTextContent.getValue(); + final String namespace; + final String localName; + if(namespaceOfTextContent.getKey().isEmpty()) { + localName = content; + namespace = xmlElement.getNamespace(); + } else { + String prefix = namespaceOfTextContent.getKey() + ":"; + Preconditions.checkArgument(content.startsWith(prefix), "Identity ref should be prefixed with \"%s\"", prefix); + localName = content.substring(prefix.length()); + namespace = namespaceOfTextContent.getValue(); + } Date revision = null; Map revisions = identityMap.get(namespace); diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java index ab2a081fb3..b7699bf69c 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java @@ -222,7 +222,7 @@ public class EditConfig extends AbstractConfigNetconfOperation { public static class IdentityMapping { private final Map identityNameToSchemaNode; - IdentityMapping() { + public IdentityMapping() { this.identityNameToSchemaNode = Maps.newHashMap(); } diff --git a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleIdentityRefAttributeReadingStrategyTest.java b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleIdentityRefAttributeReadingStrategyTest.java new file mode 100644 index 0000000000..ef35ce3c67 --- /dev/null +++ b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleIdentityRefAttributeReadingStrategyTest.java @@ -0,0 +1,34 @@ +package org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml; + +import static org.junit.Assert.assertEquals; + +import com.google.common.collect.Maps; +import java.net.URI; +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import org.junit.Test; +import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfig; +import org.opendaylight.controller.netconf.util.xml.XmlElement; + +public class SimpleIdentityRefAttributeReadingStrategyTest { + + @Test + public void testReadIdRef() throws Exception { + final Map> identityMapping = Maps.newHashMap(); + final EditConfig.IdentityMapping value = new EditConfig.IdentityMapping(); + final Date rev = new Date(); + identityMapping.put("namespace", Collections.singletonMap(rev, value)); + identityMapping.put("inner", Collections.singletonMap(rev, value)); + final SimpleIdentityRefAttributeReadingStrategy key = new SimpleIdentityRefAttributeReadingStrategy(null, "key", identityMapping); + + String read = key.readElementContent(XmlElement.fromString("local")); + assertEquals(org.opendaylight.yangtools.yang.common.QName.create(URI.create("namespace"), rev, "local").toString(), read); + + read = key.readElementContent(XmlElement.fromString("a:local")); + assertEquals(org.opendaylight.yangtools.yang.common.QName.create(URI.create("inner"), rev, "local").toString(), read); + + read = key.readElementContent(XmlElement.fromString("local").getOnlyChildElement()); + assertEquals(org.opendaylight.yangtools.yang.common.QName.create(URI.create("namespace"), rev, "local").toString(), read); + } +} \ No newline at end of file -- 2.36.6