1 package org.opendaylight.controller.cluster.datastore.node.utils;
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;
10 import java.util.HashMap;
12 import java.util.regex.Matcher;
13 import java.util.regex.Pattern;
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;
22 public NodeIdentifierWithPredicatesGenerator(String id, DataSchemaNode schemaNode){
24 matcher = pattern.matcher(this.id);
25 doesMatch = matcher.matches();
27 if(schemaNode instanceof ListSchemaNode){
28 this.listSchemaNode = (ListSchemaNode) schemaNode;
30 this.listSchemaNode = null;
35 public boolean matches(){
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<>();
44 for(String keyValue : keyValues){
45 int eqIndex = keyValue.lastIndexOf('=');
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);
56 return new YangInstanceIdentifier.NodeIdentifierWithPredicates(QNameFactory.create(matcher.group(1)), nameValues);
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);