FileDocCategorySizeDatePackage
ServiceRefFactory.javaAPI DocApache Tomcat 6.0.1415809Fri Jul 20 04:20:34 BST 2007org.apache.naming.factory.webservices

ServiceRefFactory

public class ServiceRefFactory extends Object implements ObjectFactory
Object factory for Web Services.
author
Fabien Carrion

Fields Summary
Constructors Summary
Methods Summary
public java.lang.ObjectgetObjectInstance(java.lang.Object obj, javax.naming.Name name, javax.naming.Context nameCtx, java.util.Hashtable environment)
Crete a new serviceref instance.

param
obj The reference object describing the webservice


        if (obj instanceof ServiceRef) {
            Reference ref = (Reference) obj;

            // ClassLoader
            ClassLoader tcl = 
                Thread.currentThread().getContextClassLoader();
            if (tcl == null)
                tcl = this.getClass().getClassLoader();
            ServiceFactory factory = ServiceFactory.newInstance();
            javax.xml.rpc.Service service = null;

            // Service Interface
            RefAddr tmp = ref.get(ServiceRef.SERVICE_INTERFACE);
            String serviceInterface = null;
            if (tmp != null)
                serviceInterface = (String) tmp.getContent();

            // WSDL
            tmp = ref.get(ServiceRef.WSDL);
            String wsdlRefAddr = null;
            if (tmp != null)
                wsdlRefAddr = (String) tmp.getContent();

            // PortComponent
            Hashtable portComponentRef = new Hashtable();

            // Create QName object
            QName serviceQname = null;
            tmp = ref.get(ServiceRef.SERVICE_LOCAL_PART);
            if (tmp != null) {
                String serviceLocalPart = (String) tmp.getContent();
                tmp = ref.get(ServiceRef.SERVICE_NAMESPACE);
                if (tmp == null) {
                    serviceQname = new QName(serviceLocalPart);
                } else {
                    String serviceNamespace = (String) tmp.getContent();
                    serviceQname = new QName(serviceNamespace,
                            serviceLocalPart);
                }
            }
            Class serviceInterfaceClass = null;

            // Create service object
            if (serviceInterface == null) {
                if (serviceQname == null) {
                    throw new NamingException
                    ("Could not create service-ref instance");
                }
                try {
                    if (wsdlRefAddr == null) {
                        service = factory.createService( serviceQname );
                    } else {
                        service = factory.createService( new URL(wsdlRefAddr),
                                serviceQname );
                    }
                } catch (Throwable t) {
                    NamingException ex = new NamingException
                    ("Could not create service");
                    ex.initCause(t);
                    throw ex;
                }
            } else {
                // Loading service Interface
                try {
                    serviceInterfaceClass = tcl.loadClass(serviceInterface);
                } catch(ClassNotFoundException e) {
                    NamingException ex = new NamingException
                    ("Could not load service Interface");
                    ex.initCause(e);
                    throw ex;
                }
                if (serviceInterfaceClass == null) {
                    throw new NamingException
                    ("Could not load service Interface");
                }
                try {
                    if (wsdlRefAddr == null) {
                        if (!Service.class.isAssignableFrom(serviceInterfaceClass)) {
                            throw new NamingException
                            ("service Interface should extend javax.xml.rpc.Service");
                        }
                        service = factory.loadService( serviceInterfaceClass );
                    } else {
                        service = factory.loadService( new URL(wsdlRefAddr),
                                serviceInterfaceClass,
                                new Properties() );
                    }
                } catch (Throwable t) {
                    NamingException ex = new NamingException
                    ("Could not create service");
                    ex.initCause(t);
                    throw ex;
                }
            }
            if (service == null) {
                throw new NamingException
                ("Cannot create service object");
            }
            serviceQname = service.getServiceName();
            serviceInterfaceClass = service.getClass();
            if (wsdlRefAddr != null) {
                try {
                    WSDLFactory wsdlfactory = WSDLFactory.newInstance();
                    WSDLReader reader = wsdlfactory.newWSDLReader();
                    reader.setFeature("javax.wsdl.importDocuments", true);
                    Definition def = reader.readWSDL((new URL(wsdlRefAddr)).toExternalForm());

                    javax.wsdl.Service wsdlservice = def.getService(serviceQname);
                    Map ports = wsdlservice.getPorts();
                    Method m = serviceInterfaceClass.getMethod("setEndpointAddress",
                            new Class[] { java.lang.String.class,
                            java.lang.String.class });
                    for (Iterator i = ports.keySet().iterator(); i.hasNext();) {
                        String portName = (String) i.next();
                        Port port = wsdlservice.getPort(portName);
                        String endpoint = getSOAPLocation(port);
                        m.invoke(service, new Object[] {port.getName(), endpoint });
                        portComponentRef.put(endpoint, new QName(port.getName()));
                    }
                } catch (Throwable t) {
                    NamingException ex = new NamingException
                    ("Error while reading Wsdl File");
                    ex.initCause(t);
                    throw ex;
                }
            }

            ServiceProxy proxy = new ServiceProxy(service);

            // Use port-component-ref
            for (int i = 0; i < ref.size(); i++)
                if (ServiceRef.SERVICEENDPOINTINTERFACE.equals(ref.get(i).getType())) {
                    String serviceendpoint = "";
                    String portlink = "";
                    serviceendpoint = (String) ref.get(i).getContent();
                    if (ServiceRef.PORTCOMPONENTLINK.equals(ref.get(i + 1).getType())) {
                        i++;
                        portlink = (String) ref.get(i).getContent();
                    }
                    portComponentRef.put(serviceendpoint, new QName(portlink));

                }
            proxy.setPortComponentRef(portComponentRef);

            // Instantiate service with proxy class
            Class[] interfaces = null;
            Class[] serviceInterfaces = serviceInterfaceClass.getInterfaces();
            if (serviceInterfaceClass != null) {
                interfaces = new Class[serviceInterfaces.length + 1];
                for (int i = 0; i < serviceInterfaces.length; i++) {
                    interfaces[i] = serviceInterfaces[i];
                }
            } else {
                interfaces = new Class[1];
            }
            interfaces[interfaces.length - 1] = javax.xml.rpc.Service.class;
            Object proxyInstance = null;
            try {
                proxyInstance = Proxy.newProxyInstance(tcl, interfaces, proxy);
            } catch (IllegalArgumentException e) {
                proxyInstance = Proxy.newProxyInstance(tcl, serviceInterfaces, proxy);
            }

            // Use handler
            if (((ServiceRef) ref).getHandlersSize() > 0) {

                HandlerRegistry handlerRegistry = service.getHandlerRegistry();
                ArrayList soaproles = new ArrayList();

                while (((ServiceRef) ref).getHandlersSize() > 0) {
                    HandlerRef handler = ((ServiceRef) ref).getHandler();
                    HandlerInfo handlerref = new HandlerInfo();

                    // Loading handler Class
                    tmp = handler.get(HandlerRef.HANDLER_CLASS);
                    if ((tmp == null) || (tmp.getContent() == null))
                        break;
                    Class handlerClass = null;
                    try {
                        handlerClass = tcl.loadClass((String) tmp.getContent());
                    } catch(ClassNotFoundException e) {
                        break;
                    }

                    // Load all datas relative to the handler : SOAPHeaders, config init element,
                    // portNames to be set on
                    ArrayList headers = new ArrayList();
                    Hashtable config = new Hashtable();
                    ArrayList portNames = new ArrayList();
                    for (int i = 0; i < handler.size(); i++)
                        if (HandlerRef.HANDLER_LOCALPART.equals(handler.get(i).getType())) {
                            String localpart = "";
                            String namespace = "";
                            localpart = (String) handler.get(i).getContent();
                            if (HandlerRef.HANDLER_NAMESPACE.equals(handler.get(i + 1).getType())) {
                                i++;
                                namespace = (String) handler.get(i).getContent();
                            }
                            QName header = new QName(namespace, localpart);
                            headers.add(header);
                        } else if (HandlerRef.HANDLER_PARAMNAME.equals(handler.get(i).getType())) {
                            String paramName = "";
                            String paramValue = "";
                            paramName = (String) handler.get(i).getContent();
                            if (HandlerRef.HANDLER_PARAMVALUE.equals(handler.get(i + 1).getType())) {
                                i++;
                                paramValue = (String) handler.get(i).getContent();
                            }
                            config.put(paramName, paramValue);
                        } else if (HandlerRef.HANDLER_SOAPROLE.equals(handler.get(i).getType())) {
                            String soaprole = "";
                            soaprole = (String) handler.get(i).getContent();
                            soaproles.add(soaprole);
                        } else if (HandlerRef.HANDLER_PORTNAME.equals(handler.get(i).getType())) {
                            String portName = "";
                            portName = (String) handler.get(i).getContent();
                            portNames.add(portName);
                        }

                    // Set the handlers informations
                    handlerref.setHandlerClass(handlerClass);
                    handlerref.setHeaders((QName []) headers.toArray(new QName[headers.size()]));
                    handlerref.setHandlerConfig(config);

                    if (!portNames.isEmpty()) {
                        Iterator iter = portNames.iterator();
                        while (iter.hasNext())
                            initHandlerChain(new QName((String) iter.next()), handlerRegistry,
                                    handlerref, soaproles);
                    } else {
                        Enumeration e = portComponentRef.elements();
                        while(e.hasMoreElements())
                            initHandlerChain((QName) e.nextElement(), handlerRegistry,
                                    handlerref, soaproles);
                    }
                }
            }

            return proxyInstance;

        }

        return null;

    
