You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2010/06/14 19:30:16 UTC

svn commit: r954562 - in /cxf/branches/2.2.x-fixes: ./ rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/ rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ systests/jaxws/src/...

Author: sergeyb
Date: Mon Jun 14 17:30:16 2010
New Revision: 954562

URL: http://svn.apache.org/viewvc?rev=954562&view=rev
Log:
Merged revisions 954552,954559 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r954552 | sergeyb | 2010-06-14 17:49:43 +0100 (Mon, 14 Jun 2010) | 1 line
  
  CXF-2846 : support for superclasses implementing or superinterfaces extending JAXWS Provider
........
  r954559 | sergeyb | 2010-06-14 18:13:04 +0100 (Mon, 14 Jun 2010) | 1 line
  
  CXF-2846 : minor update to make it easier to merge to 2.2.x
........

Added:
    cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/provider/AbstractSourcePayloadProvider.java
      - copied unchanged from r954559, cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/provider/AbstractSourcePayloadProvider.java
    cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/provider/SourceProvider.java
      - copied unchanged from r954559, cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/provider/SourceProvider.java
Modified:
    cxf/branches/2.2.x-fixes/   (props changed)
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointUtils.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsImplementorInfo.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/Messages.properties
    cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/provider/HWSourcePayloadProvider.java

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
    svn:mergeinfo = /cxf/trunk:954552-954559

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointUtils.java?rev=954562&r1=954561&r2=954562&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointUtils.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointUtils.java Mon Jun 14 17:30:16 2010
@@ -52,11 +52,18 @@ public final class EndpointUtils {
     }
     
     private static boolean hasWebServiceProviderAnnotation(Class<?> cls) {
-        if (cls != null) {
-            return cls.isAnnotationPresent(WebServiceProvider.class);
+        if (cls == null) {
+            return false;
         }
-        
-        return false;
+        if (null != cls.getAnnotation(WebServiceProvider.class)) {
+            return true;
+        }
+        for (Class<?> inf : cls.getInterfaces()) {
+            if (null != inf.getAnnotation(WebServiceProvider.class)) {
+                return true;
+            }
+        }
+        return hasWebServiceProviderAnnotation(cls.getSuperclass());
     }
     
     public static boolean isValidImplementor(Object implementor) {
@@ -76,4 +83,6 @@ public final class EndpointUtils {
         LOG.info("Implementor is not annotated with WebService annotation.");
         return false;
     } 
+    
+    
 }

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java?rev=954562&r1=954561&r2=954562&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java Mon Jun 14 17:30:16 2010
@@ -288,7 +288,10 @@ public class AnnotationHandlerChainBuild
         return clazz.getResource(name);
     }
     
-    private HandlerChainAnnotation findHandlerChainAnnotation(Class<?> clz, boolean searchSEI) {        
+    private HandlerChainAnnotation findHandlerChainAnnotation(Class<?> clz, boolean searchSEI) {
+        if (clz == null) {
+            return null;
+        }
         if (LOG.isLoggable(Level.FINE)) {
             LOG.fine("Checking for HandlerChain annotation on " + clz.getName());
         }
@@ -325,6 +328,9 @@ public class AnnotationHandlerChainBuild
                         break;
                     }
                 }
+                if (hcAnn == null) {
+                    hcAnn = findHandlerChainAnnotation(clz.getSuperclass(), false);
+                }
             }
         } else {
             hcAnn = new HandlerChainAnnotation(ann, clz);

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsImplementorInfo.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsImplementorInfo.java?rev=954562&r1=954561&r2=954562&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsImplementorInfo.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsImplementorInfo.java Mon Jun 14 17:30:16 2010
@@ -301,9 +301,26 @@ public class JaxWsImplementorInfo {
                 }
             }
         }
-        wsProviderAnnotation = implementorClass.getAnnotation(WebServiceProvider.class);
+        
+        wsProviderAnnotation = getWebServiceProviderAnnotation(implementorClass);
     }
 
+    private static WebServiceProvider getWebServiceProviderAnnotation(Class<?> cls) {
+        if (cls == null) {
+            return null;
+        }
+        WebServiceProvider ann = cls.getAnnotation(WebServiceProvider.class);
+        if (null != ann) {
+            return ann;
+        }
+        for (Class<?> inf : cls.getInterfaces()) {
+            if (null != inf.getAnnotation(WebServiceProvider.class)) {
+                return inf.getAnnotation(WebServiceProvider.class);
+            }
+        }
+        return getWebServiceProviderAnnotation(cls.getSuperclass());
+    }
+    
     public boolean isWebServiceProvider() {
         return Provider.class.isAssignableFrom(implementorClass);
     }
