You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Frank Cornelis (JIRA)" <ji...@apache.org> on 2014/11/19 18:27:34 UTC

[jira] [Created] (CXF-6110) AbstractSTSClient MEX: download XML schema from Location

Frank Cornelis created CXF-6110:
-----------------------------------

             Summary: AbstractSTSClient MEX: download XML schema from Location
                 Key: CXF-6110
                 URL: https://issues.apache.org/jira/browse/CXF-6110
             Project: CXF
          Issue Type: Improvement
          Components: STS
    Affects Versions: 2.7.13
            Reporter: Frank Cornelis


For MEX data like:
{code:xml}
  <MetadataSection
    Dialect="http://www.w3.org/2001/XMLSchema"
    Identifier="http://something">
        <Location>https://some/location.xsd</Location>
  </MetadataSection>
{code}
the AbstractSTSClient should probably start downloading when getAny() gives NULL.
The next patch adds this feature (quick and dirty).
{code}
--- src/main/java/org/apache/cxf/ws/security/trust/AbstractSTSClient.java.orig	2014-11-19 17:49:37.964705313 +0100
+++ src/main/java/org/apache/cxf/ws/security/trust/AbstractSTSClient.java	2014-11-19 18:19:01.989607217 +0100
@@ -41,6 +41,9 @@
 import javax.wsdl.extensions.ExtensibilityElement;
 import javax.wsdl.extensions.schema.Schema;
 import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.transform.dom.DOMSource;
@@ -48,6 +51,7 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
 import org.apache.cxf.Bus;
 import org.apache.cxf.BusException;
 import org.apache.cxf.binding.soap.SoapBindingConstants;
@@ -525,6 +529,11 @@
                             bus.getExtension(WSDLManager.class).getDefinition((Element)s.getAny());
                     } else if ("http://www.w3.org/2001/XMLSchema".equals(s.getDialect())) {
                         Element schemaElement = (Element)s.getAny();
+                        if (schemaElement ==  null) {
+                            String schemaLocation = s.getLocation();
+                            LOG.info("XSD schema location: " + schemaLocation);
+                            schemaElement = downloadSchema(schemaLocation);
+                        }
                         QName schemaName = 
                             new QName(schemaElement.getNamespaceURI(), schemaElement.getLocalName());
                         WSDLManager wsdlManager = bus.getExtension(WSDLManager.class);
@@ -586,10 +595,20 @@
                     client = new ClientImpl(bus, endpoint);
                 }
             } catch (Exception ex) {
-                throw new TrustException(LOG, "WS_MEX_ERROR", ex);
+                throw new TrustException("WS_MEX_ERROR", LOG, ex);
             }
         }
     }
+
+    private Element downloadSchema(String schemaLocation)
+        throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        documentBuilderFactory.setNamespaceAware(true);
+        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+        Document document = documentBuilder.parse(schemaLocation);
+        return document.getDocumentElement();
+    }
+
     protected String findMEXLocation(EndpointReferenceType ref, boolean useEPRWSAAddrAsMEXLocation) {
         if (ref.getMetadata() != null && ref.getMetadata().getAny() != null) {
             for (Object any : ref.getMetadata().getAny()) {
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)