Merge "Null data from XML"
[controller.git] / opendaylight / netconf / config-netconf-connector / src / main / java / org / opendaylight / controller / netconf / confignetconfconnector / operations / runtimerpc / RuntimeRpcElementResolved.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.netconf.confignetconfconnector.operations.runtimerpc;
10
11 import com.google.common.base.Preconditions;
12 import com.google.common.base.Strings;
13 import com.google.common.collect.Maps;
14 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
15 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.rpc.ModuleRpcs;
16 import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants;
17
18 import javax.management.ObjectName;
19 import java.util.HashMap;
20 import java.util.Map;
21 import java.util.regex.Matcher;
22 import java.util.regex.Pattern;
23
24 /**
25  * Represents parsed xpath to runtime bean instance
26  */
27 public final class RuntimeRpcElementResolved {
28     private final String moduleName;
29     private final String instanceName;
30     private final String namespace;
31     private final String runtimeBeanName;
32     private final Map<String, String> additionalAttributes;
33
34     private RuntimeRpcElementResolved(String namespace, String moduleName, String instanceName, String runtimeBeanName,
35             Map<String, String> additionalAttributes) {
36         this.moduleName = moduleName;
37         this.instanceName = instanceName;
38         this.additionalAttributes = additionalAttributes;
39         this.namespace = namespace;
40         this.runtimeBeanName = runtimeBeanName;
41     }
42
43     public String getModuleName() {
44         return moduleName;
45     }
46
47     public String getInstanceName() {
48         return instanceName;
49     }
50
51     public String getNamespace() {
52         return namespace;
53     }
54
55     public String getRuntimeBeanName() {
56         return runtimeBeanName;
57     }
58
59     public ObjectName getObjectName(ModuleRpcs rpcMapping) {
60         Map<String, String> additionalAttributesJavaNames = Maps
61                 .newHashMapWithExpectedSize(additionalAttributes.size());
62         for (String attributeYangName : additionalAttributes.keySet()) {
63             String attributeJavaName = rpcMapping.getRbeJavaName(attributeYangName);
64             Preconditions.checkState(attributeJavaName != null,
65                     "Cannot find java name for runtime bean wtih yang name %s", attributeYangName);
66             additionalAttributesJavaNames.put(attributeJavaName, additionalAttributes.get(attributeYangName));
67         }
68         return ObjectNameUtil.createRuntimeBeanName(moduleName, instanceName, additionalAttributesJavaNames);
69     }
70
71     private static final String xpathPatternBlueprint = "/" + XmlNetconfConstants.DATA_KEY + "/"
72             + XmlNetconfConstants.MODULES_KEY + "/" + XmlNetconfConstants.MODULE_KEY + "\\["
73             + XmlNetconfConstants.NAME_KEY + "='(.+)'\\]/" + XmlNetconfConstants.INSTANCE_KEY + "\\["
74             + XmlNetconfConstants.NAME_KEY + "='([^']+)'\\](.*)";
75     private static final Pattern xpathPattern = Pattern.compile(xpathPatternBlueprint);
76     private static final String additionalPatternBlueprint = "(.+)\\[(.+)='(.+)'\\]";
77     private static final Pattern additionalPattern = Pattern.compile(additionalPatternBlueprint);
78
79     public static RuntimeRpcElementResolved fromXpath(String xpath, String elementName, String namespace) {
80         Matcher matcher = xpathPattern.matcher(xpath);
81         Preconditions.checkState(matcher.matches(),
82                 "Node %s with value '%s' not in required form on rpc element %s, required format is %s",
83                 RuntimeRpc.CONTEXT_INSTANCE, xpath, elementName, xpathPatternBlueprint);
84
85         String moduleName = matcher.group(1);
86         String instanceName = matcher.group(2);
87         String additionalString = matcher.group(3);
88         HashMap<String, String> additionalAttributes = Maps.<String, String> newHashMap();
89         String runtimeBeanYangName = moduleName;
90         for (String additionalKeyValue : additionalString.split("/")) {
91             if (Strings.isNullOrEmpty(additionalKeyValue))
92                 continue;
93             matcher = additionalPattern.matcher(additionalKeyValue);
94             Preconditions
95                     .checkState(
96                             matcher.matches(),
97                             "Attribute %s not in required form on rpc element %s, required format for additional attributes is  %s",
98                             additionalKeyValue, elementName, additionalPatternBlueprint);
99             String name = matcher.group(1);
100             runtimeBeanYangName = name;
101             additionalAttributes.put(name, matcher.group(3));
102         }
103
104         return new RuntimeRpcElementResolved(namespace, moduleName, instanceName, runtimeBeanYangName,
105                 additionalAttributes);
106     }
107 }