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 *    &lt;?xml version="1.0"?&gt;
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *    &lt;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"&gt;
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *    &lt;xsl:output indent="yes"/&gt;
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *    &lt;xsl:template match="/"&gt;
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *      &lt;xsl:copy-of select="xalan:checkEnvironment()"/&gt;
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *    &lt;/xsl:template&gt;
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *    &lt;/xsl:stylesheet&gt;
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