package org.opendaylight.yangtools.binding.data.codec.impl;
import com.google.common.collect.ImmutableSet;
+import com.google.common.io.BaseEncoding;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@Override
public Object deserialize(final Object input) {
try {
- return charConstructor.newInstance((input.toString().toCharArray()));
+ if (input instanceof byte[]) {
+ return charConstructor.newInstance(BaseEncoding.base64().encode((byte[]) input).toCharArray());
+ } else {
+ return charConstructor.newInstance((input.toString().toCharArray()));
+ }
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException("Could not construct instance",e);
}
package org.opendaylight.yangtools.binding.data.codec.test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Map.Entry;
import javassist.ClassPool;
import org.junit.Assert;
import org.junit.Test;
+import org.opendaylight.yang.gen.v1.bug5446.rev151105.IpAddressBinary;
+import org.opendaylight.yang.gen.v1.bug5446.rev151105.IpAddressBinaryBuilder;
+import org.opendaylight.yang.gen.v1.bug5446.rev151105.Root;
+import org.opendaylight.yang.gen.v1.bug5446.rev151105.RootBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.union.rev150121.TopLevel;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.union.rev150121.TopLevelBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.union.rev150121.Wrapper;
import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
+import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
.build();
Assert.assertEquals(topLevelEntry, containerNode);
}
+
+ @Test
+ public void bug5446Test() {
+ IpAddressBinary ipAddress = IpAddressBinaryBuilder.getDefaultInstance("fwAAAQ==");
+ Root root = new RootBuilder().setIpAddress(ipAddress).build();
+ NormalizedNode<?, ?> rootNode = registry.toNormalizedNode(InstanceIdentifier.builder(Root.class).build(), root)
+ .getValue();
+
+ Entry<InstanceIdentifier<?>, DataObject> rootEntry = registry.fromNormalizedNode(
+ YangInstanceIdentifier.of(rootNode.getNodeType()), rootNode);
+
+ DataObject rootObj = rootEntry.getValue();
+ assertTrue(rootObj instanceof Root);
+ IpAddressBinary desIpAddress = ((Root) rootObj).getIpAddress();
+ assertEquals(ipAddress, desIpAddress);
+ }
}
*/
new(GeneratedTransferObject genType) {
super(genType)
+ if(isBaseEncodingImportRequired) {
+ this.importMap.put("BaseEncoding","com.google.common.io")
+ }
+ }
+
+ final private def boolean isBaseEncodingImportRequired() {
+ for (property : finalProperties) {
+ val propRet = property.returnType
+ if (propRet instanceof GeneratedTransferObject && (propRet as GeneratedTransferObject).typedef &&
+ (propRet as GeneratedTransferObject).properties != null &&
+ !(propRet as GeneratedTransferObject).properties.empty &&
+ ((propRet as GeneratedTransferObject).properties.size == 1) &&
+ (propRet as GeneratedTransferObject).properties.get(0).name.equals("value") &&
+ "byte[]".equals((propRet as GeneratedTransferObject).properties.get(0).returnType.name)) {
+ return true;
+ }
+ }
}
override constructors() '''
&& BOOLEAN.equals((propRet as GeneratedTransferObject).properties.get(0).returnType)» // And the property value is of type boolean
««« generated boolean typedef
this.«other.fieldName» = «property.fieldName».isValue().toString().toCharArray();
+ «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject
+ && (propRet as GeneratedTransferObject).typedef // Is it a typedef
+ && (propRet as GeneratedTransferObject).properties != null
+ && !(propRet as GeneratedTransferObject).properties.empty
+ && ((propRet as GeneratedTransferObject).properties.size == 1)
+ && (propRet as GeneratedTransferObject).properties.get(0).name.equals("value")
+ && "byte[]".equals((propRet as GeneratedTransferObject).properties.get(0).returnType.name)»
+ ««« generated byte[] typedef
+ this.«other.fieldName» = BaseEncoding.base64().encode(«property.fieldName».getValue()).toCharArray();
«ELSE»
««« generated type
this.«other.fieldName» = «property.fieldName».getValue().toString().toCharArray();
--- /dev/null
+package org.opendaylight.yang.gen.v1.bug5446.rev151105;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class IpAddressBinaryBuilder {
+ public static IpAddressBinary getDefaultInstance(java.lang.String defaultValue) {
+ return new IpAddressBinary(Ipv4AddressBinary.getDefaultInstance(defaultValue));
+ }
+
+ public static IpAddressBinary getDefaultInstance(byte[] defaultValue) {
+ if (defaultValue.length == 4) {
+ return new IpAddressBinary(new Ipv4AddressBinary(defaultValue));
+ } else if (defaultValue.length == 16) {
+ return new IpAddressBinary(new Ipv6AddressBinary(defaultValue));
+ }
+ return null;
+ }
+}
--- /dev/null
+module bug5446 {
+ yang-version 1;
+ namespace "bug5446";
+ prefix "bug5446";
+
+ revision "2015-11-05" {
+ }
+
+ typedef ipv4-address-binary {
+ type binary {
+ length "4";
+ }
+ }
+
+ typedef ipv6-address-binary {
+ type binary {
+ length "16";
+ }
+ }
+
+ typedef ip-address-binary {
+ type union {
+ type ipv4-address-binary;
+ type ipv6-address-binary;
+ }
+ }
+
+ container root {
+ leaf ip-address {
+ type ip-address-binary;
+ }
+ }
+}