You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wsrf-dev@ws.apache.org by ip...@apache.org on 2005/03/14 23:07:47 UTC

svn commit: r157474 - incubator/apollo/trunk/src/java/org/apache/ws/util/WsrfWsdlUtils.java

Author: ips
Date: Mon Mar 14 14:07:47 2005
New Revision: 157474

URL: http://svn.apache.org/viewcvs?view=rev&rev=157474
Log:
added support for recursing more than one-level deep into imports/includes; added support for more than one xsd:schema element within the wsdl:types element; improved error checking/reporting

Modified:
    incubator/apollo/trunk/src/java/org/apache/ws/util/WsrfWsdlUtils.java

Modified: incubator/apollo/trunk/src/java/org/apache/ws/util/WsrfWsdlUtils.java
URL: http://svn.apache.org/viewcvs/incubator/apollo/trunk/src/java/org/apache/ws/util/WsrfWsdlUtils.java?view=diff&r1=157473&r2=157474
==============================================================================
--- incubator/apollo/trunk/src/java/org/apache/ws/util/WsrfWsdlUtils.java (original)
+++ incubator/apollo/trunk/src/java/org/apache/ws/util/WsrfWsdlUtils.java Mon Mar 14 14:07:47 2005
@@ -45,6 +45,7 @@
  */
 public abstract class WsrfWsdlUtils
 {
+
     /**
      * DOCUMENT_ME
      *
@@ -93,56 +94,51 @@
     }
 
     /**
-     * @param propsDocName
+     * @param rpDocElemName
      * @param def
-     *
      * @param baseUrl
+     *
      * @return the names of the resource properties associated with the specified portType
      */
-    public static QName[] getResourcePropertyNames(QName propsDocName,
-                                                   Definition def, URL baseUrl) throws InvalidWsrfWsdlException
+    public static QName[] getResourcePropertyNames( QName rpDocElemName,
+                                                    Definition def, URL baseUrl ) throws InvalidWsrfWsdlException
     {
-        if ( propsDocName == null )
+        if ( rpDocElemName == null )
         {
             return null;
         }
-        Element schemaElem = getSchemaElement( def );
-        Element rpDocElementElem = getElementByName( schemaElem, propsDocName );
-
-        if(rpDocElementElem == null)
+        Set propNames = new HashSet();
+        Element[] schemaElems = getSchemaElements( def );
+        XsdElement rpDocXsdElem = null;
+        for ( int i = 0; i < schemaElems.length; i++ )
         {
-            String[] schemaLocations = findImportsAndIncludes(schemaElem, propsDocName.getNamespaceURI());
-            for (int i = 0; i < schemaLocations.length; i++)
+            rpDocXsdElem = getXsdElementElementRecursively( schemaElems[i], rpDocElemName, baseUrl );
+            if ( rpDocXsdElem != null )
             {
-                String location = schemaLocations[i];
-                Document shcemaDoc = null;
-                try
-                {
-                    URL schemaUrl = new URL(baseUrl, location);
-                    shcemaDoc = JaxpUtils.loadDocument(schemaUrl.openStream());
-                }
-                catch (Exception e)
-                {
-                    throw new InvalidWsrfWsdlException("Failed to load schema at location " + location);
-                }
-
-                rpDocElementElem = getElementByName( shcemaDoc.getDocumentElement(), propsDocName );
-                if(rpDocElementElem != null) break;
-            }
-            if(rpDocElementElem == null)
-            {
-                throw new InvalidWsrfWsdlException("Unable to locate the ResourceProperties Document Element with QName " + propsDocName);
+                break;
             }
         }
-        String type = rpDocElementElem.getAttribute( "type" );
+        if ( rpDocXsdElem == null )
+        {
+            throw new InvalidWsrfWsdlException(
+                    "Unable to locate the ResourceProperties Document Element with QName " + rpDocElemName );
+        }
+        String type = rpDocXsdElem.getElement().getAttribute( "type" );
         Element rpDocTypeElem;
         if ( !"".equals( type ) )
         {
-            rpDocTypeElem = getComplexTypeByName( schemaElem, type );
+            rpDocTypeElem = getComplexTypeByName( rpDocXsdElem.getSchemaElement(), type );
         }
         else
         {
-            rpDocTypeElem = (Element) rpDocElementElem.getElementsByTagNameNS( XmlConstants.NSURI_SCHEMA_XSD, "complexType" ).item( 0 );
+            rpDocTypeElem =
+                    (Element) rpDocXsdElem.getElement().getElementsByTagNameNS( XmlConstants.NSURI_SCHEMA_XSD,
+                            "complexType" )
+                    .item( 0 );
+        }
+        if ( rpDocTypeElem == null )
+        {
+            throw new InvalidWsrfWsdlException( "Unable to determine type of the ResourceProperties document element with QName " + rpDocElemName + " - expected either a type atribute or a nested anonymous complexType element." );
         }
         Element sequenceElem = null;
         NodeList sequenceNodes = rpDocTypeElem.getElementsByTagNameNS( XmlConstants.NSURI_SCHEMA_XSD, "sequence" );
@@ -160,60 +156,107 @@
         }
         if ( sequenceElem == null )
         {
-            throw new RuntimeException( "Resource property element definitions must be contained in an xsd:sequence or an xsd:all element." );
+            throw new RuntimeException(
+                    "Resource property element definitions must be contained in an xsd:sequence or an xsd:all element." );
         }
         NodeList propElems = sequenceElem.getElementsByTagNameNS( XmlConstants.NSURI_SCHEMA_XSD, "element" );
-        Set propNames = new HashSet();
-        for ( int i = 0; i < propElems.getLength(); i++ )
+        for ( int j = 0; j < propElems.getLength(); j++ )
         {
-            Element propElem = (Element) propElems.item( i );
-            String ref = propElem.getAttribute( "ref" );
-            if ( "".equals( ref ) ) {
-                throw new InvalidWsrfWsdlException( "All element defs within the resource property document def must have a 'ref' attribute that points at a global element def." );
-            }
-            StringTokenizer tokenizer = new StringTokenizer( ref, ":" );
-            if ( tokenizer.countTokens() != 2 )
+            Element propElem = (Element) propElems.item( j );
+            QName propName = getElementRefName( propElem, rpDocXsdElem.getSchemaElement() );
+            propNames.add( propName );
+        }
+        return (QName[]) propNames.toArray( new QName[0] );
+    }
+
+    private static XsdElement getXsdElementElementRecursively( Element xsdSchemaElem, QName xsdElemName, URL baseUrl )
+            throws InvalidWsrfWsdlException
+    {
+        XsdElement xsdElementElem = getXsdElementElement( xsdSchemaElem, xsdElemName );
+        if ( xsdElementElem == null )
+        {
+            String[] schemaLocations = findImportsAndIncludes( xsdSchemaElem, xsdElemName.getNamespaceURI() );
+            for ( int j = 0; j < schemaLocations.length; j++ )
             {
-                throw new InvalidWsrfWsdlException( "Value for 'ref' attribute must be qualified via a namespace prefix." );
+                String location = schemaLocations[j];
+                URL schemaUrl = null;
+                Document schemaDoc = null;
+                try
+                {
+                    schemaUrl = new URL( baseUrl, location );
+                    schemaDoc = JaxpUtils.loadDocument( schemaUrl.openStream() );
+                }
+                catch ( Exception e )
+                {
+                    throw new InvalidWsrfWsdlException( "Failed to load schema at location " + location );
+                }
+                xsdElementElem =
+                        getXsdElementElementRecursively( schemaDoc.getDocumentElement(), xsdElemName, schemaUrl );
+                if ( xsdElementElem != null )
+                {
+                    break;
+                }
             }
-            String propPrefix = tokenizer.nextToken();
-            String propLocalName = tokenizer.nextToken();
-            // TODO: write our own prefix resolver to eliminate dep on Xalan
-            PrefixResolver prefixResolver = new PrefixResolverDefault( schemaElem );
-            String propNamespace = prefixResolver.getNamespaceForPrefix( propPrefix );
-            propNames.add( new QName( propNamespace, propLocalName, propPrefix ) );
         }
+        return xsdElementElem;
+    }
 
