Merge "Fixed for bug 1197"
[controller.git] / opendaylight / md-sal / sal-protocolbuffer-encoding / src / main / java / org / opendaylight / controller / cluster / datastore / node / utils / NodeIdentifierWithPredicatesGenerator.java
1 package org.opendaylight.controller.cluster.datastore.node.utils;
2
3 import org.opendaylight.yangtools.yang.common.QName;
4 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
5 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
6 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
7 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
8 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
9
10 import java.util.HashMap;
11 import java.util.Map;
12 import java.util.regex.Matcher;
13 import java.util.regex.Pattern;
14
15 public class NodeIdentifierWithPredicatesGenerator{
16     private final String id;
17     private static final Pattern pattern = Pattern.compile("(.*)\\Q[{\\E(.*)\\Q}]\\E");
18     private final Matcher matcher;
19     private final boolean doesMatch;
20     private final ListSchemaNode listSchemaNode;
21
22     public NodeIdentifierWithPredicatesGenerator(String id, DataSchemaNode schemaNode){
23         this.id = id;
24         matcher = pattern.matcher(this.id);
25         doesMatch = matcher.matches();
26
27         if(schemaNode instanceof  ListSchemaNode){
28             this.listSchemaNode = (ListSchemaNode) schemaNode;
29         } else {
30             this.listSchemaNode = null;
31         }
32     }
33
34
35     public boolean matches(){
36         return doesMatch;
37     }
38
39     public YangInstanceIdentifier.NodeIdentifierWithPredicates getPathArgument(){
40         final String group = matcher.group(2);
41         final String[] keyValues = group.split(",");
42         Map<QName, Object> nameValues = new HashMap<>();
43
44         for(String keyValue : keyValues){
45             int eqIndex = keyValue.lastIndexOf('=');
46             try {
47                 final QName key = QNameFactory
48                     .create(keyValue.substring(0, eqIndex));
49                 nameValues.put(key, getValue(key, keyValue.substring(eqIndex + 1)));
50             } catch(IllegalArgumentException e){
51                 System.out.println("Error processing identifier : " + id);
52                 throw e;
53             }
54         }
55
56         return new YangInstanceIdentifier.NodeIdentifierWithPredicates(QNameFactory.create(matcher.group(1)), nameValues);
57     }
58
59
60     private Object getValue(QName key, String value){
61         if(listSchemaNode != null){
62             for(DataSchemaNode node : listSchemaNode.getChildNodes()){
63                 if(node instanceof LeafSchemaNode && node.getQName().equals(key)){
64                     return TypeDefinitionAwareCodec.from(LeafSchemaNode.class.cast(node).getType()).deserialize(value);
65                 }
66             }
67         }
68         return value;
69     }
70 }