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
class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec {
val CodecRegistry codecRegistry;
val Map<Class<?>,QName> classToQName = new WeakHashMap;
-
+ val Map<Class<?>, Map<List<QName>, Class<?>>> classToPreviousAugment = new WeakHashMap;
public new(CodecRegistry registry) {
codecRegistry = registry;
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<? extends DataObject>;
+ if(augment != null) {
+ baArgs.add(new Item(augment));
+ }
+ }
+ baArgs.add(baArg)
}
val ret = new InstanceIdentifier(baArgs,baType as Class<? extends DataObject>);
return ret;
}
override serialize(InstanceIdentifier input) {
+ var Class<?> previousAugmentation = null
val pathArgs = input.path as List<org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument>
var QName previousQName = null;
val components = new ArrayList<PathArgument>(pathArgs.size);
+ val qnamePath = new ArrayList<QName>(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 = resolveQname(baArg.type);
+ previousAugmentation = baArg.type;
+ }
}
return new org.opendaylight.yangtools.yang.data.api.InstanceIdentifier(components);
}
+ def updateAugmentationInjection(Class<? extends DataObject> class1, ImmutableList<QName> list, Class<?> augmentation) {
+ if(classToPreviousAugment.get(class1) == null) {
+ classToPreviousAugment.put(class1,new ConcurrentHashMap());
+ }
+ classToPreviousAugment.get(class1).put(list,augmentation);
+ }
+
private def dispatch PathArgument serializePathArgument(Item argument, QName previousQname) {
val type = argument.type;
val qname = resolveQname(type);
return new NodeIdentifier(QName.create(previousQname,qname.localName));
}
+ @SuppressWarnings("rawtypes")
private def dispatch PathArgument serializePathArgument(IdentifiableItem argument, QName previousQname) {
val Map<QName,Object> predicates = new HashMap();
val type = argument.type;
return new NodeIdentifierWithPredicates(QName.create(previousQname,qname.localName),predicates);
}
- def resolveQname(Class class1) {
+ def resolveQname(Class<?> class1) {
val qname = classToQName.get(class1);
if(qname !== null) {
return qname;