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.