modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java | 25 ++- modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/commands/ScriptCommandTest.java | 4 modules/enterprise/server/client-api/src/main/java/org/rhq/enterprise/client/LocalClient.java | 66 ---------- modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java | 26 +++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java | 32 ++++ 5 files changed, 77 insertions(+), 76 deletions(-)
New commits: commit 76a91bd24c1acb40e190c66271964ecea3bfe881 Author: Lukas Krejci lkrejci@redhat.com Date: Tue Oct 2 16:45:55 2012 +0200
Make the RhqManager class the sole place to define everything is necessary for defining and making available a new *Manager to the scripting clients.
Also removed a property on RhqManager that was only used in a single test method and replaced its usage.
diff --git a/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java b/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java index cfa52e2..1dd79f1 100644 --- a/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java +++ b/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java @@ -89,14 +89,17 @@ public enum RhqManager { SynchronizationManager(SynchronizationManagerRemote.class, "${SynchronizationManager}");
private Class<?> remote; - private String remoteName; + private String localInterfaceClassName; private String beanName; private boolean enabled;
+ private static final int REMOTE_IFACE_SUFFIX_LENGTH = "Remote".length(); + private RhqManager(Class<?> remote, String enable) { this.remote = remote; this.beanName = this.name() + "Bean"; - this.remoteName = this.name() + "Remote"; + localInterfaceClassName = getLocalInterfaceClassName(remote); + //defaults and evaluates to TRUE unless the string contains "false". Done to defend against //possible errors in string replacement during rhq build. this.enabled = true; @@ -119,15 +122,25 @@ public enum RhqManager { return this.remote; }
- public String beanName() { - return this.beanName; + public String localInterfaceClassName() { + return localInterfaceClassName; }
- public String remoteName() { - return this.remoteName; + public String beanName() { + return this.beanName; }
public boolean enabled() { return this.enabled; } + + private static String getLocalInterfaceClassName(Class<?> remoteIface) { + String ifaceName = remoteIface.getName(); + if (!ifaceName.endsWith("Remote")) { + throw new AssertionError("Inconsistent SLSB naming in RHQ! Remote interface '" + remoteIface.getName() + + "' does not follow the established naming convention. This is a bug, please report it."); + } + + return ifaceName.substring(0, ifaceName.length() - REMOTE_IFACE_SUFFIX_LENGTH) + "Local"; + } } \ No newline at end of file diff --git a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/commands/ScriptCommandTest.java b/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/commands/ScriptCommandTest.java index 8cf3ceb..d5f1c00 100644 --- a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/commands/ScriptCommandTest.java +++ b/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/commands/ScriptCommandTest.java @@ -61,11 +61,11 @@ public class ScriptCommandTest {
void assertManagersBoundToScript() { ScriptEngine scriptEngine = client.getScriptEngine(); - List<String> mgrsNotBound = new ArrayList<String>(); + List<Class<?>> mgrsNotBound = new ArrayList<Class<?>>();
for (RhqManager mgr : RhqManager.values()) { if (!scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE).containsKey(mgr.name())) { - mgrsNotBound.add(mgr.remoteName()); + mgrsNotBound.add(mgr.remote()); } }
diff --git a/modules/enterprise/server/client-api/src/main/java/org/rhq/enterprise/client/LocalClient.java b/modules/enterprise/server/client-api/src/main/java/org/rhq/enterprise/client/LocalClient.java index 5cbed7e..a918389 100644 --- a/modules/enterprise/server/client-api/src/main/java/org/rhq/enterprise/client/LocalClient.java +++ b/modules/enterprise/server/client-api/src/main/java/org/rhq/enterprise/client/LocalClient.java @@ -137,70 +137,6 @@ public class LocalClient implements RhqFacade { }
private Object getLocalSLSB(RhqManager manager) { - switch (manager) { - case AlertDefinitionManager: - return LookupUtil.getAlertDefinitionManager(); - case AlertManager: - return LookupUtil.getAlertManager(); - case AvailabilityManager: - return LookupUtil.getAvailabilityManager(); - case BundleManager: - return LookupUtil.getBundleManager(); - case CallTimeDataManager: - return LookupUtil.getCallTimeDataManager(); - case ConfigurationManager: - return LookupUtil.getConfigurationManager(); - case ContentManager: - return LookupUtil.getContentManager(); - case DataAccessManager: - return LookupUtil.getDataAccessManager(); - case DiscoveryBoss: - return LookupUtil.getDiscoveryBoss(); - case DriftManager: - return LookupUtil.getDriftManager(); - case DriftTemplateManager: - return LookupUtil.getDriftTemplateManager(); - case EventManager: - return LookupUtil.getEventManager(); - case MeasurementBaselineManager: - return LookupUtil.getMeasurementBaselineManager(); - case MeasurementDataManager: - return LookupUtil.getMeasurementDataManager(); - case MeasurementDefinitionManager: - return LookupUtil.getMeasurementDefinitionManager(); - case MeasurementScheduleManager: - return LookupUtil.getMeasurementScheduleManager(); - case OperationManager: - return LookupUtil.getOperationManager(); - case RemoteInstallManager: - return LookupUtil.getRemoteInstallManager(); - case RepoManager: - return LookupUtil.getRepoManagerLocal(); - case ResourceFactoryManager: - return LookupUtil.getResourceFactoryManager(); - case ResourceGroupManager: - return LookupUtil.getResourceGroupManager(); - case ResourceManager: - return LookupUtil.getResourceManager(); - case ResourceTypeManager: - return LookupUtil.getResourceTypeManager(); - case RoleManager: - return LookupUtil.getRoleManager(); - case SavedSearchManager: - return LookupUtil.getSavedSearchManager(); - case SubjectManager: - return LookupUtil.getSubjectManager(); - case SupportManager: - return LookupUtil.getSupportManager(); - case SynchronizationManager: - return LookupUtil.getSynchronizationManager(); - case SystemManager: - return LookupUtil.getSystemManager(); - case TagManager: - return LookupUtil.getTagManager(); - } - - throw new IllegalStateException("LocalClient does not handle the manager: " + manager - + ". This is a bug, please report it."); + return LookupUtil.getEjb(manager.beanName(), manager.localInterfaceClassName()); } } diff --git a/modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java b/modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java index 61f9ea0..c7165cc 100644 --- a/modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java +++ b/modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java @@ -19,11 +19,15 @@
package org.rhq.enterprise.client.test;
+import static org.testng.Assert.assertEquals; + import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.net.URL; import java.net.URLClassLoader; +import java.util.Arrays; +import java.util.HashSet; import java.util.Hashtable;
import javax.naming.Context; @@ -63,8 +67,12 @@ public class LocalClientTest extends JMockTest { System.setProperty(Context.INITIAL_CONTEXT_FACTORY, FakeContextFactory.class.getName()); }
- @Test - public void testResilienceAgainstContextClassloaders() throws Exception { + /** + * Needs to be called from within a test method so that the "context" variable is available. + * + * @throws NamingException + */ + private void setupFakeJndiLookup() throws NamingException { CONTEXT_MOCK_FOR_TEST = context.mock(Context.class);
context.checking(new Expectations() {{ @@ -102,6 +110,20 @@ public class LocalClientTest extends JMockTest {
allowing(CONTEXT_MOCK_FOR_TEST).close(); }}); + } + + @Test + public void testAllManagersInstantiable() throws Exception { + setupFakeJndiLookup(); + + LocalClient lc = new LocalClient(null); + assertEquals(lc.getScriptingAPI().keySet(), new HashSet<RhqManager>(Arrays.asList(RhqManager.values())), + "Scripting API contains different managers than expected."); + } + + @Test + public void testResilienceAgainstContextClassloaders() throws Exception { + setupFakeJndiLookup();
ClassLoader origCl = Thread.currentThread().getContextClassLoader(); try { diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java index e49498c..8ef6a9f 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java @@ -632,6 +632,18 @@ public final class LookupUtil { return service; }
+ /** + * Generic method to lookup an Ejb bean by name and the interface name + * + * @param beanName the name of the EJB bean + * @param interfaceName the full class name of either the remote or local interface + * + * @return the bean accessed through specified inerface + */ + public static Object getEjb(String beanName, String interfaceName) { + return lookupByName(beanName, interfaceName); + } + //-------------------------------------------- // The TEST services //-------------------------------------------- @@ -658,8 +670,15 @@ public final class LookupUtil {
// Private Methods
+ //in this method, we don't actually need the interfaceName yet, but + //this will become necessary as soon as we start using AS7 as our container. + //So let's be proactive here ;) + private static String getLocalJNDIName(String beanName, String interfaceName) { + return (embeddedDeployment ? "" : (RHQConstants.EAR_NAME + "/")) + beanName + "/local"; + } + private static <T> String getLocalJNDIName(@NotNull Class<? super T> beanClass) { - return (embeddedDeployment ? "" : (RHQConstants.EAR_NAME + "/")) + beanClass.getSimpleName() + "/local"; + return getLocalJNDIName(beanClass.getSimpleName(), beanClass.getName().replace("Bean", "Local")); }
/** @@ -685,6 +704,17 @@ public final class LookupUtil { } }
+ private static Object lookupByName(String beanName, String localInterfaceName) { + String localJNDIName = "-not initialized-"; + try { + localJNDIName = getLocalJNDIName(beanName, localInterfaceName); + return lookup(localJNDIName); + } catch (NamingException e) { + throw new RuntimeException("Failed to lookup local interface to EJB " + beanName + ", localJNDI=[" + + localJNDIName + "]", e); + } + } + @SuppressWarnings("unchecked") private static <T> T lookupRemote(Class<? super T> type) { try {
rhq-commits@lists.fedorahosted.org