Author: pradine Date: Mon Jun 4 00:40:56 2007 New Revision: 544082 URL: http://svn.apache.org/viewvc?view=rev&rev=544082 Log: Add a new test, plus some refactoring to make it work.
Added: webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/addressing/ webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/addressing/util/ webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverterTests.java Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/EndpointReference.java webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/wsaddressing/W3CEndpointReference.java webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/SubmissionEndpointReference.java webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverter.java webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/Provider.java webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java webservices/axis2/branches/java/jaxws21/modules/kernel/src/org/apache/axis2/addressing/EndpointReferenceHelper.java Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/EndpointReference.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/EndpointReference.java?view=diff&rev=544082&r1=544081&r2=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/EndpointReference.java (original) +++ webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/EndpointReference.java Mon Jun 4 00:40:56 2007 @@ -18,8 +18,11 @@ */ package javax.xml.ws; +import java.io.ByteArrayOutputStream; + import javax.xml.transform.Result; import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamResult; import javax.xml.ws.spi.Provider; public abstract class EndpointReference { @@ -34,5 +37,13 @@ public <T> T getPort(Class<T> serviceEndpointInterface, WebServiceFeature... features) { return Provider.provider().getPort(this, serviceEndpointInterface, features); + } + + @Override + public String toString() { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + writeTo(new StreamResult(baos)); + + return baos.toString(); } } Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/wsaddressing/W3CEndpointReference.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/wsaddressing/W3CEndpointReference.java?view=diff&rev=544082&r1=544081&r2=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/wsaddressing/W3CEndpointReference.java (original) +++ webservices/axis2/branches/java/jaxws21/modules/jaxws-api/src/javax/xml/ws/wsaddressing/W3CEndpointReference.java Mon Jun 4 00:40:56 2007 @@ -23,6 +23,7 @@ import java.util.Map; import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; @@ -72,9 +73,11 @@ }) public final class W3CEndpointReference extends EndpointReference { @XmlTransient - private static volatile JAXBContext jaxbContext; + protected static volatile JAXBContext jaxbContext; @XmlTransient protected static final String NS = "http://www.w3.org/2005/08/addressing"; + @XmlTransient + protected static final QName NAME = new QName(NS, "EndpointReference", "wsa"); @XmlElement(name = "Address", required = true) protected AttributedURIType address; @@ -96,8 +99,9 @@ try { JAXBContext jaxbContext = getJAXBContext(); Unmarshaller um = jaxbContext.createUnmarshaller(); - W3CEndpointReference w3cEPR = - (W3CEndpointReference) um.unmarshal(eprInfoset); + JAXBElement<W3CEndpointReference> element = + um.unmarshal(eprInfoset, W3CEndpointReference.class); + W3CEndpointReference w3cEPR = element.getValue(); address = w3cEPR.address; referenceParameters = w3cEPR.referenceParameters; @@ -120,14 +124,17 @@ try { JAXBContext jaxbContext = getJAXBContext(); Marshaller m = jaxbContext.createMarshaller(); - m.marshal(this, result); + m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); + JAXBElement<W3CEndpointReference> element = + new JAXBElement<W3CEndpointReference>(NAME, W3CEndpointReference.class, this); + m.marshal(element, result); } catch (Exception e) { //TODO NLS enable throw new WebServiceException("writeTo failure.", e); } } - + private JAXBContext getJAXBContext() throws JAXBException { //This is an implementation of double-checked locking. //It works because jaxbContext is volatile. @@ -168,6 +175,9 @@ protected String value; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); + + public AttributedURIType() { + } } /** @@ -199,6 +209,9 @@ protected List<Object> any; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); + + public ReferenceParametersType() { + } } /** @@ -230,5 +243,8 @@ protected List<Object> any; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); + + public MetadataType() { + } } } Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java?view=diff&rev=544082&r1=544081&r2=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java (original) +++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java Mon Jun 4 00:40:56 2007 @@ -23,7 +23,6 @@ import org.apache.axis2.addressing.AddressingConstants.Submission; import org.apache.axis2.addressing.metadata.ServiceName; import org.apache.axis2.addressing.metadata.WSDLLocation; -import org.apache.axis2.jaxws.addressing.SubmissionAddressingFeature; import org.apache.axis2.jaxws.addressing.SubmissionEndpointReference; import org.apache.axis2.jaxws.addressing.util.EndpointReferenceConverter; import org.apache.axis2.jaxws.binding.BindingUtils; @@ -44,7 +43,6 @@ import javax.xml.ws.EndpointReference; import javax.xml.ws.WebServiceFeature; import javax.xml.ws.handler.HandlerResolver; -import javax.xml.ws.soap.AddressingFeature; import javax.xml.ws.wsaddressing.W3CEndpointReference; import java.net.URL; @@ -62,8 +60,10 @@ protected WebServiceFeatureValidator validator; + //TODO: Is this the best place for this code? protected org.apache.axis2.addressing.EndpointReference epr; + //TODO: Is this the best place for this code? protected String addressingNamespace; private Binding binding; // force subclasses to use the lazy getter @@ -91,16 +91,7 @@ // Setting standard property defaults for the request context requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, Boolean.FALSE); - - WebServiceFeature addressingFeature = validator.get(AddressingFeature.ID); - WebServiceFeature submissionAddressingFeature = validator.get(SubmissionAddressingFeature.ID); - String bindingID = endpointDesc.getClientBindingID(); - - if (BindingUtils.isSOAPBinding(bindingID) && - (addressingFeature.isEnabled() || submissionAddressingFeature.isEnabled())) - requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE); - else - requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.FALSE); + requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE); // Set the endpoint address String endpointAddress = (epr != null ) ? epr.getAddress() : endpointDesc.getEndpointAddress(); Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/SubmissionEndpointReference.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/SubmissionEndpointReference.java?view=diff&rev=544082&r1=544081&r2=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/SubmissionEndpointReference.java (original) +++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/SubmissionEndpointReference.java Mon Jun 4 00:40:56 2007 @@ -23,6 +23,7 @@ import java.util.Map; import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; @@ -79,9 +80,11 @@ }) public class SubmissionEndpointReference extends EndpointReference { @XmlTransient - private static volatile JAXBContext jaxbContext; + protected static volatile JAXBContext jaxbContext; @XmlTransient protected static final String NS = "http://schemas.xmlsoap.org/ws/2004/08/addressing"; + @XmlTransient + protected static final QName NAME = new QName(NS, "EndpointReference", "wsa"); @XmlElement(name = "Address", required = true) @@ -108,8 +111,9 @@ try { JAXBContext jaxbContext = getJAXBContext(); Unmarshaller um = jaxbContext.createUnmarshaller(); - SubmissionEndpointReference subEPR = - (SubmissionEndpointReference) um.unmarshal(eprInfoset); + JAXBElement<SubmissionEndpointReference> element = + um.unmarshal(eprInfoset, SubmissionEndpointReference.class); + SubmissionEndpointReference subEPR = element.getValue(); address = subEPR.address; referenceParameters = subEPR.referenceParameters; @@ -134,7 +138,10 @@ try { JAXBContext jaxbContext = getJAXBContext(); Marshaller m = jaxbContext.createMarshaller(); - m.marshal(this, result); + m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); + JAXBElement<SubmissionEndpointReference> element = + new JAXBElement<SubmissionEndpointReference>(NAME, SubmissionEndpointReference.class, this); + m.marshal(element, result); } catch (Exception e) { //TODO NLS enable @@ -175,13 +182,16 @@ @XmlType(name = "AttributedURI", propOrder = { "value" }) - private class AttributedURI { + private static class AttributedURI { @XmlValue @XmlSchemaType(name = "anyURI") protected String value; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); + + public AttributedURI() { + } } /** @@ -207,10 +217,13 @@ @XmlType(name = "ReferenceParametersType", propOrder = { "any" }) - private class ReferenceParametersType { + private static class ReferenceParametersType { @XmlAnyElement(lax = true) protected List<Object> any; + + public ReferenceParametersType() { + } } /** @@ -236,10 +249,13 @@ @XmlType(name = "ReferencePropertiesType", propOrder = { "any" }) - private class ReferencePropertiesType { + private static class ReferencePropertiesType { @XmlAnyElement(lax = true) protected List<Object> any; + + public ReferencePropertiesType() { + } } /** @@ -263,7 +279,7 @@ @XmlType(name = "ServiceNameType", propOrder = { "value" }) - private class ServiceNameType { + private static class ServiceNameType { @XmlValue protected QName value; @@ -273,6 +289,9 @@ protected String portName; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); + + public ServiceNameType() { + } } /** @@ -295,11 +314,14 @@ @XmlType(name = "AttributedQName", propOrder = { "value" }) - private class AttributedQName { + private static class AttributedQName { @XmlValue protected QName value; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); + + public AttributedQName() { + } } } Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverter.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverter.java?view=diff&rev=544082&r1=544081&r2=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverter.java (original) +++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverter.java Mon Jun 4 00:40:56 2007 @@ -20,6 +20,9 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.security.PrivilegedExceptionAction; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; @@ -28,23 +31,21 @@ import javax.xml.transform.stream.StreamResult; import javax.xml.ws.EndpointReference; +import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; -import org.apache.axiom.om.impl.dom.DOOMAbstractFactory; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.AddressingConstants.Final; import org.apache.axis2.addressing.AddressingConstants.Submission; import org.apache.axis2.addressing.EndpointReferenceHelper; +import org.apache.axis2.java.security.AccessController; import org.apache.axis2.jaxws.addressing.SubmissionEndpointReference; -import org.apache.axis2.jaxws.spi.Provider; import org.apache.axis2.util.XMLUtils; -import org.w3c.dom.Node; +import org.w3c.dom.Element; public final class EndpointReferenceConverter { - private static OMFactory omFactory = DOOMAbstractFactory.getOMFactory(); - private static QName eprType = new QName("namespace", "epr", "prefix"); - private static Provider provider = new Provider(); + private static OMFactory omFactory = OMAbstractFactory.getOMFactory(); private EndpointReferenceConverter() { } @@ -59,15 +60,25 @@ * @return * @throws AxisFault */ - public static <T extends EndpointReference> T convertFromAxis2(org.apache.axis2.addressing.EndpointReference axis2EPR, Class<T> clazz) - throws AxisFault { + public static <T extends EndpointReference> T convertFromAxis2(org.apache.axis2.addressing.EndpointReference axis2EPR, final Class<T> clazz) + throws AxisFault, NoSuchMethodException, InstantiationException, InvocationTargetException, IllegalAccessException, Exception { String addressingNamespace = SubmissionEndpointReference.class.isAssignableFrom(clazz) ? Submission.WSA_NAMESPACE : Final.WSA_NAMESPACE; - OMElement om = EndpointReferenceHelper.toOM(omFactory, axis2EPR, eprType, addressingNamespace); - Source source = new DOMSource((Node) om); - EndpointReference jaxwsEPR = provider.readEndpointReference(source); + QName qname = new QName(addressingNamespace, "EndpointReference", "wsa"); + OMElement omElement = + EndpointReferenceHelper.toOM(omFactory, axis2EPR, qname, addressingNamespace); + Element eprElement = XMLUtils.toDOM(omElement); + Source eprInfoset = new DOMSource(eprElement); - return clazz.cast(jaxwsEPR); + Constructor constructor = + (Constructor) AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public Object run() throws NoSuchMethodException { + return clazz.getConstructor(Source.class); + } + }); + + return clazz.cast(constructor.newInstance(eprInfoset)); } /** Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/Provider.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/Provider.java?view=diff&rev=544082&r1=544081&r2=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/Provider.java (original) +++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/Provider.java Mon Jun 4 00:40:56 2007 @@ -18,11 +18,11 @@ */ package org.apache.axis2.jaxws.spi; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; import javax.xml.namespace.QName; import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; import javax.xml.ws.Endpoint; import javax.xml.ws.EndpointReference; import javax.xml.ws.Service; @@ -45,11 +45,12 @@ import org.apache.axis2.util.XMLUtils; import org.w3c.dom.Element; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.net.URL; import java.util.List; public class Provider extends javax.xml.ws.spi.Provider { - private static volatile JAXBContext jaxbContext; @Override public Endpoint createAndPublishEndpoint(String s, Object obj) { @@ -160,31 +161,31 @@ @Override public EndpointReference readEndpointReference(Source eprInfoset) { - EndpointReference epr = null; + EndpointReference jaxwsEPR = null; try { - JAXBContext jaxbContext = getJAXBContext(); - Unmarshaller um = jaxbContext.createUnmarshaller(); - epr = (EndpointReference) um.unmarshal(eprInfoset); + Transformer xformer = TransformerFactory.newInstance().newTransformer(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + xformer.transform(eprInfoset, new StreamResult(baos)); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + OMElement eprElement = (OMElement) XMLUtils.toOM(bais); + org.apache.axis2.addressing.EndpointReference axis2EPR = + new org.apache.axis2.addressing.EndpointReference(""); + String addressingNamespace = EndpointReferenceHelper.fromOM(axis2EPR, eprElement); + Class<? extends EndpointReference> clazz = null; + + if (Submission.WSA_NAMESPACE.equals(addressingNamespace)) + clazz = SubmissionEndpointReference.class; + else + clazz = W3CEndpointReference.class; + + jaxwsEPR = EndpointReferenceConverter.convertFromAxis2(axis2EPR, clazz); } catch (Exception e) { //TODO NLS enable. throw ExceptionFactory.makeWebServiceException("A problem occured during the creation of an endpoint reference. See the nested exception for details.", e); } - return epr; - } - - private JAXBContext getJAXBContext() throws JAXBException { - //This is an implementation of double-checked locking. - //It works because jaxbContext is volatile. - if (jaxbContext == null) { - synchronized (javax.xml.ws.spi.Provider.class) { - if (jaxbContext == null) - jaxbContext = JAXBContext.newInstance(W3CEndpointReference.class, SubmissionEndpointReference.class); - } - } - - return jaxbContext; + return jaxwsEPR; } } Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java?view=diff&rev=544082&r1=544081&r2=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java (original) +++ webservices/axis2/branches/java/jaxws21/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java Mon Jun 4 00:40:56 2007 @@ -42,6 +42,7 @@ import org.apache.axis2.jaxws.feature.util.WebServiceFeatureConfigUtil; import org.apache.axis2.jaxws.feature.util.WebServiceFeatureConfigurator; import org.apache.axis2.jaxws.i18n.Messages; +import org.apache.axis2.jaxws.spi.migrator.ApplicationContextMigrator; import org.apache.axis2.jaxws.spi.migrator.ApplicationContextMigratorUtil; import org.apache.axis2.jaxws.util.WSDLWrapper; import org.apache.commons.logging.Log; @@ -74,6 +75,10 @@ * javax.xml.ws.Service} API. This is the plug point for the client implementation. */ public class ServiceDelegate extends javax.xml.ws.spi.ServiceDelegate { + private static final WebServiceFeatureConfigurator[] CONFIGURATORS = { + new W3CAndSubmissionAddressingConfigurator(), new MTOMConfigurator(), new RespectBindingConfigurator()}; + private static final ApplicationContextMigrator[] MIGRATORS = {new PropertyMigrator()}; + private static final Log log = LogFactory.getLog(ServiceDelegate.class); private Executor executor; @@ -101,17 +106,17 @@ } } - ConfigurationContext context= serviceDescription.getAxisConfigContext(); + //TODO: Is this the best place for this code? + ConfigurationContext context = serviceDescription.getAxisConfigContext(); // Register the necessary ApplicationContextMigrators - ApplicationContextMigratorUtil.addApplicationContextMigrator(context, - Constants.APPLICATION_CONTEXT_MIGRATOR_LIST_ID, new PropertyMigrator()); + for (ApplicationContextMigrator migrator : MIGRATORS) { + ApplicationContextMigratorUtil.addApplicationContextMigrator(context, + Constants.APPLICATION_CONTEXT_MIGRATOR_LIST_ID, migrator); + } // Register our WebServiceFeature configurators. - WebServiceFeatureConfigurator[] configurators = {new W3CAndSubmissionAddressingConfigurator(), - new MTOMConfigurator(), new RespectBindingConfigurator()}; - - for (WebServiceFeatureConfigurator configurator : configurators) { + for (WebServiceFeatureConfigurator configurator : CONFIGURATORS) { WebServiceFeatureConfigUtil.addWebServiceFeatureConfigurator(context, Constants.WEB_SERVICE_FEATURE_CONFIGURATOR_LIST_ID, configurator); } Added: webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverterTests.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverterTests.java?view=auto&rev=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverterTests.java (added) +++ webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/addressing/util/EndpointReferenceConverterTests.java Mon Jun 4 00:40:56 2007 @@ -0,0 +1,194 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.axis2.jaxws.addressing.util; + +import java.io.StringReader; + +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamReader; +import javax.xml.transform.Source; +import javax.xml.transform.dom.DOMSource; +import javax.xml.ws.wsaddressing.W3CEndpointReference; + +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMFactory; +import org.apache.axiom.om.impl.builder.StAXOMBuilder; +import org.apache.axis2.addressing.EndpointReferenceHelper; +import org.apache.axis2.addressing.AddressingConstants.Final; +import org.apache.axis2.addressing.AddressingConstants.Submission; +import org.apache.axis2.jaxws.addressing.SubmissionEndpointReference; +import org.apache.axis2.jaxws.addressing.util.EndpointReferenceConverter; +import org.custommonkey.xmlunit.XMLTestCase; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; + +/** + * This class uses the JAX-WS Dispatch API to test sending and receiving + * messages using SOAP 1.2. + */ +public class EndpointReferenceConverterTests extends XMLTestCase { + private static final OMFactory OMF = OMAbstractFactory.getOMFactory(); + private static final QName ELEMENT200508 = + new QName(Final.WSA_NAMESPACE, "EndpointReference", "wsa"); + private static final QName ELEMENT200408 = + new QName(Submission.WSA_NAMESPACE, "EndpointReference", "wsa"); + + private static final String EPR200508 = + "<wsa:EndpointReference xmlns:axis2=\"http://ws.apache.org/namespaces/axis2\" xmlns:wsa=\"http://www.w3.org/2005/08/addressing\" axis2:AttrExt=\"123456789\">"+ + "<wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address>"+ + "<wsa:ReferenceParameters xmlns:fabrikam=\"http://example.com/fabrikam\">"+ + "<fabrikam:CustomerKey>123456789</fabrikam:CustomerKey>"+ + "<fabrikam:ShoppingCart>ABCDEFG</fabrikam:ShoppingCart>"+ + "</wsa:ReferenceParameters>"+ + "<wsa:Metadata>"+ + "<axis2:MetaExt axis2:AttrExt=\"123456789\">123456789</axis2:MetaExt>"+ + "</wsa:Metadata>"+ + "<axis2:EPRExt axis2:AttrExt=\"123456789\">123456789</axis2:EPRExt>"+ + "</wsa:EndpointReference>"; + + private static final String EPR200408 = + "<wsa:EndpointReference xmlns:axis2=\"http://ws.apache.org/namespaces/axis2\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" axis2:AttrExt=\"123456789\">"+ + "<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/anonymous</wsa:Address>"+ + "<wsa:ReferenceParameters xmlns:fabrikam=\"http://example.com/fabrikam\">"+ + "<fabrikam:CustomerKey>123456789</fabrikam:CustomerKey>"+ + "<fabrikam:ShoppingCart>ABCDEFG</fabrikam:ShoppingCart>"+ + "</wsa:ReferenceParameters>"+ + "<wsa:PortType>axis2:Jane</wsa:PortType>"+ + "<wsa:ServiceName PortName=\"Fred\">axis2:John</wsa:ServiceName>"+ + "<axis2:EPRExt axis2:AttrExt=\"123456789\">123456789</axis2:EPRExt>"+ + "</wsa:EndpointReference>"; + + public EndpointReferenceConverterTests(String name) { + super(name); + } + + public void test200508ConversionStartingFromAxis2() throws Exception { + XMLStreamReader parser = + XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(EPR200508)); + StAXOMBuilder builder = new StAXOMBuilder(parser); + OMElement omElement = builder.getDocumentElement(); + + org.apache.axis2.addressing.EndpointReference axis2EPR = + EndpointReferenceHelper.fromOM(omElement); + W3CEndpointReference jaxwsEPR = + EndpointReferenceConverter.convertFromAxis2(axis2EPR, W3CEndpointReference.class); + assertXMLEqual(EPR200508, jaxwsEPR.toString()); + + org.apache.axis2.addressing.EndpointReference axis2Result = + EndpointReferenceConverter.convertToAxis2(jaxwsEPR); + OMElement eprElement = + EndpointReferenceHelper.toOM(OMF, axis2Result, ELEMENT200508, Final.WSA_NAMESPACE); + assertXMLEqual(EPR200508, eprElement.toString()); + } + + public void test200508ConversionStartingFromJAXWS() throws Exception { + DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); + dbfac.setNamespaceAware(true); + DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); + Document jaxwsDoc = docBuilder.parse(new InputSource(new StringReader(EPR200508))); + Source source = new DOMSource(jaxwsDoc); + + W3CEndpointReference jaxwsEPR = new W3CEndpointReference(source); + org.apache.axis2.addressing.EndpointReference axis2EPR = + EndpointReferenceConverter.convertToAxis2(jaxwsEPR); + OMElement eprElement = + EndpointReferenceHelper.toOM(OMF, axis2EPR, ELEMENT200508, Final.WSA_NAMESPACE); + assertXMLEqual(EPR200508, eprElement.toString()); + + W3CEndpointReference jaxwsResult = + EndpointReferenceConverter.convertFromAxis2(axis2EPR, W3CEndpointReference.class); + assertXMLEqual(EPR200508, jaxwsResult.toString()); + } + + public void test200408ConversionStartingFromAxis2() throws Exception { + XMLStreamReader parser = + XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(EPR200408)); + StAXOMBuilder builder = new StAXOMBuilder(parser); + OMElement omElement = builder.getDocumentElement(); + + org.apache.axis2.addressing.EndpointReference axis2EPR = + EndpointReferenceHelper.fromOM(omElement); + SubmissionEndpointReference jaxwsEPR = + EndpointReferenceConverter.convertFromAxis2(axis2EPR, SubmissionEndpointReference.class); + assertXMLEqual(EPR200408, jaxwsEPR.toString()); + + org.apache.axis2.addressing.EndpointReference axis2Result = + EndpointReferenceConverter.convertToAxis2(jaxwsEPR); + OMElement eprElement = + EndpointReferenceHelper.toOM(OMF, axis2Result, ELEMENT200408, Submission.WSA_NAMESPACE); + assertXMLEqual(EPR200408, eprElement.toString()); + } + + public void test200408ConversionStartingFromJAXWS() throws Exception { + DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); + dbfac.setNamespaceAware(true); + DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); + Document jaxwsDoc = docBuilder.parse(new InputSource(new StringReader(EPR200408))); + Source source = new DOMSource(jaxwsDoc); + + SubmissionEndpointReference jaxwsEPR = new SubmissionEndpointReference(source); + org.apache.axis2.addressing.EndpointReference axis2EPR = + EndpointReferenceConverter.convertToAxis2(jaxwsEPR); + OMElement eprElement = + EndpointReferenceHelper.toOM(OMF, axis2EPR, ELEMENT200408, Submission.WSA_NAMESPACE); + assertXMLEqual(EPR200408, eprElement.toString()); + + SubmissionEndpointReference jaxwsResult = + EndpointReferenceConverter.convertFromAxis2(axis2EPR, SubmissionEndpointReference.class); + assertXMLEqual(EPR200408, jaxwsResult.toString()); + } + + public void testFailures() throws Exception { + try { + EndpointReferenceConverter.convertFromAxis2(null, W3CEndpointReference.class); + fail("Expected a failure."); + } + catch (Exception e) { + //pass + } + + try { + EndpointReferenceConverter.convertFromAxis2(null, SubmissionEndpointReference.class); + fail("Expected a failure."); + } + catch (Exception e) { + //pass + } + + try { + EndpointReferenceConverter.convertFromAxis2(null, null); + fail("Expected a failure."); + } + catch (Exception e) { + //pass + } + + try { + EndpointReferenceConverter.convertToAxis2(null); + fail("Expected a failure."); + } + catch (Exception e) { + //pass + } + } +} Modified: webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java?view=diff&rev=544082&r1=544081&r2=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java (original) +++ webservices/axis2/branches/java/jaxws21/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java Mon Jun 4 00:40:56 2007 @@ -21,6 +21,7 @@ import junit.framework.TestCase; import junit.framework.TestSuite; +import org.apache.axis2.jaxws.addressing.util.EndpointReferenceConverterTests; import org.apache.axis2.jaxws.anytype.tests.AnyTypeTests; import org.apache.axis2.jaxws.attachments.MTOMSerializationTests; import org.apache.axis2.jaxws.client.ClientConfigTests; @@ -125,6 +126,9 @@ suite.addTestSuite(SOAP12Tests.class); suite.addTestSuite(MTOMSerializationTests.class); suite.addTestSuite(BindingToProtocolTests.class); + + // ------ Addressing Tests ------ + suite.addTestSuite(EndpointReferenceConverterTests.class); // ------ Metadata Tests ------ suite.addTestSuite(WSDLTests.class); Modified: webservices/axis2/branches/java/jaxws21/modules/kernel/src/org/apache/axis2/addressing/EndpointReferenceHelper.java URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/kernel/src/org/apache/axis2/addressing/EndpointReferenceHelper.java?view=diff&rev=544082&r1=544081&r2=544082 ============================================================================== --- webservices/axis2/branches/java/jaxws21/modules/kernel/src/org/apache/axis2/addressing/EndpointReferenceHelper.java (original) +++ webservices/axis2/branches/java/jaxws21/modules/kernel/src/org/apache/axis2/addressing/EndpointReferenceHelper.java Mon Jun 4 00:40:56 2007 @@ -56,49 +56,60 @@ /** * Populates an endpoint reference based on the <code>OMElement</code> and - * WS-Addressing namespace that is passed in. If the string passed in is not - * recognized as a valid WS-Addressing namespace then this method behaves as - * if http://www.w3.org/2005/08/addressing has been passed in. + * WS-Addressing namespace that is passed in. * * @param epr an endpoint reference instance to hold the info. * @param eprOMElement an element of endpoint reference type * @param addressingNamespace the namespace of the WS-Addressing spec to comply with. - * @throws AxisFault if unable to locate an address element + * @throws AxisFault if unable to locate an address element, or if the specified namespace + * is different to the actual namespace. * @see #fromOM(OMElement) */ public static void fromOM(EndpointReference epr, OMElement eprOMElement, String addressingNamespace) throws AxisFault { + String namespace = fromOM(epr, eprOMElement); + + if (!namespace.equals(addressingNamespace)) + throw new AxisFault("The endpoint reference does not match the specified namespace."); + } + + /** + * Populates an endpoint reference based on the <code>OMElement</code>. Returns the + * WS-Addressing namespace that the endpoint reference is in compliance with. + * + * @param epr an endpoint reference instance to hold the info. + * @param eprOMElement an element of endpoint reference type + * @return a string representing the namespace of the endpoint reference. + * @throws AxisFault if unable to locate an address element. + */ + public static String fromOM(EndpointReference epr, OMElement eprOMElement) + throws AxisFault { boolean isFinalAddressingNamespace = false; Map map = null; //First pass, identify the addressing namespace. - if (AddressingConstants.Submission.WSA_NAMESPACE.equals(addressingNamespace)) { - OMElement address = eprOMElement.getFirstChildWithName( - (QName) submissionQNames.get(AddressingConstants.EPR_ADDRESS)); + OMElement address = eprOMElement + .getFirstChildWithName((QName) finalQNames.get(AddressingConstants.EPR_ADDRESS)); - if (address != null) { - map = submissionQNames; - isFinalAddressingNamespace = false; + if (address != null) { + map = finalQNames; + isFinalAddressingNamespace = true; - if (log.isDebugEnabled()) { - log.debug("fromOM: Found address element for namespace, " + - AddressingConstants.Submission.WSA_NAMESPACE); - } - } else { - throw new AxisFault( - "Unable to locate an address element for the endpoint reference type."); + if (log.isDebugEnabled()) { + log.debug("fromOM: Found address element for namespace, " + + AddressingConstants.Final.WSA_NAMESPACE); } } else { - OMElement address = eprOMElement.getFirstChildWithName( - (QName) finalQNames.get(AddressingConstants.EPR_ADDRESS)); + address = eprOMElement.getFirstChildWithName( + (QName) submissionQNames.get(AddressingConstants.EPR_ADDRESS)); if (address != null) { - map = finalQNames; - isFinalAddressingNamespace = true; + map = submissionQNames; + isFinalAddressingNamespace = false; if (log.isDebugEnabled()) { log.debug("fromOM: Found address element for namespace, " + - AddressingConstants.Final.WSA_NAMESPACE); + AddressingConstants.Submission.WSA_NAMESPACE); } } else { throw new AxisFault( @@ -108,6 +119,8 @@ //Second pass, identify the properties. fromOM(epr, eprOMElement, map, isFinalAddressingNamespace); + + return ((QName) map.get(AddressingConstants.EPR_ADDRESS)).getNamespaceURI(); } /** @@ -119,6 +132,7 @@ * * @param eprString string from the element of endpoint reference type * @throws AxisFault if unable to locate an address element + * @deprecated use [EMAIL PROTECTED] #fromString(String)} instead. */ public static EndpointReference fromOM(String eprString) throws AxisFault { try { @@ -130,6 +144,25 @@ } /** + * Populates an endpoint reference based on the <code>String</code> that is + * passed in. If the http://schemas.xmlsoap.org/ws/2004/08/addressing namespace + * is in effect then any reference properties will be saved as reference parameters. + * Regardless of the addressing namespace in effect, any elements present in the + * <code>String</code> that are not recognised are saved as extensibility elements. + * + * @param eprString string from the element of endpoint reference type + * @throws AxisFault if unable to locate an address element + */ + public static EndpointReference fromString(String eprString) throws AxisFault { + try { + return fromOM(new StAXOMBuilder( + new ByteArrayInputStream(eprString.getBytes())).getDocumentElement()); + } catch (XMLStreamException e) { + throw AxisFault.makeFault(e); + } + } + + /** * Populates an endpoint reference based on the <code>OMElement</code> that is * passed in. If the http://schemas.xmlsoap.org/ws/2004/08/addressing namespace * is in effect then any reference properties will be saved as reference parameters. @@ -141,41 +174,7 @@ */ public static EndpointReference fromOM(OMElement eprOMElement) throws AxisFault { EndpointReference epr = new EndpointReference(""); - boolean isFinalAddressingNamespace = false; - Map map = null; - - //First pass, identify the addressing namespace. - OMElement address = eprOMElement - .getFirstChildWithName((QName) finalQNames.get(AddressingConstants.EPR_ADDRESS)); - - if (address != null) { - map = finalQNames; - isFinalAddressingNamespace = true; - - if (log.isDebugEnabled()) { - log.debug("fromOM: Found address element for namespace, " + - AddressingConstants.Final.WSA_NAMESPACE); - } - } else { - address = eprOMElement.getFirstChildWithName( - (QName) submissionQNames.get(AddressingConstants.EPR_ADDRESS)); - - if (address != null) { - map = submissionQNames; - isFinalAddressingNamespace = false; - - if (log.isDebugEnabled()) { - log.debug("fromOM: Found address element for namespace, " + - AddressingConstants.Submission.WSA_NAMESPACE); - } - } else { - throw new AxisFault( - "Unable to locate an address element for the endpoint reference type."); - } - } - - //Second pass, identify the properties. - fromOM(epr, eprOMElement, map, isFinalAddressingNamespace); + fromOM(epr, eprOMElement); return epr; } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]