You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2009/04/15 22:21:53 UTC

svn commit: r765339 - in /tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2: Axis2ServiceBindingProvider.java Axis2ServiceProvider.java

Author: rfeng
Date: Wed Apr 15 20:21:53 2009
New Revision: 765339

URL: http://svn.apache.org/viewvc?rev=765339&view=rev
Log:
Add a special classloader to work around XXXFactory.newInstance issue within OSGi

Modified:
    tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceBindingProvider.java
    tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java

Modified: tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceBindingProvider.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceBindingProvider.java?rev=765339&r1=765338&r2=765339&view=diff
==============================================================================
--- tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceBindingProvider.java (original)
+++ tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceBindingProvider.java Wed Apr 15 20:21:53 2009
@@ -18,8 +18,6 @@
  */
 package org.apache.tuscany.sca.binding.ws.axis2;
 
-import javax.xml.stream.XMLInputFactory;
-
 import org.apache.axiom.om.OMElement;
 import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
 import org.apache.tuscany.sca.core.FactoryExtensionPoint;
@@ -60,9 +58,7 @@
         InterfaceContract contract = wsBinding.getBindingInterfaceContract();
         contract.getInterface().resetDataBinding(OMElement.class.getName());
 
-        // Pass in the XMLInputFactory to work around the Axis2 way of loading XMLInputFactory
-        XMLInputFactory inputFactory = modelFactories.getFactory(XMLInputFactory.class);
-        axisProvider = new Axis2ServiceProvider(component, service, wsBinding, servletHost, messageFactory, inputFactory);
+        axisProvider = new Axis2ServiceProvider(component, service, wsBinding, servletHost, messageFactory, modelFactories);
     }
 
     public void start() {

Modified: tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java?rev=765339&r1=765338&r2=765339&view=diff
==============================================================================
--- tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java (original)
+++ tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java Wed Apr 15 20:21:53 2009
@@ -19,18 +19,23 @@
 
 package org.apache.tuscany.sca.binding.ws.axis2;
 
+import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URL;
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.Vector;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -43,6 +48,7 @@
 import javax.wsdl.extensions.soap.SOAPAddress;
 import javax.wsdl.extensions.soap12.SOAP12Address;
 import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.stream.XMLInputFactory;
 
 import org.apache.axiom.om.OMAbstractFactory;
@@ -111,12 +117,13 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import edu.emory.mathcs.backport.java.util.Collections;
 
 public class Axis2ServiceProvider {
     public static final String IMPORT_TAG = "import";
     public static final String INCLUDE_TAG = "include";
-    
-    private static final Logger logger = Logger.getLogger(Axis2ServiceProvider.class.getName());    
+
+    private static final Logger logger = Logger.getLogger(Axis2ServiceProvider.class.getName());
 
     private RuntimeComponent component;
     private AbstractContract contract;
@@ -127,7 +134,7 @@
     private JMSSender jmsSender;
     private JMSListener jmsListener;
     private Map<String, Port> urlMap = new HashMap<String, Port>();
-    
+
     private BasicAuthenticationPolicy basicAuthenticationPolicy = null;
     private Axis2TokenAuthenticationPolicy axis2TokenAuthenticationPolicy = null;
     private List<Axis2HeaderPolicy> axis2HeaderPolicies = new ArrayList<Axis2HeaderPolicy>();
@@ -158,15 +165,74 @@
     public static final List<QName> XSD_QNAME_LIST =
         Arrays.asList(new QName[] {Q_ELEM_XSD_1999, Q_ELEM_XSD_2000, Q_ELEM_XSD_2001});
 
+    /**
+     * This classloader is used in OSGi to work around XXXFactory.newInstance()
+     */
+    private static class MultiParentClassLoader extends ClassLoader {
+        private final Set<ClassLoader> classLoaders = new HashSet<ClassLoader>();
+
+        /**
+         * @param parent The parent classloaders
+         * @param loaders A list of classloaders to be used to load classes or resources
+         */
+        public MultiParentClassLoader(ClassLoader parent, ClassLoader[] loaders) {
+            super(parent);
+            if (loaders != null) {
+                for (ClassLoader cl : loaders) {
+                    if (cl != null && cl != parent) {
+                        this.classLoaders.add(cl);
+                    }
+                }
+            }
+        }
+
+        @Override
+        protected Class<?> findClass(String className) throws ClassNotFoundException {
+            for (ClassLoader parent : classLoaders) {
+                try {
+                    parent.loadClass(className);
+                } catch (ClassNotFoundException e) {
+                    continue;
+                }
+            }
+            throw new ClassNotFoundException(className);
+        }
+
+        @Override
+        protected URL findResource(String resName) {
+            for (ClassLoader parent : classLoaders) {
+                URL url = parent.getResource(resName);
+                if (url != null) {
+                    return url;
+                }
+            }
+            return null;
+        }
+
+        @Override
+        protected Enumeration<URL> findResources(String resName) throws IOException {
+            Set<URL> urlSet = new HashSet<URL>();
+            for (ClassLoader parent : classLoaders) {
+                Enumeration<URL> urls = parent.getResources(resName);
+                if (urls != null) {
+                    while (urls.hasMoreElements()) {
+                        urlSet.add(urls.nextElement());
+                    }
+                }
+            }
+            return Collections.enumeration(urlSet);
+        }
+    }
+
     public Axis2ServiceProvider(RuntimeComponent component,
                                 AbstractContract contract,
                                 WebServiceBinding wsBinding,
                                 ServletHost servletHost,
                                 MessageFactory messageFactory,
-                                final XMLInputFactory xmlInputFactory) {
+                                final FactoryExtensionPoint modelFactories) {
 
-        this.component = component; 
-        this.contract = contract; 
+        this.component = component;
+        this.contract = contract;
         this.wsBinding = wsBinding;
         this.servletHost = servletHost;
         this.messageFactory = messageFactory;
@@ -178,8 +244,11 @@
             // security policy.
             configContext = AccessController.doPrivileged(new PrivilegedExceptionAction<ConfigurationContext>() {
                 public ConfigurationContext run() throws AxisFault {
-                    ClassLoader newTccl = xmlInputFactory.getClass().getClassLoader();
+                    ClassLoader cl1 = modelFactories.getFactory(XMLInputFactory.class).getClass().getClassLoader();
+                    ClassLoader cl2 =
+                        modelFactories.getFactory(DocumentBuilderFactory.class).getClass().getClassLoader();
                     ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+                    ClassLoader newTccl = new MultiParentClassLoader(tccl, new ClassLoader[] {cl1, cl2});
                     if (newTccl != null && newTccl != tccl) {
                         Thread.currentThread().setContextClassLoader(newTccl);
                     }
@@ -199,13 +268,13 @@
         }
 
         configContext.setContextRoot(servletHost.getContextPath());
-        
+
         // Enable MTOM if the policy intent is specified.
         if (AxisPolicyHelper.isIntentRequired(wsBinding, AxisPolicyHelper.MTOM_INTENT)) {
             configContext.getAxisConfiguration().getParameter(Configuration.ENABLE_MTOM).setLocked(false);
-            configContext.getAxisConfiguration().getParameter(Configuration.ENABLE_MTOM).setValue("true");            
+            configContext.getAxisConfiguration().getParameter(Configuration.ENABLE_MTOM).setValue("true");
         }
-        
+
         // Update port addresses with runtime information, and create a
         // map from endpoint URIs to WSDL ports that eliminates duplicate
         // ports for the same endpoint.
@@ -215,7 +284,7 @@
             setPortAddress((Port)port, endpointURI);
             urlMap.put(endpointURI, (Port)port);
         }
-        
+
         /*
         // find out which policies are active
         if (wsBinding instanceof PolicySubject) {
@@ -234,7 +303,7 @@
                 }
             }
         } 
-        */       
+        */
     }
 
     static String getPortAddress(Port port) {
@@ -265,7 +334,7 @@
         RuntimeAssemblyFactory factory = (RuntimeAssemblyFactory)factories.getFactory(AssemblyFactory.class);
         return factory.createEndpointReference(uri);
     }
-    
+
     private String computeEndpointURI(String uri, ServletHost servletHost) {
 
         if (uri == null) {
@@ -274,38 +343,40 @@
 
         // pull out the binding intents to see what sort of transport is required
         PolicySet transportJmsPolicySet = AxisPolicyHelper.getPolicySet(wsBinding, TRANSPORT_JMS_QUALIFIED_INTENT);
-        if (transportJmsPolicySet != null){
+        if (transportJmsPolicySet != null) {
             if (!uri.startsWith("jms:/")) {
                 uri = "jms:" + uri;
             }
-            
+
             // construct the rest of the URI based on the policy. All the details are put
             // into the URI here rather than being place directly into the Axis configuration 
             // as the Axis JMS sender relies on parsing the target URI      
             Axis2ConfigParamPolicy axis2ConfigParamPolicy = null;
-            for ( Object policy : transportJmsPolicySet.getPolicies() ) {
-                if ( policy instanceof Axis2ConfigParamPolicy ) {
+            for (Object policy : transportJmsPolicySet.getPolicies()) {
+                if (policy instanceof Axis2ConfigParamPolicy) {
                     axis2ConfigParamPolicy = (Axis2ConfigParamPolicy)policy;
-                    Iterator paramIterator = axis2ConfigParamPolicy.getParamElements().get(DEFAULT_QUEUE_CONNECTION_FACTORY).getChildElements();
-                    
-                    if (paramIterator.hasNext()){
+                    Iterator paramIterator =
+                        axis2ConfigParamPolicy.getParamElements().get(DEFAULT_QUEUE_CONNECTION_FACTORY)
+                            .getChildElements();
+
+                    if (paramIterator.hasNext()) {
                         StringBuffer uriParams = new StringBuffer("?");
-                       
-                        while (paramIterator.hasNext()){
+
+                        while (paramIterator.hasNext()) {
                             OMElement parameter = (OMElement)paramIterator.next();
-                            uriParams.append(parameter.getAttributeValue(new QName("","name")));
+                            uriParams.append(parameter.getAttributeValue(new QName("", "name")));
                             uriParams.append("=");
                             uriParams.append(parameter.getText());
-                            
-                            if (paramIterator.hasNext()){
+
+                            if (paramIterator.hasNext()) {
                                 uriParams.append("&");
                             }
                         }
-                        
+
                         uri = uri + uriParams;
                     }
                 }
-            }                     
+            }
         } else {
             if (!uri.startsWith("jms:")) {
                 uri = servletHost.getURLMapping(uri).toString();
@@ -323,10 +394,11 @@
                 AxisService axisService = createAxisService(entry.getKey(), entry.getValue());
                 configContext.getAxisConfiguration().addService(axisService);
             }
-          
+
             Axis2ServiceServlet servlet = null;
             for (String endpointURL : urlMap.keySet()) {
-                if (endpointURL.startsWith("http://") || endpointURL.startsWith("https://") || endpointURL.startsWith("/")) {
+                if (endpointURL.startsWith("http://") || endpointURL.startsWith("https://")
+                    || endpointURL.startsWith("/")) {
                     if (servlet == null) {
                         servlet = new Axis2ServiceServlet();
                         servlet.init(configContext);
@@ -334,34 +406,36 @@
                     //[nash] configContext.setContextRoot(endpointURL);
                     servletHost.addServletMapping(endpointURL, servlet);
                 } else if (endpointURL.startsWith("jms")) {
-                    logger.log(Level.INFO,"Axis2 JMS URL=" + endpointURL);
-                    
+                    logger.log(Level.INFO, "Axis2 JMS URL=" + endpointURL);
+
                     jmsListener = new JMSListener();
                     jmsSender = new JMSSender();
                     ListenerManager listenerManager = configContext.getListenerManager();
-                    TransportInDescription trsIn = configContext.getAxisConfiguration().getTransportIn(Constants.TRANSPORT_JMS);
-                                    
+                    TransportInDescription trsIn =
+                        configContext.getAxisConfiguration().getTransportIn(Constants.TRANSPORT_JMS);
+
                     // get JMS transport parameters from the computed URL
                     Map<String, String> jmsProps = JMSUtils.getProperties(endpointURL);
 
                     // collect the parameters used to configure the JMS transport
                     OMFactory fac = OMAbstractFactory.getOMFactory();
-                    OMElement parms = fac.createOMElement(DEFAULT_QUEUE_CONNECTION_FACTORY, null);                    
+                    OMElement parms = fac.createOMElement(DEFAULT_QUEUE_CONNECTION_FACTORY, null);
 
-                    for ( String key : jmsProps.keySet() ) {
+                    for (String key : jmsProps.keySet()) {
                         OMElement param = fac.createOMElement("parameter", null);
-                        param.addAttribute( "name", key, null );
+                        param.addAttribute("name", key, null);
                         param.addChild(fac.createOMText(param, jmsProps.get(key)));
                         parms.addChild(param);
                     }
-                    
+
                     Parameter queueConnectionFactory = new Parameter(DEFAULT_QUEUE_CONNECTION_FACTORY, parms);
-                    trsIn.addParameter( queueConnectionFactory );
-                    
+                    trsIn.addParameter(queueConnectionFactory);
+
                     trsIn.setReceiver(jmsListener);
 
-                    configContext.getAxisConfiguration().addTransportIn( trsIn );
-                    TransportOutDescription trsOut = configContext.getAxisConfiguration().getTransportOut(Constants.TRANSPORT_JMS);
+                    configContext.getAxisConfiguration().addTransportIn(trsIn);
+                    TransportOutDescription trsOut =
+                        configContext.getAxisConfiguration().getTransportOut(Constants.TRANSPORT_JMS);
                     //configContext.getAxisConfiguration().addTransportOut( trsOut );
                     trsOut.setSender(jmsSender);
 
@@ -387,17 +461,16 @@
     }
 
     public void stop() {
-        if ( jmsListener != null ) {
+        if (jmsListener != null) {
             jmsListener.stop();
             jmsListener.destroy();
-        }
-        else {
+        } else {
             for (String endpointURL : urlMap.keySet()) {
                 servletHost.removeServletMapping(endpointURL);
             }
         }
 
-        if ( jmsSender != null )
+        if (jmsSender != null)
             jmsSender.stop();
 
         try {
@@ -405,14 +478,14 @@
                 // get the path to the service
                 URI uriPath = new URI(endpointURL);
                 String stringURIPath = uriPath.getPath();
-            
+
                 /* [nash] Need a leading slash for WSDL imports to work with ?wsdl
                 // remove any "/" from the start of the path
                 if (stringURIPath.startsWith("/")) {
                     stringURIPath = stringURIPath.substring(1, stringURIPath.length());
                 }
                 */
-            
+
                 configContext.getAxisConfiguration().removeService(stringURIPath);
             }
         } catch (URISyntaxException e) {
@@ -454,7 +527,7 @@
 
         return axisService;
     }
-    
+
     /**
      * Workaround for https://issues.apache.org/jira/browse/AXIS2-3205
      * @param definition
@@ -462,11 +535,11 @@
      * @return
      */
     private static Definition getDefinition(Definition definition, QName serviceName) {
-        
-        if (serviceName == null){
+
+        if (serviceName == null) {
             return definition;
         }
-        
+
         if (definition == null) {
             return null;
         }
@@ -523,9 +596,9 @@
         axisService.setName(name);
         axisService.setEndpointURL(endpointURL);
         axisService.setDocumentation("Tuscany configured AxisService for service: " + endpointURL);
-        for ( Iterator i = axisService.getEndpoints().values().iterator(); i.hasNext(); ) {
+        for (Iterator i = axisService.getEndpoints().values().iterator(); i.hasNext();) {
             AxisEndpoint ae = (AxisEndpoint)i.next();
-            if (endpointURL.startsWith("jms") ) {
+            if (endpointURL.startsWith("jms")) {
                 Parameter qcf = new Parameter(JMSConstants.CONFAC_PARAM, null);
                 qcf.setValue(DEFAULT_QUEUE_CONNECTION_FACTORY);
                 axisService.addParameter(qcf);
@@ -585,14 +658,14 @@
         }
     }
 
-    private void modifySchemaImportsAndIncludes(Definition definition, String name){
+    private void modifySchemaImportsAndIncludes(Definition definition, String name) {
         // adjust the schema locations in types section
         Types types = definition.getTypes();
         if (types != null) {
             for (Iterator iter = types.getExtensibilityElements().iterator(); iter.hasNext();) {
                 Object ext = iter.next();
-                if (ext instanceof UnknownExtensibilityElement &&
-                    XSD_QNAME_LIST.contains(((UnknownExtensibilityElement)ext).getElementType())) {
+                if (ext instanceof UnknownExtensibilityElement && XSD_QNAME_LIST
+                    .contains(((UnknownExtensibilityElement)ext).getElementType())) {
                     changeLocations(((UnknownExtensibilityElement)ext).getElement(), name);
                 }
             }
@@ -669,7 +742,7 @@
         String callbackAddress = null;
         String callbackID = null;
         Object conversationID = null;
-        
+
         // create a message object and set the args as its body
         Message msg = messageFactory.createMessage();
         msg.setBody(args);
@@ -702,30 +775,28 @@
                     }
                 }
             }
-            
+
             // get policy specified headers
-            for (Axis2HeaderPolicy policy : axis2HeaderPolicies){
+            for (Axis2HeaderPolicy policy : axis2HeaderPolicies) {
                 //Axis2BindingHeaderConfigurator.getHeader(inMC, msg, policy.getHeaderName());
             }
-            
+
             if (axis2TokenAuthenticationPolicy != null) {
                 Axis2SOAPHeaderString tokenHeader = new Axis2SOAPHeaderString();
-                Axis2BindingHeaderConfigurator.getHeader(inMC, 
-                                                         msg, 
-                                                         axis2TokenAuthenticationPolicy.getTokenName(), 
+                Axis2BindingHeaderConfigurator.getHeader(inMC,
+                                                         msg,
+                                                         axis2TokenAuthenticationPolicy.getTokenName(),
                                                          tokenHeader);
             }
         }
-        
+
         //fill message with QoS context info 
         fillQoSContext(msg, inMC);
-        
+
         // if reference parameters are needed, create a new "From" EPR to hold them
         EndpointReference from = null;
         ReferenceParameters parameters = null;
-        if (callbackAddress != null ||
-            callbackID != null ||
-            conversationID != null) {
+        if (callbackAddress != null || callbackID != null || conversationID != null) {
             from = createEndpointReference(null);
             parameters = from.getReferenceParameters();
             msg.setFrom(from);
@@ -745,11 +816,11 @@
         if (basicAuthenticationPolicy != null) {
             Axis2BindingBasicAuthenticationConfigurator.parseHTTPHeader(inMC, msg, basicAuthenticationPolicy);
         }
-        
+
         // find the runtime wire and invoke it with the message
         RuntimeWire wire = ((RuntimeComponentService)contract).getRuntimeWire(getBinding());
-        Object response =  wire.invoke(op, msg);
-        
+        Object response = wire.invoke(op, msg);
+
         return response;
     }
 
@@ -766,47 +837,45 @@
     protected Binding getBinding() {
         return wsBinding;
     }
-    
-    private void createPolicyHandlers() throws IllegalAccessException,
-                                               InstantiationException, 
-                                               ClassNotFoundException {
+
+    private void createPolicyHandlers() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
         if (wsBinding instanceof PolicySubject) {
-            
+
             // code to create policy handlers using a policy SPI based
             // on policy providers
-/*            
-            List<PolicyProvider> policyProviders = ((RuntimeComponentService)contract).getPolicyProviders(wsBinding);
-            
-            for (PolicyProvider policyProvider : policyProviders){
-                policyHandler = policyProvider.createHandler();
-                if (policyHandler != null) {
-                    policyHandlerList.add(policyHandler);
-                } 
-            }
-*/           
+            /*            
+                        List<PolicyProvider> policyProviders = ((RuntimeComponentService)contract).getPolicyProviders(wsBinding);
+                        
+                        for (PolicyProvider policyProvider : policyProviders){
+                            policyHandler = policyProvider.createHandler();
+                            if (policyHandler != null) {
+                                policyHandlerList.add(policyHandler);
+                            } 
+                        }
+            */
         }
-    }      
-    
+    }
+
     private void fillQoSContext(Message message, MessageContext axis2MsgCtx) {
-        if ( axis2MsgCtx.getProperty(WSHandlerConstants.RECV_RESULTS) != null &&
-            axis2MsgCtx.getProperty(WSHandlerConstants.RECV_RESULTS) instanceof Vector ) {
+        if (axis2MsgCtx.getProperty(WSHandlerConstants.RECV_RESULTS) != null && axis2MsgCtx
+            .getProperty(WSHandlerConstants.RECV_RESULTS) instanceof Vector) {
             Vector recvResults = (Vector)axis2MsgCtx.getProperty(WSHandlerConstants.RECV_RESULTS);
-            for ( int count1 = 0 ; count1 < recvResults.size() ; ++count1 ) {
-                if ( recvResults.elementAt(count1) instanceof WSHandlerResult ) {
+            for (int count1 = 0; count1 < recvResults.size(); ++count1) {
+                if (recvResults.elementAt(count1) instanceof WSHandlerResult) {
                     WSHandlerResult wshr = (WSHandlerResult)recvResults.elementAt(count1);
                     Vector results = wshr.getResults();
-                    for ( int count2 = 0 ; count2 < results.size() ; ++count2 ) {
-                        if ( results.elementAt(count2) instanceof WSSecurityEngineResult ) {
-                            WSSecurityEngineResult securityResult = 
+                    for (int count2 = 0; count2 < results.size(); ++count2) {
+                        if (results.elementAt(count2) instanceof WSSecurityEngineResult) {
+                            WSSecurityEngineResult securityResult =
                                 (WSSecurityEngineResult)wshr.getResults().elementAt(count2);
-                            if ( securityResult.get("principal") != null ) {
+                            if (securityResult.get("principal") != null) {
                                 message.getHeaders().add(securityResult.get("principal"));
                             }
                         }
                     }
                 }
             }
-            
+
         }
     }
 }