code: protected void checkParserVersion(Hashtable h)
    {
  
      if (null == h)
        h = new Hashtable();
  
      try
      {
        final String XERCES1_VERSION_CLASS = "org.apache.xerces.framework.Version";
  
        Class clazz = ObjectFactory.findProviderClass(
          XERCES1_VERSION_CLASS, ObjectFactory.findClassLoader(), 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 = "org.apache.xerces.impl.Version";
  
        Class clazz = ObjectFactory.findProviderClass(
          XERCES2_VERSION_CLASS, ObjectFactory.findClassLoader(), 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, ObjectFactory.findClassLoader(), true);
  
        //@todo determine specific crimson version
        h.put(VERSION + "crimson", CLASS_PRESENT);
      }
      catch (Exception e)
      {
        h.put(VERSION + "crimson", CLASS_NOTPRESENT);
      }
    }
docs: Report product version information from common parsers.
  
  Looks for version info in xerces.jar/xercesImpl.jar/crimson.jar.
  
  //@todo actually look up version info in crimson manifest
  
  @param h Hashtable to put information in