From: Maros Marsalek Date: Wed, 4 Dec 2013 08:04:48 +0000 (+0100) Subject: Improved support for default yang statements in configuration subsystem X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-1~227^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=21187101470327eece6ffa2404f3c12f0ea6f0cd Improved support for default yang statements in configuration subsystem Generated code for configuration contains default values with correct constructor if specified for leaves Fixed binary type (de)serialization Change-Id: Ia1338013f8aacab38074e6c7af2de351c6b73835 Signed-off-by: Maros Marsalek --- diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java index 6da68018f2..115bb85b61 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java @@ -129,7 +129,7 @@ public class TemplateFactory { for (JavaAttribute ja : rpc.getParameters()) { Field field = new Field(Collections. emptyList(), ja.getType().getFullyQualifiedName(), - ja.getLowerCaseCammelCase()); + ja.getLowerCaseCammelCase(), ja.getNullableDefaultWrappedForCode()); fields.add(field); } MethodDeclaration operation = new MethodDeclaration( @@ -433,15 +433,18 @@ public class TemplateFactory { String varName = BindingGeneratorUtil .parseToValidParamName(attrEntry.getKey()); - String fullyQualifiedName; + String fullyQualifiedName, nullableDefault = null; if (attrEntry.getValue() instanceof TypedAttribute) { Type type = ((TypedAttribute) attrEntry.getValue()).getType(); fullyQualifiedName = serializeType(type); + if(attrEntry.getValue() instanceof JavaAttribute) { + nullableDefault = ((JavaAttribute)attrEntry.getValue()).getNullableDefaultWrappedForCode(); + } } else { fullyQualifiedName = FullyQualifiedNameHelper .getFullyQualifiedName(packageName, attrEntry.getValue().getUpperCaseCammelCase()); } - fields.add(new Field(fullyQualifiedName, varName)); + fields.add(new Field(fullyQualifiedName, varName, nullableDefault)); String getterName = "get" + innerName; MethodDefinition getter = new MethodDefinition( @@ -531,6 +534,7 @@ public class TemplateFactory { String packageName) { for (Entry attrEntry : attributes.entrySet()) { String type; + String nullableDefaultWrapped = null; AttributeIfc attributeIfc = attrEntry.getValue(); if (attributeIfc instanceof TypedAttribute) { @@ -548,6 +552,7 @@ public class TemplateFactory { if (innerAttr instanceof JavaAttribute) { fullyQualifiedName = ((JavaAttribute) innerAttr) .getType().getFullyQualifiedName(); + nullableDefaultWrapped = ((JavaAttribute) innerAttr).getNullableDefaultWrappedForCode(); } else if (innerAttr instanceof TOAttribute) { fullyQualifiedName = FullyQualifiedNameHelper .getFullyQualifiedName(packageName, innerAttr.getUpperCaseCammelCase()); @@ -563,7 +568,7 @@ public class TemplateFactory { } fields.add(new Field(type, attributeIfc - .getUpperCaseCammelCase())); + .getUpperCaseCammelCase(), nullableDefaultWrapped)); } } @@ -582,12 +587,16 @@ public class TemplateFactory { void processAttributes(Map attributes, String packageName) { for (Entry attrEntry : attributes.entrySet()) { - String type; + String type, nullableDefaultWrapped = null; AttributeIfc attributeIfc = attrEntry.getValue(); if (attributeIfc instanceof TypedAttribute) { TypedAttribute typedAttribute = (TypedAttribute) attributeIfc; type = serializeType(typedAttribute.getType()); + if (attributeIfc instanceof JavaAttribute) { + nullableDefaultWrapped = ((JavaAttribute) attributeIfc).getNullableDefaultWrappedForCode(); + } + } else if (attributeIfc instanceof TOAttribute) { String fullyQualifiedName = FullyQualifiedNameHelper .getFullyQualifiedName(packageName, attributeIfc.getUpperCaseCammelCase()); @@ -600,6 +609,7 @@ public class TemplateFactory { if (innerAttr instanceof JavaAttribute) { fullyQualifiedName = ((JavaAttribute) innerAttr) .getType().getFullyQualifiedName(); + nullableDefaultWrapped = ((JavaAttribute) innerAttr).getNullableDefaultWrappedForCode(); } else if (innerAttr instanceof TOAttribute) { fullyQualifiedName = FullyQualifiedNameHelper .getFullyQualifiedName(packageName, innerAttr.getUpperCaseCammelCase()); @@ -631,8 +641,7 @@ public class TemplateFactory { String varName = BindingGeneratorUtil .parseToValidParamName(attrEntry.getKey()); moduleFields.add(new ModuleField(type, varName, attributeIfc - .getUpperCaseCammelCase(), attributeIfc - .getNullableDefault(), isDependency, dependency)); + .getUpperCaseCammelCase(), nullableDefaultWrapped, isDependency, dependency)); String getterName = "get" + attributeIfc.getUpperCaseCammelCase(); diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Field.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Field.java index fe9e885b6f..0857ec6f8d 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Field.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Field.java @@ -7,10 +7,10 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model; -import java.util.List; - import com.google.common.collect.Lists; +import java.util.List; + public class Field { private final String type; private final String name; @@ -21,6 +21,10 @@ public class Field { this(Lists. newArrayList(), type, name, null); } + public Field(String type, String name, String definition) { + this(Lists. newArrayList(), type, name, definition); + } + public Field(List modifiers, String type, String name) { this(modifiers, type, name, null); } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java index 2f1437404a..1945cac1c2 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java @@ -534,7 +534,7 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { assertDeclaredField(fieldDeclarations, "private java.util.concurrent.ThreadFactory threadfactoryDependency"); assertDeclaredField(fieldDeclarations, - "private java.lang.Long keepAlive=10"); + "private java.lang.Long keepAlive=new java.lang.Long(\"10\")"); assertDeclaredField(fieldDeclarations, "private java.lang.Long coreSize"); assertDeclaredField(fieldDeclarations, "private byte[] binary"); diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryTemplatesTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryTemplatesTest.java index 3c47931896..48d5b30eb2 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryTemplatesTest.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryTemplatesTest.java @@ -7,14 +7,7 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin; -import static org.junit.Assert.assertNotNull; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; - -import java.util.Collections; -import java.util.Map; - +import com.google.common.collect.Maps; import org.junit.Test; import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIfc; @@ -23,7 +16,13 @@ import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.AbstractFa import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.TemplateFactory; import org.opendaylight.yangtools.sal.binding.model.api.Type; -import com.google.common.collect.Maps; +import java.util.Collections; +import java.util.Map; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; public class ModuleMXBeanEntryTemplatesTest { @@ -61,6 +60,7 @@ public class ModuleMXBeanEntryTemplatesTest { doReturn("package.type").when(typeA).getFullyQualifiedName(); doReturn(typeA).when(attr).getType(); doReturn("Type").when(attr).getUpperCaseCammelCase(); + doReturn("new Default()").when(attr).getNullableDefault(); return attr; } diff --git a/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/TypeProviderWrapper.java b/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/TypeProviderWrapper.java index a2238d1a13..764ecd3886 100644 --- a/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/TypeProviderWrapper.java +++ b/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/TypeProviderWrapper.java @@ -26,6 +26,10 @@ public class TypeProviderWrapper { return getType(leaf, type); } + public String getDefault(LeafSchemaNode node) { + return typeProvider.getTypeDefaultConstruction(node); + } + public Type getType(SchemaNode leaf, TypeDefinition type) { Type javaType; try { diff --git a/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/attribute/JavaAttribute.java b/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/attribute/JavaAttribute.java index 325ca9ee06..3e20e4a55a 100644 --- a/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/attribute/JavaAttribute.java +++ b/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/attribute/JavaAttribute.java @@ -22,7 +22,7 @@ import javax.management.openmbean.SimpleType; public class JavaAttribute extends AbstractAttribute implements TypedAttribute { private final Type type; - private final String nullableDescription, nullableDefault; + private final String nullableDescription, nullableDefault, nullableDefaultWrappedForCode; private final TypeProviderWrapper typeProviderWrapper; private final TypeDefinition typeDefinition; @@ -33,6 +33,7 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute { this.typeDefinition = leaf.getType(); this.typeProviderWrapper = typeProviderWrapper; this.nullableDefault = leaf.getDefault(); + this.nullableDefaultWrappedForCode = leaf.getDefault() == null ? null : typeProviderWrapper.getDefault(leaf); this.nullableDescription = leaf.getDescription(); } @@ -42,10 +43,14 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute { this.type = typeProviderWrapper.getType(leaf); this.typeDefinition = leaf.getType(); this.typeProviderWrapper = typeProviderWrapper; - this.nullableDefault = null; + this.nullableDefault = nullableDefaultWrappedForCode = null; this.nullableDescription = leaf.getDescription(); } + public TypeDefinition getTypeDefinition() { + return typeDefinition; + } + /** * Returns the most base type */ @@ -56,6 +61,10 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute { return baseType; } + public String getNullableDefaultWrappedForCode() { + return nullableDefaultWrappedForCode; + } + @Override public Type getType() { return type; diff --git a/opendaylight/config/yang-test/src/main/yang/config-test-impl.yang b/opendaylight/config/yang-test/src/main/yang/config-test-impl.yang index bd83a4cc70..9ad7a44915 100644 --- a/opendaylight/config/yang-test/src/main/yang/config-test-impl.yang +++ b/opendaylight/config/yang-test/src/main/yang/config-test-impl.yang @@ -48,28 +48,40 @@ module config-test-impl { container dto-a { leaf simple-arg { type uint32; + default 1; } leaf port { type inet:port-number; + default 8080; } + leaf ip4 { + type inet:ipv4-address; + default 127.0.0.1; + } + + leaf ip { + type inet:ip-address; + // TODO defaults for union default 0:0:0:0:0:0:0:1; + } } leaf as-number { - mandatory true; type inet:as-number; + default 44; } leaf simpleInt { type uint32; - default 99L; + default 99; } container dto_b { leaf simple-int1 { type uint32; + default 32; } leaf simple-int2 { @@ -101,28 +113,34 @@ module config-test-impl { when "/config:modules/config:module/config:type = 'impl-netconf'"; leaf binaryLeaf { type binary; + default ZGVmYXVsdEJpbg==; } leaf type { type string; + default "default-string"; } leaf extended { type tt:extend-once; + default 1; } leaf extended-twice { type tt:extend-twice; + default 2; } leaf extended-enum { type tt:extend-enum; + default ONE; } leaf sleep-factor { type decimal64 { fraction-digits 2; } + default 2.00; } container dto-c { @@ -153,23 +171,28 @@ module config-test-impl { } leaf simple-long { - type int64 ; + type int64; + default -45; } leaf simple-long-2 { type uint32; + default 445; } leaf simple-BigInteger { type uint64; + default 545454; } leaf simple-byte { type int8; + default -4; } leaf simple-short { type uint8; + default 45; } leaf simple-test { @@ -209,6 +232,7 @@ module config-test-impl { container deep { leaf simple-int3 { type uint16; + default 0; } } } @@ -393,6 +417,7 @@ module config-test-impl { container retValContainer { leaf v1 { type string; + default "from rpc"; } leaf v2 { diff --git a/opendaylight/netconf/config-netconf-connector/pom.xml b/opendaylight/netconf/config-netconf-connector/pom.xml index d855f15541..888f13c8fe 100644 --- a/opendaylight/netconf/config-netconf-connector/pom.xml +++ b/opendaylight/netconf/config-netconf-connector/pom.xml @@ -136,7 +136,9 @@ org.osgi.framework, org.osgi.util.tracker, org.slf4j, - org.w3c.dom + org.w3c.dom, + com.google.common.io, + org.opendaylight.yangtools.yang.model.api.type diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/AttributeIfcSwitchStatement.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/AttributeIfcSwitchStatement.java index 2b6f862bd7..697b811d51 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/AttributeIfcSwitchStatement.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/AttributeIfcSwitchStatement.java @@ -14,6 +14,7 @@ import org.opendaylight.controller.config.yangjmxgenerator.attribute.JavaAttribu import org.opendaylight.controller.config.yangjmxgenerator.attribute.ListAttribute; import org.opendaylight.controller.config.yangjmxgenerator.attribute.ListDependenciesAttribute; import org.opendaylight.controller.config.yangjmxgenerator.attribute.TOAttribute; +import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition; import javax.management.openmbean.ArrayType; import javax.management.openmbean.CompositeType; @@ -30,7 +31,10 @@ public abstract class AttributeIfcSwitchStatement { if (attributeIfc instanceof JavaAttribute) { try { - return caseJavaAttribute(attributeIfc.getOpenType()); + if(((JavaAttribute)attributeIfc).getTypeDefinition() instanceof BinaryTypeDefinition) { + return caseJavaBinaryAttribute(attributeIfc.getOpenType()); + } else + return caseJavaAttribute(attributeIfc.getOpenType()); } catch (UnknownOpenTypeException e) { throw getIllegalArgumentException(attributeIfc); } @@ -48,6 +52,9 @@ public abstract class AttributeIfcSwitchStatement { throw getIllegalArgumentException(attributeIfc); } + protected T caseJavaBinaryAttribute(OpenType openType) { + return caseJavaAttribute(openType); + } private IllegalArgumentException getIllegalArgumentException(AttributeIfc attributeIfc) { return new IllegalArgumentException("Unknown attribute type " + attributeIfc.getClass() + ", " + attributeIfc diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/AbstractAttributeReadingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/AbstractAttributeReadingStrategy.java index 867d94e0b7..7939112628 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/AbstractAttributeReadingStrategy.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/AbstractAttributeReadingStrategy.java @@ -27,11 +27,14 @@ public abstract class AbstractAttributeReadingStrategy implements AttributeReadi @Override public AttributeConfigElement readElement(List configNodes) { if (configNodes.size() == 0) - return AttributeConfigElement.createNullValue(nullableDefault); + return AttributeConfigElement.createNullValue(postprocessNullableDefault(nullableDefault)); return readElementHook(configNodes); } abstract AttributeConfigElement readElementHook(List configNodes); + protected Object postprocessNullableDefault(String nullableDefault) { + return nullableDefault; + } } diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/AttributeConfigElement.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/AttributeConfigElement.java index 598935a0bc..a1f46dde54 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/AttributeConfigElement.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/AttributeConfigElement.java @@ -9,7 +9,6 @@ package org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml; import com.google.common.base.Optional; -import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIfc; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.resolving.AttributeResolvingStrategy; import javax.management.openmbean.OpenType; @@ -47,24 +46,14 @@ public class AttributeConfigElement { } - public static AttributeConfigElement create(AttributeIfc attributeIfc, Object value) { - String nullableDefault = attributeIfc.getNullableDefault(); - return create(nullableDefault, value); - } - - public static AttributeConfigElement create(String nullableDefault, Object value) { + public static AttributeConfigElement create(Object nullableDefault, Object value) { return new AttributeConfigElement(nullableDefault, value); } - public static AttributeConfigElement createNullValue(AttributeIfc attributeIfc) { - return new AttributeConfigElement(attributeIfc.getNullableDefault(), null); - } - - public static AttributeConfigElement createNullValue(String nullableDefault) { + public static AttributeConfigElement createNullValue(Object nullableDefault) { return new AttributeConfigElement(nullableDefault, null); } - public Object getValue() { return value; } diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectXmlReader.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectXmlReader.java index e2ea404e21..a2691f241c 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectXmlReader.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/ObjectXmlReader.java @@ -18,6 +18,7 @@ import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attrib import javax.management.openmbean.ArrayType; import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenType; import javax.management.openmbean.SimpleType; import java.util.Map; import java.util.Map.Entry; @@ -41,6 +42,11 @@ public class ObjectXmlReader extends AttributeIfcSwitchStatement openType) { + return new SimpleBinaryAttributeReadingStrategy(lastAttribute.getNullableDefault()); + } + @Override public AttributeReadingStrategy caseJavaSimpleAttribute(SimpleType openType) { return new SimpleAttributeReadingStrategy(lastAttribute.getNullableDefault()); diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleAttributeReadingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleAttributeReadingStrategy.java index be86a2ab6f..a8605243af 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleAttributeReadingStrategy.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleAttributeReadingStrategy.java @@ -28,7 +28,13 @@ public class SimpleAttributeReadingStrategy extends AbstractAttributeReadingStra String textContent = xmlElement.getTextContent(); Preconditions.checkNotNull(textContent, "This element should contain text %s", xmlElement); - return AttributeConfigElement.create(getNullableDefault(), postprocessParsedValue(textContent)); + return AttributeConfigElement.create(postprocessNullableDefault(getNullableDefault()), + postprocessParsedValue(textContent)); + } + + @Override + protected Object postprocessNullableDefault(String nullableDefault) { + return nullableDefault; } protected Object postprocessParsedValue(String textContent) { diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleBinaryAttributeReadingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleBinaryAttributeReadingStrategy.java new file mode 100644 index 0000000000..2cac9029c6 --- /dev/null +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleBinaryAttributeReadingStrategy.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml; + +import com.google.common.collect.Lists; +import com.google.common.io.BaseEncoding; + +import java.util.List; + +public class SimpleBinaryAttributeReadingStrategy extends SimpleAttributeReadingStrategy { + + public SimpleBinaryAttributeReadingStrategy(String nullableDefault) { + super(nullableDefault); + } + + protected Object postprocessParsedValue(String textContent) { + BaseEncoding en = BaseEncoding.base64(); + byte[] decode = en.decode(textContent); + List parsed = Lists.newArrayListWithCapacity(decode.length); + for (byte b : decode) { + parsed.add(Byte.toString(b)); + } + return parsed; + } + + @Override + protected Object postprocessNullableDefault(String nullableDefault) { + return nullableDefault == null ? null : postprocessParsedValue(nullableDefault); + } +} diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleCompositeAttributeReadingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleCompositeAttributeReadingStrategy.java index 9249ac9fa8..22c9e015a9 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleCompositeAttributeReadingStrategy.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/fromxml/SimpleCompositeAttributeReadingStrategy.java @@ -14,7 +14,6 @@ import java.util.HashMap; public class SimpleCompositeAttributeReadingStrategy extends SimpleAttributeReadingStrategy { - private final String key; public SimpleCompositeAttributeReadingStrategy(String nullableDefault, String key) { @@ -28,4 +27,8 @@ public class SimpleCompositeAttributeReadingStrategy extends SimpleAttributeRead return map; } + @Override + protected Object postprocessNullableDefault(String nullableDefault) { + return nullableDefault == null ? null : postprocessParsedValue(nullableDefault); + } } diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/resolving/CompositeAttributeResolvingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/resolving/CompositeAttributeResolvingStrategy.java index a85f3064cf..c477821051 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/resolving/CompositeAttributeResolvingStrategy.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/resolving/CompositeAttributeResolvingStrategy.java @@ -70,7 +70,7 @@ final class CompositeAttributeResolvingStrategy extends parsedInnerValue.isPresent() ? parsedInnerValue.get() : null); } - CompositeDataSupport parsedValue = null; + CompositeDataSupport parsedValue; try { parsedValue = new CompositeDataSupport(getOpenType(), items); } catch (OpenDataException e) { diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/ObjectXmlWriter.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/ObjectXmlWriter.java index ad587ea987..a174e9a251 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/ObjectXmlWriter.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/ObjectXmlWriter.java @@ -19,6 +19,7 @@ import org.w3c.dom.Document; import javax.management.openmbean.ArrayType; import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenType; import javax.management.openmbean.SimpleType; import java.util.Map; import java.util.Map.Entry; @@ -51,6 +52,11 @@ public class ObjectXmlWriter extends AttributeIfcSwitchStatement openType) { + return new SimpleBinaryAttributeWritingStrategy(document, key); + } + @Override protected AttributeWritingStrategy caseJavaSimpleAttribute(SimpleType openType) { return new SimpleAttributeWritingStrategy(document, key); diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/SimpleBinaryAttributeWritingStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/SimpleBinaryAttributeWritingStrategy.java new file mode 100644 index 0000000000..c159e46987 --- /dev/null +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/attributes/toxml/SimpleBinaryAttributeWritingStrategy.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.toxml; + +import com.google.common.base.Preconditions; +import com.google.common.io.BaseEncoding; +import org.opendaylight.controller.netconf.confignetconfconnector.util.Util; +import org.w3c.dom.Document; + +import java.util.List; + +public class SimpleBinaryAttributeWritingStrategy extends SimpleAttributeWritingStrategy { + + /** + * @param document + * @param key + */ + public SimpleBinaryAttributeWritingStrategy(Document document, String key) { + super(document, key); + } + + protected Object preprocess(Object value) { + Util.checkType(value, List.class); + BaseEncoding en = BaseEncoding.base64(); + + List list = (List) value; + byte[] decoded = new byte[list.size()]; + int i = 0; + for (Object bAsStr : list) { + Preconditions.checkArgument(bAsStr instanceof String, "Unexpected inner value for %s, expected string", value); + byte b = Byte.parseByte((String) bAsStr); + decoded[i++] = b; + } + + return en.encode(decoded); + } + +} diff --git a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java index 35fa0428ec..f8916ecac2 100644 --- a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java +++ b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java @@ -55,7 +55,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import javax.management.InstanceAlreadyExistsException; @@ -125,6 +124,7 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/editConfig.xml"); checkBinaryLeafEdited(getConfigCandidate()); + // default-operation:none, should not affect binary leaf edit("netconfMessages/editConfig_none.xml"); checkBinaryLeafEdited(getConfigCandidate()); @@ -132,7 +132,6 @@ public class NetconfMappingTest extends AbstractConfigTest { // check after edit commit(); Element response = getConfigRunning(); - System.err.println(XmlUtil.toString(response)); checkBinaryLeafEdited(response); checkTypeConfigAttribute(response); @@ -165,6 +164,15 @@ public class NetconfMappingTest extends AbstractConfigTest { verifyNoMoreInteractions(netconfOperationRouter); } + private void checkBigDecimal(Element response) { + String responseTrimmed = XmlUtil.toString(response).replaceAll("\\s", ""); + + assertContainsString(responseTrimmed, "2.58"); + // Default + assertContainsString(responseTrimmed, "2.00"); + + } + private void closeSession() throws NetconfDocumentedException, ParserConfigurationException, SAXException, IOException { DefaultCloseSession closeOp = new DefaultCloseSession(NETCONF_SESSION_ID); @@ -232,14 +240,9 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/namespaces/editConfig_sameAttrDifferentNamespaces.xml"); } catch (NetconfDocumentedException e) { String message = e.getMessage(); - assertThat(message, - JUnitMatchers - .containsString("Element simple-long-2 present multiple times with different namespaces")); - assertThat(message, - JUnitMatchers.containsString("urn:opendaylight:params:xml:ns:yang:controller:test:impl")); - assertThat(message, - JUnitMatchers - .containsString(XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG)); + assertContainsString(message, "Element simple-long-2 present multiple times with different namespaces"); + assertContainsString(message, "urn:opendaylight:params:xml:ns:yang:controller:test:impl"); + assertContainsString(message, XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG); throw e; } } @@ -250,9 +253,9 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/namespaces/editConfig_differentNamespaceTO.xml"); } catch (NetconfDocumentedException e) { String message = e.getMessage(); - assertThat(message, JUnitMatchers.containsString("Unrecognised elements")); - assertThat(message, JUnitMatchers.containsString("simple-int2")); - assertThat(message, JUnitMatchers.containsString("dto_d")); + assertContainsString(message, "Unrecognised elements"); + assertContainsString(message, "simple-int2"); + assertContainsString(message, "dto_d"); throw e; } } @@ -263,13 +266,9 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/namespaces/editConfig_sameAttrDifferentNamespacesList.xml"); } catch (NetconfDocumentedException e) { String message = e.getMessage(); - assertThat(message, - JUnitMatchers.containsString("Element binaryLeaf present multiple times with different namespaces")); - assertThat(message, - JUnitMatchers.containsString("urn:opendaylight:params:xml:ns:yang:controller:test:impl")); - assertThat(message, - JUnitMatchers - .containsString(XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG)); + assertContainsString(message, "Element binaryLeaf present multiple times with different namespaces"); + assertContainsString(message, "urn:opendaylight:params:xml:ns:yang:controller:test:impl"); + assertContainsString(message, XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG); throw e; } } @@ -306,8 +305,8 @@ public class NetconfMappingTest extends AbstractConfigTest { try { edit(file); } catch (NetconfDocumentedException e) { - assertThat(e.getMessage(), JUnitMatchers.containsString("Unrecognised elements")); - assertThat(e.getMessage(), JUnitMatchers.containsString("unknownAttribute")); + assertContainsString(e.getMessage(), "Unrecognised elements"); + assertContainsString(e.getMessage(), "unknownAttribute"); continue; } fail("Unrecognised test should throw exception " + file); @@ -353,22 +352,37 @@ public class NetconfMappingTest extends AbstractConfigTest { } private void checkBinaryLeafEdited(final Element response) { - final NodeList children = response.getElementsByTagName("binaryLeaf"); - assertEquals(3, children.getLength()); - final StringBuffer buf = new StringBuffer(); - for (int i = 0; i < 3; i++) { - final Element e = (Element) children.item(i); - buf.append(XmlElement.fromDomElement(e).getTextContent()); - } - assertEquals("810", buf.toString()); + String responseTrimmed = XmlUtil.toString(response).replaceAll("\\s", ""); + String substring = "YmluYXJ5"; + assertContainsString(responseTrimmed, substring); + substring = "ZGVmYXVsdEJpbg=="; + assertContainsString(responseTrimmed, substring); } private void checkTypedefs(final Element response) { - NodeList children = response.getElementsByTagName("extended"); - assertEquals(1, children.getLength()); + String responseTrimmed = XmlUtil.toString(response).replaceAll("\\s", ""); + + String substring = "10"; + assertContainsString(responseTrimmed, substring); + // Default + assertContainsString(responseTrimmed, + "1"); - children = response.getElementsByTagName("extended-twice"); - assertEquals(1, children.getLength()); + assertContainsString(responseTrimmed, + "20"); + // Default + assertContainsString(responseTrimmed, + "2"); + + assertContainsString(responseTrimmed, + "TWO"); + // Default + assertContainsString(responseTrimmed, + "ONE"); + } + + private void assertContainsString(String string, String substring) { + assertThat(string, JUnitMatchers.containsString(substring)); } private void checkEnum(final Element response) { @@ -396,12 +410,6 @@ public class NetconfMappingTest extends AbstractConfigTest { assertEquals(2, testingDepsSize); } - private void checkBigDecimal(Element response) { - int size = response.getElementsByTagName("sleep-factor").getLength(); - assertEquals(1, size); - } - - private void checkTypeConfigAttribute(Element response) { XmlElement modulesElement = XmlElement.fromDomElement(response).getOnlyChildElement("data") @@ -458,17 +466,17 @@ public class NetconfMappingTest extends AbstractConfigTest { RuntimeRpc netconf = new RuntimeRpc(yangStoreSnapshot, configRegistryClient, NETCONF_SESSION_ID); response = executeOp(netconf, "netconfMessages/rpc.xml"); - assertThat(XmlUtil.toString(response), JUnitMatchers.containsString("testarg1".toUpperCase())); + assertContainsString(XmlUtil.toString(response), "testarg1".toUpperCase()); response = executeOp(netconf, "netconfMessages/rpcInner.xml"); - assertThat(XmlUtil.toString(response), JUnitMatchers.containsString("ok")); + assertContainsString(XmlUtil.toString(response), "ok"); response = executeOp(netconf, "netconfMessages/rpcInnerInner.xml"); - assertThat(XmlUtil.toString(response), JUnitMatchers.containsString("true")); + assertContainsString(XmlUtil.toString(response), "true"); response = executeOp(netconf, "netconfMessages/rpcInnerInner_complex_output.xml"); - assertThat(XmlUtil.toString(response), JUnitMatchers.containsString("1")); - assertThat(XmlUtil.toString(response), JUnitMatchers.containsString("2")); + assertContainsString(XmlUtil.toString(response), "1"); + assertContainsString(XmlUtil.toString(response), "2"); } private Element get() throws NetconfDocumentedException, ParserConfigurationException, SAXException, IOException { diff --git a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/editConfig.xml b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/editConfig.xml index dc522d2e64..94b73f4b10 100644 --- a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/editConfig.xml +++ b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/editConfig.xml @@ -32,15 +32,15 @@ test1 - 2.00 + 2.58 - 1 + 10 - 1 + 20 @@ -48,9 +48,8 @@ 44 - 8 - 1 - 0 + YmluYXJ5 + configAttributeType 444 diff --git a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/editConfig_none.xml b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/editConfig_none.xml index 388aa4f2ab..b48730d3f7 100644 --- a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/editConfig_none.xml +++ b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/editConfig_none.xml @@ -27,9 +27,7 @@ test1 44 - 8 - 7 - 9 + 8ad1 444 4444 diff --git a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/namespaces/editConfig_differentNamespaceTO.xml b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/namespaces/editConfig_differentNamespaceTO.xml index 4d94d9e949..df2a5e8452 100644 --- a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/namespaces/editConfig_differentNamespaceTO.xml +++ b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/namespaces/editConfig_differentNamespaceTO.xml @@ -32,9 +32,7 @@ test1 44 - 8 - 1 - 0 + 8545649856 configAttributeType 444 diff --git a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/namespaces/editConfig_typeNameConfigAttributeMatching.xml b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/namespaces/editConfig_typeNameConfigAttributeMatching.xml index 0e70e13a34..02aca8d787 100644 --- a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/namespaces/editConfig_typeNameConfigAttributeMatching.xml +++ b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/namespaces/editConfig_typeNameConfigAttributeMatching.xml @@ -32,9 +32,7 @@ test1 44 - 8 - 1 - 0 + 8545649856 444 4444 diff --git a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/unrecognised/editConfig_unrecognised7.xml b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/unrecognised/editConfig_unrecognised7.xml index d03bb084b8..825be6d19f 100644 --- a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/unrecognised/editConfig_unrecognised7.xml +++ b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/unrecognised/editConfig_unrecognised7.xml @@ -32,9 +32,7 @@ test1 44 - 8 - 1 - 0 + 8545649856 error 444 diff --git a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/unrecognised/editConfig_unrecognised8.xml b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/unrecognised/editConfig_unrecognised8.xml index 3722973912..9ef2bed7d7 100644 --- a/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/unrecognised/editConfig_unrecognised8.xml +++ b/opendaylight/netconf/netconf-util/src/test/resources/netconfMessages/unrecognised/editConfig_unrecognised8.xml @@ -32,9 +32,7 @@ test1 44 - 8 - 1 - 0 + 8545649856 444 4444