Here is an example of invoking a facade bean that is created by the Cram modeling and build environments. This could be utilized in a context where you are implementing an alternative web services implementation. In this particular example the code is specific to a WebLogic Server application server, but could easily be modified for WebSphere as shown in the commented section.
package webservice;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class FacadeUsageDemo {
/**
* Illustrates how a Curam facade can be invoked from a client.
*/
private void invokeFacade() throws NamingException,
ClassNotFoundException, SecurityException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
final String sUser = "tester";
final String sPassword = "password";
// TODO: Change for non-WebLogic application server.
final String initialCtxFactory =
"weblogic.jndi.WLInitialContextFactory";
final String providerUrl = "t3://localhost:7001";
// Authenticate and get an initial context.
final Properties properties = new Properties();
properties.setProperty(Context.SECURITY_PRINCIPAL, sUser);
properties.setProperty(Context.SECURITY_CREDENTIALS,
sPassword);
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
initialCtxFactory);
properties.setProperty(Context.PROVIDER_URL, providerUrl);
final Context initialContext =
new InitialContext(properties);
// Lookup the facade bean.
final Object o =
initialContext.
lookup("java:comp/env/curamejb/MyFacadeBeanClass");
// Load the home interface class so that we can narrow to it.
final Class<?> cls = getContextClassLoader().loadClass(
"my.custom.remote.MyFacadeHome");
final Object ehome =
javax.rmi.PortableRemoteObject.narrow(o, cls);
// Get and invoke the 'create' method of the home interface
// to give us a reference to the facade bean.
final Method createMethod =
cls.getMethod("create", new Class[0]);
final Object facadeObj =
createMethod.invoke(ehome, new Object[0]);
// Use reflection to get and invoke the method
// 'myMethod' of our interface.
final Class<?> facadeObjClass = facadeObj.getClass();
final Method myMethod =
facadeObjClass.getMethod("myMethod", new Class[0]);
// Pass arguments to invoke based on the method signature:
myMethod.invoke(facadeObj, new Object[0]);
initialContext.close();
// Note: once the initialContext object has been obtained,
// the remainder of this method could be written like this.
// However due to problems experienced with loading classes
// in WebLogic, the above workaround is necessary so that a
// classloader could be explicitly specified.
//try {
// final custom.webservice.remote.MyFacadeBeanClassHome
// ehome =
// (custom.webservice.remote.MyFacadeBeanClassHome)
// javax.rmi.PortableRemoteObject.narrow(
// o,
// custom.webservice.remote.MyFacadeBeanClassHome.class);
// custom.webservice.remote.MyFacadeBeanClass facadeObj =
// ehome.create();
// // Assumes a void method here; otherwise, arguments
// // would be needed:
// facadeObj.myMethod();
// initialContext.close();
//} catch (Throwable t) {
// t.printStackTrace();
//}
}
/**
* Gets the class loader for the context.
*
* @return ClassLoader for the context.
*/
private ClassLoader getContextClassLoader() {
return AccessController.doPrivileged(
new PrivilegedAction<ClassLoader>() {
/**
* PrvilegedAction subclass.
*
* @return ClassLoader for the context.
*/
public ClassLoader run() {
return Thread.currentThread().getContextClassLoader();
}
}
);
}
}