This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/karaf.git
commit 26a948bb9cef3ef8af640293703e051c9673589d Author: Guillaume Nodet <[email protected]> AuthorDate: Thu Nov 9 18:05:59 2017 +0100 [KARAF-5475] Add EventAdmin support to JMX --- management/server/pom.xml | 8 +- .../karaf/management/KarafMBeanServerGuard.java | 40 +- .../karaf/management/internal/Activator.java | 31 + .../management/internal/EventAdminLogger.java | 25 + .../management/internal/EventAdminLoggerImpl.java | 60 ++ .../internal/EventAdminMBeanServerWrapper.java | 648 +++++++++++++++++++++ .../internal/MBeanInvocationHandler.java | 3 + 7 files changed, 809 insertions(+), 6 deletions(-) diff --git a/management/server/pom.xml b/management/server/pom.xml index eb7648f..6b03aa5 100644 --- a/management/server/pom.xml +++ b/management/server/pom.xml @@ -109,7 +109,13 @@ <artifactId>maven-bundle-plugin</artifactId> <configuration> <instructions> - <Export-Package>org.apache.karaf.management;version=${project.version};-split-package:=merge-first</Export-Package> + <Export-Package> + org.apache.karaf.management;version=${project.version};-split-package:=merge-first + </Export-Package> + <Import-Package> + org.osgi.service.event*;resolution:=optional, + * + </Import-Package> <Private-Package> org.apache.karaf.management.internal, org.apache.karaf.service.guard.tools, diff --git a/management/server/src/main/java/org/apache/karaf/management/KarafMBeanServerGuard.java b/management/server/src/main/java/org/apache/karaf/management/KarafMBeanServerGuard.java index 6467a38..ab2fd44 100644 --- a/management/server/src/main/java/org/apache/karaf/management/KarafMBeanServerGuard.java +++ b/management/server/src/main/java/org/apache/karaf/management/KarafMBeanServerGuard.java @@ -16,7 +16,11 @@ */ package org.apache.karaf.management; +import org.apache.karaf.management.internal.Activator; import org.apache.karaf.management.internal.BulkRequestContext; +import org.apache.karaf.management.internal.EventAdminLogger; +import org.apache.karaf.management.internal.EventAdminMBeanServerWrapper; +import org.apache.karaf.management.internal.MBeanInvocationHandler; import org.apache.karaf.service.guard.tools.ACLConfigurationParser; import org.apache.karaf.util.jaas.JaasHelper; import org.osgi.service.cm.ConfigurationAdmin; @@ -25,6 +29,7 @@ import javax.management.*; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import java.lang.reflect.Proxy; import java.security.Principal; import java.util.ArrayList; import java.util.Collections; @@ -54,7 +59,12 @@ public class KarafMBeanServerGuard implements InvocationHandler { private static final Comparator<String[]> WILDCARD_PID_COMPARATOR = new WildcardPidComparator(); + private static final String INVOKE = "invoke"; + + private static final String[] INVOKE_SIG = new String[] {ObjectName.class.getName(), String.class.getName(), Object[].class.getName(), String[].class.getName()}; + private ConfigurationAdmin configAdmin; + private EventAdminLogger logger; public ConfigurationAdmin getConfigAdmin() { return configAdmin; @@ -64,6 +74,14 @@ public class KarafMBeanServerGuard implements InvocationHandler { this.configAdmin = configAdmin; } + public EventAdminLogger getLogger() { + return logger; + } + + public void setLogger(EventAdminLogger logger) { + this.logger = logger; + } + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getParameterTypes().length == 0) return null; @@ -71,15 +89,23 @@ public class KarafMBeanServerGuard implements InvocationHandler { if (!ObjectName.class.isAssignableFrom(method.getParameterTypes()[0])) return null; + MBeanServer mbs = (MBeanServer) proxy; + if (mbs != null && Proxy.getInvocationHandler(mbs) instanceof MBeanInvocationHandler) { + mbs = ((MBeanInvocationHandler) Proxy.getInvocationHandler(mbs)).getDelegate(); + } + if (mbs instanceof EventAdminMBeanServerWrapper) { + mbs = ((EventAdminMBeanServerWrapper) mbs).getDelegate(); + } + ObjectName objectName = (ObjectName) args[0]; if ("getAttribute".equals(method.getName())) { - handleGetAttribute((MBeanServer) proxy, objectName, (String) args[1]); + handleGetAttribute(mbs, objectName, (String) args[1]); } else if ("getAttributes".equals(method.getName())) { - handleGetAttributes((MBeanServer) proxy, objectName, (String[]) args[1]); + handleGetAttributes(mbs, objectName, (String[]) args[1]); } else if ("setAttribute".equals(method.getName())) { - handleSetAttribute((MBeanServer) proxy, objectName, (Attribute) args[1]); + handleSetAttribute(mbs, objectName, (Attribute) args[1]); } else if ("setAttributes".equals(method.getName())) { - handleSetAttributes((MBeanServer) proxy, objectName, (AttributeList) args[1]); + handleSetAttributes(mbs, objectName, (AttributeList) args[1]); } else if ("invoke".equals(method.getName())) { handleInvoke(objectName, (String) args[1], (Object[]) args[2], (String[]) args[3]); } @@ -338,7 +364,11 @@ public class KarafMBeanServerGuard implements InvocationHandler { if (Boolean.valueOf(System.getProperty(JMX_ACL_DETAILED_MESSAGE, "false"))) { printDetailedMessage(context, objectName, operationName, params, signature); } - throw new SecurityException("Insufficient roles/credentials for operation"); + SecurityException se = new SecurityException("Insufficient roles/credentials for operation"); + if (logger != null) { + logger.log(INVOKE, INVOKE_SIG, null, se, objectName, operationName, signature, params); + } + throw se; } private void printDetailedMessage(BulkRequestContext context, ObjectName objectName, diff --git a/management/server/src/main/java/org/apache/karaf/management/internal/Activator.java b/management/server/src/main/java/org/apache/karaf/management/internal/Activator.java index 484c4ff..4233d51 100644 --- a/management/server/src/main/java/org/apache/karaf/management/internal/Activator.java +++ b/management/server/src/main/java/org/apache/karaf/management/internal/Activator.java @@ -60,6 +60,8 @@ public class Activator extends BaseActivator implements ManagedService { private ServiceTracker<KeystoreInstance, KeystoreInstance> keystoreInstanceServiceTracker; + private EventAdminLogger eventAdminLogger; + protected void doStart() throws Exception { // Verify dependencies ConfigurationAdmin configurationAdmin = getTrackedService(ConfigurationAdmin.class); @@ -68,6 +70,26 @@ public class Activator extends BaseActivator implements ManagedService { return; } + EventAdminLogger logger = null; + if (getBoolean("audit.eventadmin.enabled", true)) { + try { + logger = new EventAdminLoggerImpl(bundleContext); + } catch (Throwable ignore) { + // Ignore the listener if EventAdmin package isn't present + } + } + if (logger == null) { + logger = new EventAdminLogger() { + @Override + public void close() { + } + @Override + public void log(String methodName, String[] signature, Object result, Throwable error, Object... params) { + } + }; + } + eventAdminLogger = logger; + String rmiRegistryHost = getString("rmiRegistryHost", ""); int rmiRegistryPort = getInt("rmiRegistryPort", 1099); String rmiServerHost = getString("rmiServerHost", "0.0.0.0"); @@ -93,6 +115,7 @@ public class Activator extends BaseActivator implements ManagedService { boolean locateExistingMBeanServerIfPossible = getBoolean("locateExistingMBeanServerIfPossible", true); KarafMBeanServerGuard guard = new KarafMBeanServerGuard(); + guard.setLogger(eventAdminLogger); guard.setConfigAdmin(configurationAdmin); rmiRegistryFactory = new RmiRegistryFactory(); @@ -108,6 +131,7 @@ public class Activator extends BaseActivator implements ManagedService { mbeanServerFactory.init(); MBeanServer mbeanServer = mbeanServerFactory.getServer(); + mbeanServer = new EventAdminMBeanServerWrapper(mbeanServer, eventAdminLogger); JaasAuthenticator jaasAuthenticator = new JaasAuthenticator(); jaasAuthenticator.setRealm(jmxRealm); @@ -208,6 +232,13 @@ public class Activator extends BaseActivator implements ManagedService { keystoreInstanceServiceTracker = null; } } + if (eventAdminLogger != null) { + try { + eventAdminLogger.close(); + } finally { + eventAdminLogger = null; + } + } } } diff --git a/management/server/src/main/java/org/apache/karaf/management/internal/EventAdminLogger.java b/management/server/src/main/java/org/apache/karaf/management/internal/EventAdminLogger.java new file mode 100644 index 0000000..ada861e --- /dev/null +++ b/management/server/src/main/java/org/apache/karaf/management/internal/EventAdminLogger.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.karaf.management.internal; + +public interface EventAdminLogger { + + void close(); + + void log(String methodName, String[] signature, Object result, Throwable error, Object... params); + +} diff --git a/management/server/src/main/java/org/apache/karaf/management/internal/EventAdminLoggerImpl.java b/management/server/src/main/java/org/apache/karaf/management/internal/EventAdminLoggerImpl.java new file mode 100644 index 0000000..b33a6bc --- /dev/null +++ b/management/server/src/main/java/org/apache/karaf/management/internal/EventAdminLoggerImpl.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.karaf.management.internal; + +import org.osgi.framework.BundleContext; +import org.osgi.service.event.Event; +import org.osgi.service.event.EventAdmin; +import org.osgi.util.tracker.ServiceTracker; + +import java.io.Closeable; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public class EventAdminLoggerImpl implements EventAdminLogger { + + private final ServiceTracker<EventAdmin, EventAdmin> tracker; + + public EventAdminLoggerImpl(BundleContext context) { + this.tracker = new ServiceTracker<>(context, EventAdmin.class.getName(), null); + this.tracker.open(); + } + + public void close() { + this.tracker.close(); + } + + public void log(String methodName, String[] signature, Object result, Throwable error, Object... params) { + EventAdmin admin = tracker.getService(); + if (admin != null) { + Map<String, Object> props = new HashMap<>(); + props.put("method", methodName); + props.put("signature", signature); + props.put("params", params); + if (result != null) { + props.put("result", result); + } + if (error != null) { + props.put("error", error); + } + Event event = new Event("javax/management/MBeanServer/" + methodName.toUpperCase(Locale.ENGLISH), props); + admin.postEvent(event); + } + } + +} diff --git a/management/server/src/main/java/org/apache/karaf/management/internal/EventAdminMBeanServerWrapper.java b/management/server/src/main/java/org/apache/karaf/management/internal/EventAdminMBeanServerWrapper.java new file mode 100644 index 0000000..b94ddf9 --- /dev/null +++ b/management/server/src/main/java/org/apache/karaf/management/internal/EventAdminMBeanServerWrapper.java @@ -0,0 +1,648 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.karaf.management.internal; + +import javax.management.Attribute; +import javax.management.AttributeList; +import javax.management.AttributeNotFoundException; +import javax.management.InstanceAlreadyExistsException; +import javax.management.InstanceNotFoundException; +import javax.management.IntrospectionException; +import javax.management.InvalidAttributeValueException; +import javax.management.ListenerNotFoundException; +import javax.management.MBeanException; +import javax.management.MBeanInfo; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServer; +import javax.management.NotCompliantMBeanException; +import javax.management.NotificationFilter; +import javax.management.NotificationListener; +import javax.management.ObjectInstance; +import javax.management.ObjectName; +import javax.management.OperationsException; +import javax.management.QueryExp; +import javax.management.ReflectionException; +import javax.management.loading.ClassLoaderRepository; +import java.io.ObjectInputStream; +import java.util.Objects; +import java.util.Set; + +public class EventAdminMBeanServerWrapper implements MBeanServer { + + private static final String[] NO_ARGS_SIG = new String[] {ObjectName.class.getName()}; + private static final String[] OBJECT_NAME_ONLY_SIG = new String[] {ObjectName.class.getName()}; + + private static final String CREATE_MBEAN = "createMBean"; + private static final String[] CREATE_MBEAN_SIG_1 = new String[] {String.class.getName(), ObjectName.class.getName()}; + private static final String[] CREATE_MBEAN_SIG_2 = new String[] {String.class.getName(), ObjectName.class.getName(), ObjectName.class.getName()}; + private static final String[] CREATE_MBEAN_SIG_3 = new String[] {String.class.getName(), Object[].class.getName(), String[].class.getName()}; + private static final String[] CREATE_MBEAN_SIG_4 = new String[] {String.class.getName(), ObjectName.class.getName(), ObjectName.class.getName(), Object[].class.getName(), String[].class.getName()}; + + private static final String REGISTER_MBEAN = "registerMBean"; + private static final String[] REGISTER_MBEAN_SIG = new String[] {Object.class.getName(), ObjectName.class.getName()}; + + + private static final String UNREGISTER_MBEAN = "unregisterMBean"; + private static final String[] UNREGISTER_MBEAN_SIG = OBJECT_NAME_ONLY_SIG; + + private static final String GET_OBJECT_INSTANCE = "getObjectInstance"; + private static final String[] GET_OBJECT_INSTANCE_SIG = OBJECT_NAME_ONLY_SIG; + + private static final String QUERY_MBEANS = "queryMBeans"; + private static final String[] QUERY_MBEANS_SIG = new String[] {ObjectName.class.getName(), QueryExp.class.getName()}; + + private static final String QUERY_NAMES = "queryMBeans"; + private static final String[] QUERY_NAMES_SIG = QUERY_MBEANS_SIG; + + private static final String IS_REGISTERED = "isRegistered"; + private static final String[] IS_REGISTERED_SIG = OBJECT_NAME_ONLY_SIG; + + private static final String GET_MBEAN_COUNT = "getMBeanCount"; + private static final String[] GET_MBEAN_COUNT_SIG = NO_ARGS_SIG; + + private static final String GET_ATTRIBUTE = "getAttribute"; + private static final String[] GET_ATTRIBUTE_SIG = new String[] {ObjectName.class.getName(), String.class.getName()}; + + private static final String GET_ATTRIBUTES = "getAttributes"; + private static final String[] GET_ATTRIBUTES_SIG = new String[] {ObjectName.class.getName(), String[].class.getName()}; + + private static final String SET_ATTRIBUTE = "setAttribute"; + private static final String[] SET_ATTRIBUTE_SIG = new String[] {ObjectName.class.getName(), Attribute.class.getName()}; + + private static final String SET_ATTRIBUTES = "setAttributes"; + private static final String[] SET_ATTRIBUTES_SIG = new String[] {ObjectName.class.getName(), AttributeList.class.getName()}; + + private static final String INVOKE = "invoke"; + private static final String[] INVOKE_SIG = new String[] {ObjectName.class.getName(), String.class.getName(), Object[].class.getName(), String[].class.getName()}; + + private static final String GET_DEFAULT_DOMAIN = "getDefaultDomain"; + private static final String[] GET_DEFAULT_DOMAIN_SIG = NO_ARGS_SIG; + + private static final String GET_DOMAINS = "getDomains"; + private static final String[] GET_DOMAINS_SIG = NO_ARGS_SIG; + + private static final String ADD_NOTIFICATION_LISTENER = "addNotificationListener"; + private static final String[] ADD_NOTIFICATION_LISTENER_SIG_1 = new String[] {ObjectName.class.getName(), NotificationListener.class.getName(), NotificationFilter.class.getName(), Object.class.getName()}; + private static final String[] ADD_NOTIFICATION_LISTENER_SIG_2 = new String[] {ObjectName.class.getName(), ObjectName.class.getName(), NotificationFilter.class.getName(), Object.class.getName()}; + + private static final String REMOVE_NOTIFICATION_LISTENER = "addNotificationListener"; + private static final String[] REMOVE_NOTIFICATION_LISTENER_SIG_1 = new String[] {ObjectName.class.getName(), ObjectName.class.getName()}; + private static final String[] REMOVE_NOTIFICATION_LISTENER_SIG_2 = new String[] {ObjectName.class.getName(), ObjectName.class.getName(), NotificationFilter.class.getName(), Object.class.getName()}; + private static final String[] REMOVE_NOTIFICATION_LISTENER_SIG_3 = new String[] {ObjectName.class.getName(), NotificationListener.class.getName()}; + private static final String[] REMOVE_NOTIFICATION_LISTENER_SIG_4 = new String[] {ObjectName.class.getName(), NotificationListener.class.getName(), NotificationFilter.class.getName(), Object.class.getName()}; + + private static final String GET_MBEAN_INFO = "getMBeanInfo"; + private static final String[] GET_MBEAN_INFO_SIG = OBJECT_NAME_ONLY_SIG; + + private static final String IS_INSTANCE_OF = "isInstanceOf"; + private static final String[] IS_INSTANCE_OF_SIG = new String[] {ObjectName.class.getName(), String.class.getName()}; + + private static final String INSTANTIATE = "instantiate"; + private static final String[] INSTANTIATE_SIG1 = new String[] {String.class.getName()}; + private static final String[] INSTANTIATE_SIG2 = new String[] {String.class.getName(), ObjectName.class.getName()}; + private static final String[] INSTANTIATE_SIG3 = new String[] {String.class.getName(), Object[].class.getName(), String[].class.getName()}; + private static final String[] INSTANTIATE_SIG4 = new String[] {String.class.getName(), ObjectName.class.getName(), Object[].class.getName(), String[].class.getName()}; + + private static final String DESERIALIZE = "deserialize"; + private static final String[] DESERIALIZE_SIG1 = new String[] {ObjectName.class.getName(), byte[].class.getName()}; + private static final String[] DESERIALIZE_SIG2 = new String[] {String.class.getName(), byte[].class.getName()}; + private static final String[] DESERIALIZE_SIG3 = new String[] {String.class.getName(), ObjectName.class.getName(), byte[].class.getName()}; + + private static final String GET_CLASSLOADER_FOR = "getClassLoaderFor"; + private static final String[] GET_CLASSLOADER_FOR_SIG = OBJECT_NAME_ONLY_SIG; + + private static final String GET_CLASSLOADER = "getClassLoader"; + private static final String[] GET_CLASSLOADER_SIG = OBJECT_NAME_ONLY_SIG; + + private static final String GET_CLASSLOADER_REPOSITORY = "getClassLoaderRepository"; + private static final String[] GET_CLASSLOADER_REPOSITORY_SIG = NO_ARGS_SIG; + + private final MBeanServer delegate; + private final EventAdminLogger logger; + + public EventAdminMBeanServerWrapper(MBeanServer delegate, EventAdminLogger logger) { + this.delegate = Objects.requireNonNull(delegate); + this.logger = Objects.requireNonNull(logger); + } + + private void log(String methodName, String[] signature, Object result, Throwable error, Object... params) { + logger.log(methodName, signature, result, error, params); + } + + @Override + public ObjectInstance createMBean(String className, ObjectName name) throws ReflectionException, InstanceAlreadyExistsException, MBeanException, NotCompliantMBeanException { + Throwable error = null; + ObjectInstance result = null; + try { + return result = delegate.createMBean(className, name); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(CREATE_MBEAN, CREATE_MBEAN_SIG_1, result, error, className, name); + } + } + + @Override + public ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName) throws ReflectionException, InstanceAlreadyExistsException, MBeanException, NotCompliantMBeanException, InstanceNotFoundException { + Throwable error = null; + ObjectInstance result = null; + try { + return result = delegate.createMBean(className, name, loaderName); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(CREATE_MBEAN, CREATE_MBEAN_SIG_2, result, error, className, name, loaderName); + } + } + + @Override + public ObjectInstance createMBean(String className, ObjectName name, Object[] params, String[] signature) throws ReflectionException, InstanceAlreadyExistsException, MBeanException, NotCompliantMBeanException { + Throwable error = null; + ObjectInstance result = null; + try { + return result = delegate.createMBean(className, name, params, signature); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(CREATE_MBEAN, CREATE_MBEAN_SIG_3, result, error, className, name, params, signature); + } + } + + @Override + public ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName, Object[] params, String[] signature) throws ReflectionException, InstanceAlreadyExistsException, MBeanException, NotCompliantMBeanException, InstanceNotFoundException { + Throwable error = null; + ObjectInstance result = null; + try { + return result = delegate.createMBean(className, name, loaderName, params, signature); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(CREATE_MBEAN, CREATE_MBEAN_SIG_4, result, error, className, name, loaderName, params, signature); + } + } + + @Override + public ObjectInstance registerMBean(Object object, ObjectName name) throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException { + Throwable error = null; + ObjectInstance result = null; + try { + return result = delegate.registerMBean(object, name); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(REGISTER_MBEAN, REGISTER_MBEAN_SIG, result, error, object, name); + } + } + + @Override + public void unregisterMBean(ObjectName name) throws InstanceNotFoundException, MBeanRegistrationException { + Throwable error = null; + try { + delegate.unregisterMBean(name); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(UNREGISTER_MBEAN, UNREGISTER_MBEAN_SIG, null, error, name); + } + } + + @Override + public ObjectInstance getObjectInstance(ObjectName name) throws InstanceNotFoundException { + Throwable error = null; + ObjectInstance result = null; + try { + return result = delegate.getObjectInstance(name); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_OBJECT_INSTANCE, GET_OBJECT_INSTANCE_SIG, result, error, name); + } + } + + @Override + public Set<ObjectInstance> queryMBeans(ObjectName name, QueryExp query) { + Throwable error = null; + Set<ObjectInstance> result = null; + try { + return result = delegate.queryMBeans(name, query); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(QUERY_MBEANS, QUERY_MBEANS_SIG, result, error, name, query); + } + } + + @Override + public Set<ObjectName> queryNames(ObjectName name, QueryExp query) { + Throwable error = null; + Set<ObjectName> result = null; + try { + return result = delegate.queryNames(name, query); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(QUERY_NAMES, QUERY_NAMES_SIG, result, error, name, query); + } + } + + @Override + public boolean isRegistered(ObjectName name) { + Throwable error = null; + Boolean result = null; + try { + return result = delegate.isRegistered(name); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(IS_REGISTERED, IS_REGISTERED_SIG, result, error, name); + } + } + + @Override + public Integer getMBeanCount() { + Throwable error = null; + Integer result = null; + try { + return result = delegate.getMBeanCount(); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_MBEAN_COUNT, GET_MBEAN_COUNT_SIG, result, error); + } + } + + @Override + public Object getAttribute(ObjectName name, String attribute) throws MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException { + Throwable error = null; + Object result = null; + try { + return result = delegate.getAttribute(name, attribute); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_ATTRIBUTE, GET_ATTRIBUTE_SIG, result, error, name, attribute); + } + } + + @Override + public AttributeList getAttributes(ObjectName name, String[] attributes) throws InstanceNotFoundException, ReflectionException { + Throwable error = null; + AttributeList result = null; + try { + return result = delegate.getAttributes(name, attributes); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_ATTRIBUTES, GET_ATTRIBUTES_SIG, result, error, name, attributes); + } + } + + @Override + public void setAttribute(ObjectName name, Attribute attribute) throws InstanceNotFoundException, AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { + Throwable error = null; + try { + delegate.setAttribute(name, attribute); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(SET_ATTRIBUTE, SET_ATTRIBUTE_SIG, null, error, name, attribute); + } + } + + @Override + public AttributeList setAttributes(ObjectName name, AttributeList attributes) throws InstanceNotFoundException, ReflectionException { + Throwable error = null; + AttributeList result = null; + try { + return result = delegate.setAttributes(name, attributes); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(SET_ATTRIBUTES, SET_ATTRIBUTES_SIG, result, error, name, attributes); + } + } + + @Override + public Object invoke(ObjectName name, String operationName, Object[] params, String[] signature) throws InstanceNotFoundException, MBeanException, ReflectionException { + Throwable error = null; + Object result = null; + try { + return result = delegate.invoke(name, operationName, params, signature); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(INVOKE, INVOKE_SIG, result, error, name, operationName, params, signature); + } + } + + @Override + public String getDefaultDomain() { + Throwable error = null; + String result = null; + try { + return result = delegate.getDefaultDomain(); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_DEFAULT_DOMAIN, GET_DEFAULT_DOMAIN_SIG, result, error); + } + } + + @Override + public String[] getDomains() { + Throwable error = null; + String[] result = null; + try { + return result = delegate.getDomains(); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_DOMAINS, GET_DOMAINS_SIG, result, error); + } + } + + @Override + public void addNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException { + Throwable error = null; + try { + delegate.addNotificationListener(name, listener, filter, handback); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(ADD_NOTIFICATION_LISTENER, ADD_NOTIFICATION_LISTENER_SIG_1, null, error, name, listener, filter, handback); + } + } + + @Override + public void addNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException { + Throwable error = null; + try { + delegate.addNotificationListener(name, listener, filter, handback); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(ADD_NOTIFICATION_LISTENER, ADD_NOTIFICATION_LISTENER_SIG_2, null, error, name, listener, filter, handback); + } + } + + @Override + public void removeNotificationListener(ObjectName name, ObjectName listener) throws InstanceNotFoundException, ListenerNotFoundException { + Throwable error = null; + try { + delegate.removeNotificationListener(name, listener); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(REMOVE_NOTIFICATION_LISTENER, REMOVE_NOTIFICATION_LISTENER_SIG_1, null, error, name, listener); + } + } + + @Override + public void removeNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, ListenerNotFoundException { + Throwable error = null; + try { + delegate.removeNotificationListener(name, listener, filter, handback); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(REMOVE_NOTIFICATION_LISTENER, REMOVE_NOTIFICATION_LISTENER_SIG_2, null, error, name, listener, filter, handback); + } + } + + @Override + public void removeNotificationListener(ObjectName name, NotificationListener listener) throws InstanceNotFoundException, ListenerNotFoundException { + Throwable error = null; + try { + delegate.removeNotificationListener(name, listener); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(REMOVE_NOTIFICATION_LISTENER, REMOVE_NOTIFICATION_LISTENER_SIG_3, null, error, name, listener); + } + } + + @Override + public void removeNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, ListenerNotFoundException { + Throwable error = null; + try { + delegate.removeNotificationListener(name, listener, filter, handback); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(REMOVE_NOTIFICATION_LISTENER, REMOVE_NOTIFICATION_LISTENER_SIG_4, null, error, name, listener, filter, handback); + } + } + + @Override + public MBeanInfo getMBeanInfo(ObjectName name) throws InstanceNotFoundException, IntrospectionException, ReflectionException { + Throwable error = null; + MBeanInfo result = null; + try { + return result = delegate.getMBeanInfo(name); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_MBEAN_INFO, GET_MBEAN_INFO_SIG, result, error, name); + } + } + + @Override + public boolean isInstanceOf(ObjectName name, String className) throws InstanceNotFoundException { + Throwable error = null; + Boolean result = null; + try { + return result = delegate.isInstanceOf(name, className); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(IS_INSTANCE_OF, IS_INSTANCE_OF_SIG, result, error, name, className); + } + } + + @Override + public Object instantiate(String className) throws ReflectionException, MBeanException { + Throwable error = null; + Object result = null; + try { + return result = delegate.instantiate(className); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(INSTANTIATE, INSTANTIATE_SIG1, result, error, className); + } + } + + @Override + public Object instantiate(String className, ObjectName loaderName) throws ReflectionException, MBeanException, InstanceNotFoundException { + Throwable error = null; + Object result = null; + try { + return result = delegate.instantiate(className, loaderName); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(INSTANTIATE, INSTANTIATE_SIG2, result, error, className, loaderName); + } + } + + @Override + public Object instantiate(String className, Object[] params, String[] signature) throws ReflectionException, MBeanException { + Throwable error = null; + Object result = null; + try { + return result = delegate.instantiate(className, params, signature); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(INSTANTIATE, INSTANTIATE_SIG3, result, error, className, params, signature); + } + } + + @Override + public Object instantiate(String className, ObjectName loaderName, Object[] params, String[] signature) throws ReflectionException, MBeanException, InstanceNotFoundException { + Throwable error = null; + Object result = null; + try { + return result = delegate.instantiate(className, loaderName, params, signature); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(INSTANTIATE, INSTANTIATE_SIG4, result, error, className, loaderName, params, signature); + } + } + + @Override + @Deprecated + public ObjectInputStream deserialize(ObjectName name, byte[] data) throws OperationsException { + Throwable error = null; + ObjectInputStream result = null; + try { + return result = delegate.deserialize(name, data); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(DESERIALIZE, DESERIALIZE_SIG1, result, error, name, data); + } + } + + @Override + @Deprecated + public ObjectInputStream deserialize(String className, byte[] data) throws OperationsException, ReflectionException { + Throwable error = null; + ObjectInputStream result = null; + try { + return result = delegate.deserialize(className, data); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(DESERIALIZE, DESERIALIZE_SIG2, result, error, className, data); + } + } + + @Override + @Deprecated + public ObjectInputStream deserialize(String className, ObjectName loaderName, byte[] data) throws OperationsException, ReflectionException { + Throwable error = null; + ObjectInputStream result = null; + try { + return result = delegate.deserialize(className, loaderName, data); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(DESERIALIZE, DESERIALIZE_SIG3, result, error, className, loaderName, data); + } + } + + @Override + public ClassLoader getClassLoaderFor(ObjectName mbeanName) throws InstanceNotFoundException { + Throwable error = null; + ClassLoader result = null; + try { + return result = delegate.getClassLoaderFor(mbeanName); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_CLASSLOADER_FOR, GET_CLASSLOADER_FOR_SIG, result, error, mbeanName); + } + } + + @Override + public ClassLoader getClassLoader(ObjectName loaderName) throws InstanceNotFoundException { + Throwable error = null; + ClassLoader result = null; + try { + return result = delegate.getClassLoader(loaderName); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_CLASSLOADER, GET_CLASSLOADER_SIG, result, error, loaderName); + } + } + + @Override + public ClassLoaderRepository getClassLoaderRepository() { + Throwable error = null; + ClassLoaderRepository result = null; + try { + return result = delegate.getClassLoaderRepository(); + } catch (Throwable e) { + error = e; + throw e; + } finally { + log(GET_CLASSLOADER_REPOSITORY, GET_CLASSLOADER_REPOSITORY_SIG, result, error); + } + } + + public MBeanServer getDelegate() { + return delegate; + } +} diff --git a/management/server/src/main/java/org/apache/karaf/management/internal/MBeanInvocationHandler.java b/management/server/src/main/java/org/apache/karaf/management/internal/MBeanInvocationHandler.java index 29680d5..b26ef2a 100644 --- a/management/server/src/main/java/org/apache/karaf/management/internal/MBeanInvocationHandler.java +++ b/management/server/src/main/java/org/apache/karaf/management/internal/MBeanInvocationHandler.java @@ -63,4 +63,7 @@ public class MBeanInvocationHandler implements InvocationHandler { } } + public MBeanServer getDelegate() { + return wrapped; + } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