-        return (QName[]) propNames.toArray( new QName[0] );
+    private static QName getElementRefName( Element propElem, Element schemaElem )
+            throws InvalidWsrfWsdlException
+    {
+        String ref = propElem.getAttribute( "ref" );
+        if ( "".equals( ref ) )
+        {
+            throw new InvalidWsrfWsdlException(
+                    "All element defs within the resource property document def must have a 'ref' attribute that points at a global element def." );
+        }
+        StringTokenizer tokenizer = new StringTokenizer( ref, ":" );
+        if ( tokenizer.countTokens() != 2 )
+        {
+            throw new InvalidWsrfWsdlException( "Value for xsd:element 'ref' attribute must be qualified via a namespace prefix." );
+        }
+        String propPrefix = tokenizer.nextToken();
+        String propLocalName = tokenizer.nextToken();
+        // TODO: write our own prefix resolver to eliminate dep on Xalan
+        PrefixResolver prefixResolver = new PrefixResolverDefault( schemaElem );
+        String propNamespace = prefixResolver.getNamespaceForPrefix( propPrefix );
+        if ( propNamespace == null )
+        {
+           throw new InvalidWsrfWsdlException( "Unable to resolve prefix '" + propPrefix + "' in xsd:element 'ref' attribute value." );
+        }
+        QName propName = new QName( propNamespace, propLocalName, propPrefix );
+        return propName;
     }
 
