tomj 02/02/12 09:28:33 Modified: java/src/org/apache/axis/providers/java JavaProvider.java EJBProvider.java Log: Rework EJBProvider to use the correct Remote Interface class information to generate WSDL In the process commented and cleaned up EJVProvider. Revision Changes Path 1.35 +33 -23 xml-axis/java/src/org/apache/axis/providers/java/JavaProvider.java Index: JavaProvider.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/providers/java/JavaProvider.java,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- JavaProvider.java 8 Feb 2002 03:09:25 -0000 1.34 +++ JavaProvider.java 12 Feb 2002 17:28:32 -0000 1.35 @@ -253,6 +253,12 @@ category.debug(JavaUtils.getMessage("exit00", "JavaProvider::invoke (" + this + ")")); } + /** + * Generate the WSDL for this service. + * + * Put in the "WSDL" property of the message context + * as a org.w3c.dom.Document + */ public void generateWSDL(MessageContext msgContext) throws AxisFault { if (category.isDebugEnabled()) category.debug(JavaUtils.getMessage("enter00", "JavaProvider::editWSDL (" + this + ")")); @@ -264,18 +270,6 @@ /* Now get the service (RPC) specific info */ /********************************************/ - String clsName = getServiceClassName(service); - Object obj = null; - try { - obj = getServiceObject(msgContext, - service, - clsName); - } catch( Exception exp ) { - category.error( exp ); - throw AxisFault.makeFault(exp); - } - - JavaClass jc = JavaClass.find(obj.getClass()); String allowedMethods = getAllowedMethods(service); /** ??? Should we enforce setting methodName? As it was, @@ -293,19 +287,21 @@ allowedMethods = null; /** If the class knows what it should be exporting, - * respect its wishes. - */ - if (obj instanceof AxisServiceConfig) { - allowedMethods = ((AxisServiceConfig)obj).getMethods(); - } + * respect its wishes. + * XXX - this system (AxisSeriviceConfig interface) is going to be + * removed per the TODO list, so it wont work for WSDL right now + * [EMAIL PROTECTED] + */ +// if (obj instanceof AxisServiceConfig) { +// allowedMethods = ((AxisServiceConfig)obj).getMethods(); +// } try { - ClassLoader cl = msgContext.getClassLoader(); - Class cls = jc.getJavaClass(); String url = msgContext.getStrProp(MessageContext.TRANS_URL); String urn = (String)msgContext.getTargetService(); String description = "Service"; + Class cls = getServiceClass(msgContext, getServiceClassName(service)); Emitter emitter = new Emitter(); emitter.setClsSmart(cls,url); emitter.setAllowedMethods(allowedMethods); @@ -343,7 +339,7 @@ /** * Default java service object comes from simply instantiating the - * class wrapped in jc + * class wrapped in jc * */ protected Object getNewServiceObject(MessageContext msgContext, @@ -352,13 +348,13 @@ { ClassLoader cl = msgContext.getClassLoader(); ClassCache cache = msgContext.getAxisEngine().getClassCache(); - JavaClass jc = cache.lookup(clsName, cl); + JavaClass jc = cache.lookup(clsName, cl); return jc.getJavaClass().newInstance(); } /** - * + * Return the class name of the service */ protected String getServiceClassName(Handler service) { @@ -366,10 +362,24 @@ } /** - * + * Return the option in the configuration that contains the service class + * name */ protected String getServiceClassNameOptionName() { return classNameOption; } + + /** + * Returns the Class info about the service class. + */ + protected Class getServiceClass(MessageContext msgContext, String clsName) throws Exception { + Handler service = msgContext.getServiceHandler(); + Object obj = getServiceObject(msgContext, + service, + clsName); + + return obj.getClass(); + } + } 1.13 +143 -48 xml-axis/java/src/org/apache/axis/providers/java/EJBProvider.java Index: EJBProvider.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/providers/java/EJBProvider.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- EJBProvider.java 8 Feb 2002 22:14:11 -0000 1.12 +++ EJBProvider.java 12 Feb 2002 17:28:33 -0000 1.13 @@ -70,6 +70,7 @@ * A basic EJB Provider * * @author Carl Woolf ([EMAIL PROTECTED]) + * @author Tom Jordahl ([EMAIL PROTECTED]) */ public class EJBProvider extends RPCProvider { @@ -91,20 +92,144 @@ /////////////////////////////////////////////////////////////// /** - * + * Return a object which implements the service. + * + * @param msgContext the message context + * @param clsName The JNDI name of the EJB home class + * @return an object that implements the service */ protected Object getNewServiceObject(MessageContext msgContext, String clsName) throws Exception { Handler serviceHandler = msgContext.getServiceHandler(); - Object home; + + // Get the EJB Home object from JNDI + Object ejbHome = getEJBHome(msgContext, clsName); + + // Get the Home class name from the configuration file + // NOTE: Do we really need to have this in the config file + // since we can get it from ejbHome.getClass()??? + String homeName = (String) getStrOption(homeInterfaceNameOption, + serviceHandler); + if (homeName == null) + throw new AxisFault( + JavaUtils.getMessage("noOption00", + homeInterfaceNameOption, + msgContext.getTargetService())); + + // Load the Home class name given in the config file + Class homeClass = msgContext.getClassLoader().loadClass(homeName); + + // Make sure the object we got back from JNDI is the same type + // as the what is specified in the config file + Object ehome = javax.rmi.PortableRemoteObject.narrow(ejbHome, homeClass); + + // Invoke the create method of the ejbHome class without actually + // touching any EJB classes (i.e. no cast to EJBHome) + Method createMethod = homeClass.getMethod("create", empty_class_array); + Object result = createMethod.invoke(ehome, empty_object_array); + + return result; + } + + /** + * Return the option in the configuration that contains the service class + * name. In the EJB case, it is the JNDI name of the bean. + */ + protected String getServiceClassNameOptionName() + { + return beanNameOption; + } + + /** + * Get a String option by looking first in the service options, + * and then at the Handler's options. This allows defaults to be + * specified at the provider level, and then overriden for particular + * services. + * + * @param optionName the option to retrieve + * @return String the value of the option or null if not found in + * either scope + */ + private String getStrOption(String optionName, Handler service) + { + String value = null; + if (service != null) + value = (String)service.getOption(optionName); + if (value == null) + value = (String)getOption(optionName); + return value; + } + + /** + * Get the class description for the EJB Remote Interface, which is what + * we are interested in exposing to the world (i.e. in WSDL). + * + * @param msgContext the message context + * @param beanJndiName the JNDI name of the EJB + * @return the class info of the EJB remote interface + */ + protected Class getServiceClass(MessageContext msgContext, String beanJndiName) throws Exception { + Handler serviceHandler = msgContext.getServiceHandler(); + + // Get the EJB Home object from JNDI + Object ejbHome = getEJBHome(msgContext, beanJndiName); + + String homeName = (String) getStrOption(homeInterfaceNameOption, + serviceHandler); + if (homeName == null) + throw new AxisFault( + JavaUtils.getMessage("noOption00", + homeInterfaceNameOption, + msgContext.getTargetService())); + + // Load the Home class name given in the config file + Class homeClass = msgContext.getClassLoader().loadClass(homeName); + + // Make sure the object we got back from JNDI is the same type + // as the what is specified in the config file + Object ehome = javax.rmi.PortableRemoteObject.narrow(ejbHome, homeClass); + + // This code requires the use of ejb.jar, so we do the funny stuff below + // EJBHome ejbHome = (EJBHome) ehome; + // EJBMetaData meta = ejbHome.getEJBMetaData(); + // Class interfaceClass = meta.getRemoteInterfaceClass(); + + // Invoke the getEJBMetaData method of the ejbHome class without actually + // touching any EJB classes (i.e. no cast to EJBHome) + Method getEJBMetaData = + homeClass.getMethod("getEJBMetaData", empty_class_array); + Object metaData = + getEJBMetaData.invoke(ehome, empty_object_array); + Method getRemoteInterfaceClass = + metaData.getClass().getMethod("getRemoteInterfaceClass", + empty_class_array); + Class interfaceClass = + (Class) getRemoteInterfaceClass.invoke(metaData, + empty_object_array); + + // got it, return it + return interfaceClass; + + } + + /** + * Common routine to do the JNDI lookup on the Home interface object + */ + private Object getEJBHome(MessageContext msgContext, String beanJndiName) throws AxisFault { + Handler serviceHandler = msgContext.getServiceHandler(); + Object ejbHome; Properties properties = null; + // Set up an InitialContext and use it get the beanJndiName from JNDI try { + // collect all the properties we need to access JNDI: + // username, password, factoryclass, contextUrl String username = (String)getStrOption(jndiUsername, serviceHandler); + // username if (username == null) username = msgContext.getUsername(); if (username != null) { @@ -113,6 +238,7 @@ username); } + // password String password = (String)getStrOption(jndiPassword, serviceHandler); if (password == null) @@ -123,6 +249,7 @@ password); } + // factory class String factoryClass = (String)getStrOption(jndiContextClass, serviceHandler); if (factoryClass != null) { @@ -131,6 +258,7 @@ factoryClass); } + // contextUrl String contextUrl = (String)getStrOption(jndiURL, serviceHandler); if (contextUrl != null) { @@ -139,67 +267,34 @@ contextUrl); } + // if we got any stuff from the configuration file + // create a new context using these properties + // otherwise, we can get a default context and cache it for next time InitialContext context = null; - if (properties != null) + if (properties != null) { context = new InitialContext(properties); - else - { + } else { if (cached_context == null) cached_context = new InitialContext(); context = cached_context; } - + + // if we didn't get a context, fail if (context == null) throw new AxisFault( JavaUtils.getMessage("cannotCreateInitialContext00")); - home = context.lookup(clsName); - if (home == null) - throw new AxisFault( JavaUtils.getMessage("cannotFindJNDIHome00",clsName)); + // Do the JNDI lookup + ejbHome = context.lookup(beanJndiName); + if (ejbHome == null) + throw new AxisFault( JavaUtils.getMessage("cannotFindJNDIHome00",beanJndiName)); } // Should probably catch javax.naming.NameNotFoundException here catch (Exception exception) { throw AxisFault.makeFault(exception); } - - String homeName = (String) getStrOption(homeInterfaceNameOption, - serviceHandler); - if (homeName == null) - throw new AxisFault(JavaUtils.getMessage("noOption00", homeInterfaceNameOption, msgContext.getTargetService())); - - Class homeClass = msgContext.getClassLoader().loadClass(homeName); - Object ehome = javax.rmi.PortableRemoteObject.narrow(home, homeClass); - Method createMethod = homeClass.getMethod("create", empty_class_array); - Object result = createMethod.invoke(ehome, empty_object_array); - - return result; + return ejbHome; } - /** - * - */ - protected String getServiceClassNameOptionName() - { - return beanNameOption; - } - /** - * Get a String option by looking first in the service options, - * and then at the Handler's options. This allows defaults to be - * specified at the provider level, and then overriden for particular - * services. - * - * @param optionName the option to retrieve - * @return String the value of the option or null if not found in - * either scope - */ - private String getStrOption(String optionName, Handler service) - { - String value = null; - if (service != null) - value = (String)service.getOption(optionName); - if (value == null) - value = (String)getOption(optionName); - return value; - } -} +} \ No newline at end of file