19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file 49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information 59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file 69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License. 89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at 99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software 139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and 169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License. 179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: EnvironmentCheck.java 468646 2006-10-28 06:57:58Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.xslt; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.File; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.FileWriter; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.PrintWriter; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.lang.reflect.Field; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.lang.reflect.Method; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Enumeration; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Hashtable; 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.StringTokenizer; 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Document; 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Element; 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node; 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Utility class to report simple information about the environment. 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Simplistic reporting about certain classes found in your JVM may 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * help answer some FAQs for simple problems. 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Usage-command line: 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code> 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * java org.apache.xalan.xslt.EnvironmentCheck [-out outFile] 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </code></p> 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Usage-from program: 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code> 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * boolean environmentOK = 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * (new EnvironmentCheck()).checkEnvironment(yourPrintWriter); 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </code></p> 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Usage-from stylesheet: 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code><pre> 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <?xml version="1.0"?> 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * xmlns:xalan="http://xml.apache.org/xalan" 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * exclude-result-prefixes="xalan"> 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <xsl:output indent="yes"/> 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <xsl:template match="/"> 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <xsl:copy-of select="xalan:checkEnvironment()"/> 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </xsl:template> 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </xsl:stylesheet> 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre></code></p> 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Xalan users reporting problems are encouraged to use this class 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to see if there are potential problems with their actual 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Java environment <b>before</b> reporting a bug. Note that you 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * should both check from the JVM/JRE's command line as well as 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * temporarily calling checkEnvironment() directly from your code, 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * since the classpath may differ (especially for servlets, etc).</p> 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Also see http://xml.apache.org/xalan-j/faq.html</p> 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Note: This class is pretty simplistic: 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * results are not necessarily definitive nor will it find all 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * problems related to environment setup. Also, you should avoid 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * calling this in deployed production code, both because it is 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * quite slow and because it forces classes to get loaded.</p> 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Note: This class explicitly has very limited compile-time 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * dependencies to enable easy compilation and usage even when 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Xalan, DOM/SAX/JAXP, etc. are not present.</p> 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Note: for an improved version of this utility, please see 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the xml-commons' project Which utility which does the same kind 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of thing but in a much simpler manner.</p> 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @author Shane_Curcuru@us.ibm.com 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @version $Id: EnvironmentCheck.java 468646 2006-10-28 06:57:58Z minchau $ 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class EnvironmentCheck 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Command line runnability: checks for [-out outFilename] arg. 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Command line entrypoint; Sets output and calls 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link #checkEnvironment(PrintWriter)}.</p> 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param args command line args 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static void main(String[] args) 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Default to System.out, autoflushing 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson PrintWriter sendOutputTo = new PrintWriter(System.out, true); 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Read our simplistic input args, if supplied 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < args.length; i++) 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ("-out".equalsIgnoreCase(args[i])) 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson i++; 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (i < args.length) 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson sendOutputTo = new PrintWriter(new FileWriter(args[i], true)); 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.err.println("# WARNING: -out " + args[i] + " threw " 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson + e.toString()); 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.err.println( 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "# WARNING: -out argument should have a filename, output sent to console"); 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson EnvironmentCheck app = new EnvironmentCheck(); 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson app.checkEnvironment(sendOutputTo); 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Programmatic entrypoint: Report on basic Java environment 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * and CLASSPATH settings that affect Xalan. 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Note that this class is not advanced enough to tell you 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * everything about the environment that affects Xalan, and 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * sometimes reports errors that will not actually affect 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Xalan's behavior. Currently, it very simplistically 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * checks the JVM's environment for some basic properties and 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * logs them out; it will report a problem if it finds a setting 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or .jar file that is <i>likely</i> to cause problems.</p> 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Advanced users can peruse the code herein to help them 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * investigate potential environment problems found; other users 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * may simply send the output from this tool along with any bugs 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * they submit to help us in the debugging process.</p> 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param pw PrintWriter to send output to; can be sent to a 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * file that will look similar to a Properties file; defaults 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to System.out if null 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if your environment appears to have no major 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * problems; false if potential environment problems found 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getEnvironmentHash() 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean checkEnvironment(PrintWriter pw) 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Use user-specified output writer if non-null 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != pw) 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson outWriter = pw; 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Setup a hash to store various environment information in 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Hashtable hash = getEnvironmentHash(); 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Check for ERROR keys in the hashtable, and print report 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean environmentHasErrors = writeEnvironmentReport(hash); 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (environmentHasErrors) 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note: many logMsg calls have # at the start to 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // fake a property-file like output 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("# WARNING: Potential problems found in your environment!"); 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("# Check any 'ERROR' items above against the Xalan FAQs"); 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("# to correct potential problems with your classes/jars"); 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("# http://xml.apache.org/xalan-j/faq.html"); 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != outWriter) 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson outWriter.flush(); 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("# YAHOO! Your environment seems to be OK."); 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != outWriter) 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson outWriter.flush(); 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Fill a hash with basic environment settings that affect Xalan. 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Worker method called from various places.</p> 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Various system and CLASSPATH, etc. properties are put into 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the hash as keys with a brief description of the current state 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of that item as the value. Any serious problems will be put in 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * with a key that is prefixed with {@link #ERROR 'ERROR.'} so it 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * stands out in any resulting report; also a key with just that 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * constant will be set as well for any error.</p> 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Note that some legitimate cases are flaged as potential 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * errors - namely when a developer recompiles xalan.jar on their 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * own - and even a non-error state doesn't guaruntee that 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * everything in the environment is correct. But this will help 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * point out the most common classpath and system property 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * problems that we've seen.</p> 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Hashtable full of useful environment info about Xalan 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * and related system properties, etc. 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Hashtable getEnvironmentHash() 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Setup a hash to store various environment information in 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Hashtable hash = new Hashtable(); 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Call various worker methods to fill in the hash 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // These are explicitly separate for maintenance and so 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // advanced users could call them standalone 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson checkJAXPVersion(hash); 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson checkProcessorVersion(hash); 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson checkParserVersion(hash); 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson checkAntVersion(hash); 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson checkDOMVersion(hash); 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson checkSAXVersion(hash); 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson checkSystemProperties(hash); 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return hash; 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Dump a basic Xalan environment report to outWriter. 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>This dumps a simple header and then each of the entries in 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the Hashtable to our PrintWriter; it does special processing 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for entries that are .jars found in the classpath.</p> 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param h Hashtable of items to report on; presumably 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * filled in by our various check*() methods 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if your environment appears to have no major 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * problems; false if potential environment problems found 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #appendEnvironmentReport(Node, Document, Hashtable) 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for an equivalent that appends to a Node instead 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected boolean writeEnvironmentReport(Hashtable h) 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == h) 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("# ERROR: writeEnvironmentReport called with null Hashtable"); 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean errors = false; 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg( 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "#---- BEGIN writeEnvironmentReport($Revision: 468646 $): Useful stuff found: ----"); 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Fake the Properties-like output 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (Enumeration keys = h.keys(); 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson keys.hasMoreElements(); 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* no increment portion */ 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ) 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Object key = keys.nextElement(); 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String keyStr = (String) key; 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Special processing for classes found.. 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (keyStr.startsWith(FOUNDCLASSES)) 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Vector v = (Vector) h.get(keyStr); 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson errors |= logFoundJars(v, keyStr); 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // ..normal processing for all other entries 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note: we could just check for the ERROR key by itself, 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // since we now set that, but since we have to go 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // through the whole hash anyway, do it this way, 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // which is safer for maintenance 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (keyStr.startsWith(ERROR)) 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson errors = true; 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg(keyStr + "=" + h.get(keyStr)); 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("Reading-" + key + "= threw: " + e.toString()); 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg( 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "#----- END writeEnvironmentReport: Useful properties found: -----"); 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return errors; 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Prefixed to hash keys that signify serious problems. */ 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static final String ERROR = "ERROR."; 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Added to descriptions that signify potential problems. */ 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static final String WARNING = "WARNING."; 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Value for any error found. */ 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static final String ERROR_FOUND = "At least one error was found!"; 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Prefixed to hash keys that signify version numbers. */ 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static final String VERSION = "version."; 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Prefixed to hash keys that signify .jars found in classpath. */ 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static final String FOUNDCLASSES = "foundclasses."; 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Marker that a class or .jar was found. */ 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static final String CLASS_PRESENT = "present-unknown-version"; 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Marker that a class or .jar was not found. */ 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static final String CLASS_NOTPRESENT = "not-present"; 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Listing of common .jar files that include Xalan-related classes. */ 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String[] jarNames = 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "xalan.jar", "xalansamples.jar", "xalanj1compat.jar", "xalanservlet.jar", 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "serializer.jar", // Serializer (shared between Xalan & Xerces) 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "xerces.jar", // Xerces-J 1.x 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "xercesImpl.jar", // Xerces-J 2.x 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "testxsl.jar", 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "crimson.jar", 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "lotusxsl.jar", 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "jaxp.jar", "parser.jar", "dom.jar", "sax.jar", "xml.jar", 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "xml-apis.jar", 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "xsltc.jar" 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson }; 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Print out report of .jars found in a classpath. 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Takes the information encoded from a checkPathForJars() 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * call and dumps it out to our PrintWriter. 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param v Vector of Hashtables of .jar file info 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param desc description to print out in header 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return false if OK, true if any .jars were reported 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * as having errors 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #checkPathForJars(String, String[]) 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected boolean logFoundJars(Vector v, String desc) 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null == v) || (v.size() < 1)) 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean errors = false; 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("#---- BEGIN Listing XML-related jars in: " + desc + " ----"); 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < v.size(); i++) 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Hashtable subhash = (Hashtable) v.elementAt(i); 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (Enumeration keys = subhash.keys(); 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson keys.hasMoreElements(); 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* no increment portion */ 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ) 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Object key = keys.nextElement(); 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String keyStr = (String) key; 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (keyStr.startsWith(ERROR)) 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson errors = true; 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg(keyStr + "=" + subhash.get(keyStr)); 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson errors = true; 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("Reading-" + key + "= threw: " + e.toString()); 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson logMsg("#----- END Listing XML-related jars in: " + desc + " -----"); 3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return errors; 3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Stylesheet extension entrypoint: Dump a basic Xalan 3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * environment report from getEnvironmentHash() to a Node. 3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Copy of writeEnvironmentReport that creates a Node suitable 4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for other processing instead of a properties-like text output. 4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </p> 4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param container Node to append our report to 4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param factory Document providing createElement, etc. services 4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param h Hash presumably from {@link #getEnvironmentHash()} 4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #writeEnvironmentReport(Hashtable) 4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for an equivalent that writes to a PrintWriter instead 4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void appendEnvironmentReport(Node container, Document factory, Hashtable h) 4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null == container) || (null == factory)) 4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Element envCheckNode = factory.createElement("EnvironmentCheck"); 4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson envCheckNode.setAttribute("version", "$Revision: 468646 $"); 4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson container.appendChild(envCheckNode); 4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == h) 4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Element statusNode = factory.createElement("status"); 4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson statusNode.setAttribute("result", "ERROR"); 4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson statusNode.appendChild(factory.createTextNode("appendEnvironmentReport called with null Hashtable!")); 4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson envCheckNode.appendChild(statusNode); 4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean errors = false; 4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Element hashNode = factory.createElement("environment"); 4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson envCheckNode.appendChild(hashNode); 4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (Enumeration keys = h.keys(); 4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson keys.hasMoreElements(); 4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* no increment portion */ 4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ) 4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Object key = keys.nextElement(); 4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String keyStr = (String) key; 4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Special processing for classes found.. 4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (keyStr.startsWith(FOUNDCLASSES)) 4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Vector v = (Vector) h.get(keyStr); 4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // errors |= logFoundJars(v, keyStr); 4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson errors |= appendFoundJars(hashNode, factory, v, keyStr); 4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // ..normal processing for all other entries 4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note: we could just check for the ERROR key by itself, 4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // since we now set that, but since we have to go 4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // through the whole hash anyway, do it this way, 4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // which is safer for maintenance 4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (keyStr.startsWith(ERROR)) 4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson errors = true; 4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Element node = factory.createElement("item"); 4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.setAttribute("key", keyStr); 4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.appendChild(factory.createTextNode((String)h.get(keyStr))); 4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson hashNode.appendChild(node); 4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson errors = true; 4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Element node = factory.createElement("item"); 4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.setAttribute("key", keyStr); 4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.appendChild(factory.createTextNode(ERROR + " Reading " + key + " threw: " + e.toString())); 4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson hashNode.appendChild(node); 4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } // end of for... 4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Element statusNode = factory.createElement("status"); 4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson statusNode.setAttribute("result", (errors ? "ERROR" : "OK" )); 4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson envCheckNode.appendChild(statusNode); 4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e2) 4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.err.println("appendEnvironmentReport threw: " + e2.toString()); 4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson e2.printStackTrace(); 4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Print out report of .jars found in a classpath. 4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Takes the information encoded from a checkPathForJars() 4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * call and dumps it out to our PrintWriter. 4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param container Node to append our report to 4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param factory Document providing createElement, etc. services 4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param v Vector of Hashtables of .jar file info 4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param desc description to print out in header 5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return false if OK, true if any .jars were reported 5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * as having errors 5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #checkPathForJars(String, String[]) 5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected boolean appendFoundJars(Node container, Document factory, 5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Vector v, String desc) 5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null == v) || (v.size() < 1)) 5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean errors = false; 5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < v.size(); i++) 5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Hashtable subhash = (Hashtable) v.elementAt(i); 5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (Enumeration keys = subhash.keys(); 5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson keys.hasMoreElements(); 5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* no increment portion */ 5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ) 5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Object key = keys.nextElement(); 5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String keyStr = (String) key; 5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (keyStr.startsWith(ERROR)) 5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson errors = true; 5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Element node = factory.createElement("foundJar"); 5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.setAttribute("name", keyStr.substring(0, keyStr.indexOf("-"))); 5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.setAttribute("desc", keyStr.substring(keyStr.indexOf("-") + 1)); 5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.appendChild(factory.createTextNode((String)subhash.get(keyStr))); 5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson container.appendChild(node); 5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson errors = true; 5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Element node = factory.createElement("foundJar"); 5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.appendChild(factory.createTextNode(ERROR + " Reading " + key + " threw: " + e.toString())); 5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson container.appendChild(node); 5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return errors; 5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Fillin hash with info about SystemProperties. 5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Logs java.class.path and other likely paths; then attempts 5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to search those paths for .jar files with Xalan-related classes. 5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * //@todo NOTE: We don't actually search java.ext.dirs for 5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * // *.jar files therein! This should be updated 5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param h Hashtable to put information in 5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #jarNames 5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #checkPathForJars(String, String[]) 5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void checkSystemProperties(Hashtable h) 5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == h) 5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h = new Hashtable(); 5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Grab java version for later use 5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String javaVersion = System.getProperty("java.version"); 5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put("java.version", javaVersion); 5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (SecurityException se) 5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // For applet context, etc. 5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put( 5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "java.version", 5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "WARNING: SecurityException thrown accessing system version properties"); 5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Printout jar files on classpath(s) that may affect operation 5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Do this in order 5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // This is present in all JVM's 5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String cp = System.getProperty("java.class.path"); 5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put("java.class.path", cp); 5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Vector classpathJars = checkPathForJars(cp, jarNames); 5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != classpathJars) 5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(FOUNDCLASSES + "java.class.path", classpathJars); 5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Also check for JDK 1.2+ type classpaths 6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String othercp = System.getProperty("sun.boot.class.path"); 6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != othercp) 6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put("sun.boot.class.path", othercp); 6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson classpathJars = checkPathForJars(othercp, jarNames); 6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != classpathJars) 6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(FOUNDCLASSES + "sun.boot.class.path", classpathJars); 6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //@todo NOTE: We don't actually search java.ext.dirs for 6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // *.jar files therein! This should be updated 6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson othercp = System.getProperty("java.ext.dirs"); 6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != othercp) 6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put("java.ext.dirs", othercp); 6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson classpathJars = checkPathForJars(othercp, jarNames); 6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != classpathJars) 6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(FOUNDCLASSES + "java.ext.dirs", classpathJars); 6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //@todo also check other System properties' paths? 6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // v2 = checkPathForJars(System.getProperty("sun.boot.library.path"), jarNames); // ?? may not be needed 6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // v3 = checkPathForJars(System.getProperty("java.library.path"), jarNames); // ?? may not be needed 6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (SecurityException se2) 6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // For applet context, etc. 6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put( 6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "java.class.path", 6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "WARNING: SecurityException thrown accessing system classpath properties"); 6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Cheap-o listing of specified .jars found in the classpath. 6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * cp should be separated by the usual File.pathSeparator. We 6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * then do a simplistic search of the path for any requested 6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * .jar filenames, and return a listing of their names and 6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * where (apparently) they came from. 6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param cp classpath to search 6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param jars array of .jar base filenames to look for 6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Vector of Hashtables filled with info about found .jars 6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #jarNames 6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #logFoundJars(Vector, String) 6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #appendFoundJars(Node, Document, Vector, String ) 6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getApparentVersion(String, long) 6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected Vector checkPathForJars(String cp, String[] jars) 6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null == cp) || (null == jars) || (0 == cp.length()) 6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson || (0 == jars.length)) 6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Vector v = new Vector(); 6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StringTokenizer st = new StringTokenizer(cp, File.pathSeparator); 6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (st.hasMoreTokens()) 6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Look at each classpath entry for each of our requested jarNames 6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String filename = st.nextToken(); 6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < jars.length; i++) 6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (filename.indexOf(jars[i]) > -1) 6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson File f = new File(filename); 6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (f.exists()) 6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If any requested jarName exists, report on 6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the details of that .jar file 6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Hashtable h = new Hashtable(2); 6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note "-" char is looked for in appendFoundJars 6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(jars[i] + "-path", f.getAbsolutePath()); 6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We won't bother reporting on the xalan.jar apparent version 6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // since this requires knowing the jar size of the xalan.jar 6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // before we build it. 6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // For other jars, eg. xml-apis.jar and xercesImpl.jar, we 6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // report the apparent version of the file we've found 6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!("xalan.jar".equalsIgnoreCase(jars[i]))) { 6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(jars[i] + "-apparent.version", 6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson getApparentVersion(jars[i], f.length())); 6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson v.addElement(h); 6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* no-op, don't add it */ 7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Hashtable h = new Hashtable(2); 7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note "-" char is looked for in appendFoundJars 7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(jars[i] + "-path", WARNING + " Classpath entry: " 7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson + filename + " does not exist"); 7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(jars[i] + "-apparent.version", CLASS_NOTPRESENT); 7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson v.addElement(h); 7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return v; 7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Cheap-o method to determine the product version of a .jar. 7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Currently does a lookup into a local table of some recent 7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * shipped Xalan builds to determine where the .jar probably 7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * came from. Note that if you recompile Xalan or Xerces 7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * yourself this will likely report a potential error, since 7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * we can't certify builds other than the ones we ship. 7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Only reports against selected posted Xalan-J builds. 7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * //@todo actually look up version info in manifests 7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param jarName base filename of the .jarfile 7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param jarSize size of the .jarfile 7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return String describing where the .jar file probably 7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * came from 7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected String getApparentVersion(String jarName, long jarSize) 7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we found a matching size and it's for our 7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // jar, then return it's description 7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Lookup in static jarVersions Hashtable 7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String foundSize = (String) jarVersions.get(new Long(jarSize)); 7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null != foundSize) && (foundSize.startsWith(jarName))) 7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return foundSize; 7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ("xerces.jar".equalsIgnoreCase(jarName) 7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson || "xercesImpl.jar".equalsIgnoreCase(jarName)) 7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// || "xalan.jar".equalsIgnoreCase(jarName)) 7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // For xalan.jar and xerces.jar/xercesImpl.jar, which we ship together: 7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // The jar is not from a shipped copy of xalan-j, so 7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // it's up to the user to ensure that it's compatible 7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return jarName + " " + WARNING + CLASS_PRESENT; 7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Otherwise, it's just a jar we don't have the version info calculated for 7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return jarName + " " + CLASS_PRESENT; 7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Report version information about JAXP interfaces. 7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Currently distinguishes between JAXP 1.0.1 and JAXP 1.1, 7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * and not found; only tests the interfaces, and does not 7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * check for reference implementation versions. 7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param h Hashtable to put information in 7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void checkJAXPVersion(Hashtable h) 7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == h) 7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h = new Hashtable(); 7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final Class noArgs[] = new Class[0]; 7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = null; 7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String JAXP1_CLASS = "javax.xml.parsers.DocumentBuilder"; 7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String JAXP11_METHOD = "getDOMImplementation"; 7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson clazz = ObjectFactory.findProviderClass( 7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson JAXP1_CLASS, ObjectFactory.findClassLoader(), true); 7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Method method = clazz.getMethod(JAXP11_METHOD, noArgs); 7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we succeeded, we at least have JAXP 1.1 available 8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "JAXP", "1.1 or higher"); 8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != clazz) 8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We must have found the class itself, just not the 8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // method, so we (probably) have JAXP 1.0.1 8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR + VERSION + "JAXP", "1.0.1"); 8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR, ERROR_FOUND); 8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We couldn't even find the class, and don't have 8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // any JAXP support at all, or only have the 8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // transform half of it 8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR + VERSION + "JAXP", CLASS_NOTPRESENT); 8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR, ERROR_FOUND); 8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Report product version information from Xalan-J. 8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Looks for version info in xalan.jar from Xalan-J products. 8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param h Hashtable to put information in 8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void checkProcessorVersion(Hashtable h) 8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == h) 8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h = new Hashtable(); 8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String XALAN1_VERSION_CLASS = 8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "org.apache.xalan.xslt.XSLProcessorVersion"; 8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XALAN1_VERSION_CLASS, ObjectFactory.findClassLoader(), true); 8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Found Xalan-J 1.x, grab it's version fields 8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StringBuffer buf = new StringBuffer(); 8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Field f = clazz.getField("PRODUCT"); 8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(f.get(null)); 8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(';'); 8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson f = clazz.getField("LANGUAGE"); 8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(f.get(null)); 8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(';'); 8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson f = clazz.getField("S_VERSION"); 8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(f.get(null)); 8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(';'); 8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xalan1", buf.toString()); 8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e1) 8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xalan1", CLASS_NOTPRESENT); 8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // NOTE: This is the old Xalan 2.0, 2.1, 2.2 version class, 8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // is being replaced by class below 8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String XALAN2_VERSION_CLASS = 8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "org.apache.xalan.processor.XSLProcessorVersion"; 8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XALAN2_VERSION_CLASS, ObjectFactory.findClassLoader(), true); 8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Found Xalan-J 2.x, grab it's version fields 8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StringBuffer buf = new StringBuffer(); 8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Field f = clazz.getField("S_VERSION"); 8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(f.get(null)); 8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xalan2x", buf.toString()); 8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e2) 8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xalan2x", CLASS_NOTPRESENT); 8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // NOTE: This is the new Xalan 2.2+ version class 8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String XALAN2_2_VERSION_CLASS = 8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "org.apache.xalan.Version"; 8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String XALAN2_2_VERSION_METHOD = "getVersion"; 8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final Class noArgs[] = new Class[0]; 8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XALAN2_2_VERSION_CLASS, ObjectFactory.findClassLoader(), true); 8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Method method = clazz.getMethod(XALAN2_2_VERSION_METHOD, noArgs); 9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Object returnValue = method.invoke(null, new Object[0]); 9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xalan2_2", (String)returnValue); 9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e2) 9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xalan2_2", CLASS_NOTPRESENT); 9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Report product version information from common parsers. 9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Looks for version info in xerces.jar/xercesImpl.jar/crimson.jar. 9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * //@todo actually look up version info in crimson manifest 9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param h Hashtable to put information in 9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void checkParserVersion(Hashtable h) 9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == h) 9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h = new Hashtable(); 9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String XERCES1_VERSION_CLASS = "org.apache.xerces.framework.Version"; 9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XERCES1_VERSION_CLASS, ObjectFactory.findClassLoader(), true); 9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Found Xerces-J 1.x, grab it's version fields 9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Field f = clazz.getField("fVersion"); 9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String parserVersion = (String) f.get(null); 9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xerces1", parserVersion); 9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xerces1", CLASS_NOTPRESENT); 9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Look for xerces1 and xerces2 parsers separately 9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String XERCES2_VERSION_CLASS = "org.apache.xerces.impl.Version"; 9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XERCES2_VERSION_CLASS, ObjectFactory.findClassLoader(), true); 9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Found Xerces-J 2.x, grab it's version fields 9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Field f = clazz.getField("fVersion"); 9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String parserVersion = (String) f.get(null); 9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xerces2", parserVersion); 9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "xerces2", CLASS_NOTPRESENT); 9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String CRIMSON_CLASS = "org.apache.crimson.parser.Parser2"; 9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson CRIMSON_CLASS, ObjectFactory.findClassLoader(), true); 9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //@todo determine specific crimson version 9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "crimson", CLASS_PRESENT); 9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "crimson", CLASS_NOTPRESENT); 9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Report product version information from Ant. 9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param h Hashtable to put information in 9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void checkAntVersion(Hashtable h) 9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == h) 9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h = new Hashtable(); 9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String ANT_VERSION_CLASS = "org.apache.tools.ant.Main"; 9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String ANT_VERSION_METHOD = "getAntVersion"; // noArgs 9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final Class noArgs[] = new Class[0]; 9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ANT_VERSION_CLASS, ObjectFactory.findClassLoader(), true); 9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Method method = clazz.getMethod(ANT_VERSION_METHOD, noArgs); 10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Object returnValue = method.invoke(null, new Object[0]); 10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "ant", (String)returnValue); 10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "ant", CLASS_NOTPRESENT); 10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Report version info from DOM interfaces. 10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Currently distinguishes between pre-DOM level 2, the DOM 10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * level 2 working draft, the DOM level 2 final draft, 10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * and not found. 10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param h Hashtable to put information in 10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void checkDOMVersion(Hashtable h) 10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == h) 10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h = new Hashtable(); 10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String DOM_LEVEL2_CLASS = "org.w3c.dom.Document"; 10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String DOM_LEVEL2_METHOD = "createElementNS"; // String, String 10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String DOM_LEVEL2WD_CLASS = "org.w3c.dom.Node"; 10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String DOM_LEVEL2WD_METHOD = "supported"; // String, String 10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String DOM_LEVEL2FD_CLASS = "org.w3c.dom.Node"; 10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String DOM_LEVEL2FD_METHOD = "isSupported"; // String, String 10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final Class twoStringArgs[] = { java.lang.String.class, 10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson java.lang.String.class }; 10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DOM_LEVEL2_CLASS, ObjectFactory.findClassLoader(), true); 10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Method method = clazz.getMethod(DOM_LEVEL2_METHOD, twoStringArgs); 10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we succeeded, we have loaded interfaces from a 10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // level 2 DOM somewhere 10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "DOM", "2.0"); 10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Check for the working draft version, which is 10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // commonly found, but won't work anymore 10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson clazz = ObjectFactory.findProviderClass( 10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DOM_LEVEL2WD_CLASS, ObjectFactory.findClassLoader(), true); 10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson method = clazz.getMethod(DOM_LEVEL2WD_METHOD, twoStringArgs); 10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR + VERSION + "DOM.draftlevel", "2.0wd"); 10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR, ERROR_FOUND); 10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e2) 10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Check for the final draft version as well 10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson clazz = ObjectFactory.findProviderClass( 10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DOM_LEVEL2FD_CLASS, ObjectFactory.findClassLoader(), true); 10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson method = clazz.getMethod(DOM_LEVEL2FD_METHOD, twoStringArgs); 10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "DOM.draftlevel", "2.0fd"); 10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e3) 10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR + VERSION + "DOM.draftlevel", "2.0unknown"); 10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR, ERROR_FOUND); 10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR + VERSION + "DOM", 10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "ERROR attempting to load DOM level 2 class: " + e.toString()); 10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR, ERROR_FOUND); 10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //@todo load an actual DOM implmementation and query it as well 10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //@todo load an actual DOM implmementation and check if 10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // isNamespaceAware() == true, which is needed to parse 10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // xsl stylesheet files into a DOM 10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Report version info from SAX interfaces. 10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Currently distinguishes between SAX 2, SAX 2.0beta2, 10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * SAX1, and not found. 10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param h Hashtable to put information in 10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void checkSAXVersion(Hashtable h) 10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == h) 11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h = new Hashtable(); 11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String SAX_VERSION1_CLASS = "org.xml.sax.Parser"; 11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String SAX_VERSION1_METHOD = "parse"; // String 11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String SAX_VERSION2_CLASS = "org.xml.sax.XMLReader"; 11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String SAX_VERSION2_METHOD = "parse"; // String 11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String SAX_VERSION2BETA_CLASSNF = "org.xml.sax.helpers.AttributesImpl"; 11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String SAX_VERSION2BETA_METHODNF = "setAttributes"; // Attributes 11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final Class oneStringArg[] = { java.lang.String.class }; 11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note this introduces a minor compile dependency on SAX... 11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final Class attributesArg[] = { org.xml.sax.Attributes.class }; 11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // This method was only added in the final SAX 2.0 release; 11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // see changes.html "Changes from SAX 2.0beta2 to SAX 2.0prerelease" 11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson SAX_VERSION2BETA_CLASSNF, ObjectFactory.findClassLoader(), true); 11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Method method = clazz.getMethod(SAX_VERSION2BETA_METHODNF, attributesArg); 11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we succeeded, we have loaded interfaces from a 11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // real, final SAX version 2.0 somewhere 11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "SAX", "2.0"); 11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we didn't find the SAX 2.0 class, look for a 2.0beta2 11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR + VERSION + "SAX", 11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "ERROR attempting to load SAX version 2 class: " + e.toString()); 11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR, ERROR_FOUND); 11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson SAX_VERSION2_CLASS, ObjectFactory.findClassLoader(), true); 11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Method method = clazz.getMethod(SAX_VERSION2_METHOD, oneStringArg); 11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we succeeded, we have loaded interfaces from a 11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // SAX version 2.0beta2 or earlier; these might work but 11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // you should really have the final SAX 2.0 11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "SAX-backlevel", "2.0beta2-or-earlier"); 11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e2) 11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we didn't find the SAX 2.0beta2 class, look for a 1.0 one 11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR + VERSION + "SAX", 11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "ERROR attempting to load SAX version 2 class: " + e.toString()); 11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR, ERROR_FOUND); 11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Class clazz = ObjectFactory.findProviderClass( 11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson SAX_VERSION1_CLASS, ObjectFactory.findClassLoader(), true); 11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Method method = clazz.getMethod(SAX_VERSION1_METHOD, oneStringArg); 11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we succeeded, we have loaded interfaces from a 11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // SAX version 1.0 somewhere; which won't work very 11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // well for JAXP 1.1 or beyond! 11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(VERSION + "SAX-backlevel", "1.0"); 11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e3) 11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we didn't find the SAX 2.0 class, look for a 1.0 one 11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note that either 1.0 or no SAX are both errors 11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h.put(ERROR + VERSION + "SAX-backlevel", 11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "ERROR attempting to load SAX version 1 class: " + e3.toString()); 11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Manual table of known .jar sizes. 11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Only includes shipped versions of certain projects. 11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * key=jarsize, value=jarname ' from ' distro name 11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note assumption: two jars cannot have the same size! 11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getApparentVersion(String, long) 11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private static Hashtable jarVersions = new Hashtable(); 11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Static initializer for jarVersions table. 11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Doing this just once saves time and space. 11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getApparentVersion(String, long) 11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static 11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note: hackish Hashtable, this could use improvement 11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(857192), "xalan.jar from xalan-j_1_1"); 11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(440237), "xalan.jar from xalan-j_1_2"); 11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(436094), "xalan.jar from xalan-j_1_2_1"); 11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(426249), "xalan.jar from xalan-j_1_2_2"); 11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(702536), "xalan.jar from xalan-j_2_0_0"); 12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(720930), "xalan.jar from xalan-j_2_0_1"); 12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(732330), "xalan.jar from xalan-j_2_1_0"); 12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(872241), "xalan.jar from xalan-j_2_2_D10"); 12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(882739), "xalan.jar from xalan-j_2_2_D11"); 12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(923866), "xalan.jar from xalan-j_2_2_0"); 12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(905872), "xalan.jar from xalan-j_2_3_D1"); 12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(906122), "xalan.jar from xalan-j_2_3_0"); 12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(906248), "xalan.jar from xalan-j_2_3_1"); 12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(983377), "xalan.jar from xalan-j_2_4_D1"); 12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(997276), "xalan.jar from xalan-j_2_4_0"); 12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1031036), "xalan.jar from xalan-j_2_4_1"); 12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Stop recording xalan.jar sizes as of Xalan Java 2.5.0 12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(596540), "xsltc.jar from xalan-j_2_2_0"); 12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(590247), "xsltc.jar from xalan-j_2_3_D1"); 12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(589914), "xsltc.jar from xalan-j_2_3_0"); 12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(589915), "xsltc.jar from xalan-j_2_3_1"); 12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1306667), "xsltc.jar from xalan-j_2_4_D1"); 12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1328227), "xsltc.jar from xalan-j_2_4_0"); 12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1344009), "xsltc.jar from xalan-j_2_4_1"); 12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1348361), "xsltc.jar from xalan-j_2_5_D1"); 12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Stop recording xsltc.jar sizes as of Xalan Java 2.5.0 12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1268634), "xsltc.jar-bundled from xalan-j_2_3_0"); 12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(100196), "xml-apis.jar from xalan-j_2_2_0 or xalan-j_2_3_D1"); 12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(108484), "xml-apis.jar from xalan-j_2_3_0, or xalan-j_2_3_1 from xml-commons-1.0.b2"); 12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(109049), "xml-apis.jar from xalan-j_2_4_0 from xml-commons RIVERCOURT1 branch"); 12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(113749), "xml-apis.jar from xalan-j_2_4_1 from factoryfinder-build of xml-commons RIVERCOURT1"); 12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(124704), "xml-apis.jar from tck-jaxp-1_2_0 branch of xml-commons"); 12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(124724), "xml-apis.jar from tck-jaxp-1_2_0 branch of xml-commons, tag: xml-commons-external_1_2_01"); 12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(194205), "xml-apis.jar from head branch of xml-commons, tag: xml-commons-external_1_3_02"); 12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If the below were more common I would update it to report 12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // errors better; but this is so old hardly anyone has it 12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(424490), "xalan.jar from Xerces Tools releases - ERROR:DO NOT USE!"); 12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1591855), "xerces.jar from xalan-j_1_1 from xerces-1..."); 12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1498679), "xerces.jar from xalan-j_1_2 from xerces-1_2_0.bin"); 12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1484896), "xerces.jar from xalan-j_1_2_1 from xerces-1_2_1.bin"); 12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(804460), "xerces.jar from xalan-j_1_2_2 from xerces-1_2_2.bin"); 12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1499244), "xerces.jar from xalan-j_2_0_0 from xerces-1_2_3.bin"); 12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1605266), "xerces.jar from xalan-j_2_0_1 from xerces-1_3_0.bin"); 12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(904030), "xerces.jar from xalan-j_2_1_0 from xerces-1_4.bin"); 12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(904030), "xerces.jar from xerces-1_4_0.bin"); 12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1802885), "xerces.jar from xerces-1_4_2.bin"); 12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1734594), "xerces.jar from Xerces-J-bin.2.0.0.beta3"); 12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1808883), "xerces.jar from xalan-j_2_2_D10,D11,D12 or xerces-1_4_3.bin"); 12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1812019), "xerces.jar from xalan-j_2_2_0"); 12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1720292), "xercesImpl.jar from xalan-j_2_3_D1"); 12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1730053), "xercesImpl.jar from xalan-j_2_3_0 or xalan-j_2_3_1 from xerces-2_0_0"); 12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1728861), "xercesImpl.jar from xalan-j_2_4_D1 from xerces-2_0_1"); 12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(972027), "xercesImpl.jar from xalan-j_2_4_0 from xerces-2_1"); 12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(831587), "xercesImpl.jar from xalan-j_2_4_1 from xerces-2_2"); 12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(891817), "xercesImpl.jar from xalan-j_2_5_D1 from xerces-2_3"); 12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(895924), "xercesImpl.jar from xerces-2_4"); 12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1010806), "xercesImpl.jar from Xerces-J-bin.2.6.2"); 12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(1203860), "xercesImpl.jar from Xerces-J-bin.2.7.1"); 12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(37485), "xalanj1compat.jar from xalan-j_2_0_0"); 12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(38100), "xalanj1compat.jar from xalan-j_2_0_1"); 12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(18779), "xalanservlet.jar from xalan-j_2_0_0"); 12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(21453), "xalanservlet.jar from xalan-j_2_0_1"); 12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(24826), "xalanservlet.jar from xalan-j_2_3_1 or xalan-j_2_4_1"); 12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(24831), "xalanservlet.jar from xalan-j_2_4_1"); 12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Stop recording xalanservlet.jar sizes as of Xalan Java 2.5.0; now a .war file 12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // For those who've downloaded JAXP from sun 12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(5618), "jaxp.jar from jaxp1.0.1"); 12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(136133), "parser.jar from jaxp1.0.1"); 12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(28404), "jaxp.jar from jaxp-1.1"); 12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(187162), "crimson.jar from jaxp-1.1"); 12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(801714), "xalan.jar from jaxp-1.1"); 12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(196399), "crimson.jar from crimson-1.1.1"); 12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(33323), "jaxp.jar from crimson-1.1.1 or jakarta-ant-1.4.1b1"); 12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(152717), "crimson.jar from crimson-1.1.2beta2"); 12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(88143), "xml-apis.jar from crimson-1.1.2beta2"); 12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(206384), "crimson.jar from crimson-1.1.3 or jakarta-ant-1.4.1b1"); 12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // jakarta-ant: since many people use ant these days 12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(136198), "parser.jar from jakarta-ant-1.3 or 1.2"); 12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson jarVersions.put(new Long(5537), "jaxp.jar from jakarta-ant-1.3 or 1.2"); 12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Simple PrintWriter we send output to; defaults to System.out. */ 12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected PrintWriter outWriter = new PrintWriter(System.out, true); 12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Bottleneck output: calls outWriter.println(s). 12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param s String to print 12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void logMsg(String s) 12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson outWriter.println(s); 12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 1297