You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sc...@apache.org on 2003/11/23 18:48:20 UTC

cvs commit: jakarta-commons/collections/src/java/org/apache/commons/collections TransformerUtils.java FactoryUtils.java

scolebourne    2003/11/23 09:48:20

  Modified:    collections/src/test/org/apache/commons/collections
                        TestFactoryUtils.java
               collections/src/java/org/apache/commons/collections
                        TransformerUtils.java FactoryUtils.java
  Added:       collections/src/java/org/apache/commons/collections/functors
                        InstantiateFactory.java PrototypeFactory.java
                        ConstantFactory.java
  Log:
  Refactor functors from inner classes to subpackage
  
  Revision  Changes    Path
  1.7       +8 -8      jakarta-commons/collections/src/test/org/apache/commons/collections/TestFactoryUtils.java
  
  Index: TestFactoryUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/TestFactoryUtils.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- TestFactoryUtils.java	23 Nov 2003 14:41:27 -0000	1.6
  +++ TestFactoryUtils.java	23 Nov 2003 17:48:19 -0000	1.7
  @@ -267,12 +267,12 @@
           }
       }
       
  -    // reflectionFactory
  +    // instantiateFactory
       //------------------------------------------------------------------
       
       public void testReflectionFactoryNull() {
           try {
  -            Factory factory = FactoryUtils.reflectionFactory(null);
  +            Factory factory = FactoryUtils.instantiateFactory(null);
               
           } catch (IllegalArgumentException ex) {
               return;
  @@ -281,7 +281,7 @@
       }
   
       public void testReflectionFactorySimple() {
  -        Factory factory = FactoryUtils.reflectionFactory(Mock3.class);
  +        Factory factory = FactoryUtils.instantiateFactory(Mock3.class);
           assertNotNull(factory);
           Object created = factory.create();
           assertEquals(0, ((Mock3) created).getValue());
  @@ -291,7 +291,7 @@
   
       public void testReflectionFactoryMismatch() {
           try {
  -            Factory factory = FactoryUtils.reflectionFactory(Date.class, null, new Object[] {null});
  +            Factory factory = FactoryUtils.instantiateFactory(Date.class, null, new Object[] {null});
               
           } catch (IllegalArgumentException ex) {
               return;
  @@ -301,7 +301,7 @@
   
       public void testReflectionFactoryNoConstructor() {
           try {
  -            Factory factory = FactoryUtils.reflectionFactory(Date.class, new Class[] {Long.class}, new Object[] {null});
  +            Factory factory = FactoryUtils.instantiateFactory(Date.class, new Class[] {Long.class}, new Object[] {null});
               
           } catch (IllegalArgumentException ex) {
               return;
  @@ -312,7 +312,7 @@
       public void testReflectionFactoryComplex() {
           TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
           // 2nd Jan 1970
  -        Factory factory = FactoryUtils.reflectionFactory(Date.class,
  +        Factory factory = FactoryUtils.instantiateFactory(Date.class,
               new Class[] {Integer.TYPE, Integer.TYPE, Integer.TYPE},
               new Object[] {new Integer(70), new Integer(0), new Integer(2)});
           assertNotNull(factory);
  
  
  
  1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/functors/InstantiateFactory.java
  
  Index: InstantiateFactory.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/InstantiateFactory.java,v 1.1 2003/11/23 17:48:19 scolebourne Exp $
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowledgement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgement may appear in the software itself,
   *    if and wherever such third-party acknowledgements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  package org.apache.commons.collections.functors;
  
  import java.io.Serializable;
  import java.lang.reflect.Constructor;
  import java.lang.reflect.InvocationTargetException;
  
  import org.apache.commons.collections.Factory;
  
  /**
   * Factory implementation that creates a new object instance by reflection.
   * 
   * @since Commons Collections 3.0
   * @version $Revision: 1.1 $ $Date: 2003/11/23 17:48:19 $
   *
   * @author Stephen Colebourne
   */
  public class InstantiateFactory implements Factory, Serializable {
  
      /** The serial version */
      static final long serialVersionUID = -7732226881069447957L;
  
      /** The class to create */
      private final Class iClassToInstantiate;
      /** The constructor parameter types */
      private final Class[] iParamTypes;
      /** The constructor arguments */
      private final Object[] iArgs;
      /** The constructor */
      private transient Constructor iConstructor = null;
  
      /**
       * Factory method that performs validation.
       * 
       * @param classToInstantiate  the class to instantiate, not null
       * @param paramTypes  the constructor parameter types
       * @param args  the constructor arguments
       */
      public static Factory getInstance(Class classToInstantiate, Class[] paramTypes, Object[] args) {
          if (classToInstantiate == null) {
              throw new IllegalArgumentException("Class to instantiate must not be null");
          }
          if (((paramTypes == null) && (args != null))
              || ((paramTypes != null) && (args == null))
              || ((paramTypes != null) && (args != null) && (paramTypes.length != args.length))) {
              throw new IllegalArgumentException("Parameter types must match the arguments");
          }
  
          if (paramTypes == null || paramTypes.length == 0) {
              paramTypes = null;
              args = null;
          } else {
              paramTypes = (Class[]) paramTypes.clone();
              args = (Object[]) args.clone();
          }
          return new InstantiateFactory(classToInstantiate, paramTypes, args);
      }
  
      /**
       * Constructor that performs no validation.
       * Use <code>getInstance</code> if you want that.
       * 
       * @param classToInstantiate  the class to instantiate
       */
      public InstantiateFactory(Class classToInstantiate) {
          super();
          iClassToInstantiate = classToInstantiate;
          iParamTypes = null;
          iArgs = null;
          findConstructor();
      }
  
      /**
       * Constructor that performs no validation.
       * Use <code>getInstance</code> if you want that.
       * 
       * @param classToInstantiate  the class to instantiate
       * @param paramTypes  the constructor parameter types, not cloned
       * @param args  the constructor arguments, not cloned
       */
      public InstantiateFactory(Class classToInstantiate, Class[] paramTypes, Object[] args) {
          super();
          iClassToInstantiate = classToInstantiate;
          iParamTypes = paramTypes;
          iArgs = args;
          findConstructor();
      }
  
      /**
       * Find the Constructor for the class specified.
       */
      private void findConstructor() {
          try {
              iConstructor = iClassToInstantiate.getConstructor(iParamTypes);
  
          } catch (NoSuchMethodException ex) {
              throw new IllegalArgumentException("InstantiateFactory: The constructor must exist and be public ");
          }
      }
  
      /**
       * Create the object using a constructor
       */
      public Object create() {
          // needed for post-serialization
          if (iConstructor == null) {
              findConstructor();
          }
  
          try {
              return iConstructor.newInstance(iArgs);
  
          } catch (InstantiationException ex) {
              throw new FunctorException("InstantiateFactory: InstantiationException", ex);
          } catch (IllegalAccessException ex) {
              throw new FunctorException("InstantiateFactory: Constructor must be public", ex);
          } catch (InvocationTargetException ex) {
              throw new FunctorException("InstantiateFactory: Constructor threw an exception", ex);
          }
      }
      
  }
  
  
  
  1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/functors/PrototypeFactory.java
  
  Index: PrototypeFactory.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/PrototypeFactory.java,v 1.1 2003/11/23 17:48:19 scolebourne Exp $
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowledgement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgement may appear in the software itself,
   *    if and wherever such third-party acknowledgements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  package org.apache.commons.collections.functors;
  
  import java.io.ByteArrayInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.io.Serializable;
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  
  import org.apache.commons.collections.Factory;
  
  /**
   * Factory implementation that creates a new instance each time based on a prototype.
   * 
   * @since Commons Collections 3.0
   * @version $Revision: 1.1 $ $Date: 2003/11/23 17:48:19 $
   *
   * @author Stephen Colebourne
   */
  public class PrototypeFactory {
  
      /**
       * Factory method that performs validation.
       * <p>
       * Creates a Factory that will return a clone of the same prototype object
       * each time the factory is used. The prototype will be cloned using one of these
       * techniques (in order):
       * <ul>
       * <li>public clone method
       * <li>public copy constructor
       * <li>serialization clone
       * <ul>
       *
       * @param prototype  the object to clone each time in the factory
       * @return the <code>prototype</code> factory
       * @throws IllegalArgumentException if the prototype is null
       * @throws IllegalArgumentException if the prototype cannot be cloned
       */
      public static Factory getInstance(Object prototype) {
          if (prototype == null) {
              throw new IllegalArgumentException("The prototype must not be null");
          }
          try {
              prototype.getClass().getMethod("clone", null);
              return new PrototypeCloneFactory(prototype);
  
          } catch (NoSuchMethodException ex) {
              try {
                  prototype.getClass().getConstructor(new Class[] { prototype.getClass()});
                  return new InstantiateFactory(
                      prototype.getClass(),
                      new Class[] { prototype.getClass()},
                      new Object[] { prototype });
  
              } catch (NoSuchMethodException ex2) {
                  if (prototype instanceof Serializable) {
                      return new PrototypeSerializationFactory((Serializable) prototype);
                  }
              }
          }
          throw new IllegalArgumentException("The prototype must be cloneable via a public clone method");
      }
  
      /**
       * Constructor that performs no validation.
       * Use <code>getInstance</code> if you want that.
       * 
       * @param constantToReturn  the constant to return each time
       */
      private PrototypeFactory() {
      }
  
      // PrototypeCloneFactory
      //-----------------------------------------------------------------------
      /**
       * PrototypeCloneFactory creates objects by copying a prototype using the clone method.
       */
      static class PrototypeCloneFactory implements Factory, Serializable {
          
          /** The serial version */
          static final long serialVersionUID = 5604271422565175555L;
          
          /** The object to clone each time */
          private final Object iPrototype;
          /** The method used to clone */
          private transient Method iCloneMethod;
  
          /**
           * Constructor to store prototype
           */
          private PrototypeCloneFactory(Object prototype) {
              super();
              if (prototype == null) {
                  throw new IllegalArgumentException("PrototypeCloneFactory: The prototype must not be null");
              }
              iPrototype = prototype;
  
              findCloneMethod();
          }
  
          /**
           * Find the Clone method for the class specified.
           */
          private void findCloneMethod() {
              try {
                  iCloneMethod = iPrototype.getClass().getMethod("clone", null);
  
              } catch (NoSuchMethodException ex) {
                  throw new IllegalArgumentException("PrototypeCloneFactory: The clone method must exist and be public ");
              }
          }
  
          /**
           * Return clone of prototype
           */
          public Object create() {
              // needed for post-serialization
              if (iCloneMethod == null) {
                  findCloneMethod();
              }
  
              try {
                  return iCloneMethod.invoke(iPrototype, null);
  
              } catch (IllegalAccessException ex) {
                  throw new FunctorException("PrototypeCloneFactory: Clone method must be public", ex);
              } catch (InvocationTargetException ex) {
                  throw new FunctorException("PrototypeCloneFactory: Clone method threw an exception", ex);
              }
          }
      }
  
      // PrototypeSerializationFactory
      //-----------------------------------------------------------------------
      /**
       * PrototypeSerializationFactory creates objects by cloning a prototype using serialization.
       */
      static class PrototypeSerializationFactory implements Factory, Serializable {
          
          /** The serial version */
          static final long serialVersionUID = -8704966966139178833L;
          
          /** The object to clone via serialization each time */
          private final Serializable iPrototype;
  
          /**
           * Constructor to store prototype
           */
          private PrototypeSerializationFactory(Serializable prototype) {
              super();
              if (prototype == null) {
                  throw new IllegalArgumentException("PrototypeSerializationFactory: The prototype must not be null");
              }
              iPrototype = prototype;
          }
  
          /**
           * Return clone of prototype by serialization
           */
          public Object create() {
              ByteArrayOutputStream baos = new ByteArrayOutputStream(512);
              ByteArrayInputStream bais = null;
              try {
                  ObjectOutputStream out = new ObjectOutputStream(baos);
                  out.writeObject(iPrototype);
  
                  bais = new ByteArrayInputStream(baos.toByteArray());
                  ObjectInputStream in = new ObjectInputStream(bais);
                  return in.readObject();
  
              } catch (ClassNotFoundException ex) {
                  throw new FunctorException(ex);
              } catch (IOException ex) {
                  throw new FunctorException(ex);
              } finally {
                  try {
                      if (bais != null) {
                          bais.close();
                      }
                  } catch (IOException ignored) {
                  }
                  try {
                      if (baos != null) {
                          baos.close();
                      }
                  } catch (IOException ignored) {
                  }
              }
          }
      }
  
  }
  
  
  
  1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/functors/ConstantFactory.java
  
  Index: ConstantFactory.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/ConstantFactory.java,v 1.1 2003/11/23 17:48:19 scolebourne Exp $
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowledgement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgement may appear in the software itself,
   *    if and wherever such third-party acknowledgements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  package org.apache.commons.collections.functors;
  
  import java.io.Serializable;
  
  import org.apache.commons.collections.Factory;
  
  /**
   * Factory implementation that returns the same constant each time.
   * <p>
   * No check is made that the object is immutable. In general, only immutable
   * objects should use the constant factory. Mutable objects should
   * use the prototype factory.
   * 
   * @since Commons Collections 3.0
   * @version $Revision: 1.1 $ $Date: 2003/11/23 17:48:19 $
   *
   * @author Stephen Colebourne
   */
  public class ConstantFactory implements Factory, Serializable {
  
      /** Serial version UID */
      static final long serialVersionUID = -3520677225766901240L;
      
      /** Returns null each time */
      public static final Factory NULL_INSTANCE = new ConstantFactory(null);
  
      /** The closures to call in turn */
      private final Object iConstant;
  
      /**
       * Factory method that performs validation.
       *
       * @param constantToReturn  the constant object to return each time in the factory
       * @return the <code>constant</code> factory.
       */
      public static Factory getInstance(Object constantToReturn) {
          if (constantToReturn == null) {
              return NULL_INSTANCE;
          }
          return new ConstantFactory(constantToReturn);
      }
      
      /**
       * Constructor that performs no validation.
       * Use <code>getInstance</code> if you want that.
       * 
       * @param constantToReturn  the constant to return each time
       */
      public ConstantFactory(Object constantToReturn) {
          super();
          iConstant = constantToReturn;
      }
  
      /**
       * Always return constant
       */
      public Object create() {
          return iConstant;
      }
      
  }
  
  
  
  1.8       +3 -3      jakarta-commons/collections/src/java/org/apache/commons/collections/TransformerUtils.java
  
  Index: TransformerUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/TransformerUtils.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- TransformerUtils.java	23 Nov 2003 17:01:36 -0000	1.7
  +++ TransformerUtils.java	23 Nov 2003 17:48:20 -0000	1.8
  @@ -835,7 +835,7 @@
                           "InstantiateTransformer: Input object was not an instanceof Class, it was a "
                               + (input == null ? "null object" : input.getClass().getName()));
                   }
  -                return FactoryUtils.reflectionFactory((Class) input, iParamTypes, iArgs).create();
  +                return FactoryUtils.instantiateFactory((Class) input, iParamTypes, iArgs).create();
   
               } catch (IllegalArgumentException ex) {
                   throw new FunctorException("InstantiateTransformer", ex);
  
  
  
  1.11      +12 -263   jakarta-commons/collections/src/java/org/apache/commons/collections/FactoryUtils.java
  
  Index: FactoryUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/FactoryUtils.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- FactoryUtils.java	23 Nov 2003 17:01:36 -0000	1.10
  +++ FactoryUtils.java	23 Nov 2003 17:48:20 -0000	1.11
  @@ -57,18 +57,10 @@
    */
   package org.apache.commons.collections;
   
  -import java.io.ByteArrayInputStream;
  -import java.io.ByteArrayOutputStream;
  -import java.io.IOException;
  -import java.io.ObjectInputStream;
  -import java.io.ObjectOutputStream;
  -import java.io.Serializable;
  -import java.lang.reflect.Constructor;
  -import java.lang.reflect.InvocationTargetException;
  -import java.lang.reflect.Method;
  -
  +import org.apache.commons.collections.functors.ConstantFactory;
  +import org.apache.commons.collections.functors.InstantiateFactory;
   import org.apache.commons.collections.functors.ExceptionFactory;
  -import org.apache.commons.collections.functors.FunctorException;
  +import org.apache.commons.collections.functors.PrototypeFactory;
   
   /**
    * <code>FactoryUtils</code> provides reference implementations and utilities
  @@ -90,11 +82,6 @@
   public class FactoryUtils {
   
       /**
  -     * A factory that always returns null
  -     */
  -    private static final Factory NULL_FACTORY = new ConstantFactory(null);
  -
  -    /**
        * This class is not normally instantiated.
        */
       public FactoryUtils() {
  @@ -118,7 +105,7 @@
        * @return the factory
        */
       public static Factory nullFactory() {
  -        return NULL_FACTORY;
  +        return ConstantFactory.NULL_INSTANCE;
       }
   
       /**
  @@ -131,7 +118,7 @@
        * @return the <code>constant</code> factory.
        */
       public static Factory constantFactory(Object constantToReturn) {
  -        return new ConstantFactory(constantToReturn);
  +        return ConstantFactory.getInstance(constantToReturn);
       }
   
       /**
  @@ -150,25 +137,7 @@
        * @throws IllegalArgumentException if the prototype cannot be cloned
        */
       public static Factory prototypeFactory(Object prototype) {
  -        if (prototype == null) {
  -            throw new IllegalArgumentException("The prototype must not be null");
  -        }
  -        try {
  -            prototype.getClass().getMethod("clone", null);
  -            return new PrototypeCloneFactory(prototype);
  -
  -        } catch (NoSuchMethodException ex) {
  -            try {
  -                prototype.getClass().getConstructor(new Class[] { prototype.getClass()});
  -                return new ReflectionFactory(prototype.getClass(), new Class[] { prototype.getClass()}, new Object[] { prototype });
  -
  -            } catch (NoSuchMethodException ex2) {
  -                if (prototype instanceof Serializable) {
  -                    return new PrototypeSerializationFactory((Serializable) prototype);
  -                }
  -            }
  -        }
  -        throw new IllegalArgumentException("The prototype must be cloneable via a public clone method");
  +        return PrototypeFactory.getInstance(prototype);
       }
   
       /**
  @@ -179,8 +148,8 @@
        * @return the <code>reflection</code> factory
        * @throws IllegalArgumentException if the classToInstantiate is null
        */
  -    public static Factory reflectionFactory(Class classToInstantiate) {
  -        return new ReflectionFactory(classToInstantiate);
  +    public static Factory instantiateFactory(Class classToInstantiate) {
  +        return InstantiateFactory.getInstance(classToInstantiate, null, null);
       }
   
       /**
  @@ -195,228 +164,8 @@
        * @throws IllegalArgumentException if the paramTypes and args don't match
        * @throws IllegalArgumentException if the constructor doesn't exist
        */
  -    public static Factory reflectionFactory(Class classToInstantiate, Class[] paramTypes, Object[] args) {
  -        return new ReflectionFactory(classToInstantiate, paramTypes, args);
  -    }
  -
  -    // ConstantFactory
  -    //----------------------------------------------------------------------------------
  -
  -    /**
  -     * ConstantFactory returns the same instance each time.
  -     */
  -    private static class ConstantFactory implements Factory, Serializable {
  -        /** The constant to return each time */
  -        private final Object iConstant;
  -
  -        /**
  -         * Constructor to store constant
  -         */
  -        private ConstantFactory(Object constant) {
  -            super();
  -            iConstant = constant;
  -        }
  -
  -        /**
  -         * Always return constant
  -         */
  -        public Object create() {
  -            return iConstant;
  -        }
  -    }
  -
  -    // PrototypeCloneFactory
  -    //----------------------------------------------------------------------------------
  -
  -    /**
  -     * PrototypeCloneFactory creates objects by copying a prototype using the clone method.
  -     */
  -    private static class PrototypeCloneFactory implements Factory, Serializable {
  -        /** The object to clone each time */
  -        private final Object iPrototype;
  -        /** The method used to clone */
  -        private transient Method iCloneMethod;
  -
  -        /**
  -         * Constructor to store prototype
  -         */
  -        private PrototypeCloneFactory(Object prototype) {
  -            super();
  -            if (prototype == null) {
  -                throw new IllegalArgumentException("PrototypeCloneFactory: The prototype must not be null");
  -            }
  -            iPrototype = prototype;
  -
  -            findCloneMethod();
  -        }
  -
  -        /**
  -         * Find the Clone method for the class specified.
  -         */
  -        private void findCloneMethod() {
  -            try {
  -                iCloneMethod = iPrototype.getClass().getMethod("clone", null);
  -
  -            } catch (NoSuchMethodException ex) {
  -                throw new IllegalArgumentException("PrototypeCloneFactory: The clone method must exist and be public ");
  -            }
  -        }
  -
  -        /**
  -         * Return clone of prototype
  -         */
  -        public Object create() {
  -            // needed for post-serialization
  -            if (iCloneMethod == null) {
  -                findCloneMethod();
  -            }
  -
  -            try {
  -                return iCloneMethod.invoke(iPrototype, null);
  -
  -            } catch (IllegalAccessException ex) {
  -                throw new FunctorException("PrototypeCloneFactory: Clone method must be public", ex);
  -            } catch (InvocationTargetException ex) {
  -                throw new FunctorException("PrototypeCloneFactory: Clone method threw an exception", ex);
  -            }
  -        }
  -    }
  -
  -    // PrototypeSerializationFactory
  -    //----------------------------------------------------------------------------------
  -
  -    /**
  -     * PrototypeSerializationFactory creates objects by cloning a prototype using serialization.
  -     */
  -    private static class PrototypeSerializationFactory implements Factory, Serializable {
  -        /** The object to clone via serialization each time */
  -        private final Serializable iPrototype;
  -
  -        /**
  -         * Constructor to store prototype
  -         */
  -        private PrototypeSerializationFactory(Serializable prototype) {
  -            super();
  -            if (prototype == null) {
  -                throw new IllegalArgumentException("PrototypeSerializationFactory: The prototype must not be null");
  -            }
  -            iPrototype = prototype;
  -        }
  -
  -        /**
  -         * Return clone of prototype by serialization
  -         */
  -        public Object create() {
  -            ByteArrayOutputStream baos = new ByteArrayOutputStream(512);
  -            ByteArrayInputStream bais = null;
  -            try {
  -                ObjectOutputStream out = new ObjectOutputStream(baos);
  -                out.writeObject(iPrototype);
  -                
  -                bais = new ByteArrayInputStream(baos.toByteArray());
  -                ObjectInputStream in = new ObjectInputStream(bais);
  -                return in.readObject();
  -        
  -            } catch (ClassNotFoundException ex) {
  -                throw new FunctorException(ex);
  -            } catch (IOException ex) {
  -                throw new FunctorException(ex);
  -            } finally {
  -                try {
  -                    if (bais != null) {
  -                        bais.close();
  -                    }
  -                } catch (IOException ignored) {}
  -                try {
  -                    if (baos != null) {
  -                        baos.close();
  -                    }
  -                } catch (IOException ignored) {}
  -            }
  -        }
  -    }
  -
  -    // ReflectionFactory
  -    //----------------------------------------------------------------------------------
  -
  -    /**
  -     * ReflectionFactory creates objects using reflection.
  -     */
  -    private static class ReflectionFactory implements Factory, Serializable {
  -        /** The class to create */
  -        private final Class iClassToInstantiate;
  -        /** The constructor parameter types */
  -        private final Class[] iParamTypes;
  -        /** The constructor arguments */
  -        private final Object[] iArgs;
  -        /** The constructor */
  -        private transient Constructor iConstructor = null;
  -
  -        /**
  -         * Constructor
  -         */
  -        public ReflectionFactory(Class classToInstantiate) {
  -            this(classToInstantiate, null, null);
  -        }
  -
  -        /* builds the object factory taking all the options needed to provide
  -         * arguments to a constructor.
  -         */
  -        public ReflectionFactory(Class classToInstantiate, Class[] paramTypes, Object[] args) {
  -            super();
  -            if (classToInstantiate == null) {
  -                throw new IllegalArgumentException("ReflectionFactory: The class to instantiate must not be null");
  -            }
  -            if (((paramTypes == null) && (args != null))
  -                || ((paramTypes != null) && (args == null))
  -                || ((paramTypes != null) && (args != null) && (paramTypes.length != args.length))) {
  -                throw new IllegalArgumentException("ReflectionFactory: The parameter types must match the arguments");
  -            }
  -
  -            iClassToInstantiate = classToInstantiate;
  -            if ((paramTypes == null) && (args == null)) {
  -                iParamTypes = null;
  -                iArgs = null;
  -            } else {
  -                iParamTypes = (Class[]) paramTypes.clone();
  -                iArgs = (Object[]) args.clone();
  -            }
  -
  -            findConstructor();
  -        }
  -
  -        /**
  -         * Find the Constructor for the class specified.
  -         */
  -        private void findConstructor() {
  -            try {
  -                iConstructor = iClassToInstantiate.getConstructor(iParamTypes);
  -
  -            } catch (NoSuchMethodException ex) {
  -                throw new IllegalArgumentException("ReflectionFactory: The constructor must exist and be public ");
  -            }
  -        }
  -
  -        /**
  -         * Create the object using a constructor
  -         */
  -        public Object create() {
  -            // needed for post-serialization
  -            if (iConstructor == null) {
  -                findConstructor();
  -            }
  -
  -            try {
  -                return iConstructor.newInstance(iArgs);
  -
  -            } catch (InstantiationException ex) {
  -                throw new FunctorException("ReflectionFactory: InstantiationException", ex);
  -            } catch (IllegalAccessException ex) {
  -                throw new FunctorException("ReflectionFactory: Constructor must be public", ex);
  -            } catch (InvocationTargetException ex) {
  -                throw new FunctorException("ReflectionFactory: Constructor threw an exception", ex);
  -            }
  -        }
  +    public static Factory instantiateFactory(Class classToInstantiate, Class[] paramTypes, Object[] args) {
  +        return InstantiateFactory.getInstance(classToInstantiate, paramTypes, args);
       }
   
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org