neilg 2003/01/24 09:20:12 Modified: java/src/org/apache/xerces/util ObjectFactory.java SecuritySupport.java SecuritySupport12.java Log: make ObjectFactory cachec xerces.properties, refreshing it when necessary, in like manner to the FactoryFinder implementation we will be relying upon. Revision Changes Path 1.10 +76 -17 xml-xerces/java/src/org/apache/xerces/util/ObjectFactory.java Index: ObjectFactory.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/util/ObjectFactory.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- ObjectFactory.java 6 Jan 2003 16:37:59 -0000 1.9 +++ ObjectFactory.java 24 Jan 2003 17:20:11 -0000 1.10 @@ -96,6 +96,20 @@ /** Set to true for debugging */ private static final boolean DEBUG = false; + /** cache the contents of the xerces.properties file. + * Until an attempt has been made to read this file, this will + * be null; if the file does not exist or we encounter some other error + * during the read, this will be empty. + */ + private static Properties fXercesProperties = null; + + /*** + * Cache the time stamp of the xerces.properties file so + * that we know if it's been modified and can invalidate + * the cache when necessary. + */ + private static long fLastModified = -1; + // // Public static methods // @@ -167,25 +181,70 @@ } // Try to read from propertiesFilename, or $java.home/lib/xerces.properties - try { - if(propertiesFilename ==null) { + String factoryClassName = null; + // no properties file name specified; use $JAVA_HOME/lib/xerces.properties: + if (propertiesFilename == null) { String javah = ss.getSystemProperty("java.home"); - propertiesFilename = javah + File.separator + - "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME; + propertiesFilename = javah + File.separator + + "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME; + File propertiesFile = new File(propertiesFilename); + boolean propertiesFileExists = ss.getFileExists(propertiesFile); + synchronized (ObjectFactory.class) { + boolean loadProperties = false; + // file existed last time + if(fLastModified >= 0) { + if(propertiesFileExists && + (fLastModified < (fLastModified = ss.getLastModified(propertiesFile)))) { + loadProperties = true; + } else { + // file has stopped existing... + if(!propertiesFileExists) { + fLastModified = -1; + fXercesProperties = null; + } // else, file wasn't modified! + } + } else { + // file has started to exist: + if(propertiesFileExists) { + loadProperties = true; + fLastModified = ss.getLastModified(propertiesFile); + } // else, nothing's changed + } + if(loadProperties) { + try { + // must never have attempted to read xerces.properties before (or it's outdeated) + fXercesProperties = new Properties(); + FileInputStream fis = ss.getFileInputStream(propertiesFile); + fXercesProperties.load(fis); + fis.close(); + } catch (Exception x) { + fXercesProperties = null; + fLastModified = -1; + // assert(x instanceof FileNotFoundException + // || x instanceof SecurityException) + // In both cases, ignore and continue w/ next location + } + } + } + if(fXercesProperties != null) { + factoryClassName = fXercesProperties.getProperty(factoryId); } - FileInputStream fis = ss.getFileInputStream(new File(propertiesFilename)); - Properties props = new Properties(); - props.load(fis); - String factoryClassName = props.getProperty(factoryId); - if (factoryClassName != null) { - debugPrintln("found in " + propertiesFilename + ", value=" + factoryClassName); - return newInstance(factoryClassName, cl, true); + } else { + try { + FileInputStream fis = ss.getFileInputStream(new File(propertiesFilename)); + Properties props = new Properties(); + props.load(fis); + fis.close(); + factoryClassName = props.getProperty(factoryId); + } catch (Exception x) { + // assert(x instanceof FileNotFoundException + // || x instanceof SecurityException) + // In both cases, ignore and continue w/ next location } - fis.close(); - } catch (Exception x) { - // assert(x instanceof FileNotFoundException - // || x instanceof SecurityException) - // In both cases, ignore and continue w/ next location + } + if (factoryClassName != null) { + debugPrintln("found in " + propertiesFilename + ", value=" + factoryClassName); + return newInstance(factoryClassName, cl, true); } // Try Jar Service Provider Mechanism 1.2 +8 -0 xml-xerces/java/src/org/apache/xerces/util/SecuritySupport.java Index: SecuritySupport.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/util/SecuritySupport.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SecuritySupport.java 26 Aug 2002 23:57:11 -0000 1.1 +++ SecuritySupport.java 24 Jan 2003 17:20:11 -0000 1.2 @@ -137,4 +137,12 @@ } return ris; } + + public boolean getFileExists(File f) { + return f.exists(); + } + + public long getLastModified(File f) { + return f.lastModified(); + } } 1.2 +19 -0 xml-xerces/java/src/org/apache/xerces/util/SecuritySupport12.java Index: SecuritySupport12.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/util/SecuritySupport12.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SecuritySupport12.java 26 Aug 2002 23:57:11 -0000 1.1 +++ SecuritySupport12.java 24 Jan 2003 17:20:11 -0000 1.2 @@ -122,4 +122,23 @@ } }); } + + public boolean getFileExists(final File f) { + return ((Boolean) + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return new Boolean(f.exists()); + } + })).booleanValue(); + } + + public long getLastModified(final File f) { + return ((Long) + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return new Long(f.lastModified()); + } + })).longValue(); + } + }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]