< prev index next >
src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/SchemaCache.java
Print this page
@@ -23,18 +23,27 @@
* questions.
*/
package com.sun.tools.internal.xjc;
-import java.net.URL;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.ValidatorHandler;
import com.sun.xml.internal.bind.v2.util.XmlFactory;
import javax.xml.XMLConstants;
+
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
import org.xml.sax.SAXException;
import static com.sun.xml.internal.bind.v2.util.XmlFactory.allowExternalAccess;
/**
@@ -45,32 +54,172 @@
*
* @author Kohsuke Kawaguchi
*/
public final class SchemaCache {
+ private final boolean createResolver;
+ private final String resourceName;
+ private final Class<?> clazz;
+
private Schema schema;
- private final URL source;
+ public SchemaCache(String resourceName, Class<?> classToResolveResources) {
+ this(resourceName, classToResolveResources, false);
+ }
- public SchemaCache(URL source) {
- this.source = source;
+ public SchemaCache(String resourceName, Class<?> classToResolveResources, boolean createResolver) {
+ this.resourceName = resourceName;
+ this.createResolver = createResolver;
+ this.clazz = classToResolveResources;
}
public ValidatorHandler newValidator() {
- synchronized(this) {
- if(schema==null) {
- try {
+ if (schema==null) {
+ synchronized (this) {
+ if (schema == null) {
+
+ ResourceResolver resourceResolver = null;
+ try (InputStream is = clazz.getResourceAsStream(resourceName)) {
+
+ StreamSource source = new StreamSource(is);
+ source.setSystemId(resourceName);
// do not disable secure processing - these are well-known schemas
+
SchemaFactory sf = XmlFactory.createSchemaFactory(XMLConstants.W3C_XML_SCHEMA_NS_URI, false);
- schema = allowExternalAccess(sf, "file", false).newSchema(source);
- } catch (SAXException e) {
- // we make sure that the schema is correct before we ship.
- throw new AssertionError(e);
+ SchemaFactory schemaFactory = allowExternalAccess(sf, "file", false);
+
+ if (createResolver) {
+ resourceResolver = new ResourceResolver(clazz);
+ schemaFactory.setResourceResolver(resourceResolver);
+ }
+ schema = schemaFactory.newSchema(source);
+
+ } catch (IOException | SAXException e) {
+ throw new InternalError(e);
+ } finally {
+ if (resourceResolver != null) resourceResolver.closeStreams();
+ }
+ }
}
}
+ return schema.newValidatorHandler();
+ }
+
+ class ResourceResolver implements LSResourceResolver {
+
+ private List<InputStream> streamsToClose = Collections.synchronizedList(new ArrayList<InputStream>());
+ private Class<?> clazz;
+
+ ResourceResolver(Class<?> clazz) {
+ this.clazz = clazz;
}
- ValidatorHandler handler = schema.newValidatorHandler();
- return handler;
+ @Override
+ public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {
+ // XSOM passes the namespace URI to the publicID parameter.
+ // we do the same here .
+ InputStream is = clazz.getResourceAsStream(systemId);
+ streamsToClose.add(is);
+ return new Input(is, publicId, systemId);
+ }
+
+ void closeStreams() {
+ for (InputStream is : streamsToClose) {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ // nothing to do ...
+ }
+ }
+ }
+ }
}
}
+
+class Input implements LSInput {
+
+ private InputStream is;
+ private String publicId;
+ private String systemId;
+
+ public Input(InputStream is, String publicId, String systemId) {
+ this.is = is;
+ this.publicId = publicId;
+ this.systemId = systemId;
+ }
+
+ @Override
+ public Reader getCharacterStream() {
+ return null;
+ }
+
+ @Override
+ public void setCharacterStream(Reader characterStream) {
+ }
+
+ @Override
+ public InputStream getByteStream() {
+ return is;
+ }
+
+ @Override
+ public void setByteStream(InputStream byteStream) {
+ }
+
+ @Override
+ public String getStringData() {
+ return null;
+ }
+
+ @Override
+ public void setStringData(String stringData) {
+ }
+
+ @Override
+ public String getSystemId() {
+ return systemId;
+ }
+
+ @Override
+ public void setSystemId(String systemId) {
+ }
+
+ @Override
+ public String getPublicId() {
+ return publicId;
+ }
+
+ @Override
+ public void setPublicId(String publicId) {
+ }
+
+ @Override
+ public String getBaseURI() {
+ return null;
+ }
+
+ @Override
+ public void setBaseURI(String baseURI) {
+ }
+
+ @Override
+ public String getEncoding() {
+ return null;
+ }
+
+ @Override
+ public void setEncoding(String encoding) {
+ }
+
+ @Override
+ public boolean getCertifiedText() {
+ return false;
+ }
+
+ @Override
+ public void setCertifiedText(boolean certifiedText) {
+ }
+}
+
+
< prev index next >