X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fbinding%2Fdom%2Fserializer%2Fimpl%2FInstanceIdentifierCodecImpl.xtend;h=d9103727b2debc5e066a34380b7caef2d9f2e8a4;hp=270660980643cfa6e58a1bcc5fc7aeff856fc584;hb=4142ab5dce3021e6f6551aada26c7523cd134844;hpb=a87db38d47967eae159c5be17ab334bb6a4edffc diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/InstanceIdentifierCodecImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/InstanceIdentifierCodecImpl.xtend index 2706609806..d9103727b2 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/InstanceIdentifierCodecImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/InstanceIdentifierCodecImpl.xtend @@ -22,14 +22,18 @@ import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl import org.opendaylight.yangtools.yang.data.api.Node import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl import org.opendaylight.yangtools.yang.data.api.CompositeNode +import org.opendaylight.yangtools.yang.binding.Augmentable +import com.google.common.collect.ImmutableList +import org.opendaylight.yangtools.yang.binding.Augmentation +import java.util.concurrent.ConcurrentHashMap +import org.opendaylight.yangtools.yang.binding.util.BindingReflections class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec { private static val LOG = LoggerFactory.getLogger(InstanceIdentifierCodecImpl); val CodecRegistry codecRegistry; - val Map,QName> classToQName = new WeakHashMap; - + val Map, Map, Class>> classToPreviousAugment = new WeakHashMap; public new(CodecRegistry registry) { codecRegistry = registry; @@ -44,10 +48,18 @@ class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec { for(biArg : biArgs) { scannedPath.add(biArg.nodeType); val baArg = deserializePathArgument(biArg,scannedPath) - baArgs.add(baArg) baType = baArg?.type + val injectAugment = classToPreviousAugment.get(baType); + if(injectAugment != null) { + val augment = injectAugment.get(scannedPath) as Class; + if(augment != null) { + baArgs.add(new Item(augment)); + } + } + baArgs.add(baArg) } val ret = new InstanceIdentifier(baArgs,baType as Class); + LOG.debug("DOM Instance Identifier {} deserialized to {}",input,ret); return ret; } @@ -74,21 +86,46 @@ class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec { } override serialize(InstanceIdentifier input) { + var Class previousAugmentation = null val pathArgs = input.path as List var QName previousQName = null; val components = new ArrayList(pathArgs.size); + val qnamePath = new ArrayList(pathArgs.size); for(baArg : pathArgs) { - codecRegistry.bindingClassEncountered(baArg.type); - val biArg = serializePathArgument(baArg,previousQName); - previousQName = biArg.nodeType; - components.add(biArg); + + if(!Augmentation.isAssignableFrom(baArg.type)) { + + val biArg = serializePathArgument(baArg,previousQName); + previousQName = biArg.nodeType; + components.add(biArg); + qnamePath.add(biArg.nodeType); + val immutableList = ImmutableList.copyOf(qnamePath); + codecRegistry.putPathToClass(immutableList,baArg.type); + if(previousAugmentation !== null) { + updateAugmentationInjection(baArg.type,immutableList,previousAugmentation) + } + + previousAugmentation = null; + } else { + previousQName = codecRegistry.getQNameForAugmentation(baArg.type as Class); + previousAugmentation = baArg.type; + } + } + val ret = new org.opendaylight.yangtools.yang.data.api.InstanceIdentifier(components); + LOG.debug("Binding Instance Identifier {} serialized to DOM InstanceIdentifier {}",input,ret); + return ret; + } + + def updateAugmentationInjection(Class class1, ImmutableList list, Class augmentation) { + if(classToPreviousAugment.get(class1) == null) { + classToPreviousAugment.put(class1,new ConcurrentHashMap()); } - return new org.opendaylight.yangtools.yang.data.api.InstanceIdentifier(components); + classToPreviousAugment.get(class1).put(list,augmentation); } private def dispatch PathArgument serializePathArgument(Item argument, QName previousQname) { val type = argument.type; - val qname = resolveQname(type); + val qname = BindingReflections.findQName(type); if(previousQname == null) { return new NodeIdentifier(qname); } @@ -100,7 +137,7 @@ class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec { val Map predicates = new HashMap(); val type = argument.type; val keyCodec = codecRegistry.getIdentifierCodecForIdentifiable(type); - val qname = resolveQname(type); + val qname = BindingReflections.findQName(type); val combinedInput = new ValueWithQName(previousQname,argument.key) val compositeOutput = keyCodec.serialize(combinedInput as ValueWithQName); for(outputValue :compositeOutput.value) { @@ -111,15 +148,4 @@ class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec { } return new NodeIdentifierWithPredicates(QName.create(previousQname,qname.localName),predicates); } - - def resolveQname(Class class1) { - val qname = classToQName.get(class1); - if(qname !== null) { - return qname; - } - val qnameField = class1.getField("QNAME"); - val qnameValue = qnameField.get(null) as QName; - classToQName.put(class1,qnameValue); - return qnameValue; - } } \ No newline at end of file