dlr         2004/06/29 23:11:55

  Modified:    src/java/org/apache/xmlrpc XmlRpc.java
  Log:
  Work around based on a patch from Ken Huffman for the
  SecurityException generated by use in unsigned applets, thrown when
  the code attempts to read a System property.
  
  * src/java/org/apache/xmlrpc/XmlRpc.java
    version: Added detail about how to implement the associated TODO to
    pre-process in the version number.  Dropped alpha/beta
    qualification of provided version number.
  
    XmlRpc(): Improved JavaDoc.  Remodeled the interior to handle the
    possible SecurityException which may be thrown when invoked by an
    unsigned applet when determining TypeFactory implementation to use
    from System property.
  
    XmlRpc(String): Improved JavaDoc.  Remodeled interior to use a joist
    construction, leveraging the new createTypeFactory(String) method to
    replace old debris.
  
    createTypeFactory(String): Merged this overload with the old private
    createTypeFactory(Class) version for use by both constructors.
    Improved implementation accordingly.
  
  Revision  Changes    Path
  1.37      +55 -31    ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpc.java
  
  Index: XmlRpc.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpc.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -u -r1.36 -r1.37
  --- XmlRpc.java       17 Jun 2004 01:40:14 -0000      1.36
  +++ XmlRpc.java       30 Jun 2004 06:11:55 -0000      1.37
  @@ -89,8 +89,10 @@
       /**
        * The version string used in HTTP communication.
        */
  -    // FIXME: Use Ant <filter> to preprocess during compilation
  -    public static final String version = "Apache XML-RPC 1.2-a3-dev";
  +    // FIXME: Use Ant <filter> to pre-process version number into a
  +    // class-loaded .properties file at build time.  Use here when
  +    // available, and otherwise provide no version string.
  +    public static final String version = "Apache XML-RPC 2.0";
   
       /**
        * The default parser to use (MinML).
  @@ -193,66 +195,88 @@
        * org.apache.xmlrpc.TypeFactory} set to an instance of the class
        * named by the <code>org.apache.xmlrpc.TypeFactory</code> System
        * property.  If property not set or class is unavailable, uses
  -     * the default.
  +     * the default of [EMAIL PROTECTED] org.apache.xmlrpc.TypeFactory}.
        */
       protected XmlRpc()
       {
  -        this(System.getProperty(TypeFactory.class.getName()));
  +        String typeFactoryName = null;
  +        try
  +        {
  +            typeFactoryName = System.getProperty(TypeFactory.class.getName());
  +        }
  +        catch (SecurityException e)
  +        {
  +            // An unsigned applet may not access system properties.
  +            // No-op means we use the default TypeFactory instead.
  +            if (debug)
  +            {
  +                System.out.println("Unable to determine the value of the " +
  +                                   "system property '" +
  +                                   TypeFactory.class.getName() + "': " +
  +                                   e.getMessage());
  +            }
  +        }
  +        this.typeFactory = createTypeFactory(typeFactoryName);
       }
   
       /**
        * Creates a new instance with the specified [EMAIL PROTECTED]
        * org.apache.xmlrpc.TypeFactory}.
        *
  -     * @param typeFactory The implementation to use.
  +     * @param typeFactoryName The fully qualified class name of the
  +     * [EMAIL PROTECTED] org.apache.xmlrpc.TypeFactory} implementation to use.
  +     */
  +    protected XmlRpc(String typeFactoryName)
  +    {
  +        this.typeFactory = createTypeFactory(typeFactoryName);
  +    }
  +
  +    /**
  +     * Creates a new instance of the specified [EMAIL PROTECTED]
  +     * org.apache.xmlrpc.TypeFactory}.
  +     *
  +     * @param className The fully qualified class name of the
  +     * implementation to use.
  +     * @return The new type mapping.
        */
  -    protected XmlRpc(String typeFactory)
  +    private TypeFactory createTypeFactory(String className)
       {
           Class c = null;
  -        if (typeFactory != null && typeFactory.length() > 0)
  +        if (className != null && className.length() > 0)
           {
               try
               {
  -                c = Class.forName(typeFactory);
  +                c = Class.forName(className);
               }
               catch (ClassNotFoundException e)
               {
  -                System.err.println("Error loading TypeFactory specified by " +
  -                                   "the " + TypeFactory.class.getName() +
  -                                   " property, using default instead: " +
  +                System.err.println("Error loading TypeFactory '" +
  +                                   "' " + c.getName() +
  +                                   "': Using the default instead: " +
                                      e.getMessage());
               }
           }
  -        this.typeFactory = createTypeFactory(c);
  -    }
   
  -    /**
  -     * Creates a new instance of the specified [EMAIL PROTECTED]
  -     * org.apache.xmlrpc.TypeFactory}.
  -     *
  -     * @param typeFactory The implementation to use.
  -     * @return The new type mapping.
  -     */
  -    private TypeFactory createTypeFactory(Class typeFactory)
  -    {
  -        // If we're using the default, serve it up immediately.
  -        if (typeFactory == null ||
  -            DefaultTypeFactory.class.equals(typeFactory))
  +        // If we're using the default, provide it immediately.
  +        if (c == null || DefaultTypeFactory.class.equals(c))
           {
               return new DefaultTypeFactory();
           }
   
           try
           {
  -            return (TypeFactory) typeFactory.newInstance();
  +            return (TypeFactory) c.newInstance();
           }
           catch (Exception e)
           {
               System.err.println("Unable to create configured TypeFactory '" +
  -                               typeFactory.getName() + "': " + e.getMessage() +
  -                               ": Using default");
  -            // Call self recursively to acquire default.
  -            return createTypeFactory(null);
  +                               c.getName() + "': " + e.getMessage() +
  +                               ": Falling back to default");
  +            if (debug)
  +            {
  +                e.printStackTrace();
  +            }
  +            return new DefaultTypeFactory();
           }
       }
   
  
  
  

Reply via email to