/* * Copyright (c) 2013 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, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.config.util; import java.util.Set; import javax.management.Attribute; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.JMException; import javax.management.JMX; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.RuntimeMBeanException; import org.opendaylight.controller.config.api.ConflictingVersionException; import org.opendaylight.controller.config.api.ValidationException; import org.opendaylight.controller.config.api.jmx.CommitStatus; import org.opendaylight.controller.config.api.jmx.ConfigRegistryMXBean; import org.opendaylight.controller.config.api.jmx.ConfigTransactionControllerMXBean; import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; public class ConfigTransactionJMXClient implements ConfigTransactionClient { private final ConfigRegistryMXBean configTransactionManagerProxy; private final ObjectName configTransactionControllerON; private final ConfigTransactionControllerMXBean configControllerProxy; private final MBeanServer configMBeanServer; public ConfigTransactionJMXClient( ConfigRegistryMXBean configTransactionManagerProxy, ObjectName configTransactionControllerON, MBeanServer configMBeanServer) { this.configMBeanServer = configMBeanServer; this.configTransactionManagerProxy = configTransactionManagerProxy; this.configTransactionControllerON = configTransactionControllerON; this.configControllerProxy = JMX.newMXBeanProxy(configMBeanServer, configTransactionControllerON, ConfigTransactionControllerMXBean.class); } public T newMXBeanProxy(ObjectName on, Class clazz) { return JMX.newMXBeanProxy(configMBeanServer, on, clazz); } public T newMBeanProxy(ObjectName on, Class clazz) { return JMX.newMBeanProxy(configMBeanServer, on, clazz); } @Override public CommitStatus commit() throws ConflictingVersionException, ValidationException { return configTransactionManagerProxy .commitConfig(configTransactionControllerON); } @Override public void assertVersion(int expectedParentVersion, int expectedCurrentVersion) { if (expectedParentVersion != getParentVersion()) { throw new IllegalStateException(); } if (expectedCurrentVersion != getVersion()) { throw new IllegalStateException(); } } // proxy around ConfigManagerMXBean @Override public ObjectName createModule(String moduleName, String instanceName) throws InstanceAlreadyExistsException { return configControllerProxy.createModule(moduleName, instanceName); } @Override public void destroyModule(ObjectName objectName) throws InstanceNotFoundException { configControllerProxy.destroyModule(objectName); } @Override public void destroyConfigBean(String moduleName, String instanceName) throws InstanceNotFoundException { destroyModule(ObjectNameUtil.createTransactionModuleON( getTransactionName(), moduleName, instanceName)); } @Override public void abortConfig() { configControllerProxy.abortConfig(); } @Override public void validateConfig() throws ValidationException { configControllerProxy.validateConfig(); } @Override public long getParentVersion() { try { return (Long) configMBeanServer.getAttribute( configTransactionControllerON, "ParentVersion"); } catch (JMException e) { throw new RuntimeException(e); } } @Override public long getVersion() { try { return (Long) configMBeanServer.getAttribute( configTransactionControllerON, "Version"); } catch (JMException e) { throw new RuntimeException(e); } } @Override public String getTransactionName() { return configControllerProxy.getTransactionName(); } @Override public Set getAvailableModuleNames() { return configControllerProxy.getAvailableModuleNames(); } @Override public ObjectName getObjectName() { return configTransactionControllerON; } @Override public Set lookupConfigBeans() { return configControllerProxy.lookupConfigBeans(); } @Override public Set lookupConfigBeans(String moduleName) { return configControllerProxy.lookupConfigBeans(moduleName); } @Override public ObjectName lookupConfigBean(String moduleName, String instanceName) throws InstanceNotFoundException { return configControllerProxy.lookupConfigBean(moduleName, instanceName); } @Override public Set lookupConfigBeans(String moduleName, String instanceName) { return configControllerProxy .lookupConfigBeans(moduleName, instanceName); } @Override public void validateBean(ObjectName configBeanON) throws ValidationException { try { configMBeanServer.invoke(configBeanON, "validate", null, null); } catch (JMException e) { throw new RuntimeException(e); } catch (RuntimeMBeanException e) { throw e.getTargetException(); } } @Override public void setAttribute(ObjectName on, String attrName, Attribute attribute) { if (ObjectNameUtil.getTransactionName(on) == null) throw new IllegalArgumentException("Not in transaction instance " + on + ", no transaction name present"); try { configMBeanServer.setAttribute(on, attribute); } catch (JMException e) { throw new IllegalStateException("Unable to set attribute " + attrName + " for " + on, e); } } }