X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-clustering-commons%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fnode%2Futils%2Fserialization%2FPathArgumentSerializer.java;h=ed9073b5582ad96c5cbc74f7894c24213574ac0d;hb=4e696d9795fe7eef40369c05c340d137394126f3;hp=d7627c008eb9062a76b3540a679706c08c686b07;hpb=9fa1be3b065c88dc97f7314d3a8eeb038efbabf5;p=controller.git diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/serialization/PathArgumentSerializer.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/serialization/PathArgumentSerializer.java index d7627c008e..ed9073b558 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/serialization/PathArgumentSerializer.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/serialization/PathArgumentSerializer.java @@ -8,27 +8,30 @@ package org.opendaylight.controller.cluster.datastore.node.utils.serialization; -import com.google.common.base.Preconditions; -import org.opendaylight.controller.cluster.datastore.node.utils.NodeIdentifierFactory; -import org.opendaylight.controller.cluster.datastore.node.utils.QNameFactory; -import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.PathArgumentType.getSerializablePathArgumentType; +import com.google.common.base.Preconditions; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; - -import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.PathArgumentType.getSerializablePathArgumentType; +import org.opendaylight.controller.cluster.datastore.node.utils.NodeIdentifierFactory; +import org.opendaylight.controller.cluster.datastore.node.utils.QNameFactory; +import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; public class PathArgumentSerializer { - private static final Map pathArgumentAttributesGetters = new HashMap<>(); + private static final String REVISION_ARG = "?revision="; + private static final Map, PathArgumentAttributesGetter> PATH_ARGUMENT_ATTRIBUTES_GETTERS = new HashMap<>(); - public static NormalizedNodeMessages.PathArgument serialize(NormalizedNodeSerializationContext context, YangInstanceIdentifier.PathArgument pathArgument){ + public static NormalizedNodeMessages.PathArgument serialize(QNameSerializationContext context, + YangInstanceIdentifier.PathArgument pathArgument) { Preconditions.checkNotNull(context, "context should not be null"); Preconditions.checkNotNull(pathArgument, "pathArgument should not be null"); @@ -51,7 +54,8 @@ public class PathArgumentSerializer { } - public static YangInstanceIdentifier.PathArgument deSerialize(NormalizedNodeDeSerializationContext context, NormalizedNodeMessages.PathArgument pathArgument){ + public static YangInstanceIdentifier.PathArgument deSerialize(QNameDeSerializationContext context, + NormalizedNodeMessages.PathArgument pathArgument) { Preconditions.checkNotNull(context, "context should not be null"); Preconditions.checkNotNull(pathArgument, "pathArgument should not be null"); @@ -59,97 +63,62 @@ public class PathArgumentSerializer { } - private static interface PathArgumentAttributesGetter { - Iterable get(NormalizedNodeSerializationContext context, - YangInstanceIdentifier.PathArgument pathArgument); + private interface PathArgumentAttributesGetter { + Iterable get( + QNameSerializationContext context, YangInstanceIdentifier.PathArgument pathArgument); } static { - pathArgumentAttributesGetters.put(YangInstanceIdentifier.NodeWithValue.class, new PathArgumentAttributesGetter() { - @Override - public Iterable get( - NormalizedNodeSerializationContext context, - YangInstanceIdentifier.PathArgument pathArgument) { - List attributes = - new ArrayList<>(); - - YangInstanceIdentifier.NodeWithValue identifier - = (YangInstanceIdentifier.NodeWithValue) pathArgument; - - NormalizedNodeMessages.PathArgumentAttribute attribute = - buildAttribute(context, null, identifier.getValue()); + PATH_ARGUMENT_ATTRIBUTES_GETTERS.put(YangInstanceIdentifier.NodeWithValue.class, (context, pathArgument) -> { + YangInstanceIdentifier.NodeWithValue identifier = (YangInstanceIdentifier.NodeWithValue) pathArgument; - attributes.add(attribute); + NormalizedNodeMessages.PathArgumentAttribute attribute = buildAttribute(context, null, + identifier.getValue()); - return attributes; - - } + return Arrays.asList(attribute); }); - pathArgumentAttributesGetters.put(YangInstanceIdentifier.NodeIdentifierWithPredicates.class, new PathArgumentAttributesGetter() { - @Override - public Iterable get( - NormalizedNodeSerializationContext context, - YangInstanceIdentifier.PathArgument pathArgument) { + PATH_ARGUMENT_ATTRIBUTES_GETTERS.put(YangInstanceIdentifier.NodeIdentifierWithPredicates.class, + (context, pathArgument) -> { + YangInstanceIdentifier.NodeIdentifierWithPredicates identifier = + (YangInstanceIdentifier.NodeIdentifierWithPredicates) pathArgument; - List attributes = - new ArrayList<>(); - - YangInstanceIdentifier.NodeIdentifierWithPredicates identifier - = (YangInstanceIdentifier.NodeIdentifierWithPredicates) pathArgument; - - for (QName key : identifier.getKeyValues().keySet()) { - Object value = identifier.getKeyValues().get(key); - NormalizedNodeMessages.PathArgumentAttribute attribute = - buildAttribute(context, key, value); + Map keyValues = identifier.getKeyValues(); + List attributes = new ArrayList<>(keyValues.size()); + for (Entry e : keyValues.entrySet()) { + NormalizedNodeMessages.PathArgumentAttribute attribute = buildAttribute(context, e.getKey(), + e.getValue()); attributes.add(attribute); - } return attributes; + }); - } - }); - - pathArgumentAttributesGetters.put(YangInstanceIdentifier.AugmentationIdentifier.class, new PathArgumentAttributesGetter() { - @Override - public Iterable get( - NormalizedNodeSerializationContext context, - YangInstanceIdentifier.PathArgument pathArgument) { + PATH_ARGUMENT_ATTRIBUTES_GETTERS.put(YangInstanceIdentifier.AugmentationIdentifier.class, + (context, pathArgument) -> { + YangInstanceIdentifier.AugmentationIdentifier identifier = + (YangInstanceIdentifier.AugmentationIdentifier) pathArgument; - List attributes = - new ArrayList<>(); - - YangInstanceIdentifier.AugmentationIdentifier identifier - = (YangInstanceIdentifier.AugmentationIdentifier) pathArgument; - - for (QName key : identifier.getPossibleChildNames()) { + Set possibleChildNames = identifier.getPossibleChildNames(); + List attributes = new ArrayList<>( + possibleChildNames.size()); + for (QName key : possibleChildNames) { Object value = key; - NormalizedNodeMessages.PathArgumentAttribute attribute = - buildAttribute(context, key, value); + NormalizedNodeMessages.PathArgumentAttribute attribute = buildAttribute(context, key, value); attributes.add(attribute); - } return attributes; + }); - } - }); - - - pathArgumentAttributesGetters.put(YangInstanceIdentifier.NodeIdentifier.class, new PathArgumentAttributesGetter() { - @Override - public Iterable get( - NormalizedNodeSerializationContext context, - YangInstanceIdentifier.PathArgument pathArgument) { - return Collections.emptyList(); - } - }); + PATH_ARGUMENT_ATTRIBUTES_GETTERS.put(YangInstanceIdentifier.NodeIdentifier.class, + (context, pathArgument) -> Collections.emptyList()); } - private static NormalizedNodeMessages.PathArgumentAttribute buildAttribute(NormalizedNodeSerializationContext context,QName name, Object value){ + private static NormalizedNodeMessages.PathArgumentAttribute buildAttribute( + QNameSerializationContext context, QName name, Object value) { NormalizedNodeMessages.PathArgumentAttribute.Builder builder = NormalizedNodeMessages.PathArgumentAttribute.newBuilder(); @@ -160,78 +129,65 @@ public class PathArgumentSerializer { } - private static NormalizedNodeMessages.QName.Builder encodeQName(NormalizedNodeSerializationContext context, QName qName){ - if(qName == null){ + private static NormalizedNodeMessages.QName.Builder encodeQName(QNameSerializationContext context, QName qname) { + if (qname == null) { return NormalizedNodeMessages.QName.getDefaultInstance().toBuilder(); } - NormalizedNodeMessages.QName.Builder qNameBuilder = - NormalizedNodeMessages.QName.newBuilder(); + NormalizedNodeMessages.QName.Builder qnameBuilder = NormalizedNodeMessages.QName.newBuilder(); - qNameBuilder.setNamespace(context.addNamespace(qName.getNamespace())); + qnameBuilder.setNamespace(context.addNamespace(qname.getNamespace())); - qNameBuilder.setRevision(context.addRevision(qName.getRevision())); + qnameBuilder.setRevision(context.addRevision(qname.getRevision())); - qNameBuilder.setLocalName(context.addLocalName(qName.getLocalName())); + qnameBuilder.setLocalName(context.addLocalName(qname.getLocalName())); - return qNameBuilder; + return qnameBuilder; } private static Iterable getPathArgumentAttributes( - NormalizedNodeSerializationContext context, - YangInstanceIdentifier.PathArgument pathArgument) { - - return pathArgumentAttributesGetters.get(pathArgument.getClass()).get(context, pathArgument); + QNameSerializationContext context, YangInstanceIdentifier.PathArgument pathArgument) { + return PATH_ARGUMENT_ATTRIBUTES_GETTERS.get(pathArgument.getClass()).get(context, pathArgument); } - private static String qNameToString(NormalizedNodeDeSerializationContext context, - NormalizedNodeMessages.QName qName){ + private static String qNameToString(QNameDeSerializationContext context, NormalizedNodeMessages.QName qname) { // If this serializer is used qName cannot be null (see encodeQName) // adding null check only in case someone tried to deSerialize a protocol buffer node // that was not serialized using the PathArgumentSerializer - Preconditions.checkNotNull(qName, "qName should not be null"); - Preconditions.checkArgument(!"".equals(qName.getLocalName()), - "qName.localName cannot be empty qName = " + qName.toString()); - Preconditions.checkArgument(qName.getNamespace() != -1, "qName.namespace should be valid"); - - StringBuilder sb = new StringBuilder(); - String namespace = context.getNamespace(qName.getNamespace()); - String revision = ""; - String localName = context.getLocalName(qName.getLocalName()); - if(qName.getRevision() != -1){ - revision = context.getRevision(qName.getRevision()); - sb.append("(").append(namespace).append("?revision=").append( - revision).append(")").append( - localName); +// Preconditions.checkNotNull(qName, "qName should not be null"); +// Preconditions.checkArgument(qName.getNamespace() != -1, "qName.namespace should be valid"); + + String namespace = context.getNamespace(qname.getNamespace()); + String localName = context.getLocalName(qname.getLocalName()); + StringBuilder sb; + if (qname.getRevision() != -1) { + String revision = context.getRevision(qname.getRevision()); + sb = new StringBuilder(namespace.length() + REVISION_ARG.length() + revision.length() + + localName.length() + 2); + sb.append('(').append(namespace).append(REVISION_ARG).append( + revision).append(')').append(localName); } else { - sb.append("(").append(namespace).append(")").append( - localName); + sb = new StringBuilder(namespace.length() + localName.length() + 2); + sb.append('(').append(namespace).append(')').append(localName); } return sb.toString(); - } /** - * Parse a protocol buffer PathArgument and return an MD-SAL PathArgument + * Parse a protocol buffer PathArgument and return an MD-SAL PathArgument. * * @param pathArgument protocol buffer PathArgument * @return MD-SAL PathArgument */ private static YangInstanceIdentifier.PathArgument parsePathArgument( - NormalizedNodeDeSerializationContext context, - NormalizedNodeMessages.PathArgument pathArgument) { + QNameDeSerializationContext context, NormalizedNodeMessages.PathArgument pathArgument) { - Preconditions.checkArgument(pathArgument.getIntType() >= 0 - && pathArgument.getIntType() < PathArgumentType.values().length, - "Illegal PathArgumentType " + pathArgument.getIntType()); - - switch(PathArgumentType.values()[pathArgument.getIntType()]){ + switch (PathArgumentType.values()[pathArgument.getIntType()]) { case NODE_IDENTIFIER_WITH_VALUE : { - - YangInstanceIdentifier.NodeWithValue nodeWithValue = - new YangInstanceIdentifier.NodeWithValue( + YangInstanceIdentifier.NodeWithValue nodeWithValue = + new YangInstanceIdentifier.NodeWithValue<>( QNameFactory.create(qNameToString(context, pathArgument.getNodeType())), parseAttribute(context, pathArgument.getAttribute(0))); @@ -239,7 +195,6 @@ public class PathArgumentSerializer { } case NODE_IDENTIFIER_WITH_PREDICATES : { - YangInstanceIdentifier.NodeIdentifierWithPredicates nodeIdentifierWithPredicates = new YangInstanceIdentifier.NodeIdentifierWithPredicates( @@ -250,14 +205,13 @@ public class PathArgumentSerializer { } case AUGMENTATION_IDENTIFIER: { + Set qnameSet = new HashSet<>(); - Set qNameSet = new HashSet<>(); - - for(NormalizedNodeMessages.PathArgumentAttribute attribute : pathArgument.getAttributeList()){ - qNameSet.add(QNameFactory.create(qNameToString(context, attribute.getName()))); + for (NormalizedNodeMessages.PathArgumentAttribute attribute : pathArgument.getAttributeList()) { + qnameSet.add(QNameFactory.create(qNameToString(context, attribute.getName()))); } - return new YangInstanceIdentifier.AugmentationIdentifier(qNameSet); + return new YangInstanceIdentifier.AugmentationIdentifier(qnameSet); } default: { @@ -269,23 +223,31 @@ public class PathArgumentSerializer { } private static Map toAttributesMap( - NormalizedNodeDeSerializationContext context, - List attributesList) { - - Map map = new HashMap<>(); + QNameDeSerializationContext context, + List attributesList) { - for(NormalizedNodeMessages.PathArgumentAttribute attribute : attributesList){ + Map map; + if (attributesList.size() == 1) { + NormalizedNodeMessages.PathArgumentAttribute attribute = attributesList.get(0); NormalizedNodeMessages.QName name = attribute.getName(); Object value = parseAttribute(context, attribute); + map = Collections.singletonMap(QNameFactory.create(qNameToString(context, name)), value); + } else { + map = new HashMap<>(); - map.put(QNameFactory.create(qNameToString(context, name)), value); + for (NormalizedNodeMessages.PathArgumentAttribute attribute : attributesList) { + NormalizedNodeMessages.QName name = attribute.getName(); + Object value = parseAttribute(context, attribute); + + map.put(QNameFactory.create(qNameToString(context, name)), value); + } } return map; } - private static Object parseAttribute(NormalizedNodeDeSerializationContext context, NormalizedNodeMessages.PathArgumentAttribute attribute){ + private static Object parseAttribute(QNameDeSerializationContext context, + NormalizedNodeMessages.PathArgumentAttribute attribute) { return ValueSerializer.deSerialize(context, attribute); } - }