Search in sources :

Example 1 with ServiceRef

use of org.apache.naming.ServiceRef 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 2 with ServiceRef

use of org.apache.naming.ServiceRef in project tomcat by apache.

the class NamingContextListener method addService.

/**
 * Set the specified web service in the naming context.
 *
 * @param service the web service descriptor
 */
public void addService(ContextService service) {
    Reference ref = lookForLookupRef(service);
    if (ref == null) {
        if (service.getWsdlfile() != null) {
            URL wsdlURL = null;
            try {
                wsdlURL = new URL(service.getWsdlfile());
            } catch (MalformedURLException e) {
            // Ignore and carry on
            }
            if (wsdlURL == null) {
                try {
                    wsdlURL = ((Context) container).getServletContext().getResource(service.getWsdlfile());
                } catch (MalformedURLException e) {
                // Ignore and carry on
                }
            }
            if (wsdlURL == null) {
                try {
                    wsdlURL = ((Context) container).getServletContext().getResource("/" + service.getWsdlfile());
                    log.debug("  Changing service ref wsdl file for /" + service.getWsdlfile());
                } catch (MalformedURLException e) {
                    log.error(sm.getString("naming.wsdlFailed", e));
                }
            }
            if (wsdlURL == null) {
                service.setWsdlfile(null);
            } else {
                service.setWsdlfile(wsdlURL.toString());
            }
        }
        if (service.getJaxrpcmappingfile() != null) {
            URL jaxrpcURL = null;
            try {
                jaxrpcURL = new URL(service.getJaxrpcmappingfile());
            } catch (MalformedURLException e) {
            // Ignore and carry on
            }
            if (jaxrpcURL == null) {
                try {
                    jaxrpcURL = ((Context) container).getServletContext().getResource(service.getJaxrpcmappingfile());
                } catch (MalformedURLException e) {
                // Ignore and carry on
                }
            }
            if (jaxrpcURL == null) {
                try {
                    jaxrpcURL = ((Context) container).getServletContext().getResource("/" + service.getJaxrpcmappingfile());
                    log.debug("  Changing service ref jaxrpc file for /" + service.getJaxrpcmappingfile());
                } catch (MalformedURLException e) {
                    log.error(sm.getString("naming.wsdlFailed", e));
                }
            }
            if (jaxrpcURL == null) {
                service.setJaxrpcmappingfile(null);
            } else {
                service.setJaxrpcmappingfile(jaxrpcURL.toString());
            }
        }
        // Create a reference to the resource.
        ref = new ServiceRef(service.getName(), service.getInterface(), service.getServiceqname(), service.getWsdlfile(), service.getJaxrpcmappingfile());
        // Adding the additional port-component-ref, if any
        Iterator<String> portcomponent = service.getServiceendpoints();
        while (portcomponent.hasNext()) {
            String serviceendpoint = portcomponent.next();
            StringRefAddr refAddr = new StringRefAddr(ServiceRef.SERVICEENDPOINTINTERFACE, serviceendpoint);
            ref.add(refAddr);
            String portlink = service.getPortlink(serviceendpoint);
            refAddr = new StringRefAddr(ServiceRef.PORTCOMPONENTLINK, portlink);
            ref.add(refAddr);
        }
        // Adding the additional parameters, if any
        Iterator<String> handlers = service.getHandlers();
        while (handlers.hasNext()) {
            String handlername = handlers.next();
            ContextHandler handler = service.getHandler(handlername);
            HandlerRef handlerRef = new HandlerRef(handlername, handler.getHandlerclass());
            Iterator<String> localParts = handler.getLocalparts();
            while (localParts.hasNext()) {
                String localPart = localParts.next();
                String namespaceURI = handler.getNamespaceuri(localPart);
                handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_LOCALPART, localPart));
                handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_NAMESPACE, namespaceURI));
            }
            Iterator<String> params = handler.listProperties();
            while (params.hasNext()) {
                String paramName = params.next();
                String paramValue = (String) handler.getProperty(paramName);
                handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_PARAMNAME, paramName));
                handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_PARAMVALUE, paramValue));
            }
            for (int i = 0; i < handler.getSoapRolesSize(); i++) {
                handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_SOAPROLE, handler.getSoapRole(i)));
            }
            for (int i = 0; i < handler.getPortNamesSize(); i++) {
                handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_PORTNAME, handler.getPortName(i)));
            }
            ((ServiceRef) ref).addHandler(handlerRef);
        }
    }
    try {
        if (log.isDebugEnabled()) {
            log.debug("  Adding service ref " + service.getName() + "  " + ref);
        }
        createSubcontexts(envCtx, service.getName());
        envCtx.bind(service.getName(), ref);
    } catch (NamingException e) {
        log.error(sm.getString("naming.bindFailed", e));
    }
}
Also used : NamingContext(org.apache.naming.NamingContext) Context(org.apache.catalina.Context) ContextHandler(org.apache.tomcat.util.descriptor.web.ContextHandler) MalformedURLException(java.net.MalformedURLException) StringRefAddr(javax.naming.StringRefAddr) Reference(javax.naming.Reference) NamingException(javax.naming.NamingException) ServiceRef(org.apache.naming.ServiceRef) URL(java.net.URL) HandlerRef(org.apache.naming.HandlerRef)

