X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfig%2Fconfig-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fapi%2Fjmx%2FObjectNameUtil.java;h=3b7858c4771c3419f2958415a2e852865f27d851;hp=cc1d89761c2ef8784b6f79019101fa76a21361c1;hb=f43b01b81319959b1907e3e04537f5169e7f33d8;hpb=404d4fc52adf17bad6b53aaeedf59d1db85780bc diff --git a/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/jmx/ObjectNameUtil.java b/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/jmx/ObjectNameUtil.java index cc1d89761c..3b7858c477 100644 --- a/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/jmx/ObjectNameUtil.java +++ b/opendaylight/config/config-api/src/main/java/org/opendaylight/controller/config/api/jmx/ObjectNameUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2013, 2017 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, @@ -7,11 +7,6 @@ */ package org.opendaylight.controller.config.api.jmx; -import org.opendaylight.controller.config.api.ModuleIdentifier; -import org.opendaylight.controller.config.api.jmx.constants.ConfigRegistryConstants; - -import javax.annotation.concurrent.ThreadSafe; -import javax.management.ObjectName; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -19,96 +14,156 @@ import java.util.Hashtable; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import javax.annotation.concurrent.ThreadSafe; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; +import org.opendaylight.controller.config.api.ModuleIdentifier; +import org.opendaylight.controller.config.api.jmx.constants.ConfigRegistryConstants; /** * Provides ObjectName creation. Each created ObjectName consists of domain that * is defined as {@link #ON_DOMAIN} and at least one key-value pair. The only * mandatory property is {@link #TYPE_KEY}. All transaction related mbeans have * {@link #TRANSACTION_NAME_KEY} property set. - * */ @ThreadSafe -public class ObjectNameUtil { +public final class ObjectNameUtil { public static final String ON_DOMAIN = ConfigRegistryConstants.ON_DOMAIN; public static final String MODULE_FACTORY_NAME_KEY = "moduleFactoryName"; + public static final String SERVICE_QNAME_KEY = "serviceQName"; public static final String INSTANCE_NAME_KEY = "instanceName"; public static final String TYPE_KEY = ConfigRegistryConstants.TYPE_KEY; - public static final String TYPE_CONFIG_REGISTRY = ConfigRegistryConstants.TYPE_CONFIG_REGISTRY; public static final String TYPE_CONFIG_TRANSACTION = "ConfigTransaction"; public static final String TYPE_MODULE = "Module"; + public static final String TYPE_SERVICE_REFERENCE = "ServiceReference"; public static final String TYPE_RUNTIME_BEAN = "RuntimeBean"; - public static final String TRANSACTION_NAME_KEY = "TransactionName"; + public static final String REF_NAME_KEY = "RefName"; + private static final String REPLACED_QUOTATION_MARK = "\\?"; + public static final String ON_WILDCARD = "*"; + + private ObjectNameUtil() { + } - public static ObjectName createON(String on) { + public static ObjectName createON(final String on) { try { return new ObjectName(on); - } catch (Exception e) { - throw new RuntimeException(e); + } catch (final MalformedObjectNameException e) { + throw new IllegalArgumentException(e); } } - public static ObjectName createONWithDomainAndType(String type) { - return ConfigRegistryConstants.createONWithDomainAndType(type); - } - - public static ObjectName createON(String name, String key, String value) { + public static ObjectName createON(final String name, final String key, final String value) { return ConfigRegistryConstants.createON(name, key, value); } - public static ObjectName createON(String name, Map attribs) { + public static ObjectName createON(final String domain, final Map attribs) { Hashtable table = new Hashtable<>(attribs); try { - return new ObjectName(name, table); - } catch (Exception e) { - throw new RuntimeException(e); + return new ObjectName(domain, table); + } catch (final MalformedObjectNameException e) { + throw new IllegalArgumentException(e); } } - public static ObjectName createTransactionControllerON( - String transactionName) { + public static ObjectName createONWithDomainAndType(final String type) { + return ConfigRegistryConstants.createONWithDomainAndType(type); + } + + public static ObjectName createTransactionControllerON(final String transactionName) { Map onParams = new HashMap<>(); onParams.put(TRANSACTION_NAME_KEY, transactionName); onParams.put(TYPE_KEY, TYPE_CONFIG_TRANSACTION); return createON(ON_DOMAIN, onParams); } - public static ObjectName createTransactionModuleON(String transactionName, - ModuleIdentifier moduleIdentifier) { - return createTransactionModuleON(transactionName, - moduleIdentifier.getFactoryName(), + public static ObjectName createTransactionModuleON(final String transactionName, + final ModuleIdentifier moduleIdentifier) { + return createTransactionModuleON(transactionName, moduleIdentifier.getFactoryName(), moduleIdentifier.getInstanceName()); } - public static ObjectName createTransactionModuleON(String transactionName, - String moduleName, String instanceName) { - Map onParams = createModuleON(moduleName, instanceName); + public static ObjectName createTransactionModuleON(final String transactionName, final String moduleName, + final String instanceName) { + Map onParams = createModuleMap(moduleName, instanceName); onParams.put(TRANSACTION_NAME_KEY, transactionName); return createON(ON_DOMAIN, onParams); } - public static ObjectName createTransactionModuleON(String transactionName, - ObjectName on) { - return createTransactionModuleON(transactionName, getFactoryName(on), - getInstanceName(on)); + public static ObjectName createTransactionModuleON(final String transactionName, final ObjectName on) { + return createTransactionModuleON(transactionName, getFactoryName(on), getInstanceName(on)); } - public static ObjectName createReadOnlyModuleON( - ModuleIdentifier moduleIdentifier) { - return createReadOnlyModuleON(moduleIdentifier.getFactoryName(), - moduleIdentifier.getInstanceName()); + public static ObjectName createReadOnlyModuleON(final ModuleIdentifier moduleIdentifier) { + return createReadOnlyModuleON(moduleIdentifier.getFactoryName(), moduleIdentifier.getInstanceName()); } - public static ObjectName createReadOnlyModuleON(String moduleName, - String instanceName) { - Map onParams = createModuleON(moduleName, instanceName); + public static ObjectName createReadOnlyModuleON(final String moduleName, final String instanceName) { + Map onParams = createModuleMap(moduleName, instanceName); return createON(ON_DOMAIN, onParams); } - private static Map createModuleON(String moduleName, - String instanceName) { + public static ObjectName createReadOnlyServiceON(final String serviceQName, final String refName) { + Map onParams = createServiceMap(serviceQName, refName); + return createON(ON_DOMAIN, onParams); + } + + public static ObjectName createTransactionServiceON(final String transactionName, final String serviceQName, + final String refName) { + Map onParams = createServiceON(transactionName, serviceQName, refName); + return createON(ON_DOMAIN, onParams); + } + + public static String getServiceQName(final ObjectName objectName) { + checkType(objectName, TYPE_SERVICE_REFERENCE); + String quoted = objectName.getKeyProperty(SERVICE_QNAME_KEY); + return unquoteAndUnescape(objectName, quoted); + } + + // ObjectName supports quotation and ignores tokens like =, but fails to ignore + // ? sign. + // It must be replaced with another character that hopefully does not collide + // with actual value. + private static String unquoteAndUnescape(final ObjectName objectName, final String quoted) { + if (quoted == null) { + throw new IllegalArgumentException("Cannot find " + SERVICE_QNAME_KEY + " in " + objectName); + } + if (!quoted.startsWith("\"") || !quoted.endsWith("\"")) { + throw new IllegalArgumentException("Quotes not found in " + objectName); + } + String substring = quoted.substring(1); + substring = substring.substring(0, substring.length() - 1); + substring = substring.replace(REPLACED_QUOTATION_MARK, "?"); + return substring; + } + + private static String quoteAndEscapeValue(final String serviceQName) { + return "\"" + serviceQName.replace("?", REPLACED_QUOTATION_MARK) + "\""; + } + + public static String getReferenceName(final ObjectName objectName) { + checkType(objectName, TYPE_SERVICE_REFERENCE); + return objectName.getKeyProperty(REF_NAME_KEY); + } + + private static Map createServiceON(final String transactionName, final String serviceQName, + final String refName) { + Map result = new HashMap<>(createServiceMap(serviceQName, refName)); + result.put(TRANSACTION_NAME_KEY, transactionName); + return result; + } + + private static Map createServiceMap(final String serviceQName, final String refName) { + Map onParams = new HashMap<>(); + onParams.put(TYPE_KEY, TYPE_SERVICE_REFERENCE); + onParams.put(SERVICE_QNAME_KEY, quoteAndEscapeValue(serviceQName)); + onParams.put(REF_NAME_KEY, refName); + return onParams; + } + + private static Map createModuleMap(final String moduleName, final String instanceName) { Map onParams = new HashMap<>(); onParams.put(TYPE_KEY, TYPE_MODULE); onParams.put(MODULE_FACTORY_NAME_KEY, moduleName); @@ -116,38 +171,43 @@ public class ObjectNameUtil { return onParams; } - public static String getFactoryName(ObjectName objectName) { + public static String getFactoryName(final ObjectName objectName) { + checkTypeOneOf(objectName, TYPE_MODULE, TYPE_RUNTIME_BEAN); return objectName.getKeyProperty(MODULE_FACTORY_NAME_KEY); } - public static String getInstanceName(ObjectName objectName) { + public static String getInstanceName(final ObjectName objectName) { + checkTypeOneOf(objectName, TYPE_MODULE, TYPE_RUNTIME_BEAN); return objectName.getKeyProperty(INSTANCE_NAME_KEY); } - public static String getTransactionName(ObjectName objectName) { + public static String getTransactionName(final ObjectName objectName) { return objectName.getKeyProperty(TRANSACTION_NAME_KEY); } /** * Sanitize on: keep only mandatory attributes of module + metadata. */ - public static ObjectName withoutTransactionName(ObjectName inputON) { + public static ObjectName withoutTransactionName(final ObjectName inputON) { + checkTypeOneOf(inputON, TYPE_MODULE, TYPE_SERVICE_REFERENCE); if (getTransactionName(inputON) == null) { - throw new IllegalArgumentException( - "Expected ObjectName with transaction:" + inputON); + throw new IllegalArgumentException("Expected ObjectName with transaction:" + inputON); } - if (ON_DOMAIN.equals(inputON.getDomain()) == false) { - throw new IllegalArgumentException("Expected different domain: " - + inputON); + if (!ON_DOMAIN.equals(inputON.getDomain())) { + throw new IllegalArgumentException("Expected different domain: " + inputON); + } + Map outputProperties; + if (inputON.getKeyProperty(TYPE_KEY).equals(TYPE_MODULE)) { + String moduleName = getFactoryName(inputON); + String instanceName = getInstanceName(inputON); + outputProperties = new HashMap<>(createModuleMap(moduleName, instanceName)); + } else { + String serviceQName = getServiceQName(inputON); + String refName = getReferenceName(inputON); + outputProperties = new HashMap<>(createServiceMap(serviceQName, refName)); } - String moduleName = getFactoryName(inputON); - String instanceName = getInstanceName(inputON); - - Map allProperties = getAdditionalProperties(inputON); - Map outputProperties = new HashMap<>(createModuleON(moduleName, instanceName)); - - for(Entry entry: allProperties.entrySet()) { + for (Entry entry : allProperties.entrySet()) { if (entry.getKey().startsWith("X-")) { outputProperties.put(entry.getKey(), entry.getValue()); } @@ -155,17 +215,21 @@ public class ObjectNameUtil { return createON(ON_DOMAIN, outputProperties); } - private static void assertDoesNotContain( - Map additionalProperties, String key) { + public static ObjectName withTransactionName(final ObjectName inputON, final String transactionName) { + Map additionalProperties = getAdditionalProperties(inputON); + additionalProperties.put(TRANSACTION_NAME_KEY, transactionName); + return createON(inputON.getDomain(), additionalProperties); + + } + + private static void assertDoesNotContain(final Map additionalProperties, final String key) { if (additionalProperties.containsKey(key)) { - throw new IllegalArgumentException( - "Map 'additionalProperties' cannot overwrite attribute " - + key); + throw new IllegalArgumentException("Map 'additionalProperties' cannot overwrite attribute " + key); } } - public static ObjectName createRuntimeBeanName(String moduleName, - String instanceName, Map additionalProperties) { + public static ObjectName createRuntimeBeanName(final String moduleName, final String instanceName, + final Map additionalProperties) { // check that there is no overwriting of default attributes assertDoesNotContain(additionalProperties, MODULE_FACTORY_NAME_KEY); assertDoesNotContain(additionalProperties, INSTANCE_NAME_KEY); @@ -178,24 +242,23 @@ public class ObjectNameUtil { return createON(ON_DOMAIN, map); } - private static Set blacklist = new HashSet<>(Arrays.asList( - MODULE_FACTORY_NAME_KEY, INSTANCE_NAME_KEY, TYPE_KEY)); + private static Set blacklist = new HashSet<>( + Arrays.asList(MODULE_FACTORY_NAME_KEY, INSTANCE_NAME_KEY, TYPE_KEY)); - public static Map getAdditionalPropertiesOfRuntimeBeanName( - ObjectName on) { + public static Map getAdditionalPropertiesOfRuntimeBeanName(final ObjectName on) { checkType(on, TYPE_RUNTIME_BEAN); Map allProperties = getAdditionalProperties(on); Map result = new HashMap<>(); for (Entry entry : allProperties.entrySet()) { - if (blacklist.contains(entry.getKey()) == false) { + if (!blacklist.contains(entry.getKey())) { result.put(entry.getKey(), entry.getValue()); } } return result; } - public static Map getAdditionalProperties(ObjectName on) { - Hashtable keyPropertyList = on.getKeyPropertyList(); + public static Map getAdditionalProperties(final ObjectName on) { + Map keyPropertyList = on.getKeyPropertyList(); Map result = new HashMap<>(); for (Entry entry : keyPropertyList.entrySet()) { result.put(entry.getKey(), entry.getValue()); @@ -203,69 +266,75 @@ public class ObjectNameUtil { return result; } - public static void checkDomain(ObjectName objectName) { + public static void checkDomain(final ObjectName objectName) { if (!ON_DOMAIN.equals(objectName.getDomain())) { throw new IllegalArgumentException("Wrong domain " + objectName); } } - public static void checkType(ObjectName objectName, String type) { + public static void checkType(final ObjectName objectName, final String type) { if (!type.equals(objectName.getKeyProperty(TYPE_KEY))) { - throw new IllegalArgumentException("Wrong type, expected '" + type - + "', got " + objectName); + throw new IllegalArgumentException("Wrong type, expected '" + type + "', got " + objectName); } } - public static ObjectName createModulePattern(String moduleName, - String instanceName) { - if (moduleName == null) - moduleName = "*"; - if (instanceName == null) - instanceName = "*"; + public static void checkTypeOneOf(final ObjectName objectName, final String... types) { + for (String type : types) { + if (type.equals(objectName.getKeyProperty(TYPE_KEY))) { + return; + } + } + throw new IllegalArgumentException( + "Wrong type, expected one of " + Arrays.asList(types) + ", got " + objectName); + } + + public static ObjectName createModulePattern(final String moduleName, final String instanceName) { + String finalModuleName = moduleName == null ? ON_WILDCARD : moduleName; + String finalInstanceName = instanceName == null ? ON_WILDCARD : instanceName; + // do not return object names containing transaction name - ObjectName namePattern = ObjectNameUtil - .createON(ObjectNameUtil.ON_DOMAIN + ":" - + ObjectNameUtil.TYPE_KEY + "=" - + ObjectNameUtil.TYPE_MODULE + "," - + ObjectNameUtil.MODULE_FACTORY_NAME_KEY + "=" - + moduleName + "," + "" - + ObjectNameUtil.INSTANCE_NAME_KEY + "=" + instanceName); + ObjectName namePattern = ObjectNameUtil.createON(ObjectNameUtil.ON_DOMAIN + ":" + ObjectNameUtil.TYPE_KEY + "=" + + ObjectNameUtil.TYPE_MODULE + "," + ObjectNameUtil.MODULE_FACTORY_NAME_KEY + "=" + finalModuleName + + "," + "" + ObjectNameUtil.INSTANCE_NAME_KEY + "=" + finalInstanceName); return namePattern; } - public static ObjectName createModulePattern(String ifcName, - String instanceName, String transactionName) { - return ObjectNameUtil.createON(ObjectNameUtil.ON_DOMAIN - + ":type=Module," + ObjectNameUtil.MODULE_FACTORY_NAME_KEY - + "=" + ifcName + "," + ObjectNameUtil.INSTANCE_NAME_KEY + "=" - + instanceName + "," + ObjectNameUtil.TRANSACTION_NAME_KEY - + "=" + transactionName); + public static ObjectName createModulePattern(final String ifcName, final String instanceName, + final String transactionName) { + String finalIfcName = ifcName == null ? ON_WILDCARD : ifcName; + String finalInstanceName = instanceName == null ? ON_WILDCARD : instanceName; + String finalTransactionName = transactionName == null ? ON_WILDCARD : transactionName; + + return ObjectNameUtil.createON(ObjectNameUtil.ON_DOMAIN + ":type=Module," + + ObjectNameUtil.MODULE_FACTORY_NAME_KEY + "=" + finalIfcName + "," + ObjectNameUtil.INSTANCE_NAME_KEY + + "=" + finalInstanceName + "," + ObjectNameUtil.TRANSACTION_NAME_KEY + "=" + finalTransactionName); } - public static ObjectName createRuntimeBeanPattern(String moduleName, - String instanceName) { - return ObjectNameUtil.createON(ObjectNameUtil.ON_DOMAIN + ":" - + ObjectNameUtil.TYPE_KEY + "=" - + ObjectNameUtil.TYPE_RUNTIME_BEAN + "," - + ObjectNameUtil.MODULE_FACTORY_NAME_KEY + "=" + moduleName - + "," + ObjectNameUtil.INSTANCE_NAME_KEY + "=" + instanceName - + ",*"); + public static ObjectName createRuntimeBeanPattern(final String moduleName, final String instanceName) { + String finalModuleName = moduleName == null ? ON_WILDCARD : moduleName; + String finalInstanceName = instanceName == null ? ON_WILDCARD : instanceName; + + return ObjectNameUtil.createON(ObjectNameUtil.ON_DOMAIN + ":" + ObjectNameUtil.TYPE_KEY + "=" + + ObjectNameUtil.TYPE_RUNTIME_BEAN + "," + ObjectNameUtil.MODULE_FACTORY_NAME_KEY + "=" + + finalModuleName + "," + ObjectNameUtil.INSTANCE_NAME_KEY + "=" + finalInstanceName + ",*"); } - public static ModuleIdentifier fromON(ObjectName objectName, - String expectedType) { + public static ModuleIdentifier fromON(final ObjectName objectName, final String expectedType) { checkType(objectName, expectedType); String factoryName = getFactoryName(objectName); - if (factoryName == null) - throw new IllegalArgumentException( - "ObjectName does not contain module name"); + if (factoryName == null) { + throw new IllegalArgumentException("ObjectName does not contain module name"); + } String instanceName = getInstanceName(objectName); - if (instanceName == null) - throw new IllegalArgumentException( - "ObjectName does not contain instance name"); + if (instanceName == null) { + throw new IllegalArgumentException("ObjectName does not contain instance name"); + } return new ModuleIdentifier(factoryName, instanceName); } + public static boolean isServiceReference(final ObjectName objectName) { + return TYPE_SERVICE_REFERENCE.equals(objectName.getKeyProperty(TYPE_KEY)); + } }