/* * Copyright (c) 2014 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.cluster.datastore.node.utils.serialization; 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; public class ValueSerializer { private static final String NULL_VALUE = ""; public static void serialize(NormalizedNodeMessages.Node.Builder builder, QNameSerializationContext context, Object value) { builder.setIntValueType(ValueType.getSerializableType(value).ordinal()); 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 void serialize(NormalizedNodeMessages.PathArgumentAttribute.Builder builder, QNameSerializationContext context, Object value){ builder.setType(ValueType.getSerializableType(value).ordinal()); 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(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(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) { return ValueType.values()[valueType].deserialize(value); } }