2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.controller.netconf.confignetconfconnector.operations.runtimerpc;
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;
18 import javax.management.ObjectName;
19 import java.util.HashMap;
21 import java.util.regex.Matcher;
22 import java.util.regex.Pattern;
25 * Represents parsed xpath to runtime bean instance
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;
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;
43 public String getModuleName() {
47 public String getInstanceName() {
51 public String getNamespace() {
55 public String getRuntimeBeanName() {
56 return runtimeBeanName;
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));
68 return ObjectNameUtil.createRuntimeBeanName(moduleName, instanceName, additionalAttributesJavaNames);
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);
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);
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))
93 matcher = additionalPattern.matcher(additionalKeyValue);
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));
104 return new RuntimeRpcElementResolved(namespace, moduleName, instanceName, runtimeBeanYangName,
105 additionalAttributes);