revert mistaken commit to HEAD. This should restore HEAD to its correct state, leaving only the new tck-jaxp-1_2_0 branch with "unofficial" APIs
git-svn-id: https://svn.apache.org/repos/asf/xml/commons/trunk@226024 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
1 parent
c9ce59d37b
commit
6ef6cd1d5f
20 files changed
+536
-1366
No files matched your search
@@ -100,7 +100,6 @@ public abstract class DocumentBuilder {
|
||||
protected DocumentBuilder () {
|
||||
}
|
||||
|
||||
private static final boolean DEBUG = false ;
|
||||
/**
|
||||
* Parse the content of the given <code>InputStream</code> as an XML
|
||||
* document and return a new DOM {@link org.w3c.dom.Document} object.
|
||||
@@ -190,12 +189,11 @@ public abstract class DocumentBuilder {
|
||||
throw new IllegalArgumentException("File cannot be null");
|
||||
}
|
||||
|
||||
String escapedURI = FilePathToURI.filepath2URI(f.getAbsolutePath()) ;
|
||||
|
||||
if(DEBUG)
|
||||
System.out.println("Escaped URI = " + escapedURI) ;
|
||||
|
||||
InputSource in = new InputSource(escapedURI);
|
||||
String uri = "file:" + f.getAbsolutePath();
|
||||
if (File.separatorChar == '\\') {
|
||||
uri = uri.replace('\\', '/');
|
||||
}
|
||||
InputSource in = new InputSource(uri);
|
||||
return parse(in);
|
||||
}
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@ public abstract class DocumentBuilderFactory {
|
||||
/* The default property name according to the JAXP spec */
|
||||
"javax.xml.parsers.DocumentBuilderFactory",
|
||||
/* The fallback implementation class name */
|
||||
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
|
||||
null);
|
||||
} catch (FactoryFinder.ConfigurationError e) {
|
||||
throw new FactoryConfigurationError(e.getException(),
|
||||
e.getMessage());
|
||||
|
||||
+139
-222
@@ -55,15 +55,17 @@
|
||||
|
||||
package javax.xml.parsers;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
||||
import java.util.Properties;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.Properties;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
@@ -71,170 +73,65 @@ import java.util.Properties;
|
||||
* API.
|
||||
*
|
||||
* This code is designed to implement the JAXP 1.1 spec pluggability
|
||||
* feature. The code runs both as part of an unbundled jar file and also
|
||||
* when bundled as part of the JDK. Ideally the code should both compile
|
||||
* and run on JDK version 1.1 and later. However, due to the complexities
|
||||
* of invoking Java 2 security methods via reflection, this code will only
|
||||
* compile on Java 2 although it will run under JDK 1.1 VMs. As of 1may02
|
||||
* this file is on a "java2-branch".
|
||||
*
|
||||
* @author Edwin Goei
|
||||
* feature and is designed to both compile and run on JDK version 1.1 and
|
||||
* later. The code also runs both as part of an unbundled jar file and
|
||||
* when bundled as part of the JDK.
|
||||
*/
|
||||
class FactoryFinder {
|
||||
/** Controls debugging output to stderr */
|
||||
private static boolean debug;
|
||||
/** Set to true for debugging */
|
||||
private static final boolean debug = false;
|
||||
|
||||
// Define system property "jaxp.debug" to get output
|
||||
static {
|
||||
try {
|
||||
String val =
|
||||
SecuritySupport.getInstance().getSystemProperty("jaxp.debug");
|
||||
// Allow simply setting the prop to turn on debug
|
||||
debug = val != null && (! "false".equals(val));
|
||||
} catch (SecurityException se) {
|
||||
debug = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Main entry point. Finds and creates a new instance of a concrete
|
||||
* factory implementation in the specified order as stated in the JAXP
|
||||
* spec. This code attempts to find a factory implementation in
|
||||
* serveral locations. If one fails, the next one is tried. To be
|
||||
* more robust, this occurs even if a SecurityException is thrown, but
|
||||
* perhaps it may be better to propogate the SecurityException instead,
|
||||
* so SecurityException-s are not masked.
|
||||
*
|
||||
* @return A new instance of the concrete factory class, never null
|
||||
*
|
||||
* @param factoryId
|
||||
* Name of the factory to find, same as a property name
|
||||
*
|
||||
* @param fallbackClassName
|
||||
* Implementation class name, if nothing else is found. Use
|
||||
* null to mean not to use a fallback.
|
||||
*
|
||||
* @throws FactoryFinder.ConfigurationError
|
||||
* If a factory instance cannot be returned
|
||||
*
|
||||
* Package private so this code can be shared.
|
||||
*/
|
||||
static Object find(String factoryId, String fallbackClassName)
|
||||
throws ConfigurationError
|
||||
{
|
||||
SecuritySupport ss = SecuritySupport.getInstance();
|
||||
|
||||
// Figure out which ClassLoader to use for loading the provider
|
||||
// class. If there is a Context ClassLoader then use it.
|
||||
ClassLoader cl = ss.getContextClassLoader();
|
||||
if (cl == null) {
|
||||
// Assert: we are on JDK 1.1 or we have no Context ClassLoader
|
||||
// so use the current ClassLoader
|
||||
cl = FactoryFinder.class.getClassLoader();
|
||||
}
|
||||
|
||||
dPrint("find factoryId=" + factoryId);
|
||||
|
||||
// Use the system property first
|
||||
try {
|
||||
String systemProp = ss.getSystemProperty(factoryId);
|
||||
if (systemProp != null) {
|
||||
dPrint("found system property, value=" + systemProp);
|
||||
return newInstance(systemProp, cl, true);
|
||||
}
|
||||
} catch (SecurityException se) {
|
||||
// Ignore and continue w/ next location
|
||||
}
|
||||
|
||||
// Try to read from $java.home/lib/jaxp.properties
|
||||
try {
|
||||
String javah = ss.getSystemProperty("java.home");
|
||||
String configFile = javah + File.separator +
|
||||
"lib" + File.separator + "jaxp.properties";
|
||||
FileInputStream fis = ss.getFileInputStream(new File(configFile));
|
||||
Properties props = new Properties();
|
||||
props.load(fis);
|
||||
String factoryClassName = props.getProperty(factoryId);
|
||||
if (factoryClassName != null) {
|
||||
dPrint("found in jaxp.properties, value=" + factoryClassName);
|
||||
return newInstance(factoryClassName, cl, true);
|
||||
}
|
||||
} catch (Exception x) {
|
||||
// assert(x instanceof FileNotFoundException
|
||||
// || x instanceof SecurityException)
|
||||
// In both cases, ignore and continue w/ next location
|
||||
}
|
||||
|
||||
// Try Jar Service Provider Mechanism
|
||||
Object provider = findJarServiceProvider(factoryId);
|
||||
if (provider != null) {
|
||||
return provider;
|
||||
}
|
||||
|
||||
if (fallbackClassName == null) {
|
||||
throw new ConfigurationError(
|
||||
"Provider for " + factoryId + " cannot be found", null);
|
||||
}
|
||||
|
||||
dPrint("using fallback, value=" + fallbackClassName);
|
||||
return newInstance(fallbackClassName, cl, true);
|
||||
}
|
||||
|
||||
private static void dPrint(String msg) {
|
||||
private static void debugPrintln(String msg) {
|
||||
if (debug) {
|
||||
System.err.println("JAXP: " + msg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance of a class using the specified ClassLoader and
|
||||
* optionally fall back to the current ClassLoader if not found.
|
||||
*
|
||||
* @param className Name of the concrete class corresponding to the
|
||||
* service provider
|
||||
*
|
||||
* @param cl ClassLoader to use to load the class, null means to use
|
||||
* the bootstrap ClassLoader
|
||||
*
|
||||
* @param doFallback true if the current ClassLoader should be tried as
|
||||
* a fallback if the class is not found using cl
|
||||
*/
|
||||
private static Object newInstance(String className, ClassLoader cl,
|
||||
boolean doFallback)
|
||||
* Figure out which ClassLoader to use. For JDK 1.2 and later use
|
||||
* the context ClassLoader.
|
||||
*/
|
||||
private static ClassLoader findClassLoader()
|
||||
throws ConfigurationError
|
||||
{
|
||||
// assert(className != null);
|
||||
Method m = null;
|
||||
|
||||
try {
|
||||
Class providerClass;
|
||||
if (cl == null) {
|
||||
// XXX Use the bootstrap ClassLoader. There is no way to
|
||||
// load a class using the bootstrap ClassLoader that works
|
||||
// in both JDK 1.1 and Java 2. However, this should still
|
||||
// work b/c the following should be true:
|
||||
//
|
||||
// (cl == null) iff current ClassLoader == null
|
||||
//
|
||||
// Thus Class.forName(String) will use the current
|
||||
// ClassLoader which will be the bootstrap ClassLoader.
|
||||
providerClass = Class.forName(className);
|
||||
m = Thread.class.getMethod("getContextClassLoader", null);
|
||||
} catch (NoSuchMethodException e) {
|
||||
// Assume that we are running JDK 1.1, use the current ClassLoader
|
||||
debugPrintln("assuming JDK 1.1");
|
||||
return FactoryFinder.class.getClassLoader();
|
||||
}
|
||||
|
||||
try {
|
||||
return (ClassLoader) m.invoke(Thread.currentThread(), null);
|
||||
} catch (IllegalAccessException e) {
|
||||
// assert(false)
|
||||
throw new ConfigurationError("Unexpected IllegalAccessException",
|
||||
e);
|
||||
} catch (InvocationTargetException e) {
|
||||
// assert(e.getTargetException() instanceof SecurityException)
|
||||
throw new ConfigurationError("Unexpected InvocationTargetException",
|
||||
e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance of a class using the specified ClassLoader
|
||||
*/
|
||||
private static Object newInstance(String className,
|
||||
ClassLoader classLoader)
|
||||
throws ConfigurationError
|
||||
{
|
||||
try {
|
||||
Class spiClass;
|
||||
if (classLoader == null) {
|
||||
spiClass = Class.forName(className);
|
||||
} else {
|
||||
try {
|
||||
providerClass = cl.loadClass(className);
|
||||
} catch (ClassNotFoundException x) {
|
||||
if (doFallback) {
|
||||
// Fall back to current classloader
|
||||
cl = FactoryFinder.class.getClassLoader();
|
||||
providerClass = cl.loadClass(className);
|
||||
} else {
|
||||
throw x;
|
||||
}
|
||||
}
|
||||
spiClass = classLoader.loadClass(className);
|
||||
}
|
||||
Object instance = providerClass.newInstance();
|
||||
dPrint("created new instance of " + providerClass +
|
||||
" using ClassLoader: " + cl);
|
||||
return instance;
|
||||
return spiClass.newInstance();
|
||||
} catch (ClassNotFoundException x) {
|
||||
throw new ConfigurationError(
|
||||
"Provider " + className + " not found", x);
|
||||
@@ -245,91 +142,111 @@ class FactoryFinder {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to find provider using Jar Service Provider Mechanism
|
||||
/**
|
||||
* Finds the implementation Class object in the specified order. Main
|
||||
* entry point.
|
||||
* @return Class object of factory, never null
|
||||
*
|
||||
* @return instance of provider class if found or null
|
||||
* @param factoryId Name of the factory to find, same as
|
||||
* a property name
|
||||
* @param fallbackClassName Implementation class name, if nothing else
|
||||
* is found. Use null to mean no fallback.
|
||||
*
|
||||
* @exception FactoryFinder.ConfigurationError
|
||||
*
|
||||
* Package private so this code can be shared.
|
||||
*/
|
||||
private static Object findJarServiceProvider(String factoryId)
|
||||
static Object find(String factoryId, String fallbackClassName)
|
||||
throws ConfigurationError
|
||||
{
|
||||
SecuritySupport ss = SecuritySupport.getInstance();
|
||||
String serviceId = "META-INF/services/" + factoryId;
|
||||
InputStream is = null;
|
||||
debugPrintln("debug is on");
|
||||
|
||||
// First try the Context ClassLoader
|
||||
ClassLoader cl = ss.getContextClassLoader();
|
||||
if (cl != null) {
|
||||
is = ss.getResourceAsStream(cl, serviceId);
|
||||
ClassLoader classLoader = findClassLoader();
|
||||
|
||||
// If no provider found then try the current ClassLoader
|
||||
if (is == null) {
|
||||
cl = FactoryFinder.class.getClassLoader();
|
||||
is = ss.getResourceAsStream(cl, serviceId);
|
||||
// Use the system property first
|
||||
try {
|
||||
String systemProp =
|
||||
System.getProperty( factoryId );
|
||||
if( systemProp!=null) {
|
||||
debugPrintln("found system property " + systemProp);
|
||||
return newInstance(systemProp, classLoader);
|
||||
}
|
||||
} else {
|
||||
// No Context ClassLoader or JDK 1.1 so try the current
|
||||
// ClassLoader
|
||||
cl = FactoryFinder.class.getClassLoader();
|
||||
is = ss.getResourceAsStream(cl, serviceId);
|
||||
} catch (SecurityException se) {
|
||||
}
|
||||
|
||||
if (is == null) {
|
||||
// No provider found
|
||||
return null;
|
||||
}
|
||||
|
||||
dPrint("found jar resource=" + serviceId +
|
||||
" using ClassLoader: " + cl);
|
||||
|
||||
// Read the service provider name in UTF-8 as specified in
|
||||
// the jar spec. Unfortunately this fails in Microsoft
|
||||
// VJ++, which does not implement the UTF-8
|
||||
// encoding. Theoretically, we should simply let it fail in
|
||||
// that case, since the JVM is obviously broken if it
|
||||
// doesn't support such a basic standard. But since there
|
||||
// are still some users attempting to use VJ++ for
|
||||
// development, we have dropped in a fallback which makes a
|
||||
// second attempt using the platform's default encoding. In
|
||||
// VJ++ this is apparently ASCII, which is a subset of
|
||||
// UTF-8... and since the strings we'll be reading here are
|
||||
// also primarily limited to the 7-bit ASCII range (at
|
||||
// least, in English versions), this should work well
|
||||
// enough to keep us on the air until we're ready to
|
||||
// officially decommit from VJ++. [Edited comment from
|
||||
// jkesselm]
|
||||
BufferedReader rd;
|
||||
// try to read from $java.home/lib/xml.properties
|
||||
try {
|
||||
rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
|
||||
} catch (java.io.UnsupportedEncodingException e) {
|
||||
rd = new BufferedReader(new InputStreamReader(is));
|
||||
String javah=System.getProperty( "java.home" );
|
||||
String configFile = javah + File.separator +
|
||||
"lib" + File.separator + "jaxp.properties";
|
||||
File f=new File( configFile );
|
||||
if( f.exists()) {
|
||||
Properties props=new Properties();
|
||||
props.load( new FileInputStream(f));
|
||||
String factoryClassName = props.getProperty(factoryId);
|
||||
debugPrintln("found java.home property " + factoryClassName);
|
||||
return newInstance(factoryClassName, classLoader);
|
||||
}
|
||||
} catch(Exception ex ) {
|
||||
if( debug ) ex.printStackTrace();
|
||||
}
|
||||
|
||||
String serviceId = "META-INF/services/" + factoryId;
|
||||
// try to find services in CLASSPATH
|
||||
try {
|
||||
InputStream is=null;
|
||||
if (classLoader == null) {
|
||||
is=ClassLoader.getSystemResourceAsStream( serviceId );
|
||||
} else {
|
||||
is=classLoader.getResourceAsStream( serviceId );
|
||||
}
|
||||
|
||||
String factoryClassName = null;
|
||||
try {
|
||||
// XXX Does not handle all possible input as specified by the
|
||||
// Jar Service Provider specification
|
||||
factoryClassName = rd.readLine();
|
||||
rd.close();
|
||||
} catch (IOException x) {
|
||||
// No provider found
|
||||
return null;
|
||||
if( is!=null ) {
|
||||
debugPrintln("found " + serviceId);
|
||||
|
||||
// Read the service provider name in UTF-8 as specified in
|
||||
// the jar spec. Unfortunately this fails in Microsoft
|
||||
// VJ++, which does not implement the UTF-8
|
||||
// encoding. Theoretically, we should simply let it fail in
|
||||
// that case, since the JVM is obviously broken if it
|
||||
// doesn't support such a basic standard. But since there
|
||||
// are still some users attempting to use VJ++ for
|
||||
// development, we have dropped in a fallback which makes a
|
||||
// second attempt using the platform's default encoding. In
|
||||
// VJ++ this is apparently ASCII, which is a subset of
|
||||
// UTF-8... and since the strings we'll be reading here are
|
||||
// also primarily limited to the 7-bit ASCII range (at
|
||||
// least, in English versions), this should work well
|
||||
// enough to keep us on the air until we're ready to
|
||||
// officially decommit from VJ++. [Edited comment from
|
||||
// jkesselm]
|
||||
BufferedReader rd;
|
||||
try {
|
||||
rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
|
||||
} catch (java.io.UnsupportedEncodingException e) {
|
||||
rd = new BufferedReader(new InputStreamReader(is));
|
||||
}
|
||||
|
||||
String factoryClassName = rd.readLine();
|
||||
rd.close();
|
||||
|
||||
if (factoryClassName != null &&
|
||||
! "".equals(factoryClassName)) {
|
||||
debugPrintln("loaded from services: " + factoryClassName);
|
||||
return newInstance(factoryClassName, classLoader);
|
||||
}
|
||||
}
|
||||
} catch( Exception ex ) {
|
||||
if( debug ) ex.printStackTrace();
|
||||
}
|
||||
|
||||
if (factoryClassName != null &&
|
||||
! "".equals(factoryClassName)) {
|
||||
dPrint("found in resource, value="
|
||||
+ factoryClassName);
|
||||
|
||||
// Note: here we do not want to fall back to the current
|
||||
// ClassLoader because we want to avoid the case where the
|
||||
// resource file was found using one ClassLoader and the
|
||||
// provider class was instantiated using a different one.
|
||||
return newInstance(factoryClassName, cl, false);
|
||||
if (fallbackClassName == null) {
|
||||
throw new ConfigurationError(
|
||||
"Provider for " + factoryId + " cannot be found", null);
|
||||
}
|
||||
|
||||
// No provider found
|
||||
return null;
|
||||
debugPrintln("loaded from fallback value: " + fallbackClassName);
|
||||
return newInstance(fallbackClassName, classLoader);
|
||||
}
|
||||
|
||||
static class ConfigurationError extends Error {
|
||||
|
||||
@@ -1,169 +0,0 @@
|
||||
/*
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2002 The Apache Software Foundation.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Xerces" and "Apache Software Foundation" must
|
||||
* not be used to endorse or promote products derived from this
|
||||
* software without prior written permission. For written
|
||||
* permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* nor may "Apache" appear in their name, without prior written
|
||||
* permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation and was
|
||||
* originally based on software copyright (c) 1999, International
|
||||
* Business Machines, Inc., http://www.apache.org. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
package javax.xml.parsers;
|
||||
|
||||
class FilePathToURI {
|
||||
|
||||
// which ASCII characters need to be escaped
|
||||
private static boolean gNeedEscaping[] = new boolean[128];
|
||||
// the first hex character if a character needs to be escaped
|
||||
private static char gAfterEscaping1[] = new char[128];
|
||||
// the second hex character if a character needs to be escaped
|
||||
private static char gAfterEscaping2[] = new char[128];
|
||||
private static char[] gHexChs = {'0', '1', '2', '3', '4', '5', '6', '7',
|
||||
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
|
||||
// initialize the above 3 arrays
|
||||
static {
|
||||
for (int i = 0; i <= 0x1f; i++) {
|
||||
gNeedEscaping[i] = true;
|
||||
gAfterEscaping1[i] = gHexChs[i >> 4];
|
||||
gAfterEscaping2[i] = gHexChs[i & 0xf];
|
||||
}
|
||||
gNeedEscaping[0x7f] = true;
|
||||
gAfterEscaping1[0x7f] = '7';
|
||||
gAfterEscaping2[0x7f] = 'F';
|
||||
char[] escChs = {' ', '<', '>', '#', '%', '"', '{', '}',
|
||||
'|', '\\', '^', '~', '[', ']', '`'};
|
||||
int len = escChs.length;
|
||||
char ch;
|
||||
for (int i = 0; i < len; i++) {
|
||||
ch = escChs[i];
|
||||
gNeedEscaping[ch] = true;
|
||||
gAfterEscaping1[ch] = gHexChs[ch >> 4];
|
||||
gAfterEscaping2[ch] = gHexChs[ch & 0xf];
|
||||
}
|
||||
}
|
||||
|
||||
// To escape a file path to a URI, by using %HH to represent
|
||||
// special ASCII characters: 0x00~0x1F, 0x7F, ' ', '<', '>', '#', '%'
|
||||
// and '"' and non-ASCII characters (whose value >= 128).
|
||||
public static String filepath2URI(String path){
|
||||
// return null if path is null.
|
||||
if (path == null)
|
||||
return null;
|
||||
|
||||
char separator = java.io.File.separatorChar;
|
||||
path = path.replace(separator, '/');
|
||||
|
||||
int len = path.length(), ch;
|
||||
StringBuffer buffer = new StringBuffer(len*3);
|
||||
buffer.append("file://");
|
||||
// change C:/blah to /C:/blah
|
||||
if (len >= 2 && path.charAt(1) == ':') {
|
||||
ch = Character.toUpperCase(path.charAt(0));
|
||||
if (ch >= 'A' && ch <= 'Z') {
|
||||
buffer.append('/');
|
||||
}
|
||||
}
|
||||
|
||||
// for each character in the path
|
||||
int i = 0;
|
||||
for (; i < len; i++) {
|
||||
ch = path.charAt(i);
|
||||
// if it's not an ASCII character, break here, and use UTF-8 encoding
|
||||
if (ch >= 128)
|
||||
break;
|
||||
if (gNeedEscaping[ch]) {
|
||||
buffer.append('%');
|
||||
buffer.append(gAfterEscaping1[ch]);
|
||||
buffer.append(gAfterEscaping2[ch]);
|
||||
// record the fact that it's escaped
|
||||
}
|
||||
else {
|
||||
buffer.append((char)ch);
|
||||
}
|
||||
}
|
||||
|
||||
// we saw some non-ascii character
|
||||
if (i < len) {
|
||||
// get UTF-8 bytes for the remaining sub-string
|
||||
byte[] bytes = null;
|
||||
byte b;
|
||||
try {
|
||||
bytes = path.substring(i).getBytes("UTF-8");
|
||||
} catch (java.io.UnsupportedEncodingException e) {
|
||||
// should never happen
|
||||
return path;
|
||||
}
|
||||
len = bytes.length;
|
||||
|
||||
// for each byte
|
||||
for (i = 0; i < len; i++) {
|
||||
b = bytes[i];
|
||||
// for non-ascii character: make it positive, then escape
|
||||
if (b < 0) {
|
||||
ch = b + 256;
|
||||
buffer.append('%');
|
||||
buffer.append(gHexChs[ch >> 4]);
|
||||
buffer.append(gHexChs[ch & 0xf]);
|
||||
}
|
||||
else if (gNeedEscaping[b]) {
|
||||
buffer.append('%');
|
||||
buffer.append(gAfterEscaping1[b]);
|
||||
buffer.append(gAfterEscaping2[b]);
|
||||
}
|
||||
else {
|
||||
buffer.append((char)b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
}//FilePathToURI
|
||||
+10
-15
@@ -107,7 +107,6 @@ import org.xml.sax.SAXNotSupportedException;
|
||||
|
||||
public abstract class SAXParser {
|
||||
|
||||
private static final boolean DEBUG = false ;
|
||||
protected SAXParser () {
|
||||
|
||||
}
|
||||
@@ -294,16 +293,14 @@ public abstract class SAXParser {
|
||||
throw new IllegalArgumentException("File cannot be null");
|
||||
}
|
||||
|
||||
String escapedURI = FilePathToURI.filepath2URI(f.getAbsolutePath()) ;
|
||||
|
||||
if(DEBUG)
|
||||
System.out.println("Escaped URI = " + escapedURI) ;
|
||||
|
||||
InputSource input = new InputSource(escapedURI);
|
||||
String uri = "file:" + f.getAbsolutePath();
|
||||
if (File.separatorChar == '\\') {
|
||||
uri = uri.replace('\\', '/');
|
||||
}
|
||||
InputSource input = new InputSource(uri);
|
||||
this.parse(input, hb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse the content of the file specified as XML using the
|
||||
* specified {@link org.xml.sax.helpers.DefaultHandler}.
|
||||
@@ -324,12 +321,11 @@ public abstract class SAXParser {
|
||||
throw new IllegalArgumentException("File cannot be null");
|
||||
}
|
||||
|
||||
String escapedURI = FilePathToURI.filepath2URI(f.getAbsolutePath()) ;
|
||||
|
||||
if(DEBUG)
|
||||
System.out.println("Escaped URI = " + escapedURI) ;
|
||||
|
||||
InputSource input = new InputSource(escapedURI);
|
||||
String uri = "file:" + f.getAbsolutePath();
|
||||
if (File.separatorChar == '\\') {
|
||||
uri = uri.replace('\\', '/');
|
||||
}
|
||||
InputSource input = new InputSource(uri);
|
||||
this.parse(input, dh);
|
||||
}
|
||||
|
||||
@@ -357,7 +353,6 @@ public abstract class SAXParser {
|
||||
}
|
||||
|
||||
Parser parser = this.getParser();
|
||||
|
||||
if (hb != null) {
|
||||
parser.setDocumentHandler(hb);
|
||||
parser.setEntityResolver(hb);
|
||||
|
||||
@@ -136,7 +136,7 @@ public abstract class SAXParserFactory {
|
||||
/* The default property name according to the JAXP spec */
|
||||
"javax.xml.parsers.SAXParserFactory",
|
||||
/* The fallback implementation class name */
|
||||
"org.apache.xerces.jaxp.SAXParserFactoryImpl");
|
||||
null);
|
||||
} catch (FactoryFinder.ConfigurationError e) {
|
||||
throw new FactoryConfigurationError(e.getException(),
|
||||
e.getMessage());
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
/*
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2002 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The name "Apache Software Foundation" must not be used to endorse or
|
||||
* promote products derived from this software without prior written
|
||||
* permission. For written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* nor may "Apache" appear in their name, without prior written
|
||||
* permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation and was
|
||||
* originally based on software copyright (c) 1999-2002, Sun Microsystems,
|
||||
* Inc., http://www.sun.com. For more information on the Apache Software
|
||||
* Foundation, please see <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
package javax.xml.parsers;
|
||||
|
||||
import java.lang.reflect.*;
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
* It is package private and therefore is not exposed as part of the JAXP
|
||||
* API.
|
||||
*
|
||||
* Base class with security related methods that work on JDK 1.1.
|
||||
*/
|
||||
class SecuritySupport {
|
||||
|
||||
/*
|
||||
* Make this of type Object so that the verifier won't try to
|
||||
* prove its type, thus possibly trying to load the SecuritySupport12
|
||||
* class.
|
||||
*/
|
||||
private static final Object securitySupport;
|
||||
|
||||
static {
|
||||
SecuritySupport ss = null;
|
||||
try {
|
||||
Class c = Class.forName("java.security.AccessController");
|
||||
// if that worked, we're on 1.2.
|
||||
/*
|
||||
// don't reference the class explicitly so it doesn't
|
||||
// get dragged in accidentally.
|
||||
c = Class.forName("javax.mail.SecuritySupport12");
|
||||
Constructor cons = c.getConstructor(new Class[] { });
|
||||
ss = (SecuritySupport)cons.newInstance(new Object[] { });
|
||||
*/
|
||||
/*
|
||||
* Unfortunately, we can't load the class using reflection
|
||||
* because the class is package private. And the class has
|
||||
* to be package private so the APIs aren't exposed to other
|
||||
* code that could use them to circumvent security. Thus,
|
||||
* we accept the risk that the direct reference might fail
|
||||
* on some JDK 1.1 JVMs, even though we would never execute
|
||||
* this code in such a case. Sigh...
|
||||
*/
|
||||
ss = new SecuritySupport12();
|
||||
} catch (Exception ex) {
|
||||
// ignore it
|
||||
} finally {
|
||||
if (ss == null)
|
||||
ss = new SecuritySupport();
|
||||
securitySupport = ss;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an appropriate instance of this class, depending on whether
|
||||
* we're on a JDK 1.1 or J2SE 1.2 (or later) system.
|
||||
*/
|
||||
public static SecuritySupport getInstance() {
|
||||
return (SecuritySupport)securitySupport;
|
||||
}
|
||||
|
||||
public ClassLoader getContextClassLoader() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getSystemProperty(String propName) {
|
||||
return System.getProperty(propName);
|
||||
}
|
||||
|
||||
public FileInputStream getFileInputStream(File file)
|
||||
throws FileNotFoundException
|
||||
{
|
||||
return new FileInputStream(file);
|
||||
}
|
||||
|
||||
public InputStream getResourceAsStream(ClassLoader cl, String name) {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = ClassLoader.getSystemResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
}
|
||||
@@ -1,125 +0,0 @@
|
||||
/*
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2002 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The name "Apache Software Foundation" must not be used to endorse or
|
||||
* promote products derived from this software without prior written
|
||||
* permission. For written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* nor may "Apache" appear in their name, without prior written
|
||||
* permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation and was
|
||||
* originally based on software copyright (c) 1999-2002, Sun Microsystems,
|
||||
* Inc., http://www.sun.com. For more information on the Apache Software
|
||||
* Foundation, please see <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
package javax.xml.parsers;
|
||||
|
||||
import java.security.*;
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
* It is package private and therefore is not exposed as part of the JAXP
|
||||
* API.
|
||||
*
|
||||
* Security related methods that only work on J2SE 1.2 and newer.
|
||||
*/
|
||||
class SecuritySupport12 extends SecuritySupport {
|
||||
|
||||
public ClassLoader getContextClassLoader() {
|
||||
return (ClassLoader)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
ClassLoader cl = null;
|
||||
try {
|
||||
cl = Thread.currentThread().getContextClassLoader();
|
||||
} catch (SecurityException ex) { }
|
||||
return cl;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public String getSystemProperty(final String propName) {
|
||||
return (String)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
return System.getProperty(propName);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public FileInputStream getFileInputStream(final File file)
|
||||
throws FileNotFoundException
|
||||
{
|
||||
try {
|
||||
return (FileInputStream)
|
||||
AccessController.doPrivileged(new PrivilegedExceptionAction() {
|
||||
public Object run() throws FileNotFoundException {
|
||||
return new FileInputStream(file);
|
||||
}
|
||||
});
|
||||
} catch (PrivilegedActionException e) {
|
||||
throw (FileNotFoundException)e.getException();
|
||||
}
|
||||
}
|
||||
|
||||
public InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = ClassLoader.getSystemResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user