Use NormalizedNode streaming serialization in sal-remoterpc-connector
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / datastore / node / utils / serialization / ValueSerializer.java
index 8def754f117792ef8e02f327455a9aa54785cf3f..7523976a73d1c24d6fdf807f6b1297f9e5482a5e 100644 (file)
 
 package org.opendaylight.controller.cluster.datastore.node.utils.serialization;
 
-import org.opendaylight.controller.cluster.datastore.node.utils.QNameFactory;
+import com.google.protobuf.ByteString;
+import java.util.HashSet;
+import java.util.Set;
 import org.opendaylight.controller.cluster.datastore.util.InstanceIdentifierUtils;
 import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.HashSet;
-import java.util.Set;
-
 public class ValueSerializer {
+    private static final String NULL_VALUE = "";
+
     public static void serialize(NormalizedNodeMessages.Node.Builder builder,
-        NormalizedNodeSerializationContext context, Object value){
+            QNameSerializationContext context, Object value) {
         builder.setIntValueType(ValueType.getSerializableType(value).ordinal());
 
-        if(value instanceof YangInstanceIdentifier) {
+        if (value instanceof YangInstanceIdentifier) {
             builder.setInstanceIdentifierValue(
-                InstanceIdentifierUtils.toSerializable((YangInstanceIdentifier) value));
-        } else if(value instanceof Set) {
-            Set set = (Set) value;
-            if(!set.isEmpty()){
-                for(Object o : set){
-                    if(o instanceof String){
+                InstanceIdentifierUtils.toSerializable((YangInstanceIdentifier) value, context));
+        } else if (value instanceof Set) {
+            Set<?> set = (Set<?>) value;
+            if (!set.isEmpty()) {
+                for (Object o : set) {
+                    if (o instanceof String) {
                         builder.addBitsValue(o.toString());
                     } else {
-                        throw new IllegalArgumentException("Expected value type to be Bits but was : " +
-                            value.toString());
+                        throw new IllegalArgumentException("Expected value type to be Bits but was : "
+                            value.toString());
                     }
                 }
             }
+        } else if (value instanceof byte[]) {
+            builder.setBytesValue(ByteString.copyFrom((byte[]) value));
+        } else if (value == null) {
+            builder.setValue(NULL_VALUE);
         } else {
             builder.setValue(value.toString());
         }
     }
 
     public static void serialize(NormalizedNodeMessages.PathArgumentAttribute.Builder builder,
-        NormalizedNodeSerializationContext context, Object value){
+            QNameSerializationContext context, Object value) {
 
         builder.setType(ValueType.getSerializableType(value).ordinal());
-        builder.setValue(value.toString());
+
+        if (value instanceof YangInstanceIdentifier) {
+            builder.setInstanceIdentifierValue(
+                    InstanceIdentifierUtils.toSerializable((YangInstanceIdentifier) value, context));
+        } else if (value instanceof Set) {
+            Set<?> set = (Set<?>) value;
+            if (!set.isEmpty()) {
+                for (Object o : set) {
+                    if (o instanceof String) {
+                        builder.addBitsValue(o.toString());
+                    } else {
+                        throw new IllegalArgumentException("Expected value type to be Bits but was : "
+                            + value.toString());
+                    }
+                }
+            }
+        } else if (value instanceof byte[]) {
+            builder.setBytesValue(ByteString.copyFrom((byte[]) value));
+        } else if (value == null) {
+            builder.setValue(NULL_VALUE);
+        } else {
+            builder.setValue(value.toString());
+        }
     }
 
-    public static Object deSerialize(
-        NormalizedNodeDeSerializationContext context, NormalizedNodeMessages.Node node) {
-        if(node.getIntValueType() == ValueType.YANG_IDENTIFIER_TYPE.ordinal()){
-            return InstanceIdentifierUtils.fromSerializable(
-                node.getInstanceIdentifierValue());
-        } else if(node.getIntValueType() == ValueType.BITS_TYPE.ordinal()){
-            return new HashSet(node.getBitsValueList());
+    public static Object deSerialize(QNameDeSerializationContext context,
+            NormalizedNodeMessages.Node node) {
+        if (node.getIntValueType() == ValueType.YANG_IDENTIFIER_TYPE.ordinal()) {
+            return InstanceIdentifierUtils.fromSerializable(node.getInstanceIdentifierValue(), context);
+        } else if (node.getIntValueType() == ValueType.BITS_TYPE.ordinal()) {
+            return new HashSet<>(node.getBitsValueList());
+        } else if (node.getIntValueType() == ValueType.BINARY_TYPE.ordinal()) {
+            return node.getBytesValue().toByteArray();
         }
         return deSerializeBasicTypes(node.getIntValueType(), node.getValue());
     }
 
-    public static Object deSerialize(
-        NormalizedNodeDeSerializationContext context,
-        NormalizedNodeMessages.PathArgumentAttribute attribute) {
+    public static Object deSerialize(QNameDeSerializationContext context,
+            NormalizedNodeMessages.PathArgumentAttribute attribute) {
+
+        if (attribute.getType() == ValueType.YANG_IDENTIFIER_TYPE.ordinal()) {
+            return InstanceIdentifierUtils.fromSerializable(attribute.getInstanceIdentifierValue(), context);
+        } else if (attribute.getType() == ValueType.BITS_TYPE.ordinal()) {
+            return new HashSet<>(attribute.getBitsValueList());
+        } else if (attribute.getType() == ValueType.BINARY_TYPE.ordinal()) {
+            return attribute.getBytesValue().toByteArray();
+        }
         return deSerializeBasicTypes(attribute.getType(), attribute.getValue());
     }
 
 
     private static Object deSerializeBasicTypes(int valueType, String value) {
-        switch(ValueType.values()[valueType]){
-           case SHORT_TYPE: {
-               return Short.valueOf(value);
-           }
-           case BOOL_TYPE: {
-               return Boolean.valueOf(value);
-           }
-           case BYTE_TYPE: {
-               return Byte.valueOf(value);
-           }
-           case INT_TYPE : {
-                return Integer.valueOf(value);
-           }
-           case LONG_TYPE: {
-               return Long.valueOf(value);
-           }
-           case QNAME_TYPE: {
-               return QNameFactory.create(value);
-           }
-           case BIG_INTEGER_TYPE: {
-               return new BigInteger(value);
-           }
-           case BIG_DECIMAL_TYPE: {
-               return new BigDecimal(value);
-           }
-           default: {
-               return value;
-           }
-        }
+        return ValueType.values()[valueType].deserialize(value);
     }
 
 }