You are viewing a plain text version of this content. The canonical link for it is here.
Posted to woden-dev@ws.apache.org by jk...@apache.org on 2007/01/25 02:40:08 UTC

svn commit: r499639 - in /incubator/woden/trunk/java/src/org/apache/woden/internal: DOMWSDLReader.java OMWSDLReader.java resolver/DOMSchemaResolverAdapter.java resolver/SchemaResolverAdapter.java

Author: jkaputin
Date: Wed Jan 24 17:40:07 2007
New Revision: 499639

URL: http://svn.apache.org/viewvc?view=rev&rev=499639
Log:
WODEN-10 Fix for WSDL 2.0 testcase SchemaId-1G. 
A schema import, inside an inlined schema, with a
schemaLocation containing a fragid that identifies
another inlined schema will now be resolved correctly. 

Added:
    incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/DOMSchemaResolverAdapter.java
Modified:
    incubator/woden/trunk/java/src/org/apache/woden/internal/DOMWSDLReader.java
    incubator/woden/trunk/java/src/org/apache/woden/internal/OMWSDLReader.java
    incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/SchemaResolverAdapter.java

Modified: incubator/woden/trunk/java/src/org/apache/woden/internal/DOMWSDLReader.java
URL: http://svn.apache.org/viewvc/incubator/woden/trunk/java/src/org/apache/woden/internal/DOMWSDLReader.java?view=diff&rev=499639&r1=499638&r2=499639
==============================================================================
--- incubator/woden/trunk/java/src/org/apache/woden/internal/DOMWSDLReader.java (original)
+++ incubator/woden/trunk/java/src/org/apache/woden/internal/DOMWSDLReader.java Wed Jan 24 17:40:07 2007
@@ -32,6 +32,7 @@
 import org.apache.woden.WSDLReader;
 import org.apache.woden.WSDLSource;
 import org.apache.woden.XMLElement;
+import org.apache.woden.internal.resolver.DOMSchemaResolverAdapter;
 import org.apache.woden.internal.resolver.EntityResolverAdapter;
 import org.apache.woden.internal.resolver.SchemaResolverAdapter;
 import org.apache.woden.internal.schema.ImportedSchemaImpl;
@@ -279,7 +280,7 @@
             XmlSchemaCollection xsc = new XmlSchemaCollection();
             
             // Plug in the selected woden URI Resolver
-            xsc.setSchemaResolver(new SchemaResolverAdapter(getURIResolver()));         
+            xsc.setSchemaResolver(new DOMSchemaResolverAdapter(getURIResolver(), schemaEl));         
             schemaDef = xsc.read(domSchemaEl, baseURI);
         } 
         catch (XmlSchemaException e) 
@@ -352,13 +353,13 @@
         
         if(schema.getSchemaLocation() != null)
         {
-            schemaDef = retrieveSchema(desc.getDocumentBaseURI(), schemaLoc);
+            schemaDef = retrieveSchema(importEl, desc.getDocumentBaseURI(), schemaLoc);
         }
         
         if(schemaDef == null) {
             //Either there was no schemaLocation or it did not resolve to a schema,
             //so try to retrieve a schema at the namespace.
-            schemaDef = retrieveSchema(null, importNS);
+            schemaDef = retrieveSchema(importEl, null, importNS);
         }
         
         if(schemaDef == null) {
@@ -557,7 +558,8 @@
         }
     }
     
