blob: 0f603014c886c505d1a640b56c799d3b5b74e7dc [file] [log] [blame]
/*
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package catalog;
import static jaxp.library.JAXPTestUtilities.getSystemProperty;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.nio.file.Paths;
import java.security.CodeSource;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Policy;
import java.security.ProtectionDomain;
import javax.xml.XMLConstants;
import javax.xml.catalog.CatalogFeatures;
import javax.xml.catalog.CatalogResolver;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLResolver;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.testng.Assert;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ls.LSInput;
import org.w3c.dom.ls.LSResourceResolver;
import org.xml.sax.Attributes;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.DefaultHandler2;
/**
* Base class:
* Initialized xml/xsd/xsl used for the test;
* Handler classes
*
* @author huizhe.wang@oracle.com
*/
public class CatalogSupportBase {
// the System Property for the USE_CATALOG feature
final static String SP_USE_CATALOG = "javax.xml.useCatalog";
boolean debug = false;
String filepath;
String slash = "";
protected void setUp() {
String file1 = getClass().getResource("CatalogSupport.xml").getFile();
if (getSystemProperty("os.name").contains("Windows")) {
filepath = file1.substring(1, file1.lastIndexOf("/") + 1);
slash = "/";
} else {
filepath = file1.substring(0, file1.lastIndexOf("/") + 1);
}
initFiles();
}
String xml_catalog, xml_bogus_catalog;
// For tests using system.xml
String xml_system, dtd_system, dtd_systemResolved;
final String elementInSystem = "catalogtest";
final String expectedWCatalog = "Test system entry";
final String expectedWResolver = "Test resolved by an EntityHandler, rather than a Catalog entry";
// For tests using XInclude.xml
String xml_xInclude, xml_xIncludeSimple;
final String elementInXISimple = "blue";
final String contentInXIutf8 = "trjsagdkasgdhasdgashgdhsadgashdg";
final String contentInUIutf8Catalog = "usingCatalog";
// For the xsd import and include
String xsd_xmlSchema, dtd_xmlSchema, dtd_datatypes;
String xsd_xmlSchema_import, xsd_xml;
String xml_val_test, xml_val_test_id, xsd_val_test;
String xsd_include_company, xsd_include_person, xsd_include_product;
String xsl_include, xsl_includeDTD, xsl_import_html, xsl_include_header, xsl_include_footer;
// For the xsl import and include
String xml_xsl, xml_xslDTD;
// For document function
String xml_doc, xsl_doc, xml_doc2;
void initFiles() {
xml_system = filepath + "system.xml";
dtd_system = filepath + "system.dtd";
dtd_systemResolved = "<!ENTITY system \"resolved by an EntityHandler, rather than a Catalog\">";
xml_catalog = Paths.get(filepath + "CatalogSupport.xml").toUri().toASCIIString();
xml_bogus_catalog = Paths.get(filepath + "CatalogSupport_bogus.xml").toUri().toASCIIString();
xml_xInclude = "<?xml version=\"1.0\"?>\n" +
"<xinclude:include xmlns:xinclude=\"http://www.w3.org/2001/XInclude\"\n" +
" href=\"XI_simple.xml\"/>\n";
xml_xIncludeSimple = filepath + "XI_simple.xml";
xsd_xmlSchema = "<?xml version=\"1.1\" encoding=\"UTF-8\"?>"
+ "<!DOCTYPE xs:schema PUBLIC \"-//W3C//DTD XMLSCHEMA 200102//EN\" \"pathto/XMLSchema.dtd\" >"
+ "<xs:schema targetNamespace=\"http://www.w3.org/2001/XMLSchema\" blockDefault=\"#all\" "
+ " elementFormDefault=\"qualified\" version=\"1.0\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" "
+ " xml:lang=\"EN\" xmlns:hfp=\"http://www.w3.org/2001/XMLSchema-hasFacetAndProperty\">"
+ " <xs:annotation>"
+ " <xs:documentation>"
+ " Part 1 version: Id: structures.xsd,v 1.2 2004/01/15 11:34:25 ht Exp "
+ " Part 2 version: Id: datatypes.xsd,v 1.3 2004/01/23 18:11:13 ht Exp "
+ " </xs:documentation>"
+ " </xs:annotation>"
+ "</xs:schema>";
dtd_xmlSchema = filepath + "XMLSchema.dtd";
dtd_datatypes = filepath + "datatypes.dtd";
xsd_xmlSchema_import = "<?xml version=\"1.1\" encoding=\"UTF-8\"?>"
+ "<xs:schema targetNamespace=\"http://www.w3.org/2001/XMLSchema\" "
+ "blockDefault=\"#all\" elementFormDefault=\"qualified\" version=\"1.0\" "
+ "xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xml:lang=\"EN\" "
+ "xmlns:hfp=\"http://www.w3.org/2001/XMLSchema-hasFacetAndProperty\">"
+ " <xs:annotation>"
+ " <xs:documentation>"
+ " Part 1 version: Id: structures.xsd,v 1.2 2004/01/15 11:34:25 ht Exp "
+ " Part 2 version: Id: datatypes.xsd,v 1.3 2004/01/23 18:11:13 ht Exp "
+ " </xs:documentation>"
+ " </xs:annotation>"
+ ""
+ " <xs:import namespace=\"http://www.w3.org/XML/1998/namespace\" "
+ "schemaLocation=\"http://www.w3.org/2001/pathto/xml.xsd\">"
+ " <xs:annotation>"
+ " <xs:documentation>"
+ " Get access to the xml: attribute groups for xml:lang"
+ " as declared on 'schema' and 'documentation' below"
+ " </xs:documentation>"
+ " </xs:annotation>"
+ " </xs:import>"
+ " <xs:element name=\"schema\" id=\"schema\">"
+ " <xs:complexType>"
+ " <xs:simpleContent>"
+ " <xs:extension base=\"xs:integer\">"
+ " <xs:attribute ref=\"xml:lang\"/>"
+ " </xs:extension>"
+ " </xs:simpleContent>"
+ " </xs:complexType>"
+ " </xs:element>"
+ "</xs:schema>";
xsd_xml = filepath + "xml.xsd";
xsd_include_company = "<?xml version=\"1.1\"?>"
+ "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""
+ " targetNamespace=\"http://www.company.org\""
+ " xmlns=\"http://www.company.org\""
+ " elementFormDefault=\"qualified\">"
+ " <xsd:include schemaLocation=\"pathto/XSDInclude_person.xsd\"/>"
+ " <xsd:include schemaLocation=\"pathto/XSDInclude_product.xsd\"/>"
+ " <xsd:element name=\"Company\">"
+ " <xsd:complexType>"
+ " <xsd:sequence>"
+ " <xsd:element name=\"Person\" type=\"PersonType\""
+ " maxOccurs=\"unbounded\"/>"
+ " <xsd:element name=\"Product\" type=\"ProductType\""
+ " maxOccurs=\"unbounded\"/>"
+ " </xsd:sequence>"
+ " </xsd:complexType>"
+ " </xsd:element>"
+ "</xsd:schema>";
xsd_include_person = filepath + "XSDInclude_person.xsd";
xsd_include_product = filepath + "XSDInclude_product.xsd";
xsl_include = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">"
+ " <xsl:import href=\"pathto/XSLImport_html.xsl\"/>"
+ " <xsl:include href=\"pathto/XSLInclude_header.xsl\"/>"
+ " "
+ ""
+ " <xsl:template match=\"content/title\">"
+ " <h1><xsl:apply-templates/></h1>"
+ " </xsl:template>"
+ " "
+ " <xsl:include href=\"pathto/XSLInclude_footer.xsl\"/>"
+ ""
+ "</xsl:stylesheet>";
xsl_includeDTD = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<!DOCTYPE HTMLlat1 SYSTEM \"http://openjdk.java.net/xml/catalog/dtd/XSLDTD.dtd\">"
+ "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">"
+ " <xsl:import href=\"pathto/XSLImport_html.xsl\"/>"
+ " <xsl:include href=\"pathto/XSLInclude_header.xsl\"/>"
+ " "
+ ""
+ " <xsl:template match=\"content/title\">"
+ " <h1><xsl:apply-templates/></h1>"
+ " </xsl:template>"
+ " "
+ " <xsl:include href=\"pathto/XSLInclude_footer.xsl\"/>"
+ ""
+ "</xsl:stylesheet>";
xsl_import_html = filepath + "XSLImport_html.xsl";
xsl_include_header = filepath + "XSLInclude_header.xsl";
xsl_include_footer = filepath + "XSLInclude_footer.xsl";
xml_val_test = filepath + "/val_test.xml";
xml_val_test_id = "file://" + slash + xml_val_test;
xsd_val_test = filepath + "/val_test.xsd";
xml_xsl = "<?xml version=\"1.0\"?>\n" +
"<content>\n" +
" <header>This is the header</header>\n" +
" Some content\n" +
" <footer>footer</footer>\n" +
"</content>";
xml_xslDTD = "<?xml version=\"1.0\"?>\n" +
"<!DOCTYPE content SYSTEM \"http://openjdk.java.net/xml/catalog/dtd/include.dtd\">" +
"<content>\n" +
" <header>This is the header</header>\n" +
" Some content\n" +
" <footer>footer</footer>\n" +
"</content>";
xml_doc = filepath + "/DocFunc.xml";
xsl_doc = filepath + "/DocFunc.xsl";
xml_doc2 = filepath + "/DocFunc2.xml";
}
/*
Verifies the Catalog support on SAXParser.
*/
public void testSAX(boolean setUseCatalog, boolean useCatalog, String catalog,
String xml, MyHandler handler, String expected) throws Exception {
SAXParser parser = getSAXParser(setUseCatalog, useCatalog, catalog);
parser.parse(xml, handler);
Assert.assertEquals(handler.getResult().trim(), expected);
}
/*
Verifies the Catalog support on XMLReader.
*/
public void testXMLReader(boolean setUseCatalog, boolean useCatalog, String catalog,
String xml, MyHandler handler, String expected) throws Exception {
XMLReader reader = getXMLReader(setUseCatalog, useCatalog, catalog);
reader.setContentHandler(handler);
reader.setEntityResolver(handler);
reader.parse(xml);
Assert.assertEquals(handler.getResult().trim(), expected);
}
/*
Verifies the Catalog support on XInclude.
*/
public void testXInclude(boolean setUseCatalog, boolean useCatalog, String catalog,
String xml, MyHandler handler, String expected) throws Exception {
SAXParser parser = getSAXParser(setUseCatalog, useCatalog, catalog);
parser.parse(new InputSource(new StringReader(xml)), handler);
debugPrint("handler.result:" + handler.getResult());
Assert.assertEquals(handler.getResult().trim(), expected);
}
/*
Verifies the Catalog support on DOM parser.
*/
public void testDOM(boolean setUseCatalog, boolean useCatalog, String catalog,
String xml, MyHandler handler, String expected) throws Exception {
DocumentBuilder docBuilder = getDomBuilder(setUseCatalog, useCatalog, catalog);
docBuilder.setEntityResolver(handler);
Document doc = docBuilder.parse(xml);
Node node = doc.getElementsByTagName(elementInSystem).item(0);
String result = node.getFirstChild().getTextContent();
Assert.assertEquals(result.trim(), expected);
}
/*
Verifies the Catalog support on StAX parser.
*/
public void testStAX(boolean setUseCatalog, boolean useCatalog, String catalog,
String xml, XMLResolver resolver, String expected) throws Exception {
XMLStreamReader streamReader = getStreamReader(
setUseCatalog, useCatalog, catalog, xml, resolver);
String text = getText(streamReader, XMLStreamConstants.CHARACTERS);
Assert.assertEquals(text.trim(), expected);
}
/*
Verifies that the Catalog support for StAX parser is disabled when
USE_CATALOG == false.
*/
public void testStAXNegative(boolean setUseCatalog, boolean useCatalog, String catalog,
String xml, XMLResolver resolver, String expected) throws Exception {
XMLStreamReader streamReader = getStreamReader(
setUseCatalog, useCatalog, catalog, xml, resolver);
String text = getText(streamReader, XMLStreamConstants.ENTITY_REFERENCE);
Assert.assertEquals(text.trim(), expected);
}
/*
Verifies the Catalog support on resolving DTD, xsd import and include in
Schema files.
*/
public void testValidation(boolean setUseCatalog, boolean useCatalog, String catalog,
String xsd, LSResourceResolver resolver)
throws Exception {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// use resolver or catalog if resolver = null
if (resolver != null) {
factory.setResourceResolver(resolver);
}
if (setUseCatalog) {
factory.setFeature(XMLConstants.USE_CATALOG, useCatalog);
}
factory.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog);
Schema schema = factory.newSchema(new StreamSource(new StringReader(xsd)));
success("XMLSchema.dtd and datatypes.dtd are resolved.");
}
/**
* Verifies Catalog Support for the Validator.
* @param setUseCatalog1 a flag to indicate whether USE_CATALOG shall be set
* on the factory.
* @param setUseCatalog2 a flag to indicate whether USE_CATALOG shall be set
* on the Validator.
* @param source the XML source
* @param resolver1 a resolver to be set on the factory if specified
* @param resolver2 a resolver to be set on the Validator if specified
* @param catalog1 a catalog to be set on the factory if specified
* @param catalog2 a catalog to be set on the Validator if specified
*/
public void testValidator(boolean setUseCatalog1, boolean setUseCatalog2, boolean useCatalog,
Source source, LSResourceResolver resolver1, LSResourceResolver resolver2,
String catalog1, String catalog2)
throws Exception {
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
if (setUseCatalog1) {
schemaFactory.setFeature(XMLConstants.USE_CATALOG, useCatalog);
}
if (catalog1 != null) {
schemaFactory.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog1);
}
if (resolver1 != null) {
schemaFactory.setResourceResolver(resolver1);
}
Schema schema = schemaFactory.newSchema();
Validator validator = schema.newValidator();
if (setUseCatalog2) {
validator.setFeature(XMLConstants.USE_CATALOG, useCatalog);
}
if (catalog2 != null) {
validator.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog2);
}
if (resolver2 != null) {
validator.setResourceResolver(resolver2);
}
validator.validate(source);
}
/*
Verifies the Catalog support on resolving DTD, xsl import and include in
XSL files.
*/
public void testXSLImport(boolean setUseCatalog, boolean useCatalog, String catalog,
SAXSource xsl, StreamSource xml,
URIResolver resolver, String expected) throws Exception {
TransformerFactory factory = getTransformerFactory(setUseCatalog, useCatalog, catalog, resolver);
Transformer transformer = factory.newTransformer(xsl);
StringWriter out = new StringWriter();
transformer.transform(xml, new StreamResult(out));
debugPrint("out:\n" + out.toString());
Assert.assertTrue(out.toString().contains(expected), "testXSLImport");
}
/*
Verifies the Catalog support on resolving DTD, xsl import and include in
XSL files.
*/
public void testXSLImportWTemplates(boolean setUseCatalog, boolean useCatalog,
String catalog, SAXSource xsl, StreamSource xml,
URIResolver resolver, String expected) throws Exception {
TransformerFactory factory = getTransformerFactory(setUseCatalog, useCatalog, catalog, resolver);
Transformer transformer = factory.newTemplates(xsl).newTransformer();
StringWriter out = new StringWriter();
transformer.transform(xml, new StreamResult(out));
Assert.assertTrue(out.toString().contains(expected), "testXSLImportWTemplates");
}
/**
* Returns an instance of SAXParser with a catalog if one is provided.
*
* @param setUseCatalog a flag indicates whether USE_CATALOG shall be set
* through the factory
* @param useCatalog the value of USE_CATALOG
* @param catalog a catalog
* @return an instance of SAXParser
* @throws ParserConfigurationException
* @throws SAXException
*/
SAXParser getSAXParser(boolean setUseCatalog, boolean useCatalog, String catalog)
throws ParserConfigurationException, SAXException {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setXIncludeAware(true);
if (setUseCatalog) {
spf.setFeature(XMLConstants.USE_CATALOG, useCatalog);
}
SAXParser parser = spf.newSAXParser();
parser.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog);
return parser;
}
/**
* Returns an instance of XMLReader with a catalog if one is provided.
*
* @param setUseCatalog a flag indicates whether USE_CATALOG shall be set
* through the factory
* @param useCatalog the value of USE_CATALOG
* @param catalog a catalog
* @return an instance of XMLReader
* @throws ParserConfigurationException
* @throws SAXException
*/
XMLReader getXMLReader(boolean setUseCatalog, boolean useCatalog, String catalog)
throws ParserConfigurationException, SAXException {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
XMLReader reader = spf.newSAXParser().getXMLReader();
if (setUseCatalog) {
reader.setFeature(XMLConstants.USE_CATALOG, useCatalog);
}
reader.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog);
return reader;
}
/**
* Returns an instance of DocumentBuilder that may have set a Catalog.
*
* @param setUseCatalog a flag indicates whether USE_CATALOG shall be set
* through the factory
* @param useCatalog the value of USE_CATALOG
* @param catalog a catalog
* @return an instance of DocumentBuilder
* @throws ParserConfigurationException
*/
DocumentBuilder getDomBuilder(boolean setUseCatalog, boolean useCatalog, String catalog)
throws ParserConfigurationException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
if (setUseCatalog) {
dbf.setFeature(XMLConstants.USE_CATALOG, useCatalog);
}
dbf.setAttribute(CatalogFeatures.Feature.FILES.getPropertyName(), catalog);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
return docBuilder;
}
/**
* Creates a DOMSource.
*
* @param uri the URI to the XML source file
* @param systemId the systemId of the source
* @param setUseCatalog a flag indicates whether USE_CATALOG shall be set
* through the factory
* @param useCatalog the value of USE_CATALOG
* @param catalog a catalog
* @return a DOMSource
* @throws Exception
*/
DOMSource getDOMSource(String uri, String systemId, boolean setUseCatalog,
boolean useCatalog, String catalog) {
DOMSource ds = null;
try {
DocumentBuilder builder = getDomBuilder(setUseCatalog, useCatalog, catalog);
Document doc = builder.parse(new File(uri));
ds = new DOMSource(doc, systemId);
} catch (Exception e) {}
return ds;
}
/**
* Creates a StAXSource.
*
* @param xmlFile the XML source file
* @param xmlFileId the systemId of the source
* @param setUseCatalog a flag indicates whether USE_CATALOG shall be set
* through the factory
* @param useCatalog the value of USE_CATALOG
* @param catalog a catalog
* @return a StAXSource
* @throws XMLStreamException
* @throws FileNotFoundException
*/
StAXSource getStaxSource(String xmlFile, String xmlFileId, boolean setUseCatalog,
boolean useCatalog, String catalog) {
StAXSource ss = null;
try {
XMLInputFactory xif = XMLInputFactory.newFactory();
if (setUseCatalog) {
xif.setProperty(XMLConstants.USE_CATALOG, useCatalog);
}
xif.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog);
ss = new StAXSource(xif.createXMLEventReader(
xmlFileId, new FileInputStream(xmlFile)));
} catch (Exception e) {}
return ss;
}
/**
* Creates an XMLStreamReader.
*
* @param setUseCatalog a flag indicates whether USE_CATALOG shall be set
* through the factory
* @param useCatalog the value of USE_CATALOG
* @param catalog the path to a catalog
* @param xml the xml to be parsed
* @param resolver a resolver to be set on the reader
* @return an instance of the XMLStreamReader
* @throws FileNotFoundException
* @throws XMLStreamException
*/
XMLStreamReader getStreamReader(boolean setUseCatalog, boolean useCatalog,
String catalog, String xml, XMLResolver resolver)
throws FileNotFoundException, XMLStreamException {
XMLInputFactory factory = XMLInputFactory.newInstance();
if (catalog != null) {
factory.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog);
}
factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, true);
factory.setProperty(XMLInputFactory.IS_COALESCING, true);
if (resolver != null) {
factory.setProperty(XMLInputFactory.RESOLVER, resolver);
}
if (setUseCatalog) {
factory.setProperty(XMLConstants.USE_CATALOG, useCatalog);
}
InputStream entityxml = new FileInputStream(xml);
XMLStreamReader streamReader = factory.createXMLStreamReader(xml, entityxml);
return streamReader;
}
/**
* Returns the accumulated text of an event type.
*
* @param streamReader the XMLStreamReader
* @param type the type of event requested
* @return the text of the accumulated text for the request type
* @throws XMLStreamException
*/
String getText(XMLStreamReader streamReader, int type) throws XMLStreamException {
StringBuilder text = new StringBuilder();
StringBuilder entityRef = new StringBuilder();
while(streamReader.hasNext()){
int eventType = streamReader.next();
switch (eventType) {
case XMLStreamConstants.START_ELEMENT:
break;
case XMLStreamConstants.CHARACTERS:
text.append(streamReader.getText());
break;
case XMLStreamConstants.ENTITY_REFERENCE:
entityRef.append(streamReader.getText());
break;
}
}
if (type == XMLStreamConstants.CHARACTERS) {
return text.toString();
} else {
return entityRef.toString();
}
}
/**
* Returns an instance of TransformerFactory with either a custom URIResolver
* or Catalog.
*
* @param setUseCatalog a flag indicates whether USE_CATALOG shall be set
* through the factory
* @param useCatalog the value of USE_CATALOG
* @param catalog a catalog
* @param resolver a custom resolver
* @return an instance of TransformerFactory
* @throws Exception
*/
TransformerFactory getTransformerFactory(boolean setUseCatalog, boolean useCatalog,
String catalog, URIResolver resolver)
throws Exception {
TransformerFactory factory = TransformerFactory.newInstance();
if (setUseCatalog) {
factory.setFeature(XMLConstants.USE_CATALOG, useCatalog);
}
if (catalog != null) {
factory.setAttribute(CatalogFeatures.Feature.FILES.getPropertyName(), catalog);
}
// use resolver or catalog if resolver = null
if (resolver != null) {
factory.setURIResolver(resolver);
}
return factory;
}
void fail(String msg) {
System.out.println("Test failed:");
System.out.println(msg);
}
void success(String msg) {
System.out.println("Test succeded:");
System.out.println(msg);
}
void debugPrint(String msg) {
if (debug) {
System.out.println(msg);
}
}
/**
* Extends MyStaxResolver to override resolveEntity
*/
class MyStaxEntityResolver implements XMLResolver {
public MyStaxEntityResolver() {
}
public Object resolveEntity(String publicId, String systemId, String baseURI,
String namespace)
throws javax.xml.stream.XMLStreamException {
try {
return new ByteArrayInputStream(
"<!ENTITY system \"resolved by an EntityHandler, rather than a Catalog\">".getBytes("UTF-8"));
} catch (UnsupportedEncodingException ex) {
return null;
}
}
}
/**
* A custom XMLResolver
*/
class MyStaxResolver implements XMLResolver {
public MyStaxResolver() {
}
public Object resolveEntity(String publicId, String systemId, String baseURI,
String namespace) throws javax.xml.stream.XMLStreamException {
return null;
}
}
/**
* Extends MyHandler and overrides resolveEntity with a CatalogResolver
*/
class MyCatalogHandler extends MyHandler {
CatalogResolver cr;
public MyCatalogHandler(CatalogResolver cr, String elementName) {
super(elementName);
this.cr = cr;
}
@Override
public InputSource resolveEntity(String publicId, String systemId) {
return cr.resolveEntity(publicId, systemId);
}
@Override
public InputSource resolveEntity(String name, String publicId,
String baseURI, String systemId) {
return cr.resolveEntity(publicId, systemId);
}
}
/**
* Extends MyHandler and overrides resolveEntity
*/
class MyEntityHandler extends MyHandler {
String[] systemIds;
InputSource[] returnValues;
public MyEntityHandler(String[] systemIds, InputSource[] returnValues, String elementName) {
super(elementName);
this.systemIds = systemIds;
this.returnValues = returnValues;
}
@Override
public InputSource resolveEntity(String name, String publicId,
String baseURI, String systemId) {
for (int i = 0; i < systemIds.length; i++) {
if (systemId.endsWith(systemIds[i])) {
return returnValues[i];
}
}
return null;
}
}
/**
* SAX handler
*/
public class MyHandler extends DefaultHandler2 implements ErrorHandler {
String elementName, currentElementName, result;
StringBuilder textContent = new StringBuilder();
/**
*
* @param elementName the name of the element from which the content
* is to be captured
*/
MyHandler(String elementName) {
textContent.setLength(0);
this.elementName = elementName;
}
String getResult() {
return result.trim();
}
public void startDocument() throws SAXException {
}
public void endDocument() throws SAXException {
}
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
currentElementName = localName;
textContent.delete(0, textContent.length());
try {
debugPrint("Element: " + uri + ":" + localName + " " + qName);
} catch (Exception e) {
throw new SAXException(e);
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {
debugPrint("Text: " + textContent.toString() + "");
debugPrint("End Element: " + uri + ":" + localName + " " + qName);
if (currentElementName.equals(elementName)) {
result = textContent.toString();
}
}
public void characters(char ch[], int start, int length) throws SAXException {
if (currentElementName.equals(elementName)) {
textContent.append(ch, start, length);
}
}
public void internalEntityDecl(String name, String value) throws SAXException {
super.internalEntityDecl(name, value);
debugPrint("internalEntityDecl() is invoked for entity : " + name);
}
public void externalEntityDecl(String name, String publicId, String systemId)
throws SAXException {
super.externalEntityDecl(name, publicId, systemId);
debugPrint("externalEntityDecl() is invoked for entity : " + name);
}
public void startEntity(String name) throws SAXException {
super.startEntity(name);
// debugPrint("startEntity() is invoked for entity : " + name) ;
}
public void endEntity(String name) throws SAXException {
super.endEntity(name);
// debugPrint("endEntity() is invoked for entity : " + name) ;
}
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
debugPrint("resolveEntity(publicId, systemId) is invoked");
return super.resolveEntity(publicId, systemId);
}
/**
* public InputSource resolveEntity(String name, String publicId, String
* baseURI, String systemId) throws SAXException, IOException {
* System.out.println("resolveEntity(name, publicId, baseURI, systemId)
* is invoked"); return super.resolveEntity(name, publicId, baseURI,
* systemId); }
*/
public InputSource getExternalSubset(String name, String baseURI)
throws SAXException, IOException {
debugPrint("getExternalSubset() is invoked");
return super.getExternalSubset(name, baseURI);
}
}
/**
* The purpose of this class, vs an anonymous class, is to show clearly what
* we're testing by passing the parameters to the constructor.
*/
class SourceResolver implements LSResourceResolver {
String publicId;
String[] systemIds;
XmlInput[] returnValues;
public SourceResolver(String publicId, String[] systemIds, XmlInput[] returnValues) {
this.publicId = publicId;
this.systemIds = systemIds;
this.returnValues = returnValues;
}
@Override
public LSInput resolveResource(String type, String namespaceURI, String publicId,
String systemId, String baseURI) {
for (int i = 0; i < systemIds.length; i++) {
if (systemId.endsWith(systemIds[i])) {
return returnValues[i];
}
}
return null;
}
}
class XmlInput implements LSInput {
private InputStream inputStream;
private String systemId;
private String baseUri;
public XmlInput(InputStream inputStream, String systemId, String baseUri) {
this.inputStream = inputStream;
this.systemId = systemId;
this.baseUri = baseUri;
}
@Override
public Reader getCharacterStream() {
return null;
}
@Override
public void setCharacterStream(Reader characterStream) {
}
@Override
public InputStream getByteStream() {
return inputStream;
}
@Override
public void setByteStream(InputStream byteStream) {
this.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) {
this.systemId = systemId;
}
@Override
public String getPublicId() {
return null;
}
@Override
public void setPublicId(String publicId) {
}
@Override
public String getBaseURI() {
return baseUri;
}
@Override
public void setBaseURI(String baseURI) {
this.baseUri = 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) {
}
}
class XslResolver implements URIResolver {
String[] hrefs;
Source[] returnValues;
public XslResolver(String[] href, Source[] returnValues) {
this.hrefs = href;
this.returnValues = returnValues;
}
@Override
public Source resolve(String href, String base) throws TransformerException {
for (int i = 0; i < hrefs.length; i++) {
if (href.endsWith(hrefs[i])) {
return returnValues[i];
}
}
return null;
}
}
/**
* Simple policy implementation that grants a set of permissions to all code
* sources and protection domains.
*/
static class SimplePolicy extends Policy {
private final Permissions perms;
public SimplePolicy(Permission... permissions) {
perms = new Permissions();
for (Permission permission : permissions) {
perms.add(permission);
}
}
@Override
public PermissionCollection getPermissions(CodeSource cs) {
return perms;
}
@Override
public PermissionCollection getPermissions(ProtectionDomain pd) {
return perms;
}
@Override
public boolean implies(ProtectionDomain pd, Permission p) {
return perms.implies(p);
}
}
}