Example 3 with ServiceRef

use of org.apache.naming.ServiceRef 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)

Example 4 with ServiceRef

use of org.apache.naming.ServiceRef in project tomcat70 by apache.

the class NamingContextListener method addService.

/**
 * Set the specified web service in the naming context.
 */
public void addService(ContextService service) {
    if (service.getWsdlfile() != null) {
        URL wsdlURL = null;
        try {
            wsdlURL = new URL(service.getWsdlfile());
        } catch (MalformedURLException e) {
        // Ignore and carry on
        }
        if (wsdlURL == null) {
            try {
                wsdlURL = ((Context) container).getServletContext().getResource(service.getWsdlfile());
            } catch (MalformedURLException e) {
            // Ignore and carry on
            }
        }
        if (wsdlURL == null) {
            try {
                wsdlURL = ((Context) container).getServletContext().getResource("/" + service.getWsdlfile());
                logger.debug("  Changing service ref wsdl file for /" + service.getWsdlfile());
            } catch (MalformedURLException e) {
                logger.error(sm.getString("naming.wsdlFailed", e));
            }
        }
        if (wsdlURL == null)
            service.setWsdlfile(null);
        else
            service.setWsdlfile(wsdlURL.toString());
    }
    if (service.getJaxrpcmappingfile() != null) {
        URL jaxrpcURL = null;
        try {
            jaxrpcURL = new URL(service.getJaxrpcmappingfile());
        } catch (MalformedURLException e) {
        // Ignore and carry on
        }
        if (jaxrpcURL == null) {
            try {
                jaxrpcURL = ((Context) container).getServletContext().getResource(service.getJaxrpcmappingfile());
            } catch (MalformedURLException e) {
            // Ignore and carry on
            }
        }
        if (jaxrpcURL == null) {
            try {
                jaxrpcURL = ((Context) container).getServletContext().getResource("/" + service.getJaxrpcmappingfile());
                logger.debug("  Changing service ref jaxrpc file for /" + service.getJaxrpcmappingfile());
            } catch (MalformedURLException e) {
                logger.error(sm.getString("naming.wsdlFailed", e));
            }
        }
        if (jaxrpcURL == null)
            service.setJaxrpcmappingfile(null);
        else
            service.setJaxrpcmappingfile(jaxrpcURL.toString());
    }
    // Create a reference to the resource.
    Reference ref = new ServiceRef(service.getName(), service.getInterface(), service.getServiceqname(), service.getWsdlfile(), service.getJaxrpcmappingfile());
    // Adding the additional port-component-ref, if any
    Iterator<String> portcomponent = service.getServiceendpoints();
    while (portcomponent.hasNext()) {
        String serviceendpoint = portcomponent.next();
        StringRefAddr refAddr = new StringRefAddr(ServiceRef.SERVICEENDPOINTINTERFACE, serviceendpoint);
        ref.add(refAddr);
        String portlink = service.getPortlink(serviceendpoint);
        refAddr = new StringRefAddr(ServiceRef.PORTCOMPONENTLINK, portlink);
        ref.add(refAddr);
    }
    // Adding the additional parameters, if any
    Iterator<String> handlers = service.getHandlers();
    while (handlers.hasNext()) {
        String handlername = handlers.next();
        ContextHandler handler = service.getHandler(handlername);
        HandlerRef handlerRef = new HandlerRef(handlername, handler.getHandlerclass());
        Iterator<String> localParts = handler.getLocalparts();
        while (localParts.hasNext()) {
            String localPart = localParts.next();
            String namespaceURI = handler.getNamespaceuri(localPart);
            handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_LOCALPART, localPart));
            handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_NAMESPACE, namespaceURI));
        }
        Iterator<String> params = handler.listProperties();
        while (params.hasNext()) {
            String paramName = params.next();
            String paramValue = (String) handler.getProperty(paramName);
            handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_PARAMNAME, paramName));
            handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_PARAMVALUE, paramValue));
        }
        for (int i = 0; i < handler.getSoapRolesSize(); i++) {
            handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_SOAPROLE, handler.getSoapRole(i)));
        }
        for (int i = 0; i < handler.getPortNamesSize(); i++) {
            handlerRef.add(new StringRefAddr(HandlerRef.HANDLER_PORTNAME, handler.getPortName(i)));
        }
        ((ServiceRef) ref).addHandler(handlerRef);
    }
    try {
        if (logger.isDebugEnabled()) {
            logger.debug("  Adding service ref " + service.getName() + "  " + ref);
        }
        createSubcontexts(envCtx, service.getName());
        envCtx.bind(service.getName(), ref);
    } catch (NamingException e) {
        logger.error(sm.getString("naming.bindFailed", e));
    }
}
Also used : NamingContext(org.apache.naming.NamingContext) Context(org.apache.catalina.Context) ContextHandler(org.apache.catalina.deploy.ContextHandler) MalformedURLException(java.net.MalformedURLException) StringRefAddr(javax.naming.StringRefAddr) Reference(javax.naming.Reference) NamingException(javax.naming.NamingException) ServiceRef(org.apache.naming.ServiceRef) URL(java.net.URL) HandlerRef(org.apache.naming.HandlerRef)

Aggregations

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