-    private static String[] findImportsAndIncludes(Element schemaElem, String namespaceURI)
+    private static String[] findImportsAndIncludes( Element schemaElem, String namespaceURI )
     {
         List elems = new ArrayList();
-        NodeList imports = schemaElem.getElementsByTagNameNS(XmlConstants.NSURI_SCHEMA_XSD, XmlConstants.XSD_ATTRIB_IMPORT);
-        for (int i = 0; i < imports.getLength(); i++)
-        {
-            Element importNode = (Element) imports.item(i);
-            Attr attributeNode = importNode.getAttributeNode("namespace");
-            if(attributeNode != null)
+        NodeList imports = schemaElem.getElementsByTagNameNS( XmlConstants.NSURI_SCHEMA_XSD,
+                XmlConstants.XSD_ATTRIB_IMPORT );
+        for ( int i = 0; i < imports.getLength(); i++ )
+        {
+            Element importNode = (Element) imports.item( i );
+            Attr attributeNode = importNode.getAttributeNode( "namespace" );
+            if ( attributeNode != null )
             {
-                if (namespaceURI.equals(attributeNode.getValue()))
+                if ( namespaceURI.equals( attributeNode.getValue() ) )
                 {
-                    elems.add(importNode);
+                    elems.add( importNode );
                 }
             }
         }
-        NodeList includes = schemaElem.getElementsByTagNameNS(XmlConstants.NSURI_SCHEMA_XSD, XmlConstants.XSD_ATTRIB_INCLUDE);
-        for (int i = 0; i < includes.getLength(); i++)
+        NodeList includes = schemaElem.getElementsByTagNameNS( XmlConstants.NSURI_SCHEMA_XSD,
+                XmlConstants.XSD_ATTRIB_INCLUDE );
+        for ( int i = 0; i < includes.getLength(); i++ )
         {
-              elems.add(includes.item(i));
+            elems.add( includes.item( i ) );
         }
         String[] locations = new String[elems.size()];
-        for (int i = 0; i < elems.size(); i++)
+        for ( int i = 0; i < elems.size(); i++ )
         {
-            Element element = (Element) elems.get(i);
-            Attr attributeNode = element.getAttributeNode("schemaLocation");
-            if(attributeNode != null)
+            Element element = (Element) elems.get( i );
+            Attr attributeNode = element.getAttributeNode( "schemaLocation" );
+            if ( attributeNode != null )
             {
                 locations[i] = attributeNode.getValue();
             }
@@ -221,8 +264,8 @@
         return locations;
     }
 
-    private static Element getElementByName( Element schemaElem,
-                                             QName name )
+    private static XsdElement getXsdElementElement( Element schemaElem,
+                                                    QName name )
     {
         NodeList children = schemaElem.getChildNodes();
         for ( int i = 0; i < children.getLength(); i++ )
@@ -233,7 +276,7 @@
                 Element elementElem = (Element) child;
                 if ( String.valueOf( elementElem.getAttribute( "name" ) ).equals( name.getLocalPart() ) )
                 {
-                    return elementElem;
+                    return new XsdElement( elementElem, schemaElem );
                 }
             }
         }
@@ -262,10 +305,13 @@
     public static QName getResourcePropertiesDocumentName( PortType portType )
     {
         Map extAttribs = portType.getExtensionAttributes();
-        QName rpDocDefQName = (QName) extAttribs.get( org.apache.ws.resource.properties.v1_2_draft05.ResourcePropertiesConstants.RESOURCE_PROPERTIES_PORTTYPE_ATTRIB );
+        QName rpDocDefQName = (QName) extAttribs.get(
+                org.apache.ws.resource.properties.v1_2_draft05.ResourcePropertiesConstants.RESOURCE_PROPERTIES_PORTTYPE_ATTRIB );
         if ( rpDocDefQName == null )
         {
-            rpDocDefQName = (QName) extAttribs.get( org.apache.ws.resource.properties.v1_2_draft01.ResourcePropertiesConstants.RESOURCE_PROPERTIES_PORTTYPE_ATTRIB );
+            rpDocDefQName =
+                    (QName) extAttribs.get(
+                            org.apache.ws.resource.properties.v1_2_draft01.ResourcePropertiesConstants.RESOURCE_PROPERTIES_PORTTYPE_ATTRIB );
         }
         return rpDocDefQName;
     }
@@ -273,15 +319,20 @@
     public static QName getMetadataDescriptorName( PortType portType )
     {
         Map extAttribs = portType.getExtensionAttributes();
-        return (QName) extAttribs.get( new QName( "http://docs.oasis-open.org/wsrf/2004/10/wsrf-WSResourceMetadataDescriptor-1.0-draft-01.xsd", "metadataDescriptor", "wsrmd" ) );
+        return (QName) extAttribs.get( new QName(
+                "http://docs.oasis-open.org/wsrf/2004/10/wsrf-WSResourceMetadataDescriptor-1.0-draft-01.xsd",
+                "metadataDescriptor", "wsrmd" ) );
     }
 
-    public static String getMetadataDescriptorLocation( PortType portType ) throws org.apache.ws.resource.InvalidWsrfWsdlException
+    public static String getMetadataDescriptorLocation( PortType portType )
+            throws org.apache.ws.resource.InvalidWsrfWsdlException
     {
         Map extAttribs = portType.getExtensionAttributes();
         final QName METADATA_DESCRIPTOR_PORTTYPE_ATTRIB =
-            new QName( "http://docs.oasis-open.org/wsrf/2004/10/wsrf-WSResourceMetadataDescriptor-1.0-draft-01.xsd", "metadataDescriptorLocation", "wsrmd" );
-        QName qValue = ((QName)extAttribs.get( METADATA_DESCRIPTOR_PORTTYPE_ATTRIB ));
+                new QName(
+                        "http://docs.oasis-open.org/wsrf/2004/10/wsrf-WSResourceMetadataDescriptor-1.0-draft-01.xsd",
+                        "metadataDescriptorLocation", "wsrmd" );
+        QName qValue = ( (QName) extAttribs.get( METADATA_DESCRIPTOR_PORTTYPE_ATTRIB ) );
         if ( qValue == null )
         {
             return null;
@@ -290,15 +341,16 @@
         StringTokenizer tokenizer = new StringTokenizer( value );
         if ( tokenizer.countTokens() != 2 )
         {
-            throw new org.apache.ws.resource.InvalidWsrfWsdlException( METADATA_DESCRIPTOR_PORTTYPE_ATTRIB + " attribute on portType must be of the format \"namespaceURI locationURL\"");
+            throw new org.apache.ws.resource.InvalidWsrfWsdlException( METADATA_DESCRIPTOR_PORTTYPE_ATTRIB +
+                    " attribute on portType must be of the format \"namespaceURI locationURL\"" );
         }
         tokenizer.nextToken();
         return tokenizer.nextToken();
     }
 
-    private static Element getSchemaElement( Definition def )
+    private static Element[] getSchemaElements( Definition def )
     {
-        Element schemaElem = null;
+        List schemaElems = new ArrayList();
         List extElems = def.getTypes().getExtensibilityElements();
         for ( int i = 0; i < extElems.size(); i++ )
         {
@@ -310,12 +362,33 @@
                 if ( elem.getNamespaceURI().equals( XmlConstants.NSURI_SCHEMA_XSD )
                         && elem.getLocalName().equals( XmlConstants.XSD_SCHEMA.getLocalPart() ) )
                 {
-                    schemaElem = elem;
-                    break;
+                    schemaElems.add( elem );
                 }
             }
         }
-        return schemaElem;
+        return (Element[]) schemaElems.toArray( new Element[0] );
+    }
+
+    private static class XsdElement
+    {
+        private Element m_elem;
+        private Element m_schemaElem;
+
+        public XsdElement( Element elem, Element schemaElem )
+        {
+            m_elem = elem;
+            m_schemaElem = schemaElem;
+        }
+
+        public Element getElement()
+        {
+            return m_elem;
+        }
+
+        public Element getSchemaElement()
+        {
+            return m_schemaElem;
+        }
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: apollo-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: apollo-dev-help@ws.apache.org