Search in sources :

Example 1 with HandlerRegistry

use of javax.xml.rpc.handler.HandlerRegistry in project Payara by payara.

the class ServiceInvocationHandler method addMessageSecurityHandler.

private boolean addMessageSecurityHandler(Service service) throws Exception {
    HandlerRegistry registry = service.getHandlerRegistry();
    Iterator ports = null;
    try {
        ports = service.getPorts();
    } catch (Exception e) {
        // FIXME: should make sure that the exception was thrown because
        // the service is not fully defined; but for now just return.
        ports = null;
    }
    while (ports != null && ports.hasNext()) {
        QName nextPort = (QName) ports.next();
        List handlerChain = registry.getHandlerChain(nextPort);
        // append security handler to the end of every handler chain
        // ASSUMPTION 1: that registry.getHandlerChain() never returns null.
        // ASSUMPTION 2: that handlers from ServiceRef have already been added
        HandlerInfo handlerInfo = getMessageSecurityHandlerInfo(nextPort);
        if (handlerInfo != null) {
            handlerChain.add(handlerInfo);
        }
    }
    return ports == null ? false : true;
}
Also used : HandlerRegistry(javax.xml.rpc.handler.HandlerRegistry) QName(javax.xml.namespace.QName) Iterator(java.util.Iterator) List(java.util.List) InvocationTargetException(java.lang.reflect.InvocationTargetException) HandlerInfo(javax.xml.rpc.handler.HandlerInfo)

Example 2 with HandlerRegistry

use of javax.xml.rpc.handler.HandlerRegistry in project Payara by payara.

the class WsUtil method configureHandlerChain.

public void configureHandlerChain(ServiceReferenceDescriptor serviceRef, javax.xml.rpc.Service service, Iterator ports, ClassLoader loader) throws Exception {
    if (!serviceRef.hasHandlers()) {
        return;
    }
    HandlerRegistry registry = service.getHandlerRegistry();
    while (ports.hasNext()) {
        QName nextPort = (QName) ports.next();
        List handlerChain = registry.getHandlerChain(nextPort);
        Collection soapRoles = new HashSet();
        for (Iterator iter = serviceRef.getHandlers().iterator(); iter.hasNext(); ) {
            WebServiceHandler nextHandler = (WebServiceHandler) iter.next();
            Collection portNames = nextHandler.getPortNames();
            if (portNames.isEmpty() || portNames.contains(nextPort.getLocalPart())) {
                soapRoles.addAll(nextHandler.getSoapRoles());
                HandlerInfo handlerInfo = createHandlerInfo(nextHandler, loader);
                handlerChain.add(handlerInfo);
            }
        }
    }
}
Also used : HandlerRegistry(javax.xml.rpc.handler.HandlerRegistry) QName(javax.xml.namespace.QName) HandlerInfo(javax.xml.rpc.handler.HandlerInfo)

Example 3 with HandlerRegistry

use of javax.xml.rpc.handler.HandlerRegistry in project tomcat70 by apache.

the class ServiceRefFactory method getObjectInstance.

// ----------------------------------------------------------- Constructors
// -------------------------------------------------------------- Constants
// ----------------------------------------------------- Instance Variables
// --------------------------------------------------------- Public Methods
// -------------------------------------------------- ObjectFactory Methods
/**
 * Crete 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<String, QName>();
        // 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);
                // Can't change the API
                @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<String>();
            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<QName>();
                Hashtable<String, String> config = new Hashtable<String, String>();
                ArrayList<String> portNames = new ArrayList<String>();
                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) QName(javax.xml.namespace.QName) Hashtable(java.util.Hashtable) 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)

Example 4 with HandlerRegistry

use of javax.xml.rpc.handler.HandlerRegistry 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) {
        ServiceRef ref = (ServiceRef) 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);
                // Can't change the API
                @SuppressWarnings("unchecked") Map<String, ?> ports = wsdlservice.getPorts();
                Method m = serviceInterfaceClass.getMethod("setEndpointAddress", new Class[] { java.lang.String.class, java.lang.String.class });
                for (String portName : ports.keySet()) {
                    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<?>[] serviceInterfaces = serviceInterfaceClass.getInterfaces();
        Class<?>[] interfaces = Arrays.copyOf(serviceInterfaces, serviceInterfaces.length + 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 (ref.getHandlersSize() > 0) {
            HandlerRegistry handlerRegistry = service.getHandlerRegistry();
            List<String> soaproles = new ArrayList<>();
            while (ref.getHandlersSize() > 0) {
                HandlerRef handlerRef = 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
                List<QName> headers = new ArrayList<>();
                Hashtable<String, String> config = new Hashtable<>();
                List<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[0]));
                handlerInfo.setHandlerConfig(config);
                if (!portNames.isEmpty()) {
                    for (String portName : portNames) {
                        initHandlerChain(new QName(portName), 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) QName(javax.xml.namespace.QName) Hashtable(java.util.Hashtable) 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

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