stevel      2002/10/07 22:45:35

  Modified:    src/main/org/apache/tools/ant/util WeakishReference.java
  Added:       src/main/org/apache/tools/ant/util WeakishReference12.java
  Log:
  This is the reflection based fixup for weak refs on 1.2+
  
  Revision  Changes    Path
  1.2       +39 -28    
jakarta-ant/src/main/org/apache/tools/ant/util/WeakishReference.java
  
  Index: WeakishReference.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/util/WeakishReference.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- WeakishReference.java     10 Sep 2002 22:19:28 -0000      1.1
  +++ WeakishReference.java     8 Oct 2002 05:45:35 -0000       1.2
  @@ -54,7 +54,11 @@
   
   package org.apache.tools.ant.util;
   
  -import java.lang.ref.WeakReference;
  +import org.apache.tools.ant.BuildException;
  +
  +import java.lang.reflect.Constructor;
  +import java.lang.reflect.InvocationTargetException;
  +
   
   /**
    * this is a weak reference on java1.2 and up, a hard
  @@ -63,6 +67,9 @@
    */
   public abstract class WeakishReference  {
   
  +    private static Constructor referenceConstructor;
  +
  +    private final static String WEAK_REFERENCE_NAME= 
"org,apache.tools.ant.util.WeakishReference12";
   
       /**
        * create the appropriate type of reference for the java version
  @@ -70,13 +77,40 @@
        * @return
        */
       public static WeakishReference createReference(Object object) {
  -        if(JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) {
  -            return new HardReference(object);
  -        } else {
  -            return new SoftReference(object);
  +        if(referenceConstructor==null) {
  +            createReferenceConstructor();
  +        }
  +        try {
  +            return (WeakishReference)referenceConstructor
  +                        .newInstance(new Object[]{object});
  +        } catch (Exception e) {
  +            throw new BuildException("while creating a weakish reference",e);
  +        }
  +    }
  +
  +    /**
  +     * create the appropriate constructor method for the
  +     */
  +    private static void createReferenceConstructor() {
  +        Class[] ctor=new Class[]{Object.class};
  +        try {
  +            referenceConstructor=HardReference.class.getConstructor(ctor);
  +        } catch (NoSuchMethodException e) {
  +            //deep trouble here
  +            throw new BuildException("when creating a Hard Reference 
constructor",e);
  +        }
  +        if (!JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) {
  +            //create a weak ref constructor. If this fails we have that hard 
one anyway
  +            try {
  +                Class clazz=Class.forName(WEAK_REFERENCE_NAME);
  +                referenceConstructor=clazz.getConstructor(ctor);
  +            } catch (ClassNotFoundException e) {
  +            } catch (NoSuchMethodException e) {
  +            }
           }
       }
   
  +
       /**
        * Returns this reference object's referent.  If this reference object 
has
        * been cleared, then this method returns <code>null</code>.
  @@ -108,27 +142,4 @@
           }
       }
   
  -    /**
  -     * a soft reference for Java 1.2 or later
  -     */
  -    private static class SoftReference extends WeakishReference {
  -        private WeakReference weakref;
  -
  -        /**
  -         * create a new soft reference, which is bound to a
  -         * Weak reference inside
  -         * @param reference
  -         * @see java.lang.ref.WeakReference
  -         */
  -        public SoftReference(Object reference) {
  -            this.weakref = new WeakReference(reference);
  -        }
  -
  -        /**
  -         * Returns this reference object's referent.
  -         */
  -        public Object get() {
  -            return weakref.get();
  -        }
  -    }
   }
  
  
  
  1.1                  
jakarta-ant/src/main/org/apache/tools/ant/util/WeakishReference12.java
  
  Index: WeakishReference12.java
  ===================================================================
  /*
   * User: slo
   * Date: Sep 10, 2002
   * Time: 11:02:16 PM
   * Status:      Experimental (Do Not Distribute)
   *
   * (c) Copyright 2002, Hewlett-Packard Company, all rights reserved.
   */
  
  package org.apache.tools.ant.util;
  
  import java.lang.ref.WeakReference;
  
  /**
   *
   */
  public class WeakishReference12 extends WeakishReference  {
  
      private WeakReference weakref;
  
      /**
       * create a new soft reference, which is bound to a
       * Weak reference inside
       * @param reference
       * @see java.lang.ref.WeakReference
       */
      public WeakishReference12(Object reference) {
          this.weakref = new WeakReference(reference);
      }
  
      /**
       * Returns this reference object's referent.
       */
      public Object get() {
          return weakref.get();
      }
  
  }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to