[ 
https://issues.apache.org/jira/browse/CXF-6110?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Colm O hEigeartaigh resolved CXF-6110.
--------------------------------------
    Resolution: Fixed

> 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
>            Assignee: Colm O hEigeartaigh
>             Fix For: 3.1.0, 3.0.3, 2.7.14
>
>
> 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.
> I stumbled upon this by implementing a WS-Trust STS with a WSDL that contains 
> schema imports instead of an embedded XML schema.
> 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)

Reply via email to