-    private XmlSchema retrieveSchema(URI contextURI, String schemaSpec) throws WSDLException {
+    private XmlSchema retrieveSchema(XMLElement contextElement, URI contextURI, String schemaSpec) 
+    throws WSDLException {
         
         Document importedSchemaDoc = null;
         Element schemaEl = null;
@@ -633,7 +635,7 @@
                 XmlSchemaCollection xsc = new XmlSchemaCollection();
                 
                 // Plug in the selected woden URI Resolver
-                xsc.setSchemaResolver(new SchemaResolverAdapter(getURIResolver()));   
+                xsc.setSchemaResolver(new DOMSchemaResolverAdapter(getURIResolver(), contextElement));   
                 
                 schemaDef = xsc.read(schemaEl, baseLoc);
                 fImportedSchemas.put(schemaURL, schemaDef);

Modified: incubator/woden/trunk/java/src/org/apache/woden/internal/OMWSDLReader.java
URL: http://svn.apache.org/viewvc/incubator/woden/trunk/java/src/org/apache/woden/internal/OMWSDLReader.java?view=diff&rev=499639&r1=499638&r2=499639
==============================================================================
--- incubator/woden/trunk/java/src/org/apache/woden/internal/OMWSDLReader.java (original)
+++ incubator/woden/trunk/java/src/org/apache/woden/internal/OMWSDLReader.java Wed Jan 24 17:40:07 2007
@@ -143,7 +143,6 @@
         //Now try to retrieve the schema import using schemaLocation
 
         OMElement importedSchemaDoc = null;
-        OMElement schemaEl = null;
         URI contextURI = null;
         String schemaLoc = null;
         URL url = null;
@@ -231,7 +230,7 @@
                 XmlSchemaCollection xsc = new XmlSchemaCollection();
                 
                 // Plug in the selected woden URI Resolver
-                xsc.setSchemaResolver(new SchemaResolverAdapter(getURIResolver()));
+                xsc.setSchemaResolver(new SchemaResolverAdapter(getURIResolver(), importEl));
                 
                 schemaDef = xsc.read(schemaSource, null);
                 fImportedSchemas.put(schemaURL, schemaDef);
@@ -282,7 +281,7 @@
             xsc.setNamespaceContext(namespaces);
             
             // Plug in the selected woden URI Resolver
-            xsc.setSchemaResolver(new SchemaResolverAdapter(getURIResolver()));
+            xsc.setSchemaResolver(new SchemaResolverAdapter(getURIResolver(), schemaElement));
             
             schemaDef = xsc.read(schemaSource, null);
         }

Added: incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/DOMSchemaResolverAdapter.java
URL: http://svn.apache.org/viewvc/incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/DOMSchemaResolverAdapter.java?view=auto&rev=499639
==============================================================================
--- incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/DOMSchemaResolverAdapter.java (added)
+++ incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/DOMSchemaResolverAdapter.java Wed Jan 24 17:40:07 2007
@@ -0,0 +1,85 @@
+/**
+ * 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.woden.internal.resolver;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.woden.XMLElement;
+import org.apache.woden.resolver.URIResolver;
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.InputSource;
+
+/**
+ * Class that adds DOM specific behaviour to the SchemaResolverAdapter class.
+ * 
+ * TODO consider some approach other than inheritance as part of a broader consideration
+ * of resolving imports and fragids.
+ * 
+ * @author John Kaputin (jkaputin@apache.org)
+ *
+ */
+
+public class DOMSchemaResolverAdapter extends SchemaResolverAdapter {
+
+    public DOMSchemaResolverAdapter(URIResolver actualResolver, XMLElement schemaElement) {
+        super(actualResolver, schemaElement);
+    }
+    
+    protected InputStream resolveFragId(String fragId) {
+        Element contextEl = (Element)fContextElement.getSource();
+        Document doc = contextEl.getOwnerDocument();
+        String id = fragId.substring(1);
+        Element schemaEl = doc.getElementById(id);
+        
+        String localName = schemaEl.getLocalName();
+        if(!localName.equals("schema")) {
+            //the fragId does not point to a schema element
+            return null;
+        }
+        
+        String prefix = schemaEl.getPrefix();
+        if(prefix != null) {
+            //check if we need to add a schema NS declaration
+            String nsUri = schemaEl.getNamespaceURI();
+            String schemaNSDecl = "xmlns:" + prefix;
+            boolean isSchemaNSDeclared = schemaEl.hasAttribute(schemaNSDecl);
+            if(!isSchemaNSDeclared) {
+                schemaEl.setAttribute(schemaNSDecl, nsUri);
+            }
+        }
+        
+        //TODO need to check for other prefixes requiring NS decls to be added to the schema element
+        
+        OutputFormat format = new OutputFormat(doc);
+        ByteArrayOutputStream oStream = new ByteArrayOutputStream();
+        XMLSerializer serializer = new XMLSerializer(oStream, format);
+        try {
+            serializer.serialize(schemaEl);
+        } catch (IOException e) {
+            // TODO this conforms to parent, but needs an error message via ErrorReporter and maybe it should be handled differently?
+            throw new RuntimeException(e);
+        }
+        ByteArrayInputStream iStream = new ByteArrayInputStream(oStream.toByteArray());
+        return iStream;
+    }
+}

Modified: incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/SchemaResolverAdapter.java
URL: http://svn.apache.org/viewvc/incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/SchemaResolverAdapter.java?view=diff&rev=499639&r1=499638&r2=499639
==============================================================================
--- incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/SchemaResolverAdapter.java (original)
+++ incubator/woden/trunk/java/src/org/apache/woden/internal/resolver/SchemaResolverAdapter.java Wed Jan 24 17:40:07 2007
@@ -17,9 +17,11 @@
 package org.apache.woden.internal.resolver;
 
 import java.io.File;
+import java.io.InputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
 
+import org.apache.woden.XMLElement;
 import org.xml.sax.InputSource;
 
 /**
@@ -32,9 +34,13 @@
 public class SchemaResolverAdapter implements org.apache.ws.commons.schema.resolver.URIResolver {
 	
 	private org.apache.woden.resolver.URIResolver fActualResolver;
+    protected XMLElement fContextElement;
 	
-	public SchemaResolverAdapter(org.apache.woden.resolver.URIResolver actualResolver) {
+	public SchemaResolverAdapter(org.apache.woden.resolver.URIResolver actualResolver, 
+            XMLElement contextElement) {
+        
 		fActualResolver = actualResolver;
+        fContextElement = contextElement;
 	}
 	
 	/**
@@ -101,12 +107,33 @@
 		{
 			throw new RuntimeException(e);
 		}
+        
+        InputSource iSource = new InputSource(resolved != null ? resolved.toString() : uri.toString());
+        
+        //Check if the uri ends in a fragid, if so include the schema element it 
+        //identifies in the input source.
+        String systemId = iSource.getSystemId();
+        String fragId = null;
+        int i = systemId.indexOf("#");
+        if(i > -1) {
+            fragId = systemId.substring(i);
+            iSource.setByteStream(resolveFragId(fragId));
+        }
 		
-		return new InputSource(resolved != null? resolved.toString() : uri.toString());
-		   
-		   
-	   }
+		return iSource;
+	}
 
+    /*
+     * Helper method to resolve fragid to a schema element, represented as a byte stream.
+     * This will be XML parser-specific, so the default behaviour here is to do nothing
+     * and implementations should override this method if necessary.
+     * 
+     * TODO if *both* DOM and OM impls need to do something, make this method an abstract declaration.
+     */
+    protected InputStream resolveFragId(String fradId) {
+        return null;
+    }
+    
 	/* based on ws commons DefaultURIResolver.resolveEntity(...)
 	 * 
 	 */



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