You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by se...@apache.org on 2015/06/12 16:40:59 UTC

svn commit: r1685094 - /aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/container/SimpleNamespaceHandlerSet.java

Author: sergeyb
Date: Fri Jun 12 14:40:59 2015
New Revision: 1685094

URL: http://svn.apache.org/r1685094
Log:
[ARIES-1334] Updating SimpleNamespaceHandlerSet to do the best effort at resolving relative schema references such as xsd:include

Modified:
    aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/container/SimpleNamespaceHandlerSet.java

Modified: aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/container/SimpleNamespaceHandlerSet.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/container/SimpleNamespaceHandlerSet.java?rev=1685094&r1=1685093&r2=1685094&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/container/SimpleNamespaceHandlerSet.java (original)
+++ aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/container/SimpleNamespaceHandlerSet.java Fri Jun 12 14:40:59 2015
@@ -18,21 +18,30 @@
  */
 package org.apache.aries.blueprint.container;
 
-import org.apache.aries.blueprint.NamespaceHandler;
-import org.apache.aries.blueprint.ext.impl.ExtNamespaceHandler;
-import org.apache.aries.blueprint.parser.NamespaceHandlerSet;
-import org.xml.sax.SAXException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import javax.xml.XMLConstants;
 import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamSource;
 import javax.xml.validation.Schema;
 import javax.xml.validation.SchemaFactory;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URL;
-import java.util.*;
+
+import org.apache.aries.blueprint.NamespaceHandler;
+import org.apache.aries.blueprint.ext.impl.ExtNamespaceHandler;
+import org.apache.aries.blueprint.parser.NamespaceHandlerSet;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
+import org.xml.sax.SAXException;
 
 public class SimpleNamespaceHandlerSet implements NamespaceHandlerSet {
 
@@ -81,6 +90,25 @@ public class SimpleNamespaceHandlerSet i
                     schemaSources.add(new StreamSource(is));
                 }
                 SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+                schemaFactory.setResourceResolver(new LSResourceResolver() {
+                    
+                    public LSInput resolveResource(String type, String namespace, String publicId,
+                                                   String systemId, String baseURI) {
+                        try {
+                            if (systemId != null && !URI.create(systemId).isAbsolute()) {
+                                URI namespaceURI = URI.create(namespace);
+                                if (namespaces.containsKey(namespaceURI)) {
+                                    URI systemIdUri = namespaces.get(namespaceURI).toURI().resolve(systemId);
+                                    InputStream resourceStream = systemIdUri.toURL().openStream();
+                                    return new LSInputImpl(publicId, systemId, resourceStream);
+                                }
+                            }
+                        } catch (Exception ex) {
+                            // ignore
+                        }
+                        return null;
+                    }
+                });
                 schema = schemaFactory.newSchema(schemaSources.toArray(new Source[schemaSources.size()]));
             } finally {
                 for (InputStream is : streams) {
@@ -103,4 +131,93 @@ public class SimpleNamespaceHandlerSet i
         schema = null;
     }
 
+    private static class LSInputImpl implements LSInput {
+
+        protected String fPublicId;
+
+        protected String fSystemId;
+
+        protected String fBaseSystemId;
+
+        protected InputStream fByteStream;
+
+        protected Reader fCharStream;
+
+        protected String fData;
+
+        protected String fEncoding;
+
+        protected boolean fCertifiedText;
+
+        LSInputImpl(String publicId, String systemId, InputStream byteStream) {
+            fPublicId = publicId;
+            fSystemId = systemId;
+            fByteStream = byteStream;
+        }
+
+        public InputStream getByteStream() {
+            return fByteStream;
+        }
+
+        public void setByteStream(InputStream byteStream) {
+            fByteStream = byteStream;
+        }
+
+        public Reader getCharacterStream() {
+            return fCharStream;
+        }
+
+        public void setCharacterStream(Reader characterStream) {
+            fCharStream = characterStream;
+        }
+
+        public String getStringData() {
+            return fData;
+        }
+
+        public void setStringData(String stringData) {
+            fData = stringData;
+        }
+
+        public String getEncoding() {
+            return fEncoding;
+        }
+
+        public void setEncoding(String encoding) {
+            fEncoding = encoding;
+        }
+
+        public String getPublicId() {
+            return fPublicId;
+        }
+
+        public void setPublicId(String publicId) {
+            fPublicId = publicId;
+        }
+
+        public String getSystemId() {
+            return fSystemId;
+        }
+
+        public void setSystemId(String systemId) {
+            fSystemId = systemId;
+        }
+
+        public String getBaseURI() {
+            return fBaseSystemId;
+        }
+
+        public void setBaseURI(String baseURI) {
+            fBaseSystemId = baseURI;
+        }
+
+        public boolean getCertifiedText() {
+            return fCertifiedText;
+        }
+
+        public void setCertifiedText(boolean certifiedText) {
+            fCertifiedText = certifiedText;
+        }
+
+    }
 }