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