| /* |
| * Copyright 2003,2004 The Apache Software Foundation. |
| * |
| * Licensed 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.axis.management; |
| |
| import org.apache.axis.components.logger.LogFactory; |
| import org.apache.axis.i18n.Messages; |
| import org.apache.commons.logging.Log; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.lang.reflect.Method; |
| |
| /** |
| * class to act as a dynamic loading registrar to commons-modeler, so |
| * as to autoregister stuff |
| * |
| * @link http://www.webweavertech.com/costin/archives/000168.html#000168 |
| */ |
| public class Registrar { |
| /** |
| * our log |
| */ |
| protected static Log log = LogFactory.getLog(Registrar.class.getName()); |
| |
| /** |
| * register using reflection. The perf hit is moot as jmx is |
| * all reflection anyway |
| * |
| * @param objectToRegister |
| * @param name |
| * @param context |
| */ |
| public static boolean register(Object objectToRegister, |
| String name, String context) { |
| if (isBound()) { |
| if (log.isDebugEnabled()) { |
| log.debug("Registering " + objectToRegister + " as " |
| + name); |
| } |
| return modelerBinding.register(objectToRegister, name, context); |
| } else { |
| return false; |
| } |
| } |
| |
| /** |
| * Check for being bound to a modeler -this will force |
| * a binding if none existed. |
| * |
| * @return |
| */ |
| |
| public static boolean isBound() { |
| createModelerBinding(); |
| return modelerBinding.canBind(); |
| } |
| |
| /** |
| * create the modeler binding if it is needed |
| * At the end of this call, modelerBinding != null |
| */ |
| private static void createModelerBinding() { |
| if (modelerBinding == null) { |
| modelerBinding = new ModelerBinding(); |
| } |
| } |
| |
| /** |
| * the inner class that does the binding |
| */ |
| private static ModelerBinding modelerBinding = null; |
| |
| /** |
| * This class provides a dynamic binding to the |
| * commons-modeler registry at run time |
| */ |
| static class ModelerBinding { |
| /** |
| * the constructor binds |
| */ |
| public ModelerBinding() { |
| bindToModeler(); |
| } |
| |
| /** |
| * can the binding bind? |
| * |
| * @return true iff the classes are bound |
| */ |
| public boolean canBind() { |
| return registry != null; |
| } |
| |
| /** |
| * log |
| */ |
| protected static Log log = LogFactory.getLog(ModelerBinding.class.getName()); |
| /** |
| * registry object |
| */ |
| Object registry; |
| /** |
| * method to call |
| */ |
| Method registerComponent; |
| |
| /** |
| * register using reflection. The perf hit is moot as jmx is |
| * all reflection anyway |
| * |
| * @param objectToRegister |
| * @param name |
| * @param context |
| */ |
| public boolean register(Object objectToRegister, String name, String context) { |
| if (registry != null) { |
| Object args[] = new Object[]{objectToRegister, name, context}; |
| try { |
| registerComponent.invoke(registry, args); |
| if (log.isDebugEnabled()) { |
| log.debug("Registered " + name + " in " + context); |
| } |
| } catch (IllegalAccessException e) { |
| log.error(e); |
| return false; |
| } catch (IllegalArgumentException e) { |
| log.error(e); |
| return false; |
| } catch (InvocationTargetException e) { |
| log.error(e); |
| return false; |
| } |
| return true; |
| } else { |
| return false; |
| } |
| } |
| |
| /** |
| * bind to the modeler; return success/failure flag |
| * |
| * @return true if the binding worked |
| */ |
| private boolean bindToModeler() { |
| Exception ex = null; |
| Class clazz; |
| try { |
| clazz = Class.forName("org.apache.commons.modeler.Registry"); |
| } catch (ClassNotFoundException e) { |
| // just ignore it silently if we don't have commons-modeler.jar around |
| registry = null; |
| return false; |
| } |
| try { |
| Class[] getRegistryArgs = new Class[]{Object.class, Object.class,}; |
| Method getRegistry = clazz.getMethod("getRegistry", getRegistryArgs); |
| Object[] getRegistryOptions = new Object[]{null, null}; |
| registry = getRegistry.invoke(null, getRegistryOptions); |
| Class[] registerArgs = new Class[]{Object.class, |
| String.class, |
| String.class}; |
| registerComponent = clazz.getMethod("registerComponent", registerArgs); |
| } catch (IllegalAccessException e) { |
| ex = e; |
| } catch (IllegalArgumentException e) { |
| ex = e; |
| } catch (InvocationTargetException e) { |
| ex = e; |
| } catch (NoSuchMethodException e) { |
| ex = e; |
| } |
| // handle any of these exceptions |
| if (ex != null) { |
| //log the error |
| log.warn(Messages.getMessage("Registrar.cantregister"), ex); |
| //mark the registration as a failure |
| registry = null; |
| //and fail |
| return false; |
| } else { |
| //success |
| return true; |
| } |
| } |
| } |
| } |