/**
   * Report version info from DOM interfaces.
   *
   * <p>Currently distinguishes between pre-DOM level 2, the DOM level 2 working draft, the DOM
   * level 2 final draft, and not found.
   *
   * @param h Hashtable to put information in
   */
  protected void checkDOMVersion(Hashtable h) {

    if (null == h) h = new Hashtable();

    final String DOM_LEVEL2_CLASS = "org.w3c.dom.Document";
    final String DOM_LEVEL2_METHOD = "createElementNS"; // String, String
    final String DOM_LEVEL3_METHOD = "getDoctype"; // no parameter
    final String DOM_LEVEL2WD_CLASS = "org.w3c.dom.Node";
    final String DOM_LEVEL2WD_METHOD = "supported"; // String, String
    final String DOM_LEVEL2FD_CLASS = "org.w3c.dom.Node";
    final String DOM_LEVEL2FD_METHOD = "isSupported"; // String, String
    final Class twoStringArgs[] = {java.lang.String.class, java.lang.String.class};

    try {
      Class clazz = ObjectFactory.findProviderClass(DOM_LEVEL2_CLASS, true);

      Method method = clazz.getMethod(DOM_LEVEL2_METHOD, twoStringArgs);

      // If we succeeded, we have loaded interfaces from a
      //  level 2 DOM somewhere
      h.put(VERSION + "DOM", "2.0");

      try {
        // Check for the working draft version, which is
        //  commonly found, but won't work anymore
        clazz = ObjectFactory.findProviderClass(DOM_LEVEL2WD_CLASS, true);

        method = clazz.getMethod(DOM_LEVEL2WD_METHOD, twoStringArgs);

        h.put(ERROR + VERSION + "DOM.draftlevel", "2.0wd");
        h.put(ERROR, ERROR_FOUND);
      } catch (Exception e2) {
        try {
          // Check for the final draft version as well
          clazz = ObjectFactory.findProviderClass(DOM_LEVEL2FD_CLASS, true);

          method = clazz.getMethod(DOM_LEVEL2FD_METHOD, twoStringArgs);

          h.put(VERSION + "DOM.draftlevel", "2.0fd");
        } catch (Exception e3) {
          h.put(ERROR + VERSION + "DOM.draftlevel", "2.0unknown");
          h.put(ERROR, ERROR_FOUND);
        }
      }
    } catch (Exception e) {
      h.put(ERROR + VERSION + "DOM", "ERROR attempting to load DOM level 2 class: " + e.toString());
      h.put(ERROR, ERROR_FOUND);
    }

    // @todo load an actual DOM implmementation and query it as well
    // @todo load an actual DOM implmementation and check if
    //  isNamespaceAware() == true, which is needed to parse
    //  xsl stylesheet files into a DOM
  }
  /**
   * Report product version information from common parsers.
   *
   * <p>Looks for version info in xerces.jar/xercesImpl.jar/crimson.jar.
   *
   * <p>//@todo actually look up version info in crimson manifest
   *
   * @param h Hashtable to put information in
   */
  protected void checkParserVersion(Hashtable h) {

    if (null == h) h = new Hashtable();

    try {
      final String XERCES1_VERSION_CLASS = "com.sun.org.apache.xerces.internal.framework.Version";

      Class clazz = ObjectFactory.findProviderClass(XERCES1_VERSION_CLASS, true);

      // Found Xerces-J 1.x, grab it's version fields
      Field f = clazz.getField("fVersion");
      String parserVersion = (String) f.get(null);

      h.put(VERSION + "xerces1", parserVersion);
    } catch (Exception e) {
      h.put(VERSION + "xerces1", CLASS_NOTPRESENT);
    }

    // Look for xerces1 and xerces2 parsers separately
    try {
      final String XERCES2_VERSION_CLASS = "com.sun.org.apache.xerces.internal.impl.Version";

      Class clazz = ObjectFactory.findProviderClass(XERCES2_VERSION_CLASS, true);

      // Found Xerces-J 2.x, grab it's version fields
      Field f = clazz.getField("fVersion");
      String parserVersion = (String) f.get(null);

      h.put(VERSION + "xerces2", parserVersion);
    } catch (Exception e) {
      h.put(VERSION + "xerces2", CLASS_NOTPRESENT);
    }

    try {
      final String CRIMSON_CLASS = "org.apache.crimson.parser.Parser2";

      Class clazz = ObjectFactory.findProviderClass(CRIMSON_CLASS, true);

      // @todo determine specific crimson version
      h.put(VERSION + "crimson", CLASS_PRESENT);
    } catch (Exception e) {
      h.put(VERSION + "crimson", CLASS_NOTPRESENT);
    }
  }
  /**
   * Report version information about JAXP interfaces.
   *
   * <p>Currently distinguishes between JAXP 1.0.1 and JAXP 1.1, and not found; only tests the
   * interfaces, and does not check for reference implementation versions.
   *
   * @param h Hashtable to put information in
   */
  protected void checkJAXPVersion(Hashtable h) {

    if (null == h) h = new Hashtable();

    Class clazz = null;

    try {
      final String JAXP1_CLASS = "javax.xml.stream.XMLStreamConstants";

      clazz = ObjectFactory.findProviderClass(JAXP1_CLASS, true);

      // If we succeeded, we have JAXP 1.4 available
      h.put(VERSION + "JAXP", "1.4");
    } catch (Exception e) {
      h.put(ERROR + VERSION + "JAXP", "1.3");
      h.put(ERROR, ERROR_FOUND);
    }
  }
  /**
   * Report product version information from Ant.
   *
   * @param h Hashtable to put information in
   */
  protected void checkAntVersion(Hashtable h) {

    if (null == h) h = new Hashtable();

    try {
      final String ANT_VERSION_CLASS = "org.apache.tools.ant.Main";
      final String ANT_VERSION_METHOD = "getAntVersion"; // noArgs
      final Class noArgs[] = new Class[0];

      Class clazz = ObjectFactory.findProviderClass(ANT_VERSION_CLASS, true);

      Method method = clazz.getMethod(ANT_VERSION_METHOD, noArgs);
      Object returnValue = method.invoke(null, new Object[0]);

      h.put(VERSION + "ant", (String) returnValue);
    } catch (Exception e) {
      h.put(VERSION + "ant", CLASS_NOTPRESENT);
    }
  }
  /**
   * Report version info from DOM interfaces.
   *
   * @param h Hashtable to put information in
   */
  protected boolean checkDOML3(Hashtable h) {

    if (null == h) h = new Hashtable();

    final String DOM_CLASS = "org.w3c.dom.Document";
    final String DOM_LEVEL3_METHOD = "getDoctype"; // no parameter

    try {
      Class clazz = ObjectFactory.findProviderClass(DOM_CLASS, true);

      Method method = clazz.getMethod(DOM_LEVEL3_METHOD, (Class<?>[]) null);

      // If we succeeded, we have loaded interfaces from a
      //  level 3 DOM somewhere
      h.put(VERSION + "DOM", "3.0");
      return true;
    } catch (Exception e) {
      return false;
    }
  }
 /*     */ public final void initialize(int node, int last, DOM dom, SortSettings settings)
     /*     */ throws TransletException
       /*     */ {
   /* 104 */ this._dom = dom;
   /* 105 */ this._node = node;
   /* 106 */ this._last = last;
   /* 107 */ this._settings = settings;
   /*     */
   /* 109 */ int levels = settings.getSortOrders().length;
   /* 110 */ this._values = new Object[levels];
   /*     */
   /* 112 */ String colFactClassname = null;
   /*     */ try
   /*     */ {
     /* 115 */ colFactClassname =
         SecuritySupport.getSystemProperty(
             "com.sun.org.apache.xalan.internal.xsltc.COLLATOR_FACTORY");
     /*     */ }
   /*     */ catch (SecurityException e)
   /*     */ {
     /*     */ }
   /*     */
   /* 122 */ if (colFactClassname != null) {
     /*     */ try {
       /* 124 */ Object candObj = ObjectFactory.findProviderClass(colFactClassname, true);
       /* 125 */ this._collatorFactory = ((CollatorFactory) candObj);
       /*     */ } catch (ClassNotFoundException e) {
       /* 127 */ throw new TransletException(e);
       /*     */ }
     /* 129 */ Locale[] locales = settings.getLocales();
     /* 130 */ this._collators = new Collator[levels];
     /* 131 */ for (int i = 0; i < levels; i++) {
       /* 132 */ this._collators[i] = this._collatorFactory.getCollator(locales[i]);
       /*     */ }
     /* 134 */ this._collator = this._collators[0];
     /*     */ } else {
     /* 136 */ this._collators = settings.getCollators();
     /* 137 */ this._collator = this._collators[0];
     /*     */ }
   /*     */ }
  /**
   * Returns a serializer for the specified output method. The output method is specified by the
   * value of the property associated with the "method" key. If no implementation exists that
   * supports the specified output method an exception of some type will be thrown. For a list of
   * the output "method" key values see {@link Method}.
   *
   * @param format The output format, minimally the "method" property must be set.
   * @return A suitable serializer.
   * @throws IllegalArgumentException if method is null or an appropriate serializer can't be found
   * @throws Exception if the class for the serializer is found but does not implement
   *     ContentHandler.
   * @throws WrappedRuntimeException if an exception is thrown while trying to find serializer
   */
  public static Serializer getSerializer(Properties format) {
    Serializer ser;

    try {
      String method = format.getProperty(OutputKeys.METHOD);

      if (method == null) {
        String msg =
            Utils.messages.createMessage(
                MsgKey.ER_FACTORY_PROPERTY_MISSING, new Object[] {OutputKeys.METHOD});
        throw new IllegalArgumentException(msg);
      }

      String className = format.getProperty(OutputPropertiesFactory.S_KEY_CONTENT_HANDLER);

      if (null == className) {
        // Missing Content Handler property, load default using OutputPropertiesFactory
        Properties methodDefaults = OutputPropertiesFactory.getDefaultMethodProperties(method);
        className = methodDefaults.getProperty(OutputPropertiesFactory.S_KEY_CONTENT_HANDLER);
        if (null == className) {
          String msg =
              Utils.messages.createMessage(
                  MsgKey.ER_FACTORY_PROPERTY_MISSING,
                  new Object[] {OutputPropertiesFactory.S_KEY_CONTENT_HANDLER});
          throw new IllegalArgumentException(msg);
        }
      }

      Class cls = ObjectFactory.findProviderClass(className, true);

      // _serializers.put(method, cls);

      Object obj = cls.newInstance();

      if (obj instanceof SerializationHandler) {
        // this is one of the supplied serializers
        ser = (Serializer) cls.newInstance();
        ser.setOutputFormat(format);
      } else {
        /*
         *  This  must be a user defined Serializer.
         *  It had better implement ContentHandler.
         */
        if (obj instanceof ContentHandler) {

          /*
           * The user defined serializer defines ContentHandler,
           * but we need to wrap it with ToXMLSAXHandler which
           * will collect SAX-like events and emit true
           * SAX ContentHandler events to the users handler.
           */
          className = SerializerConstants.DEFAULT_SAX_SERIALIZER;
          cls = ObjectFactory.findProviderClass(className, true);
          SerializationHandler sh = (SerializationHandler) cls.newInstance();
          sh.setContentHandler((ContentHandler) obj);
          sh.setOutputFormat(format);

          ser = sh;
        } else {
          // user defined serializer does not implement
          // ContentHandler, ... very bad
          throw new Exception(
              Utils.messages.createMessage(
                  MsgKey.ER_SERIALIZER_NOT_CONTENTHANDLER, new Object[] {className}));
        }
      }
    } catch (Exception e) {
      throw new com.sun.org.apache.xml.internal.serializer.utils.WrappedRuntimeException(e);
    }

    // If we make it to here ser is not null.
    return ser;
  }
  /**
   * Report version info from SAX interfaces.
   *
   * <p>Currently distinguishes between SAX 2, SAX 2.0beta2, SAX1, and not found.
   *
   * @param h Hashtable to put information in
   */
  protected void checkSAXVersion(Hashtable h) {

    if (null == h) h = new Hashtable();

    final String SAX_VERSION1_CLASS = "org.xml.sax.Parser";
    final String SAX_VERSION1_METHOD = "parse"; // String
    final String SAX_VERSION2_CLASS = "org.xml.sax.XMLReader";
    final String SAX_VERSION2_METHOD = "parse"; // String
    final String SAX_VERSION2BETA_CLASSNF = "org.xml.sax.helpers.AttributesImpl";
    final String SAX_VERSION2BETA_METHODNF = "setAttributes"; // Attributes
    final Class oneStringArg[] = {java.lang.String.class};
    // Note this introduces a minor compile dependency on SAX...
    final Class attributesArg[] = {org.xml.sax.Attributes.class};

    try {
      // This method was only added in the final SAX 2.0 release;
      //  see changes.html "Changes from SAX 2.0beta2 to SAX 2.0prerelease"
      Class clazz = ObjectFactory.findProviderClass(SAX_VERSION2BETA_CLASSNF, true);

      Method method = clazz.getMethod(SAX_VERSION2BETA_METHODNF, attributesArg);

      // If we succeeded, we have loaded interfaces from a
      //  real, final SAX version 2.0 somewhere
      h.put(VERSION + "SAX", "2.0");
    } catch (Exception e) {
      // If we didn't find the SAX 2.0 class, look for a 2.0beta2
      h.put(
          ERROR + VERSION + "SAX", "ERROR attempting to load SAX version 2 class: " + e.toString());
      h.put(ERROR, ERROR_FOUND);

      try {
        Class clazz = ObjectFactory.findProviderClass(SAX_VERSION2_CLASS, true);

        Method method = clazz.getMethod(SAX_VERSION2_METHOD, oneStringArg);

        // If we succeeded, we have loaded interfaces from a
        //  SAX version 2.0beta2 or earlier; these might work but
        //  you should really have the final SAX 2.0
        h.put(VERSION + "SAX-backlevel", "2.0beta2-or-earlier");
      } catch (Exception e2) {
        // If we didn't find the SAX 2.0beta2 class, look for a 1.0 one
        h.put(
            ERROR + VERSION + "SAX",
            "ERROR attempting to load SAX version 2 class: " + e.toString());
        h.put(ERROR, ERROR_FOUND);

        try {
          Class clazz = ObjectFactory.findProviderClass(SAX_VERSION1_CLASS, true);

          Method method = clazz.getMethod(SAX_VERSION1_METHOD, oneStringArg);

          // If we succeeded, we have loaded interfaces from a
          //  SAX version 1.0 somewhere; which won't work very
          //  well for JAXP 1.1 or beyond!
          h.put(VERSION + "SAX-backlevel", "1.0");
        } catch (Exception e3) {
          // If we didn't find the SAX 2.0 class, look for a 1.0 one
          // Note that either 1.0 or no SAX are both errors
          h.put(
              ERROR + VERSION + "SAX-backlevel",
              "ERROR attempting to load SAX version 1 class: " + e3.toString());
        }
      }
    }
  }
  /**
   * Report product version information from Xalan-J.
   *
   * <p>Looks for version info in xalan.jar from Xalan-J products.
   *
   * @param h Hashtable to put information in
   */
  protected void checkProcessorVersion(Hashtable h) {

    if (null == h) h = new Hashtable();

    try {
      final String XALAN1_VERSION_CLASS =
          "com.sun.org.apache.xalan.internal.xslt.XSLProcessorVersion";

      Class clazz = ObjectFactory.findProviderClass(XALAN1_VERSION_CLASS, true);

      // Found Xalan-J 1.x, grab it's version fields
      StringBuffer buf = new StringBuffer();
      Field f = clazz.getField("PRODUCT");

      buf.append(f.get(null));
      buf.append(';');

      f = clazz.getField("LANGUAGE");

      buf.append(f.get(null));
      buf.append(';');

      f = clazz.getField("S_VERSION");

      buf.append(f.get(null));
      buf.append(';');
      h.put(VERSION + "xalan1", buf.toString());
    } catch (Exception e1) {
      h.put(VERSION + "xalan1", CLASS_NOTPRESENT);
    }

    try {
      // NOTE: This is the old Xalan 2.0, 2.1, 2.2 version class,
      //    is being replaced by class below
      final String XALAN2_VERSION_CLASS =
          "com.sun.org.apache.xalan.internal.processor.XSLProcessorVersion";

      Class clazz = ObjectFactory.findProviderClass(XALAN2_VERSION_CLASS, true);

      // Found Xalan-J 2.x, grab it's version fields
      StringBuffer buf = new StringBuffer();
      Field f = clazz.getField("S_VERSION");
      buf.append(f.get(null));

      h.put(VERSION + "xalan2x", buf.toString());
    } catch (Exception e2) {
      h.put(VERSION + "xalan2x", CLASS_NOTPRESENT);
    }
    try {
      // NOTE: This is the new Xalan 2.2+ version class
      final String XALAN2_2_VERSION_CLASS = "com.sun.org.apache.xalan.internal.Version";
      final String XALAN2_2_VERSION_METHOD = "getVersion";
      final Class noArgs[] = new Class[0];

      Class clazz = ObjectFactory.findProviderClass(XALAN2_2_VERSION_CLASS, true);

      Method method = clazz.getMethod(XALAN2_2_VERSION_METHOD, noArgs);
      Object returnValue = method.invoke(null, new Object[0]);

      h.put(VERSION + "xalan2_2", (String) returnValue);
    } catch (Exception e2) {
      h.put(VERSION + "xalan2_2", CLASS_NOTPRESENT);
    }
  }
 /*     */ private void doTransform() {
   /*     */ try {
     /* 101 */ Class clazz = ObjectFactory.findProviderClass(this._className, true);
     /* 102 */ AbstractTranslet translet = (AbstractTranslet) clazz.newInstance();
     /* 103 */ translet.postInitialization();
     /*     */
     /* 106 */ SAXParserFactory factory = SAXParserFactory.newInstance();
     /*     */ try {
       /* 108 */ factory.setFeature("http://xml.org/sax/features/namespaces", true);
       /*     */ }
     /*     */ catch (Exception e) {
       /* 111 */ factory.setNamespaceAware(true);
       /*     */ }
     /* 113 */ SAXParser parser = factory.newSAXParser();
     /* 114 */ XMLReader reader = parser.getXMLReader();
     /*     */
     /* 117 */ XSLTCDTMManager dtmManager =
         (XSLTCDTMManager) XSLTCDTMManager.getDTMManagerClass().newInstance();
     /*     */ DTMWSFilter wsfilter;
     /*     */ DTMWSFilter wsfilter;
     /* 122 */ if ((translet != null) && ((translet instanceof StripFilter)))
       /* 123 */ wsfilter = new DOMWSFilter(translet);
     /*     */ else {
       /* 125 */ wsfilter = null;
       /*     */ }
     /*     */
     /* 128 */ DOMEnhancedForDTM dom =
         (DOMEnhancedForDTM)
             dtmManager.getDTM(
                 new SAXSource(reader, new InputSource(this._fileName)),
                 false,
                 wsfilter,
                 true,
                 false,
                 translet.hasIdCall());
     /*     */
     /* 133 */ dom.setDocumentURI(this._fileName);
     /* 134 */ translet.prepassDocument(dom);
     /*     */
     /* 137 */ int n = this._params.size();
     /* 138 */ for (int i = 0; i < n; i++) {
       /* 139 */ Parameter param = (Parameter) this._params.elementAt(i);
       /* 140 */ translet.addParameter(param._name, param._value);
       /*     */ }
     /*     */
     /* 144 */ TransletOutputHandlerFactory tohFactory =
         TransletOutputHandlerFactory.newInstance();
     /*     */
     /* 146 */ tohFactory.setOutputType(0);
     /* 147 */ tohFactory.setEncoding(translet._encoding);
     /* 148 */ tohFactory.setOutputMethod(translet._method);
     /*     */
     /* 150 */ if (this._iterations == -1) {
       /* 151 */ translet.transform(dom, tohFactory.getSerializationHandler());
       /*     */ }
     /* 153 */ else if (this._iterations > 0) {
       /* 154 */ long mm = System.currentTimeMillis();
       /* 155 */ for (int i = 0; i < this._iterations; i++) {
         /* 156 */ translet.transform(dom, tohFactory.getSerializationHandler());
         /*     */ }
       /*     */
       /* 159 */ mm = System.currentTimeMillis() - mm;
       /*     */
       /* 161 */ System.err.println("\n<!--");
       /* 162 */ System.err.println("  transform  = " + mm / this._iterations + " ms");
       /*     */
       /* 165 */ System.err.println(
           "  throughput = " + 1000.0D / (mm / this._iterations) + " tps");
       /*     */
       /* 169 */ System.err.println("-->");
       /*     */ }
     /*     */ }
   /*     */ catch (TransletException e) {
     /* 173 */ if (this._debug) e.printStackTrace();
     /* 174 */ System.err.println(new ErrorMsg("RUNTIME_ERROR_KEY") + e.getMessage());
     /*     */ }
   /*     */ catch (RuntimeException e)
   /*     */ {
     /* 178 */ if (this._debug) e.printStackTrace();
     /* 179 */ System.err.println(new ErrorMsg("RUNTIME_ERROR_KEY") + e.getMessage());
     /*     */ }
   /*     */ catch (FileNotFoundException e)
   /*     */ {
     /* 183 */ if (this._debug) e.printStackTrace();
     /* 184 */ ErrorMsg err = new ErrorMsg("FILE_NOT_FOUND_ERR", this._fileName);
     /* 185 */ System.err.println(new ErrorMsg("RUNTIME_ERROR_KEY") + err.toString());
     /*     */ }
   /*     */ catch (MalformedURLException e)
   /*     */ {
     /* 189 */ if (this._debug) e.printStackTrace();
     /* 190 */ ErrorMsg err = new ErrorMsg("INVALID_URI_ERR", this._fileName);
     /* 191 */ System.err.println(new ErrorMsg("RUNTIME_ERROR_KEY") + err.toString());
     /*     */ }
   /*     */ catch (ClassNotFoundException e)
   /*     */ {
     /* 195 */ if (this._debug) e.printStackTrace();
     /* 196 */ ErrorMsg err = new ErrorMsg("CLASS_NOT_FOUND_ERR", this._className);
     /* 197 */ System.err.println(new ErrorMsg("RUNTIME_ERROR_KEY") + err.toString());
     /*     */ }
   /*     */ catch (UnknownHostException e)
   /*     */ {
     /* 201 */ if (this._debug) e.printStackTrace();
     /* 202 */ ErrorMsg err = new ErrorMsg("INVALID_URI_ERR", this._fileName);
     /* 203 */ System.err.println(new ErrorMsg("RUNTIME_ERROR_KEY") + err.toString());
     /*     */ }
   /*     */ catch (SAXException e)
   /*     */ {
     /* 207 */ Exception ex = e.getException();
     /* 208 */ if (this._debug) {
       /* 209 */ if (ex != null) ex.printStackTrace();
       /* 210 */ e.printStackTrace();
       /*     */ }
     /* 212 */ System.err.print(new ErrorMsg("RUNTIME_ERROR_KEY"));
     /* 213 */ if (ex != null) /* 214 */ System.err.println(ex.getMessage());
     /*     */ else /* 216 */ System.err.println(e.getMessage());
     /*     */ }
   /*     */ catch (Exception e) {
     /* 219 */ if (this._debug) e.printStackTrace();
     /* 220 */ System.err.println(new ErrorMsg("RUNTIME_ERROR_KEY") + e.getMessage());
     /*     */ }
   /*     */ }