Dominik Derwiński created CXF-7223:
--------------------------------------

             Summary: Honor com.sun.xml.internal.ws.developer.JAXWSProperties
                 Key: CXF-7223
                 URL: https://issues.apache.org/jira/browse/CXF-7223
             Project: CXF
          Issue Type: Improvement
          Components: JAX-WS Runtime
            Reporter: Dominik Derwiński


Is it possible for CXF to honor properties described in 
com.sun.xml.internal.ws.developer.JAXWSProperties? Especially adding 
reflection-based workarounds for 
com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory is not so 
simple.

WildFly application server forces CXF upon user, disables access to default 
JAX-WS implementation and prevents easy injection of said factory for specific 
connections. Workaround requires opening the internals of the application 
server to the application (of which org.apache.cxf.impl module causes a warning 
to be shown when deploying the application), and looking for CXF using 
reflection (in order not to have a real dependency forced by the compiler):

{code}
    public static void setConnectTimeout(BindingProvider port, int timeout) {
        Map<String, Object> env = port.getRequestContext();
        // https://java.net/jira/browse/JAX_WS-1166
        // com.sun.xml.internal.ws.developer.JAXWSProperties.CONNECT_TIMEOUT
        env.put("com.sun.xml.ws.connect.timeout", timeout);
        env.put("com.sun.xml.internal.ws.connect.timeout", timeout);
        env.put("javax.xml.ws.client.connectionTimeout", timeout);
    }

    public static void setRequestTimeout(BindingProvider port, int timeout) {
        Map<String, Object> env = port.getRequestContext();
        // https://java.net/jira/browse/JAX_WS-1166
        // com.sun.xml.internal.ws.developer.JAXWSProperties.REQUEST_TIMEOUT
        env.put("com.sun.xml.ws.request.timeout", timeout);
        env.put("com.sun.xml.internal.ws.request.timeout", timeout);
        env.put("javax.xml.ws.client.receiveTimeout", timeout);
    }

    public static void setSSLSocketFactory(BindingProvider port, 
SSLSocketFactory factory) {
        Map<String, Object> env = port.getRequestContext();
        // com.sun.xml.internal.ws.developer.JAXWSProperties.SSL_SOCKET_FACTORY
        env.put("com.sun.xml.ws.transport.https.client.SSLSocketFactory", 
factory);
        
env.put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", 
factory);
        try {
            Class<?> tlsParamsClass = 
Class.forName("org.apache.cxf.configuration.jsse.TLSClientParameters");
            Object tlsParams = tlsParamsClass.newInstance();
            tlsParamsClass.getMethod("setSSLSocketFactory", 
SSLSocketFactory.class).invoke(tlsParams, factory);

            Class<?> clientProxyClass = 
Class.forName("org.apache.cxf.frontend.ClientProxy");
            Class<?> clientClass = 
Class.forName("org.apache.cxf.endpoint.Client");
            Class<?> conduitClass = 
Class.forName("org.apache.cxf.transport.http.HTTPConduit");

            Object client = clientProxyClass.getMethod("getClient", 
Object.class).invoke(null, port);
            Object conduit = clientClass.getMethod("getConduit").invoke(client);
            conduitClass.getMethod("setTlsClientParameters", 
tlsParamsClass).invoke(conduit, tlsParams);
        } catch (ClassNotFoundException ex) {
            // silent
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }
{code}

If CXF would read the standard properties that would be much easier.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to