Repository: cxf Updated Branches: refs/heads/3.0.x-fixes ecb9139d1 -> 58ceaafe4
[CXF-6621] integration of changes from cxf-2.7.x-fixes Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/47fe9b86 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/47fe9b86 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/47fe9b86 Branch: refs/heads/3.0.x-fixes Commit: 47fe9b86df8644447010af31023e7d528cf8859a Parents: edcfc3b Author: rsearls <rsea...@redhat.com> Authored: Mon Oct 26 09:33:47 2015 -0400 Committer: Alessio Soldano <asold...@redhat.com> Committed: Mon Oct 26 18:21:10 2015 +0100 ---------------------------------------------------------------------- .../apache/cxf/common/util/URIParserUtil.java | 18 +- .../org/apache/cxf/frontend/WSDLGetUtils.java | 217 +++++++------------ .../cxf/systest/jaxws/OASISCatalogTest.java | 131 +++++++---- .../systest/schemaimport/SchemaImportTest.java | 4 +- .../main/resources/META-INF/jax-ws-catalog.xml | 3 + .../others/hello_world_messages_catalog.wsdl | 25 ++- .../others/hello_world_wsdl_import_catalog.wsdl | 2 + .../resources/wsdl/schemas/another-schema.xsd | 29 +++ .../wsdl/schemas/d/another-included.xsd | 29 +++ .../wsdl/schemas/d/d/another-included.xsd | 27 +++ .../resources/wsdl/schemas/d/d/included.xsd | 27 +++ .../main/resources/wsdl/schemas/d/included.xsd | 29 +++ .../src/main/resources/wsdl/schemas/schema.xsd | 29 +++ .../cxf/tools/util/URIParserUtilTest.java | 25 +++ 14 files changed, 404 insertions(+), 191 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/core/src/main/java/org/apache/cxf/common/util/URIParserUtil.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/cxf/common/util/URIParserUtil.java b/core/src/main/java/org/apache/cxf/common/util/URIParserUtil.java index 98afa1f..158765c 100644 --- a/core/src/main/java/org/apache/cxf/common/util/URIParserUtil.java +++ b/core/src/main/java/org/apache/cxf/common/util/URIParserUtil.java @@ -26,13 +26,23 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.StringTokenizer; import org.apache.cxf.common.classloader.ClassLoaderUtils; -import org.apache.cxf.helpers.JavaUtils; public final class URIParserUtil { + private static final Set<String> KEYWORDS = new HashSet<String>(Arrays + .asList(new String[] {"abstract", "boolean", "break", "byte", "case", "catch", "char", "class", + "const", "continue", "default", "do", "double", "else", "extends", "final", + "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", + "int", "interface", "long", "native", "new", "package", "private", "protected", + "public", "return", "short", "static", "strictfp", "super", "switch", + "synchronized", "this", "throw", "throws", "transient", "try", "void", + "volatile", "while", "true", "false", "null", "assert", "enum"})); private static final String EXCLUDED_CHARS = "<>\"{}|\\^`"; private static final String HEX_DIGITS = "0123456789abcdef"; @@ -213,7 +223,7 @@ public final class URIParserUtil { } public static boolean containsReservedKeywords(String token) { - return JavaUtils.isJavaKeyword(token); + return KEYWORDS.contains(token); } public static String escapeChars(String s) { @@ -303,8 +313,8 @@ public final class URIParserUtil { * doing but is not actually doing when URI roots do not fully match. * See http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6226081 * - * @param base The base URI - * @param toBeRelativized The URI to be realivized + * @param baseURI The base URI + * @param toBeRelativizedURI The URI to be realivized * @return The string value of the URI you'd expect to get as result * of calling baseURI.relativize(toBeRelativizedURI). * null is returned if the parameters are null or are not http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java ---------------------------------------------------------------------- diff --git a/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java b/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java index f114e47..3202bab 100644 --- a/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java +++ b/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java @@ -60,6 +60,7 @@ import org.apache.cxf.catalog.OASISCatalogManagerHelper; import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.common.util.URIParserUtil; +import org.apache.cxf.common.util.UrlUtils; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.message.Message; @@ -71,6 +72,7 @@ import org.apache.cxf.wsdl.WSDLManager; import org.apache.cxf.wsdl11.ResourceManagerWSDLLocator; import org.apache.cxf.wsdl11.ServiceWSDLBuilder; + /** * */ @@ -356,7 +358,8 @@ public class WSDLGetUtils { Map<String, Definition> done, Map<String, SchemaReference> doneSchemas, String base, - String docBase) { + String docBase, + String parentResolvedLocation) { OASISCatalogManager catalogs = OASISCatalogManager.getCatalogManager(bus); Collection<List<?>> imports = CastUtils.cast((Collection<?>)def.getImports().values()); @@ -364,7 +367,7 @@ public class WSDLGetUtils { List<Import> impLst = CastUtils.cast(lst); for (Import imp : impLst) { String start = imp.getLocationURI(); - String decodedStart = null; + String decodedStart; // Always use the URL decoded version to ensure that we have a // canonical representation of the import URL for lookup. @@ -391,13 +394,20 @@ public class WSDLGetUtils { //ignore } if (done.put(decodedStart, imp.getDefinition()) == null) { - updateDefinition(bus, imp.getDefinition(), done, doneSchemas, base, start); + if (imp.getDefinition() != null && imp.getDefinition().getDocumentBaseURI() != null) { + done.put(imp.getDefinition().getDocumentBaseURI(), imp.getDefinition()); + } + updateDefinition(bus, imp.getDefinition(), done, doneSchemas, base, start, null); } } } else { if (done.put(decodedStart, imp.getDefinition()) == null) { done.put(resolvedSchemaLocation, imp.getDefinition()); - updateDefinition(bus, imp.getDefinition(), done, doneSchemas, base, start); + if (imp.getDefinition() != null && imp.getDefinition().getDocumentBaseURI() != null) { + done.put(imp.getDefinition().getDocumentBaseURI(), imp.getDefinition()); + } + updateDefinition(bus, imp.getDefinition(), done, doneSchemas, base, start, + resolvedSchemaLocation); } } } @@ -412,7 +422,7 @@ public class WSDLGetUtils { for (ExtensibilityElement el : CastUtils.cast(types.getExtensibilityElements(), ExtensibilityElement.class)) { if (el instanceof Schema) { - updateSchemaImports(bus, (Schema)el, docBase, doneSchemas, base); + updateSchemaImports(bus, (Schema)el, docBase, doneSchemas, base, parentResolvedLocation); } } } @@ -469,134 +479,84 @@ public class WSDLGetUtils { Schema schema, String docBase, Map<String, SchemaReference> doneSchemas, - String base) { - OASISCatalogManager catalogs = OASISCatalogManager.getCatalogManager(bus); + String base, + String parentResolved) { Collection<List<?>> imports = CastUtils.cast((Collection<?>)schema.getImports().values()); for (List<?> lst : imports) { List<SchemaImport> impLst = CastUtils.cast(lst); for (SchemaImport imp : impLst) { - String start = findSchemaLocation(doneSchemas, imp, docBase); - - if (start != null) { - String decodedStart = null; - // Always use the URL decoded version to ensure that we have a - // canonical representation of the import URL for lookup. - try { - decodedStart = URLDecoder.decode(start, "utf-8"); - } catch (UnsupportedEncodingException e) { - throw new WSDLQueryException( - new org.apache.cxf.common.i18n.Message("COULD_NOT_PROVIDE_WSDL", - LOG, - start), e); - } - - if (!doneSchemas.containsKey(decodedStart)) { - String resolvedSchemaLocation = resolveWithCatalogs(catalogs, start, base); - if (resolvedSchemaLocation == null) { - resolvedSchemaLocation = resolveWithCatalogs(catalogs, imp.getSchemaLocationURI(), base); - } - if (resolvedSchemaLocation == null) { - try { - //check to see if it's already in a URL format. If so, leave it. - new URL(start); - } catch (MalformedURLException e) { - if (doneSchemas.put(decodedStart, imp) == null) { - putResolvedSchemaLocationIfRelative(doneSchemas, decodedStart, imp); - updateSchemaImports(bus, imp.getReferencedSchema(), start, doneSchemas, base); - } - } - } else { - if (doneSchemas.put(decodedStart, imp) == null) { - doneSchemas.put(resolvedSchemaLocation, imp); - String p = getAndSaveRelativeSchemaLocationIfCatalogResolved(doneSchemas, - resolvedSchemaLocation, - schema, - imp); - updateSchemaImports(bus, imp.getReferencedSchema(), p, doneSchemas, base); - } - } - } - } + processSchemaReference(imp, bus, schema, docBase, doneSchemas, base, parentResolved); } } List<SchemaReference> includes = CastUtils.cast(schema.getIncludes()); for (SchemaReference included : includes) { - String start = findSchemaLocation(doneSchemas, included, docBase); - - if (start != null) { - String decodedStart = null; - // Always use the URL decoded version to ensure that we have a - // canonical representation of the import URL for lookup. - try { - decodedStart = URLDecoder.decode(start, "utf-8"); - } catch (UnsupportedEncodingException e) { - throw new WSDLQueryException( - new org.apache.cxf.common.i18n.Message("COULD_NOT_PROVIDE_WSDL", - LOG, - start), e); - } - - String resolvedSchemaLocation = resolveWithCatalogs(catalogs, start, base); - if (resolvedSchemaLocation == null) { - if (!doneSchemas.containsKey(decodedStart)) { - try { - //check to see if it's aleady in a URL format. If so, leave it. - new URL(start); - } catch (MalformedURLException e) { - if (doneSchemas.put(decodedStart, included) == null) { - putResolvedSchemaLocationIfRelative(doneSchemas, decodedStart, included); - updateSchemaImports(bus, included.getReferencedSchema(), start, doneSchemas, base); - } - } - } - } else if (!doneSchemas.containsKey(decodedStart) - || !doneSchemas.containsKey(resolvedSchemaLocation)) { - doneSchemas.put(decodedStart, included); - doneSchemas.put(resolvedSchemaLocation, included); - String p = getAndSaveRelativeSchemaLocationIfCatalogResolved(doneSchemas, - resolvedSchemaLocation, - schema, - included); - updateSchemaImports(bus, included.getReferencedSchema(), p, doneSchemas, base); - } - } + processSchemaReference(included, bus, schema, docBase, doneSchemas, base, parentResolved); } List<SchemaReference> redefines = CastUtils.cast(schema.getRedefines()); for (SchemaReference included : redefines) { - String start = findSchemaLocation(doneSchemas, included, docBase); + processSchemaReference(included, bus, schema, docBase, doneSchemas, base, parentResolved); + } + } - if (start != null) { - String decodedStart = null; - // Always use the URL decoded version to ensure that we have a - // canonical representation of the import URL for lookup. - try { - decodedStart = URLDecoder.decode(start, "utf-8"); - } catch (UnsupportedEncodingException e) { - throw new WSDLQueryException( + private void processSchemaReference(SchemaReference schemaReference, + Bus bus, + Schema schema, + String docBase, + Map<String, SchemaReference> doneSchemas, + String base, + String parentResolved) { + OASISCatalogManager catalogs = OASISCatalogManager.getCatalogManager(bus); + String start = findSchemaLocation(doneSchemas, schemaReference, docBase); + String origLocation = schemaReference.getSchemaLocationURI(); + + if (start != null) { + String decodedStart; + String decodedOrigLocation; + // Always use the URL decoded version to ensure that we have a + // canonical representation of the import URL for lookup. + try { + decodedStart = URLDecoder.decode(start, "utf-8"); + decodedOrigLocation = URLDecoder.decode(origLocation, "utf-8"); + } catch (UnsupportedEncodingException e) { + throw new WSDLQueryException( new org.apache.cxf.common.i18n.Message("COULD_NOT_PROVIDE_WSDL", - LOG, - start), e); - } + LOG, + start), e); + } + if (!doneSchemas.containsKey(decodedStart)) { String resolvedSchemaLocation = resolveWithCatalogs(catalogs, start, base); if (resolvedSchemaLocation == null) { - if (!doneSchemas.containsKey(decodedStart)) { + resolvedSchemaLocation = + resolveWithCatalogs(catalogs, schemaReference.getSchemaLocationURI(), base); + } + if (resolvedSchemaLocation == null) { + try { + //check to see if it's already in a URL format. If so, leave it. + new URL(start); + } catch (MalformedURLException e) { + doneSchemas.put(decodedStart, schemaReference); + doneSchemas.put(schemaReference.getReferencedSchema().getDocumentBaseURI(), schemaReference); try { - //check to see if it's aleady in a URL format. If so, leave it. - new URL(start); - } catch (MalformedURLException e) { - if (doneSchemas.put(decodedStart, included) == null) { - putResolvedSchemaLocationIfRelative(doneSchemas, decodedStart, included); - updateSchemaImports(bus, included.getReferencedSchema(), docBase, doneSchemas, base); + if (!(new URI(origLocation).isAbsolute()) && parentResolved != null) { + resolvedSchemaLocation = resolveRelativePath(parentResolved, decodedOrigLocation); + doneSchemas.put(resolvedSchemaLocation, schemaReference); } + } catch (URISyntaxException e1) { + // ignore } + updateSchemaImports(bus, schemaReference.getReferencedSchema(), start, doneSchemas, base, + resolvedSchemaLocation); } - } else if (!doneSchemas.containsKey(decodedStart) - || !doneSchemas.containsKey(resolvedSchemaLocation)) { - doneSchemas.put(decodedStart, included); - doneSchemas.put(resolvedSchemaLocation, included); - updateSchemaImports(bus, included.getReferencedSchema(), docBase, doneSchemas, base); + } else if (doneSchemas.put(decodedStart, schemaReference) == null) { + doneSchemas.put(resolvedSchemaLocation, schemaReference); + String p = getAndSaveRelativeSchemaLocationIfCatalogResolved(doneSchemas, + resolvedSchemaLocation, + schema, + schemaReference); + updateSchemaImports(bus, schemaReference.getReferencedSchema(), p, doneSchemas, base, + resolvedSchemaLocation); } } } @@ -607,12 +567,12 @@ public class WSDLGetUtils { * 1) get a valid relative location to use for recursion into the imported schema * 2) add an entry to the doneSchemas map using such a valid relative location, as that's * what will be used later for import links - * + * * The valid relative location for the imported schema is computed by first obtaining the * relative uri that maps the importing schema resolved location into the imported schema * resolved location, then such value is resolved on top of the valid relative location * that's saved in the doneSchemas map for the importing schema. - * + * * @param doneSchemas * @param resolvedSchemaLocation * @param currentSchema @@ -646,25 +606,6 @@ public class WSDLGetUtils { return path; } - /** - * If given decodedStart is relative path, resolves a real location of given schema and puts it into schema map. - * - * @param doneSchemas schema map - * @param decodedStart path referencing schema - * @param schemaReference referenced schema - */ - private void putResolvedSchemaLocationIfRelative(Map<String, SchemaReference> doneSchemas, String decodedStart, - SchemaReference schemaReference) { - try { - if (!(new URI(decodedStart).isAbsolute())) { - String resolved = schemaReference.getReferencedSchema().getDocumentBaseURI(); - doneSchemas.put(resolved, schemaReference); - } - } catch (URISyntaxException ex) { - // ignore - } - } - private String findSchemaLocation(Map<String, SchemaReference> doneSchemas, SchemaReference imp, String docBase) { @@ -691,6 +632,12 @@ public class WSDLGetUtils { return schemaLocationURI; } + private String resolveRelativePath(String parentUri, String relativePath) { + // can not use `new URI(uri).resolve(path)`, because that doesn't work with "jar:file:x!y" kind of URIs + String base = UrlUtils.getStem(parentUri); + return base + '/' + relativePath; + } + /** * Write the contents of a wsdl Definition object to a file. * @@ -710,7 +657,7 @@ public class WSDLGetUtils { String base, EndpointInfo endpointInfo) throws WSDLException { - Document doc = null; + Document doc; Bus bus = message.getExchange().getBus(); Definition def = lookupDefinition(bus, mp, wsdl, base); String epurl = base; @@ -818,7 +765,7 @@ public class WSDLGetUtils { Definition def = builder.build(new HashMap<String, SchemaInfo>()); mp.put("", def); - updateDefinition(bus, def, mp, smp, base, ""); + updateDefinition(bus, def, mp, smp, base, "", ""); } } http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/OASISCatalogTest.java ---------------------------------------------------------------------- diff --git a/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/OASISCatalogTest.java b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/OASISCatalogTest.java index c826668..0be307f 100644 --- a/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/OASISCatalogTest.java +++ b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/OASISCatalogTest.java @@ -63,29 +63,31 @@ public class OASISCatalogTest extends Assert { Endpoint ep = Endpoint.publish("http://localhost:" + PORT + "/SoapContext/SoapPort", new GreeterImpl()); - String result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" - + "xsd=hello_world_schema2.xsd"); - assertTrue(result, result.contains("xsd=hello_world_schema.xsd")); - assertTrue(result, result.contains("xsd=hello_world_schema3.xsd")); - assertTrue(result, result.contains("xsd=d/hello_world_schema4.xsd")); - - result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" - + "xsd=hello_world_schema3.xsd"); - assertTrue(result.length() > 0); - - result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" - + "xsd=d/hello_world_schema4.xsd"); - assertTrue(result, result.contains("xsd=d/d/hello_world_schema4.xsd")); - - result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort" - + "?xsd=hello_world_schema.xsd"); - assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/hello_world_schema2.xsd")); - - result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort" - + "?wsdl=hello_world_messages_catalog.wsdl"); - assertTrue(result, result.contains("xsd=hello_world_schema.xsd")); - - ep.stop(); + try { + String result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=hello_world_schema2.xsd"); + assertTrue(result, result.contains("xsd=hello_world_schema.xsd")); + assertTrue(result, result.contains("xsd=hello_world_schema3.xsd")); + assertTrue(result, result.contains("xsd=d/hello_world_schema4.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=hello_world_schema3.xsd"); + assertTrue(result.length() > 0); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=d/hello_world_schema4.xsd"); + assertTrue(result, result.contains("xsd=d/d/hello_world_schema4.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort" + + "?xsd=hello_world_schema.xsd"); + assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/hello_world_schema2.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort" + + "?wsdl=hello_world_messages_catalog.wsdl"); + assertTrue(result, result.contains("xsd=hello_world_schema.xsd")); + } finally { + ep.stop(); + } } /** @@ -101,30 +103,65 @@ public class OASISCatalogTest extends Assert { public void testWSDLPublishWithCatalogsRewritePaths() { Endpoint ep = Endpoint.publish("http://localhost:" + PORT + "/SoapContext/SoapPort", new GreeterImpl()); - - String result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" - + "xsd=http://apache.org/hello_world/types2/hello_world_schema2.xsd"); - assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/hello_world_schema.xsd")); - assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/hello_world_schema3.xsd")); - assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/d/hello_world_schema4.xsd")); - - result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" - + "xsd=http://apache.org/hello_world/types2/hello_world_schema.xsd"); - assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/hello_world_schema2.xsd")); - - result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" - + "xsd=http://apache.org/hello_world/types2/hello_world_schema3.xsd"); - assertTrue(result.length() > 0); - - result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" - + "xsd=http://apache.org/hello_world/types2/d/hello_world_schema4.xsd"); - assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/d/d/hello_world_schema4.xsd")); - - result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" - + "xsd=http://apache.org/hello_world/types2/d/d/hello_world_schema4.xsd"); - assertTrue(result.length() > 0); - - ep.stop(); + try { + // schemas in the same directory as WSDL + + String result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/types2/hello_world_schema2.xsd"); + assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/hello_world_schema.xsd")); + assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/hello_world_schema3.xsd")); + assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/d/hello_world_schema4.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/types2/hello_world_schema.xsd"); + assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/hello_world_schema2.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/types2/hello_world_schema3.xsd"); + assertTrue(result.length() > 0); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/types2/d/hello_world_schema4.xsd"); + assertTrue(result, result.contains("xsd=http://apache.org/hello_world/types2/d/d/hello_world_schema4.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/types2/d/d/hello_world_schema4.xsd"); + assertFalse(result.contains("schemaLocation")); + + // schemas in separate directory which is not subdirectory of WSDL dir + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "wsdl=http://apache.org/hello_world/types2/hello_world_messages_catalog.wsdl"); + assertTrue(result, result.contains("xsd=http://apache.org/hello_world/schemas-in-separate-dir/schema.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/schemas-in-separate-dir/schema.xsd"); + assertTrue(result, + result.contains("xsd=http://apache.org/hello_world/schemas-in-separate-dir/d/included.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/schemas-in-separate-dir/d/included.xsd"); + assertTrue(result, + result.contains("xsd=http://apache.org/hello_world/schemas-in-separate-dir/d/d/included.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/schemas-in-separate-dir/d/d/included.xsd"); + assertFalse(result, result.contains("schemaLocation")); + + // rewrite rule that doesn't begin with 'classpath:' but contains only the path + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/schemas-in-separate-dir-non-cp/another-schema.xsd"); + assertTrue(result, result.contains("xsd=http://apache.org/hello_world/schemas-in-separate-dir-non-cp/d/" + + "another-included.xsd")); + + result = readUrl("http://localhost:" + PORT + "/SoapContext/SoapPort?" + + "xsd=http://apache.org/hello_world/schemas-in-separate-dir-non-cp/d/another-included.xsd"); + assertTrue(result, result.contains("xsd=http://apache.org/hello_world/schemas-in-separate-dir-non-cp/d/d/" + + "another-included.xsd")); + } finally { + ep.stop(); + } } @Test http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/systests/uncategorized/src/test/java/org/apache/cxf/systest/schemaimport/SchemaImportTest.java ---------------------------------------------------------------------- diff --git a/systests/uncategorized/src/test/java/org/apache/cxf/systest/schemaimport/SchemaImportTest.java b/systests/uncategorized/src/test/java/org/apache/cxf/systest/schemaimport/SchemaImportTest.java index 7755f19..df458c2 100644 --- a/systests/uncategorized/src/test/java/org/apache/cxf/systest/schemaimport/SchemaImportTest.java +++ b/systests/uncategorized/src/test/java/org/apache/cxf/systest/schemaimport/SchemaImportTest.java @@ -57,9 +57,9 @@ public class SchemaImportTest extends AbstractBusClientServerTestBase { @Test public void testImportSchema2() throws Exception { String schemaURL = "http://localhost:" + PORT + "/schemaimport/sayHi2" - + "?xsd=../sayhi/sayhi/sayhi-schema1.xsd"; + + "?xsd=../sayhi/sayhi/sayhi-schema1.xsd"; URL url = new URL(schemaURL); - try { + try { InputStream ins = url.openStream(); String output = IOUtils.toString(ins); assertTrue(output.indexOf("sayHiArray") > -1); http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/testutils/src/main/resources/META-INF/jax-ws-catalog.xml ---------------------------------------------------------------------- diff --git a/testutils/src/main/resources/META-INF/jax-ws-catalog.xml b/testutils/src/main/resources/META-INF/jax-ws-catalog.xml index 28d5907..3b1f3cf 100644 --- a/testutils/src/main/resources/META-INF/jax-ws-catalog.xml +++ b/testutils/src/main/resources/META-INF/jax-ws-catalog.xml @@ -19,7 +19,10 @@ --> <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="system"> <rewriteSystem systemIdStartString="http://apache.org/hello_world/types2/" rewritePrefix="/wsdl/others/"/> + <rewriteSystem systemIdStartString="http://apache.org/hello_world/schemas-in-separate-dir/" rewritePrefix="classpath:/wsdl/schemas/"/> + <rewriteSystem systemIdStartString="http://apache.org/hello_world/schemas-in-separate-dir-non-cp/" rewritePrefix="/wsdl/schemas/"/> <rewriteSystem systemIdStartString="doesnotexist" rewritePrefix="../wsdl/catalog"/> <rewriteSystem systemIdStartString="nopath" rewritePrefix="../wsdl"/> + <rewriteSystem systemIdStartString="testutils" rewritePrefix="classpath:/wsdl"/> </catalog> http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/testutils/src/main/resources/wsdl/others/hello_world_messages_catalog.wsdl ---------------------------------------------------------------------- diff --git a/testutils/src/main/resources/wsdl/others/hello_world_messages_catalog.wsdl b/testutils/src/main/resources/wsdl/others/hello_world_messages_catalog.wsdl index 1597ef2..dce23a6 100644 --- a/testutils/src/main/resources/wsdl/others/hello_world_messages_catalog.wsdl +++ b/testutils/src/main/resources/wsdl/others/hello_world_messages_catalog.wsdl @@ -17,10 +17,29 @@ specific language governing permissions and limitations under the License. --> -<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://apache.org/hello_world/messages" xmlns:x1="http://apache.org/hello_world/types" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloWorld" targetNamespace="http://apache.org/hello_world/messages"> +<wsdl:definitions name="HelloWorld" + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://apache.org/hello_world/messages" + xmlns:x1="http://apache.org/hello_world/types" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://apache.org/hello_world/messages"> <wsdl:types> - <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://apache.org/hello_world/types/schema" elementFormDefault="qualified"> - <xsd:import namespace="http://apache.org/hello_world/types" schemaLocation="hello_world_schema.xsd"/> + <schema targetNamespace="http://apache.org/hello_world/types/schema" + xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> + <xsd:import namespace="http://apache.org/hello_world/types" + schemaLocation="hello_world_schema.xsd"/> + </schema> + <schema targetNamespace="http://apache.org/hello_world/schemas-in-separate-dir" + xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> + <xsd:import namespace="http://apache.org/hello_world/schemas-in-separate-dir" + schemaLocation="http://apache.org/hello_world/schemas-in-separate-dir/schema.xsd"/> + </schema> + <schema targetNamespace="http://apache.org/hello_world/schemas-in-separate-dir" + xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> + <xsd:import namespace="http://apache.org/hello_world/schemas-in-separate-dir" + schemaLocation="http://apache.org/hello_world/schemas-in-separate-dir-non-cp/another-schema.xsd"/> </schema> </wsdl:types> <wsdl:message name="sayHiRequest"> http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/testutils/src/main/resources/wsdl/others/hello_world_wsdl_import_catalog.wsdl ---------------------------------------------------------------------- diff --git a/testutils/src/main/resources/wsdl/others/hello_world_wsdl_import_catalog.wsdl b/testutils/src/main/resources/wsdl/others/hello_world_wsdl_import_catalog.wsdl index 23a03c9..12ed895 100644 --- a/testutils/src/main/resources/wsdl/others/hello_world_wsdl_import_catalog.wsdl +++ b/testutils/src/main/resources/wsdl/others/hello_world_wsdl_import_catalog.wsdl @@ -24,10 +24,12 @@ <wsdl:input message="x1:sayHiRequest"/> <wsdl:output message="x1:sayHiResponse"/> </wsdl:operation> + <wsdl:operation name="greetMe"> <wsdl:input message="x1:greetMeRequest"/> <wsdl:output message="x1:greetMeResponse"/> </wsdl:operation> + <wsdl:operation name="pingMe"> <wsdl:input message="x1:pingMeRequest"/> <wsdl:output message="x1:pingMeResponse"/> http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/testutils/src/main/resources/wsdl/schemas/another-schema.xsd ---------------------------------------------------------------------- diff --git a/testutils/src/main/resources/wsdl/schemas/another-schema.xsd b/testutils/src/main/resources/wsdl/schemas/another-schema.xsd new file mode 100644 index 0000000..1fa48f0 --- /dev/null +++ b/testutils/src/main/resources/wsdl/schemas/another-schema.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<!-- + 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. +--> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://apache.org/hello_world/schemas-in-separate-dir" + elementFormDefault="qualified"> + + <xsd:import schemaLocation="d/another-included.xsd" namespace="http://apache.org/hello_world/schemas-in-separate-dir"/> + + <xsd:element name="sayHi5"> + <xsd:complexType/> + </xsd:element> +</xsd:schema> http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/testutils/src/main/resources/wsdl/schemas/d/another-included.xsd ---------------------------------------------------------------------- diff --git a/testutils/src/main/resources/wsdl/schemas/d/another-included.xsd b/testutils/src/main/resources/wsdl/schemas/d/another-included.xsd new file mode 100644 index 0000000..f262555 --- /dev/null +++ b/testutils/src/main/resources/wsdl/schemas/d/another-included.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<!-- + 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. +--> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://apache.org/hello_world/schemas-in-separate-dir" + elementFormDefault="qualified"> + + <xsd:import schemaLocation="d/another-included.xsd" namespace="http://apache.org/hello_world/schemas-in-separate-dir"/> + + <xsd:element name="sayHi6"> + <xsd:complexType/> + </xsd:element> +</xsd:schema> http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/testutils/src/main/resources/wsdl/schemas/d/d/another-included.xsd ---------------------------------------------------------------------- diff --git a/testutils/src/main/resources/wsdl/schemas/d/d/another-included.xsd b/testutils/src/main/resources/wsdl/schemas/d/d/another-included.xsd new file mode 100644 index 0000000..7b5a3c6 --- /dev/null +++ b/testutils/src/main/resources/wsdl/schemas/d/d/another-included.xsd @@ -0,0 +1,27 @@ +<?xml version="1.0"?> +<!-- + 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. +--> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://apache.org/hello_world/schemas-in-separate-dir" + elementFormDefault="qualified"> + + <xsd:element name="sayHi6"> + <xsd:complexType/> + </xsd:element> +</xsd:schema> http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/testutils/src/main/resources/wsdl/schemas/d/d/included.xsd ---------------------------------------------------------------------- diff --git a/testutils/src/main/resources/wsdl/schemas/d/d/included.xsd b/testutils/src/main/resources/wsdl/schemas/d/d/included.xsd new file mode 100644 index 0000000..b825296 --- /dev/null +++ b/testutils/src/main/resources/wsdl/schemas/d/d/included.xsd @@ -0,0 +1,27 @@ +<?xml version="1.0"?> +<!-- + 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. +--> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://apache.org/hello_world/schemas-in-separate-dir" + elementFormDefault="qualified"> + + <xsd:element name="sayHi4"> + <xsd:complexType/> + </xsd:element> +</xsd:schema> http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/testutils/src/main/resources/wsdl/schemas/d/included.xsd ---------------------------------------------------------------------- diff --git a/testutils/src/main/resources/wsdl/schemas/d/included.xsd b/testutils/src/main/resources/wsdl/schemas/d/included.xsd new file mode 100644 index 0000000..2b306cc --- /dev/null +++ b/testutils/src/main/resources/wsdl/schemas/d/included.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<!-- + 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. +--> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://apache.org/hello_world/schemas-in-separate-dir" + elementFormDefault="qualified"> + + <xsd:import schemaLocation="d/included.xsd" namespace="http://apache.org/hello_world/schemas-in-separate-dir"/> + + <xsd:element name="sayHi3"> + <xsd:complexType/> + </xsd:element> +</xsd:schema> http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/testutils/src/main/resources/wsdl/schemas/schema.xsd ---------------------------------------------------------------------- diff --git a/testutils/src/main/resources/wsdl/schemas/schema.xsd b/testutils/src/main/resources/wsdl/schemas/schema.xsd new file mode 100644 index 0000000..325b231 --- /dev/null +++ b/testutils/src/main/resources/wsdl/schemas/schema.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<!-- + 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. +--> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://apache.org/hello_world/schemas-in-separate-dir" + elementFormDefault="qualified"> + + <xsd:import schemaLocation="d/included.xsd" namespace="http://apache.org/hello_world/schemas-in-separate-dir"/> + + <xsd:element name="sayHi2"> + <xsd:complexType/> + </xsd:element> +</xsd:schema> http://git-wip-us.apache.org/repos/asf/cxf/blob/47fe9b86/tools/common/src/test/java/org/apache/cxf/tools/util/URIParserUtilTest.java ---------------------------------------------------------------------- diff --git a/tools/common/src/test/java/org/apache/cxf/tools/util/URIParserUtilTest.java b/tools/common/src/test/java/org/apache/cxf/tools/util/URIParserUtilTest.java index 9bb3642..99a96b1 100644 --- a/tools/common/src/test/java/org/apache/cxf/tools/util/URIParserUtilTest.java +++ b/tools/common/src/test/java/org/apache/cxf/tools/util/URIParserUtilTest.java @@ -19,6 +19,7 @@ package org.apache.cxf.tools.util; +import java.net.URISyntaxException; import java.net.URLDecoder; import org.apache.cxf.common.util.URIParserUtil; @@ -103,4 +104,28 @@ public class URIParserUtilTest extends Assert { String s = URIParserUtil.escapeChars(orig); assertEquals(orig, URLDecoder.decode(s, "UTF-8")); } + + @Test + public void testRelativize() throws URISyntaxException { + assertNull(URIParserUtil.relativize(null, "foo")); + assertNull(URIParserUtil.relativize("foo", null)); + assertEquals("", URIParserUtil.relativize("", "")); + assertEquals("", URIParserUtil.relativize("fds", "")); + assertEquals("../", URIParserUtil.relativize("fds/", "")); + assertEquals("fdsfs", URIParserUtil.relativize("", "fdsfs")); + assertEquals("fdsfs/a", URIParserUtil.relativize("", "fdsfs/a")); + assertEquals("../de", URIParserUtil.relativize("ab/cd", "de")); + assertEquals("../de/fe/gh", URIParserUtil.relativize("ab/cd", "de/fe/gh")); + assertEquals("../../../de/fe/gh", URIParserUtil.relativize("/abc/def/", "de/fe/gh")); + assertNull(URIParserUtil.relativize("file:/c:/abc/def/", "de/fe/gh")); // null as the URI obtained by + // the 2 strings are not both + // absolute or not absolute + assertEquals("pippo2.xsd", URIParserUtil.relativize("/abc/def/pippo1.xsd", "/abc/def/pippo2.xsd")); + assertEquals("../default/pippo2.xsd", + URIParserUtil.relativize("/abc/def/pippo1.xsd", "/abc/default/pippo2.xsd")); + assertEquals("def/pippo2.xsd", URIParserUtil.relativize("/abc/def", "/abc/def/pippo2.xsd")); + assertEquals("hello_world_schema2.xsd", + URIParserUtil.relativize("jar:file:/home/a.jar!/wsdl/others/", + "jar:file:/home/a.jar!/wsdl/others/hello_world_schema2.xsd")); + } }