blob: c3c9dd36afc9c6f39bfa78e06e72624d378fc5b2 [file] [log] [blame]
/*
* 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.felix.ipojo.handlers.jmx;
import java.lang.reflect.InvocationTargetException;
import javax.management.MBeanRegistration;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.apache.felix.ipojo.InstanceManager;
import org.apache.felix.ipojo.parser.MethodMetadata;
import org.apache.felix.ipojo.util.Callback;
/**
* This class implements a 'wide' iPOJO DynamicMBean that can perform actions
* before and after its registration and deregistration.
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class DynamicMBeanWRegisterImpl extends DynamicMBeanImpl implements
MBeanRegistration {
/**
* The preRegister method of MBeanRegistration interface.
*/
private MethodMetadata m_preRegisterMeth;
/**
* The postRegister method of MBeanRegistration interface.
*/
private MethodMetadata m_postRegisterMeth;
/**
* The preDeregister method of MBeanRegistration interface.
*/
private MethodMetadata m_preDeregisterMeth;
/**
* The postDeregister method of MBeanRegistration interface.
*/
private MethodMetadata m_postDeregisterMeth;
/**
* The effective name of the MBean.
*/
private ObjectName m_objName;
/**
* Constructs a new DynamicMBeanWRegisterImpl.
*
* @param properties the data extracted from the metadata.xml
* @param instanceManager the instance manager
* @param preRegisterMeth the method to call before MBean registration
* @param postRegisterMeth the method to call after MBean registration
* @param preDeregisterMeth the method to call before MBean deregistration
* @param postDeregisterMeth the method to call after MBean registration
*/
public DynamicMBeanWRegisterImpl(JmxConfigFieldMap properties,
InstanceManager instanceManager, MethodMetadata preRegisterMeth,
MethodMetadata postRegisterMeth, MethodMetadata preDeregisterMeth,
MethodMetadata postDeregisterMeth) {
super(properties, instanceManager);
m_preRegisterMeth = preRegisterMeth;
m_postRegisterMeth = postRegisterMeth;
m_preDeregisterMeth = preDeregisterMeth;
m_postDeregisterMeth = postDeregisterMeth;
}
/**
* Returns the MBean name used to register it.
*
* @return the MBean name used to register it.
*/
public ObjectName getObjectName() {
return m_objName;
}
/**
* This method is executed before the MBean registration.
*
* @param server the server on which the MBean will be registered
* @param name the name of the MBean to expose
* @throws Exception This exception will be caught by the MBean server and re-thrown as an MBeanRegistrationException.
* @return the name with which the MBean will be registered
*/
public ObjectName preRegister(MBeanServer server, ObjectName name)
throws Exception {
m_objName = (ObjectName) callMethod(m_preRegisterMeth,
MBeanHandler.PRE_REGISTER_METH_NAME, new Object[] { server, name });
return m_objName;
}
/**
* This method is executed after the MBean registration.
*
* @param registrationDone indicates whether or not the MBean has been successfully registered in the MBean server.
*/
public void postRegister(Boolean registrationDone) {
callMethod(m_postRegisterMeth, MBeanHandler.POST_REGISTER_METH_NAME,
new Object[] { registrationDone });
}
/**
* This method is before after the MBean deregistration.
*
* @throws Exception This exception will be caught by the MBean server and re-thrown as an MBeanRegistrationException.
*/
public void preDeregister() throws Exception {
callMethod(m_preDeregisterMeth, MBeanHandler.PRE_DEREGISTER_METH_NAME,
null);
}
/**
* This method is executed after the MBean deregistration.
*/
public void postDeregister() {
callMethod(m_postDeregisterMeth,
MBeanHandler.POST_DEREGISTER_METH_NAME, null);
}
/**
* Private method used to execute a given callback.
*
* @param methodMetadata the metadata description of the callback
* @param methodName the name of the callback
* @param params the parameters of the callback
* @return the object eventually returned by the callback, or null if nothing's returned
*/
private Object callMethod(MethodMetadata methodMetadata, String methodName,
Object[] params) {
Callback mc = new Callback(methodMetadata, m_instanceManager);
try {
if ((params == null) || (params.length == 0)) {
return mc.call();
} else {
return mc.call(params);
}
} catch (NoSuchMethodException e) {
// should never happen : method exists
System.err.println("No such method : " + methodName);
e.printStackTrace();
} catch (IllegalAccessException e) {
System.err.println("Illegal Access Exception");
e.printStackTrace();
} catch (InvocationTargetException e) {
System.err.println("Invocation Target Exception");
e.printStackTrace();
}
return null;
}
}