Search in sources :

Example 1 with ServiceFactory

use of javax.xml.rpc.ServiceFactory in project tomcat by apache.

the class ServiceRefFactory method getObjectInstance.

/**
     * Create a new serviceref instance.
     *
     * @param obj The reference object describing the webservice
     */
@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
    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<String, QName> 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 (Exception e) {
                NamingException ex = new NamingException("Could not create service");
                ex.initCause(e);
                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 (Exception e) {
                NamingException ex = new NamingException("Could not create service");
                ex.initCause(e);
                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);
                @SuppressWarnings("unchecked") Map<String, ?> ports = wsdlservice.getPorts();
                Method m = serviceInterfaceClass.getMethod("setEndpointAddress", new Class[] { java.lang.String.class, java.lang.String.class });
                for (Iterator<String> i = ports.keySet().iterator(); i.hasNext(); ) {
                    String portName = 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 (Exception e) {
                if (e instanceof InvocationTargetException) {
                    Throwable cause = e.getCause();
                    if (cause instanceof ThreadDeath) {
                        throw (ThreadDeath) cause;
                    }
                    if (cause instanceof VirtualMachineError) {
                        throw (VirtualMachineError) cause;
                    }
                }
                NamingException ex = new NamingException("Error while reading Wsdl File");
                ex.initCause(e);
                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();
        interfaces = new Class[serviceInterfaces.length + 1];
        for (int i = 0; i < serviceInterfaces.length; i++) {
            interfaces[i] = serviceInterfaces[i];
        }
        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<String> soaproles = new ArrayList<>();
            while (((ServiceRef) ref).getHandlersSize() > 0) {
                HandlerRef handlerRef = ((ServiceRef) ref).getHandler();
                HandlerInfo handlerInfo = new HandlerInfo();
                // Loading handler Class
                tmp = handlerRef.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<QName> headers = new ArrayList<>();
                Hashtable<String, String> config = new Hashtable<>();
                ArrayList<String> portNames = new ArrayList<>();
                for (int i = 0; i < handlerRef.size(); i++) if (HandlerRef.HANDLER_LOCALPART.equals(handlerRef.get(i).getType())) {
                    String localpart = "";
                    String namespace = "";
                    localpart = (String) handlerRef.get(i).getContent();
                    if (HandlerRef.HANDLER_NAMESPACE.equals(handlerRef.get(i + 1).getType())) {
                        i++;
                        namespace = (String) handlerRef.get(i).getContent();
                    }
                    QName header = new QName(namespace, localpart);
                    headers.add(header);
                } else if (HandlerRef.HANDLER_PARAMNAME.equals(handlerRef.get(i).getType())) {
                    String paramName = "";
                    String paramValue = "";
                    paramName = (String) handlerRef.get(i).getContent();
                    if (HandlerRef.HANDLER_PARAMVALUE.equals(handlerRef.get(i + 1).getType())) {
                        i++;
                        paramValue = (String) handlerRef.get(i).getContent();
                    }
                    config.put(paramName, paramValue);
                } else if (HandlerRef.HANDLER_SOAPROLE.equals(handlerRef.get(i).getType())) {
                    String soaprole = "";
                    soaprole = (String) handlerRef.get(i).getContent();
                    soaproles.add(soaprole);
                } else if (HandlerRef.HANDLER_PORTNAME.equals(handlerRef.get(i).getType())) {
                    String portName = "";
                    portName = (String) handlerRef.get(i).getContent();
                    portNames.add(portName);
                }
                // Set the handlers informations
                handlerInfo.setHandlerClass(handlerClass);
                handlerInfo.setHeaders(headers.toArray(new QName[headers.size()]));
                handlerInfo.setHandlerConfig(config);
                if (!portNames.isEmpty()) {
                    Iterator<String> iter = portNames.iterator();
                    while (iter.hasNext()) initHandlerChain(new QName(iter.next()), handlerRegistry, handlerInfo, soaproles);
                } else {
                    Enumeration<QName> e = portComponentRef.elements();
                    while (e.hasMoreElements()) initHandlerChain(e.nextElement(), handlerRegistry, handlerInfo, soaproles);
                }
            }
        }
        return proxyInstance;
    }
    return null;
}
Also used : ServiceFactory(javax.xml.rpc.ServiceFactory) Port(javax.wsdl.Port) ArrayList(java.util.ArrayList) Properties(java.util.Properties) URL(java.net.URL) RefAddr(javax.naming.RefAddr) HandlerRegistry(javax.xml.rpc.handler.HandlerRegistry) NamingException(javax.naming.NamingException) HandlerRef(org.apache.naming.HandlerRef) HandlerInfo(javax.xml.rpc.handler.HandlerInfo) Reference(javax.naming.Reference) Hashtable(java.util.Hashtable) QName(javax.xml.namespace.QName) Definition(javax.wsdl.Definition) Service(javax.xml.rpc.Service) Method(java.lang.reflect.Method) NamingException(javax.naming.NamingException) InvocationTargetException(java.lang.reflect.InvocationTargetException) InvocationTargetException(java.lang.reflect.InvocationTargetException) WSDLFactory(javax.wsdl.factory.WSDLFactory) Service(javax.xml.rpc.Service) ServiceRef(org.apache.naming.ServiceRef) WSDLReader(javax.wsdl.xml.WSDLReader)

Aggregations

InvocationTargetException (java.lang.reflect.InvocationTargetException)1 Method (java.lang.reflect.Method)1 URL (java.net.URL)1 ArrayList (java.util.ArrayList)1 Hashtable (java.util.Hashtable)1 Properties (java.util.Properties)1 NamingException (javax.naming.NamingException)1 RefAddr (javax.naming.RefAddr)1 Reference (javax.naming.Reference)1 Definition (javax.wsdl.Definition)1 Port (javax.wsdl.Port)1 WSDLFactory (javax.wsdl.factory.WSDLFactory)1 WSDLReader (javax.wsdl.xml.WSDLReader)1 QName (javax.xml.namespace.QName)1 Service (javax.xml.rpc.Service)1 ServiceFactory (javax.xml.rpc.ServiceFactory)1 HandlerInfo (javax.xml.rpc.handler.HandlerInfo)1 HandlerRegistry (javax.xml.rpc.handler.HandlerRegistry)1 HandlerRef (org.apache.naming.HandlerRef)1 ServiceRef (org.apache.naming.ServiceRef)1