/* * RHQ Management Platform * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.gui.util; import java.beans.Introspector; import java.lang.reflect.Method; import org.rhq.enterprise.server.util.LookupUtil; /** * A common Seam component that wraps the {@link LookupUtil}, so that any Seam * components can use the common DI mechanism to obtain EJB references. * * This component primarily exists to keep the JNDI lookup in the {@link LookupUtil} * so that it will not conflict with Seam's JNDI lookup mechanism. Eventually, all * session beans can simply be annotated as Seam components and the {@link LookupUtil} * (as well as this component) can be deprecated. * * For every getter method defined in {@link LookupUtil}, a Seam component will * be created that delegates component creation to that getter method. * * Example Usage: * <code>public static ResourceManagerLocal getResourceManager()</code> will be * called any time that a component with name "resourceManager" is injected: * * <code>@In private ResourceManagerLocal resourceManager;</code> is equivalent to * <code>private ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();</code> * * @author Justin Harris */ //@Startup //@Scope(ScopeType.APPLICATION) //@Name("lookupComponent") public class LookupComponent { //@In //private Init init; //@In //private Context applicationContext; //@Create public void scanComponents() { for (Method method : LookupUtil.class.getDeclaredMethods()) { String methodName = method.getName(); // only worried about getters if (methodName.startsWith("get")) { String componentName = getPropertyName(methodName); addComponent(componentName, method); } } } /** * Returns e.g. "foo" for <code>getterMethodName</code> "getFoo" * * @param getterMethodName * @return */ private String getPropertyName(String getterMethodName) { return Introspector.decapitalize(getterMethodName.substring(3)); } /** * Registers a new Seam component that uses the <code>creationMethod</code> * to "instantiate" a component with the given <code>componentName</code> * * @param componentName * @param creationMethod */ private void addComponent(String componentName, Method creationMethod) { LookupUtilComponent component = new LookupUtilComponent(componentName, creationMethod); //this.applicationContext.set(componentName + ".component", component); // set the new component to @AutoCreate //this.init.addAutocreateVariable(componentName); } /** * Custom Seam component that delegates component intantiation to a creation * method. This is similar in concept to Seam @Factory methods. */ class LookupUtilComponent /*extends Component*/{ private Method creationMethod; Method getCreationMethod() { return this.creationMethod; } private LookupUtilComponent(String name, Method creationMethod) { //super(Object.class, name); this.creationMethod = creationMethod; } //@Override protected Object instantiate() throws Exception { return this.creationMethod.invoke(null); } } }