code: static Object createObject(String factoryId, 
                                        String propertiesFilename,
                                        String fallbackClassName)
          throws ConfigurationError
      {
          Class factoryClass = lookUpFactoryClass(factoryId,
                                                  propertiesFilename,
                                                  fallbackClassName);
  
          if (factoryClass == null) {
              throw new ConfigurationError(
                  "Provider for " + factoryId + " cannot be found", null);
          }
  
          try{
              Object instance = factoryClass.newInstance();
              debugPrintln("created new instance of factory " + factoryId);
              return instance;
          } catch (Exception x) {
              throw new ConfigurationError(
                  "Provider for factory " + factoryId
                      + " could not be instantiated: " + x, x);
          }
      }
docs: Finds the implementation Class object in the specified order.  The
  specified order is the following:
  <ol>
  <li>query the system property using <code>System.getProperty</code>
  <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
  <li>read <code>META-INF/services/<i>factoryId</i></code> file
  <li>use fallback classname
  </ol>
  
  @return instance of factory, never null
  
  @param factoryId             Name of the factory to find, same as
  a property name
  @param propertiesFilename The filename in the $java.home/lib directory
  of the properties file.  If none specified,
  ${java.home}/lib/xalan.properties will be used.
  @param fallbackClassName     Implementation class name, if nothing else
  is found.  Use null to mean no fallback.
  
  @exception ObjectFactory.ConfigurationError