From 69ac34a6c6c3d77d57d6c04cce024a1c7789048e Mon Sep 17 00:00:00 2001 From: Grzegorz Grzybek Date: Wed, 6 Apr 2016 15:04:52 +0200 Subject: [PATCH] [ARIES-1503] Use NamespaceHandler to resolve namespace URI only when it's supported --- blueprint/blueprint-cm/pom.xml | 2 +- .../compendium/cm/CmNamespaceHandler.java | 13 ++++- .../NamespaceHandlerRegistryImpl.java | 52 +++++++++++++------ .../aries/blueprint/NamespaceHandler2.java | 19 +++---- .../spring/BlueprintNamespaceHandler.java | 5 ++ 5 files changed, 64 insertions(+), 27 deletions(-) diff --git a/blueprint/blueprint-cm/pom.xml b/blueprint/blueprint-cm/pom.xml index b5317fb5fc..a9c955be3c 100644 --- a/blueprint/blueprint-cm/pom.xml +++ b/blueprint/blueprint-cm/pom.xml @@ -57,7 +57,7 @@ 1.0.0 1.2.0 - 1.1.0 + 1.5.0-SNAPSHOT 1.0.4 diff --git a/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmNamespaceHandler.java b/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmNamespaceHandler.java index b0392263c8..442366bb6c 100644 --- a/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmNamespaceHandler.java +++ b/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmNamespaceHandler.java @@ -29,6 +29,7 @@ import org.apache.aries.blueprint.ComponentDefinitionRegistry; import org.apache.aries.blueprint.NamespaceHandler; +import org.apache.aries.blueprint.NamespaceHandler2; import org.apache.aries.blueprint.ParserContext; import org.apache.aries.blueprint.ext.PlaceholdersUtils; import org.apache.aries.blueprint.mutable.MutableBeanMetadata; @@ -77,7 +78,7 @@ * * @version $Rev$, $Date$ */ -public class CmNamespaceHandler implements NamespaceHandler { +public class CmNamespaceHandler implements NamespaceHandler2 { public static final String BLUEPRINT_NAMESPACE = "http://www.osgi.org/xmlns/blueprint/v1.0.0"; public static final String BLUEPRINT_CM_NAMESPACE_1_0 = "http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"; @@ -153,6 +154,16 @@ public void setConfigAdmin(ConfigurationAdmin configAdmin) { CmNamespaceHandler.configAdmin = configAdmin; } + public boolean usePsvi() { + return false; + } + + public boolean mayResolve(String namespace) { + return namespace != null + && (namespace.startsWith("http://aries.apache.org/blueprint/xmlns/blueprint-cm") + || namespace.startsWith("http://aries.apache.org/blueprint/xmlns/blueprint-ext")); + } + public URL getSchemaLocation(String namespace) { if (BLUEPRINT_CM_NAMESPACE_1_3.equals(namespace)) { return getClass().getResource("blueprint-cm-1.3.0.xsd"); diff --git a/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java b/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java index 00490bbb4f..0da90c9304 100644 --- a/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java +++ b/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java @@ -51,6 +51,7 @@ import javax.xml.validation.SchemaFactory; import org.apache.aries.blueprint.NamespaceHandler; +import org.apache.aries.blueprint.NamespaceHandler2; import org.apache.aries.blueprint.container.NamespaceHandlerRegistry; import org.apache.aries.blueprint.parser.NamespaceHandlerSet; import org.osgi.framework.Bundle; @@ -416,28 +417,47 @@ public LSInput resolveResource(String type, } } } - for (NamespaceHandler h : handlers.values()) { - URL url = h.getSchemaLocation(namespaceURI); - if (url != null) { - // handling include-relative-path case - if (systemId != null && !systemId.matches("^[a-z][-+.0-9a-z]*:.*")) { - try { - url = new URL(url, systemId); - } catch (Exception e) { - // ignore and use the given systemId - } + URI uri = URI.create(namespaceURI); + Set hs = NamespaceHandlerRegistryImpl.this.handlers.get(uri); + // first check registered handlers + if (hs != null) { + for (NamespaceHandler h : hs) { + URL url = h.getSchemaLocation(namespaceURI); + if (url != null) { + return createLSInput(publicId, systemId, url); } - try { - final StreamSource source = new StreamSource(url.openStream(), url.toExternalForm()); - schemaSources.add(source); - return new SourceLSInput(source, publicId, url); - } catch (IOException e) { - throw new RuntimeException(e); + } + } + // then check if some handler may resolve the namespace + for (NamespaceHandler h : handlers.values()) { + if (h instanceof NamespaceHandler2 && ((NamespaceHandler2) h).mayResolve(namespaceURI)) { + URL url = h.getSchemaLocation(namespaceURI); + if (url != null) { + return createLSInput(publicId, systemId, url); + } } } return null; } + + private LSInput createLSInput(String publicId, String systemId, URL url) { + // handling include-relative-path case + if (systemId != null && !systemId.matches("^[a-z][-+.0-9a-z]*:.*")) { + try { + url = new URL(url, systemId); + } catch (Exception e) { + // ignore and use the given systemId + } + } + try { + final StreamSource source = new StreamSource(url.openStream(), url.toExternalForm()); + schemaSources.add(source); + return new SourceLSInput(source, publicId, url); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } private class SourceLSInput implements LSInput { diff --git a/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/NamespaceHandler2.java b/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/NamespaceHandler2.java index 844512eb5e..86d3d59638 100644 --- a/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/NamespaceHandler2.java +++ b/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/NamespaceHandler2.java @@ -16,24 +16,25 @@ */ package org.apache.aries.blueprint; -import java.net.URL; -import java.util.Set; - -import org.osgi.service.blueprint.reflect.ComponentMetadata; -import org.osgi.service.blueprint.reflect.Metadata; -import org.w3c.dom.Element; -import org.w3c.dom.Node; - /** * Additional namespace features */ public interface NamespaceHandler2 extends NamespaceHandler { - /* + /** * A namespace can return true if its parsing relies on PSVI, * i.e. extensions from the schema for default attributes values * for example. */ boolean usePsvi(); + /** + *

A hint for a registry of handlers that this handler actually may resolve given namespace + * and {@link NamespaceHandler#getSchemaLocation(String) return a location for XSD resource} for it.

+ *

Some handlers return some XSD resource when asked for location of unknown namespace

+ * @param namespace + * @return + */ + boolean mayResolve(String namespace); + } diff --git a/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintNamespaceHandler.java b/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintNamespaceHandler.java index 2252944704..b5403adf14 100644 --- a/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintNamespaceHandler.java +++ b/blueprint/blueprint-spring/src/main/java/org/apache/aries/blueprint/spring/BlueprintNamespaceHandler.java @@ -82,6 +82,11 @@ public boolean usePsvi() { return true; } + @Override + public boolean mayResolve(String namespace) { + return schemas.containsKey(namespace); + } + @Override public URL getSchemaLocation(String s) { if (schemas.containsKey(s)) {