private java.lang.StringgetSOAPLocation(javax.wsdl.Port port)

param
port analyzed port
return
Returns the endpoint URL of the given Port

        String endpoint = null;
        List extensions = port.getExtensibilityElements();
        for (Iterator i = extensions.iterator(); i.hasNext();) {
            ExtensibilityElement ext = (ExtensibilityElement) i.next();
            if (ext instanceof SOAPAddress) {
                SOAPAddress addr = (SOAPAddress) ext;
                endpoint = addr.getLocationURI();
            }
        }
        return endpoint;
    
private voidinitHandlerChain(javax.xml.namespace.QName portName, javax.xml.rpc.handler.HandlerRegistry handlerRegistry, javax.xml.rpc.handler.HandlerInfo handlerref, java.util.ArrayList soaprolesToAdd)

        HandlerChain handlerList = (HandlerChain) handlerRegistry.getHandlerChain(portName);
        handlerList.add(handlerref);
        String[] soaprolesRegistered = handlerList.getRoles();
        String [] soaproles = new String[soaprolesRegistered.length + soaprolesToAdd.size()];
        int i;
        for (i = 0;i < soaprolesRegistered.length; i++)
            soaproles[i] = soaprolesRegistered[i];
        for (int j = 0; j < soaprolesToAdd.size(); j++)
            soaproles[i+j] = (String) soaprolesToAdd.get(j);
        handlerList.setRoles(soaproles);
        handlerRegistry.setHandlerChain(portName, handlerList);