1 package org.opendaylight.controller.sal.binding.dom.serializer.impl
3 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
4 import org.opendaylight.controller.sal.binding.dom.serializer.api.CodecRegistry
5 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument
6 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem
7 import org.opendaylight.yangtools.yang.common.QName
8 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.Item
10 import java.util.WeakHashMap
11 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier
12 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates
13 import java.util.ArrayList
14 import org.opendaylight.controller.sal.binding.dom.serializer.api.InstanceIdentifierCodec
15 import org.opendaylight.controller.sal.binding.dom.serializer.api.ValueWithQName
16 import java.util.HashMap
17 import org.slf4j.LoggerFactory
19 import org.opendaylight.yangtools.yang.binding.DataObject
20 import org.opendaylight.controller.sal.binding.dom.serializer.api.IdentifierCodec
21 import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl
22 import org.opendaylight.yangtools.yang.data.api.Node
23 import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl
24 import org.opendaylight.yangtools.yang.data.api.CompositeNode
26 class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec {
28 private static val LOG = LoggerFactory.getLogger(InstanceIdentifierCodecImpl);
29 val CodecRegistry codecRegistry;
31 val Map<Class<?>,QName> classToQName = new WeakHashMap;
34 public new(CodecRegistry registry) {
35 codecRegistry = registry;
39 override deserialize(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier input) {
40 var Class<?> baType = null
41 val biArgs = input.path
42 val scannedPath = new ArrayList<QName>(biArgs.size);
43 val baArgs = new ArrayList<org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument>(biArgs.size)
45 scannedPath.add(biArg.nodeType);
46 val baArg = deserializePathArgument(biArg,scannedPath)
50 val ret = new InstanceIdentifier(baArgs,baType as Class<? extends DataObject>);
54 private def dispatch org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument deserializePathArgument(NodeIdentifier argument,List<QName> processedPath) {
55 val Class cls = codecRegistry.getClassForPath(processedPath);
60 private def dispatch org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument deserializePathArgument(NodeIdentifierWithPredicates argument,List<QName> processedPath) {
61 val Class type = codecRegistry.getClassForPath(processedPath);
62 val IdentifierCodec codec = codecRegistry.getIdentifierCodecForIdentifiable(type);
63 val value = codec.deserialize(argument.toCompositeNode())?.value;
64 return CodecTypeUtils.newIdentifiableItem(type,value);
67 def CompositeNode toCompositeNode(NodeIdentifierWithPredicates predicates) {
68 val keyValues = predicates.keyValues.entrySet;
69 val values = new ArrayList<Node<?>>(keyValues.size)
70 for(keyValue : keyValues) {
71 values.add(new SimpleNodeTOImpl(keyValue.key,null,keyValue.value))
73 return new CompositeNodeTOImpl(predicates.nodeType,null,values);
76 override serialize(InstanceIdentifier input) {
77 val pathArgs = input.path as List<org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument>
78 var QName previousQName = null;
79 val components = new ArrayList<PathArgument>(pathArgs.size);
80 for(baArg : pathArgs) {
81 codecRegistry.bindingClassEncountered(baArg.type);
82 val biArg = serializePathArgument(baArg,previousQName);
83 previousQName = biArg.nodeType;
84 components.add(biArg);
86 return new org.opendaylight.yangtools.yang.data.api.InstanceIdentifier(components);
89 private def dispatch PathArgument serializePathArgument(Item argument, QName previousQname) {
90 val type = argument.type;
91 val qname = resolveQname(type);
92 if(previousQname == null) {
93 return new NodeIdentifier(qname);
95 return new NodeIdentifier(QName.create(previousQname,qname.localName));
98 @SuppressWarnings("rawtypes")
99 private def dispatch PathArgument serializePathArgument(IdentifiableItem argument, QName previousQname) {
100 val Map<QName,Object> predicates = new HashMap();
101 val type = argument.type;
102 val keyCodec = codecRegistry.getIdentifierCodecForIdentifiable(type);
103 val qname = resolveQname(type);
104 val combinedInput = new ValueWithQName(previousQname,argument.key)
105 val compositeOutput = keyCodec.serialize(combinedInput as ValueWithQName);
106 for(outputValue :compositeOutput.value) {
107 predicates.put(outputValue.nodeType,outputValue.value);
109 if(previousQname == null) {
110 return new NodeIdentifierWithPredicates(qname,predicates);
112 return new NodeIdentifierWithPredicates(QName.create(previousQname,qname.localName),predicates);
115 def resolveQname(Class<?> class1) {
116 val qname = classToQName.get(class1);
120 val qnameField = class1.getField("QNAME");
121 val qnameValue = qnameField.get(null) as QName;
122 classToQName.put(class1,qnameValue);