You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sc...@apache.org on 2008/07/21 21:59:21 UTC

svn commit: r678540 - in /webservices/axis2/trunk/java/modules/jaxws: src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java test/org/apache/axis2/jaxws/message/MessageTests.java

Author: scheu
Date: Mon Jul 21 12:59:21 2008
New Revision: 678540

URL: http://svn.apache.org/viewvc?rev=678540&view=rev
Log:
Quick fix to ensure EndpointReferenceType is known to JAXB

Modified:
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java
    webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java?rev=678540&r1=678539&r2=678540&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java Mon Jul 21 12:59:21 2008
@@ -34,11 +34,16 @@
 import javax.xml.bind.JAXBIntrospector;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.annotation.XmlType;
 import javax.xml.ws.Holder;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.lang.annotation.Annotation;
 import java.lang.ref.SoftReference;
+import java.lang.reflect.AnnotatedElement;
 import java.net.URL;
 import java.net.URLDecoder;
 import java.security.PrivilegedActionException;
@@ -46,6 +51,7 @@
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -95,6 +101,17 @@
 
     ;
     
+    // Some packages have a known set of classes.
+    // This map is immutable after its static creation.
+    private static final Map<String, List<Class>> specialMap = new HashMap<String, List<Class>>();
+    static {
+        // The javax.xml.ws.wsaddressing package has a single class (W3CEndpointReference)
+        List<Class> classes = new ArrayList<Class>();
+        classes.add(W3CEndpointReference.class);
+        specialMap.put("javax.xml.ws.wsaddressing", classes);
+    }
+    
+    
     /**
      * Get a JAXBContext for the class
      *
@@ -727,6 +744,12 @@
         if (pkg == null) {
             return new ArrayList<Class>();
         }
+        
+        // See if this is a special package that has a set of known classes.
+        List<Class> knownClasses = specialMap.get(pkg);
+        if (knownClasses != null) {
+            return knownClasses;
+        }
 
         /*
         * This method is a best effort method.  We should always return an object.
@@ -776,10 +799,12 @@
         // are acceptable.
         for (int i=0; i<list.size();) {
             Class cls = list.get(i);
-            if (!cls.isInterface() &&
-                ClassUtils.getDefaultPublicConstructor(cls) != null &&
-               !ClassUtils.isJAXWSClass(cls) &&
-               cls.getPackage().getName().equals(pkg)) {
+            if (!cls.isInterface() && 
+                    (cls.isEnum() ||
+                     getAnnotation(cls, XmlType.class) != null ||
+                     ClassUtils.getDefaultPublicConstructor(cls) != null) &&
+                !ClassUtils.isJAXWSClass(cls) &&
+                cls.getPackage().getName().equals(pkg)) {
                 i++; // Acceptable class
             } else {
                 if (log.isDebugEnabled()) {
@@ -842,6 +867,7 @@
                             // by JAXB should be added.
                             if (!clazz.isInterface()
                                     && (clazz.isEnum() ||
+                                        getAnnotation(clazz, XmlType.class) != null ||
                                         ClassUtils.getDefaultPublicConstructor(clazz) != null)
                                     && !ClassUtils.isJAXWSClass(clazz)
                                     && !java.lang.Exception.class.isAssignableFrom(clazz)) {
@@ -1180,4 +1206,11 @@
         }
     }
 
+    private static Annotation getAnnotation(final AnnotatedElement element, final Class annotation) {
+        return (Annotation) AccessController.doPrivileged(new PrivilegedAction() {
+            public Object run() {
+                return element.getAnnotation(annotation);
+            }
+        });
+    }
 }

Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java?rev=678540&r1=678539&r2=678540&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java Mon Jul 21 12:59:21 2008
@@ -29,6 +29,8 @@
 import org.apache.axis2.datasource.jaxb.JAXBDSContext;
 import org.apache.axis2.datasource.jaxb.JAXBDataSource;
 import org.apache.axis2.jaxws.TestLogger;
+import org.apache.axis2.jaxws.addressing.SubmissionEndpointReference;
+import org.apache.axis2.jaxws.addressing.SubmissionEndpointReferenceBuilder;
 import org.apache.axis2.jaxws.message.databinding.JAXBBlockContext;
 import org.apache.axis2.jaxws.message.databinding.JAXBUtils;
 import org.apache.axis2.jaxws.message.factory.JAXBBlockFactory;
@@ -46,6 +48,9 @@
 import javax.xml.soap.SOAPMessage;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder;
+
 import java.io.ByteArrayOutputStream;
 import java.io.StringReader;
 import java.util.TreeSet;
@@ -129,6 +134,26 @@
     private static final QName sampleQName = new QName("urn://sample", "a");
 
     private static XMLInputFactory inputFactory = XMLInputFactory.newInstance();
+    
+    private W3CEndpointReference w3cEPR;
+    private SubmissionEndpointReference subEPR;
+    
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        
+        W3CEndpointReferenceBuilder w3cBuilder = new W3CEndpointReferenceBuilder();
+        w3cBuilder = w3cBuilder.address("http://somewhere.com/somehow");
+        w3cBuilder = w3cBuilder.serviceName(new QName("http://test", "TestService"));
+        w3cBuilder = w3cBuilder.endpointName(new QName("http://test", "TestPort"));
+        w3cEPR = w3cBuilder.build();
+        
+        SubmissionEndpointReferenceBuilder subBuilder = new SubmissionEndpointReferenceBuilder();
+        subBuilder = subBuilder.address("http://somewhere.com/somehow");
+        subBuilder = subBuilder.serviceName(new QName("http://test", "TestService"));
+        subBuilder = subBuilder.endpointName(new QName("http://test", "TestPort"));
+        subEPR = subBuilder.build();
+    }
 
     public MessageTests() {
         super();
@@ -705,6 +730,75 @@
     }
     
     /**
+     * Create a JAXBBlock containing a JAX-B business object 
+     * and simulate a normal Dispatch<Object> output flow
+     * @throws Exception
+     */
+    public void testJAXBOutflow_W3CEndpointReference() throws Exception {
+        // Create a SOAP 1.1 Message
+        MessageFactory mf = (MessageFactory)
+            FactoryRegistry.getFactory(MessageFactory.class);
+        Message m = mf.create(Protocol.soap11);
+        
+        // Get the BlockFactory
+        JAXBBlockFactory bf = (JAXBBlockFactory)
+            FactoryRegistry.getFactory(JAXBBlockFactory.class);
+        
+        // Create the JAX-B object... a W3CEndpointReference
+        W3CEndpointReference obj = w3cEPR;
+       
+        
+        // Create the JAXBContext
+        Class[] classes = new Class[] {W3CEndpointReference.class};
+        //JAXBContext jaxbContext = JAXBContext.newInstance(classes);
+        //JAXBBlockContext context = new JAXBBlockContext(jaxbContext);
+        JAXBBlockContext context = new JAXBBlockContext("javax.xml.ws.wsaddressing");
+        
+        System.out.println("JAXBContext= " + context);
+        
+        // Create a JAXBBlock using the Echo object as the content.  This simulates
+        // what occurs on the outbound JAX-WS Dispatch<Object> client
+        Block block = bf.createFrom(obj, context, null);
+        
+        // Add the block to the message as normal body content.
+        m.setBodyBlock(block);
+        
+        // Check to see if the message is a fault.  The client/server will always call this method.
+        // The Message must respond appropriately without doing a conversion.
+        boolean isFault = m.isFault();
+        assertTrue(!isFault);
+        assertTrue("XMLPart Representation is " + m.getXMLPartContentType(),
+                    "SPINE".equals(m.getXMLPartContentType()));
+        
+        // On an outbound flow, we need to convert the Message 
+        // to an OMElement, specifically an OM SOAPEnvelope, 
+        // so we can set it on the Axis2 MessageContext
+        org.apache.axiom.soap.SOAPEnvelope env = 
+            (org.apache.axiom.soap.SOAPEnvelope) m.getAsOMElement();
+        
+        // Check to see if the message is a fault.  The client/server will always call this method.
+        // The Message must respond appropriately without doing a conversion.
+        isFault = m.isFault();
+        assertTrue(!isFault);
+        assertTrue("XMLPart Representation is " + m.getXMLPartContentType(),
+                    "OM".equals(m.getXMLPartContentType()));
+        
+        // Serialize the Envelope using the same mechanism as the 
+        // HTTP client.
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        env.serializeAndConsume(baos, new OMOutputFormat());
+        
+        // To check that the output is correct, get the String contents of the 
+        // reader
+        String newText = baos.toString();
+        System.out.println(newText);
+        assertTrue(newText.contains("http://somewhere.com/somehow"));
+        assertTrue(newText.contains("soap"));
+        assertTrue(newText.contains("Envelope"));
+        assertTrue(newText.contains("Body"));
+    }
+    
+    /**
      * Same as JAXBOutputflow, but has an additional check
      * to make sure that the JAXB serialization is deferrred
      * until the actual serialization of the message.