@@ -321,22 +338,28 @@ public class JaxWsImplementorInfo {
     }
 
     public Class<?> getProviderParameterType() {
-        // The Provider Implementor inherits out of Provider<T>
-        Class<?> c = implementorClass;
+        return doGetProviderParameterType(implementorClass);
+    }
+
+    private static Class<?> doGetProviderParameterType(Class<?> c) {
         while (c != null) {
             Type intfTypes[] = c.getGenericInterfaces();
             for (Type t : intfTypes) {
                 Class<?> clazz = JAXBEncoderDecoder.getClassFromType(t);
-                if (Provider.class == clazz) {
-                    Type paramTypes[] = ((ParameterizedType)t).getActualTypeArguments();
-                    return JAXBEncoderDecoder.getClassFromType(paramTypes[0]);
+                if (Provider.class.isAssignableFrom(clazz)) {
+                    if (Provider.class == clazz) {
+                        Type paramTypes[] = ((ParameterizedType)t).getActualTypeArguments();
+                        return JAXBEncoderDecoder.getClassFromType(paramTypes[0]);
+                    } else {
+                        return doGetProviderParameterType(clazz);
+                    }
                 }
             }
             c = c.getSuperclass();
         }
         return null;
     }
-
+    
     public String getBindingType() {
         BindingType bType = implementorClass.getAnnotation(BindingType.class);
         if (bType != null) {

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java?rev=954562&r1=954561&r2=954562&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java Mon Jun 14 17:30:16 2010
@@ -41,6 +41,7 @@ import javax.xml.ws.Action;
 import javax.xml.ws.AsyncHandler;
 import javax.xml.ws.BindingType;
 import javax.xml.ws.FaultAction;
+import javax.xml.ws.Provider;
 import javax.xml.ws.Service;
 import javax.xml.ws.WebFault;
 import javax.xml.ws.WebServiceFeature;
@@ -261,10 +262,11 @@ public class JaxWsServiceFactoryBean ext
     }
 
     protected void initializeWSDLOperationsForProvider() {
-        Type[] genericInterfaces = getServiceClass().getGenericInterfaces();
-        ParameterizedType pt = (ParameterizedType)genericInterfaces[0];
-        Class c = (Class)pt.getActualTypeArguments()[0];
-
+        Class c = getProviderParameterType(getServiceClass());
+        if (c == null) {
+            throw new ServiceConstructionException(new Message("INVALID_PROVIDER_EXC", LOG));
+        }
+        
         if (getEndpointInfo() == null
             && isFromWsdl()) {
             //most likely, they specified a WSDL, but for some reason
@@ -359,6 +361,24 @@ public class JaxWsServiceFactoryBean ext
         
     }
 
+    protected Class<?> getProviderParameterType(Class<?> cls) {
+        if (cls == null) {
+            return null;
+        }
+        Type[] genericInterfaces = cls.getGenericInterfaces();
+        for (Type type : genericInterfaces) {
+            if (type instanceof ParameterizedType) { 
+                Class<?> rawCls = (Class<?>)((ParameterizedType)type).getRawType();
+                if (Provider.class == rawCls) {
+                    return (Class<?>)((ParameterizedType)type).getActualTypeArguments()[0];
+                }
+            } else if (type instanceof Class && Provider.class.isAssignableFrom((Class)type)) {
+                return getProviderParameterType((Class)type);
+            }
+        }
+        return getProviderParameterType(cls.getSuperclass());
+    }
+    
     void initializeWrapping(OperationInfo o, Method selected) {
         Class responseWrapper = getResponseWrapper(selected);
         if (responseWrapper != null) {

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/Messages.properties
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/Messages.properties?rev=954562&r1=954561&r2=954562&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/Messages.properties (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/Messages.properties Mon Jun 14 17:30:16 2010
@@ -19,6 +19,7 @@
 #
 #
 SEI_LOAD_FAILURE_EXC = Failed to load service endpoint interface.
+INVALID_PROVIDER_EXC = {0} is not a valid JAXWS Provider.
 SEI_LOAD_FAILURE_MSG = Could not load Webservice SEI
 SEI_WITHOUT_WEBSERVICE_ANNOTATION_EXC = Service endpoint interface does not have a @WebService annotation.
 ILLEGAL_ATTRIBUTE_IN_SEI_ANNOTATION_EXC = Attributes portName, serviceName and endpointInterface are not allowed in the @WebService annotation of an SEI.

Modified: cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/provider/HWSourcePayloadProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/provider/HWSourcePayloadProvider.java?rev=954562&r1=954561&r2=954562&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/provider/HWSourcePayloadProvider.java (original)
+++ cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/provider/HWSourcePayloadProvider.java Mon Jun 14 17:30:16 2010
@@ -18,120 +18,13 @@
  */
 
 package org.apache.cxf.systest.provider;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.io.Writer;
 
-import javax.annotation.Resource;
-import javax.jws.HandlerChain;
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.ws.Provider;
-import javax.xml.ws.ServiceMode;
-import javax.xml.ws.WebServiceContext;
-import javax.xml.ws.WebServiceProvider;
-import javax.xml.ws.handler.MessageContext;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-import org.apache.cxf.helpers.XMLUtils;
-import org.apache.cxf.staxutils.StaxSource;
-import org.apache.cxf.staxutils.StaxUtils;
-
-//The following wsdl file is used.
-//wsdlLocation = "/trunk/testutils/src/main/resources/wsdl/hello_world_rpc_lit.wsdl"
-@WebServiceProvider(portName = "SoapPortProviderRPCLit3", serviceName = "SOAPServiceProviderRPCLit",
-                      targetNamespace = "http://apache.org/hello_world_rpclit",
- wsdlLocation = "/wsdl/hello_world_rpc_lit.wsdl")
-@ServiceMode (value = javax.xml.ws.Service.Mode.PAYLOAD)
-@HandlerChain(file = "./handlers_invocation.xml", name = "TestHandlerChain")
-public class HWSourcePayloadProvider implements Provider<Source> {
-    boolean doneStax;
-    @Resource 
-    WebServiceContext ctx;
-
-    public HWSourcePayloadProvider() {
-    
+public class HWSourcePayloadProvider extends AbstractSourcePayloadProvider
+    implements Comparable<HWSourcePayloadProvider> {
+ 
+    @Override
+    public int compareTo(HWSourcePayloadProvider p) {
+        return p == this ? 0 : -1;
     }
     
-    public Source invoke(Source request) {   
-        QName qn = (QName)ctx.getMessageContext().get(MessageContext.WSDL_OPERATION);
-        if (qn == null) {
-            throw new RuntimeException("No Operation Name");
-        }
-        
-        try {
-            System.out.println(request.getClass().getName());
-            String input = getSourceAsString(request);
-            System.out.println(input);  
-            
-            if (input.indexOf("ServerLogicalHandler") >= 0) {
-                return map(request.getClass());
-            }
-
-        } catch (Exception e) {
-            System.out.println("Received an exception while parsing the source");
-            e.printStackTrace();
-        }
-        return null;
-    }
-    
-    private Source map(Class<? extends Source> class1) 
-        throws Exception {
-        
-        InputStream greetMeInputStream = getClass()
-            .getResourceAsStream("resources/GreetMeRpcLiteralRespBody.xml");
-        if (DOMSource.class.equals(class1)) {
-            return new DOMSource(XMLUtils.parse(greetMeInputStream));
-        } else if (StaxSource.class.equals(class1)) {
-            if (doneStax) {
-                XMLReader reader = XMLReaderFactory.createXMLReader();
-                return new SAXSource(reader, new InputSource(greetMeInputStream));
-            } else {
-                doneStax = true;
-                return new StaxSource(StaxUtils.createXMLStreamReader(greetMeInputStream));
-            }
-        } else if (StreamSource.class.equals(class1)) {
-            StreamSource source = new StreamSource();
-            source.setInputStream(greetMeInputStream);
-            return source;
-        }
-        //java 6 javax.xml.transform.stax.StAXSource
-        XMLStreamReader reader = StaxUtils.createXMLStreamReader(greetMeInputStream);
-        return class1.getConstructor(XMLStreamReader.class).newInstance(reader);
-    }
-
-    public static String getSourceAsString(Source s) throws Exception {
-        try {
-            Transformer transformer = TransformerFactory.newInstance().newTransformer();
-            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
-            Writer out = new StringWriter();
-            StreamResult streamResult = new StreamResult();
-            streamResult.setWriter(out);
-            transformer.transform(s, streamResult);
-            return streamResult.getWriter().toString();
-            
-        } catch (TransformerException te) {
-            if ("javax.xml.transform.stax.StAXSource".equals(s.getClass().getName())) {
-                //on java6, we will get this class if "stax" is configured
-                //for the preferred type. However, older xalans don't know about it
-                //we'll manually do it
-                XMLStreamReader r = (XMLStreamReader)s.getClass().getMethod("getXMLStreamReader").invoke(s);
-                return XMLUtils.toString(StaxUtils.read(r).getDocumentElement());
-            }
-            throw te;
-        }
-    }
 }