You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ar...@apache.org on 2002/05/29 04:57:41 UTC

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

arron       02/05/28 19:57:41

  Added:       collections/src/java/org/apache/commons/collections
                        FactoryUtils.java LazyCollections.java
                        SimpleObjectFactory.java
  Log:
  initial commit.
  
  Revision  Changes    Path
  1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/FactoryUtils.java
  
  Index: FactoryUtils.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/FactoryUtils.java,v 1.1 2002/05/29 02:57:41 arron Exp $
   * $Revision: 1.1 $
   * $Date: 2002/05/29 02:57:41 $
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2001 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 acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Struts", 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 Group.
   *
   * 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;
  
  import java.util.*;
  import java.lang.reflect.*;
  
  /**
   * A Factory for the creation of Factories. This is more of the factory
   * "pattern" by definition, but what it creates, is objects which subscribe to
   * a factory interface which other systems can rely on them to manufacture
   * objects.
   *
   * @author Arron Bates
   * @version $Revision: 1.1 $
   */
  public class FactoryUtils {
    
    /** Creates a SimpleObjectFactory whith a class definition, which will be
     * used to create a new object from an empty constructor.
     *
     * @param inClass class definition which will be ued to create the new object
     * @return the simple object factory.
     */
    public static SimpleObjectFactory createStandardFactory(Class inClass) {
      return new StandardFactory(inClass);
    }
    
    /** Creates a SimpleObjectFactory whith the class definition and argument
     * details, which can create a new object from a constructor which requires
     * arguments.
     *
     * @param inClass class definition which will be ued to create the new object
     * @param argTypes argument class types for the constructor
     * @param argObjects the objects for the arguments themselves
     * @return the simple object factory.
     */
    public static SimpleObjectFactory createStandardFactory(Class inClass,
                                                            Class[] argTypes,
                                                            Object[] argObjects) {
      return new StandardFactory(inClass, argTypes, argObjects);
    }
    
    
    
    /* A simple factory, which takes the bare bones of object creation to do just
     * that, create new objects.
     */
    private static class StandardFactory implements SimpleObjectFactory {
      
      /* builds the object factory. The class definition can creat objects which
       * have no-argument constructors.
       */
      public StandardFactory(Class inClass) {
        this.classDefinition = inClass;
      }
      
      /* builds the object factory taking all the options needed to provide
       * arguments to a constructor.
       */
      public StandardFactory(Class inClass, Class[] argTypes, Object[] argObjects) {
        this(inClass);
        this.argTypes = argTypes;
        this.argObjects = argObjects;
      }
    
    
    
      /* This method is the beast that creates the new objects. Problem faced is that
       * the Exceptions thrown are all RuntimeExceptions, meaning that for this class
       * to be used as a java.util.Map implementation itself, it has to guide the
       * exceptions as the runtime excpetions commonly thrown by these objects.
       *
       * Thinly disguising the error as a null pointer, with a modified message for
       * debugging.
       */
      public Object createObject() {
        
        Object obj = null;
        /* for catching error specifics */
        String fubar = null;
        
        try {
          if ((argTypes == null) || (argObjects == null)) {
            /* no arguments, make object with empty constructor */
            obj = this.classDefinition.newInstance();
          } else {
            /* construct object with argument details */
            Constructor constructor = this.classDefinition.getConstructor(argTypes);
            obj = constructor.newInstance(argObjects);
          }
        } catch (InstantiationException ex) {
          fubar = ex.getMessage();
        } catch (IllegalAccessException ex) {
          fubar = ex.getMessage();
        } catch (IllegalArgumentException ex) {
          fubar = ex.getMessage();
        } catch (NoSuchMethodException ex) {
          fubar = ex.getMessage();
        } catch (InvocationTargetException ex) {
          fubar = ex.getMessage();
        }
        
        /* fake our Exception if required */
        if (fubar != null) {
          /* guise the error as a more typical error */
    	    throw new NullPointerException("Failed object creation :: "+ fubar +"\n");
        }
        
        return obj;
      }
    
      /* class definition for new object creation */
      private Class classDefinition;
    
      /* construcor details, optional */
      private Class[] argTypes;
      private Object[] argObjects;
    }
  }
  
  
  1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/LazyCollections.java
  
  Index: LazyCollections.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/LazyCollections.java,v 1.1 2002/05/29 02:57:41 arron Exp $
   * $Revision: 1.1 $
   * $Date: 2002/05/29 02:57:41 $
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2001 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 acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Struts", 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 Group.
   *
   * 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;
  
  import java.util.*;
  import java.lang.reflect.*;
  
  /**
   * This is the factory manager for the lazy object creation collections. The
   * collections are within package scope only, so factory creation can be
   * standardised for these collections, and to provide a more convenient single
   * point entry for their use.
   *
   * Use the static factory methods to wrap your various collections in the Lazy
   * implementations so they can creat objects for incomming requestes.
   *
   * This class also holds the standard object factory, which has the means to
   * create simply the objects for the incomming requests. If all you need is a
   * new class built from an empty constructor, then all you need to provide is
   * the class definition.
   *
   * @see org.apache.commons.collections.LazyList
   * @see org.apache.commons.collections.LazyMap
   * @see org.apache.commons.collections.LazySortedMap
   *
   * @author Arron Bates
   * @version $Revision: 1.1 $
   */
  public class LazyCollections {
    
    
    /** Creates a LazyMap whith the provided object factory.
     *
     * @param inMap the java.util.Map implementation we have to wrap.
     * @param factory SimpleObjectFactory for new object creation
     * @return the wrapped Map reference
     */
    public static Map lazyMap(Map inMap, SimpleObjectFactory factory) {
      /* creates a new lazy map with the provided factory */
  	  return new LazyMap(inMap, factory);
    }
    
    /** Creates a LazyMap whith the class definition, which will be used to create
     * a SimpleObjectFactory which will create a new object from an empty
     * constructor.
     *
     * @param inMap the java.util.Map implementation we have to wrap.
     * @param inClass class definition which will be ued to create the new object
     * @return the wrapped Map reference
     */
    public static Map lazyMap(Map inMap, Class inClass) {
      /* creates a new lazy map with a new object factory */
      SimpleObjectFactory f = FactoryUtils.createStandardFactory(inClass);
  	  return new LazyMap(inMap, f);
    }
    
    /** Creates a LazyMap whith the class definition and argument details, which
     * will be used to create a SimpleObjectFactory which will create a new object
     * from a constructor which requires arguments.
     *
     * @param inMap the java.util.Map implementation we have to wrap.
     * @param inClass class definition which will be ued to create the new object
     * @param argTypes argument class types for the constructor
     * @param argObjects the objects for the arguments themselves
     * @return the wrapped Map reference
     */
    public static Map lazyMap(Map inMap, Class inClass, Class[] argTypes,
                              Object[] argObjects) {
      /* creates a new lazy map with a new object factory */
      SimpleObjectFactory f = FactoryUtils.createStandardFactory(inClass, argTypes, argObjects);
      return new LazyMap(inMap, f);
    }
  
  
    /** Creates a LazySortedMap whith the provided object factory.
     *
     * @param inMap the java.util.SortedMap implementation we have to wrap.
     * @param factory SimpleObjectFactory for new object creation
     * @return the wrapped SortedMap reference
     */
    public static SortedMap lazySortedMap(SortedMap inMap,
                                          SimpleObjectFactory factory) {
      /* creates a new lazy sorted map with the provided factory */
  	  return new LazySortedMap(inMap, factory);
    }
    
    /** Creates a LazySortedMap whith the class definition, which will be used to
     * create a SimpleObjectFactory which will create a new object from an empty
     * constructor.
     *
     * @param inMap the java.util.SortedMap implementation we have to wrap.
     * @param inClass class definition which will be ued to create the new object
     * @return the wrapped SortedMap reference
     */
    public static SortedMap lazySortedMap(SortedMap inMap, Class inClass) {
      /* creates a new lazy sorted map with a new object factory */
      SimpleObjectFactory f = FactoryUtils.createStandardFactory(inClass);
  	  return new LazySortedMap(inMap, f);
    }
    
    /** Creates a LazySortedMap whith the class definition and argument details,
     * which will be used to create a SimpleObjectFactory which will create a new
     * object from a constructor which requires arguments.
     *
     * @param inMap the java.util.SortedMap implementation we have to wrap.
     * @param inClass class definition which will be ued to create the new object
     * @param argTypes argument class types for the constructor
     * @param argObjects the objects for the arguments themselves
     * @return the wrapped SortedMap reference
     */
    public static SortedMap lazySortedMap(SortedMap inMap, Class inClass,
                                          Class[] argTypes, Object[] argObjects) {
      /* creates a new lazy sorted map with a new object factory */
      SimpleObjectFactory f = FactoryUtils.createStandardFactory(inClass, argTypes, argObjects);
      return new LazySortedMap(inMap, f);
    }
    
    
    /** Creates a LazyList whith the provided object factory.
     *
     * @param inMap the java.util.List implementation we have to wrap.
     * @param factory SimpleObjectFactory for new object creation
     * @return the wrapped List reference
     */
    public static List lazyList(List inList, SimpleObjectFactory factory) {
      /* creates a new lazy list with the provided factory */
      return new LazyList(inList, factory);
    }
    
    /** Creates a LazyList whith the class definition, which will be used to
     * create a SimpleObjectFactory which will create a new object from an empty
     * constructor.
     *
     * @param inMap the java.util.List implementation we have to wrap.
     * @param inClass class definition which will be ued to create the new object
     * @return the wrapped List reference
     */
    public static List lazyList(List inList, Class inClass) {
      /* creates a new lazy list with a new object factory */
      SimpleObjectFactory f = FactoryUtils.createStandardFactory(inClass);
      return new LazyList(inList, f);
    }
    
    /** Creates a LazyList whith the class definition and argument details,
     * which will be used to create a SimpleObjectFactory which will create a new
     * object from a constructor which requires arguments.
     *
     * @param inMap the java.util.List implementation we have to wrap.
     * @param inClass class definition which will be ued to create the new object
     * @param argTypes argument class types for the constructor
     * @param argObjects the objects for the arguments themselves
     * @return the wrapped List reference
     */
    public static List lazyList(List inList, Class inClass, Class[] argTypes,
                                Object[] argObjects) {
      /* creates a new lazy list with a new object factory */
      SimpleObjectFactory f = FactoryUtils.createStandardFactory(inClass, argTypes, argObjects);
      return new LazyList(inList, f);
    }
    
    
    
    /** Cleans a List implementation from nulls. Because a rampant index up the
     * line can create many nulls. At some point, the collection has to become
     * useful outside of reliable index use. clean() does this.
     *
     * @param inList Lsit to rip the nulls out of
     */
    public static void clean(List inList) {
      /* loop through backwards, removing out any nulls found */
      for (int i = (inList.size()-1); i >= 0; i--) {
        if (inList.get(i) == null) {
          inList.remove(i);
        }
      }
    }
    
    
    
    /* This is a java.util.List implementation which provides the means of objects
     * when requested. When a system expects an object to be provided when accessed
     * via an index, this collection has been provided the rules (factory reference)
     * to create an object, add it to the list and return it to the request.
     *
     * For example, when a request comes into the Struts controller for a bean, it
     * will created the bean. These request references can be indexed or mapped.
     * Problem for many reasons is that there is not an object waiting within the
     * session object. To recieve these updates, objects have to be created from the
     * collections that hold them.
     *
     * Only issue for lists, is that indexes will most often ben requested outside
     * the boulds of the list. This implementation will pack the spaces with null
     * objects. To make the list useful to business logic, a call to
     * <code>clean()</code> will clear the list of these null references.
     */
    private static class LazyList implements List {
      
      
      /* Builds a LazyList with the provided SimpleObjectFactory as the means of
       * creating the objects.
       */
      public LazyList(List inList, SimpleObjectFactory factory) {
        this.listImpl = inList;
        this.factory = factory;
      }
      
      
      /* Proxy method to the impl's get method. With the exception that if it's out
       * of bounds, then the collection will grow, leaving place-holders in its
       * wake, so that an item can be set at any given index. Later the
       * place-holders are removed to return to a pure collection.
       *
       * If there's a place-holder at the index, then it's replaced with a proper
       * object to be used.
       */
      public Object get(int index) {
        Object obj;
        int size = listImpl.size();
        if (index < this.listImpl.size()) {
          /* within bounds, get the object */
          obj = this.listImpl.get(index);
          if (obj == null) {
            /* item is a place holder, create new one, set and return */
            obj = this.factory.createObject();
            this.listImpl.set(index, obj);
            return obj;
          } else {
            /* good and ready to go */
            return obj;
          }
        } else {
          /* we have to grow the list */
          for (int i = this.listImpl.size(); i < (this.listImpl.size()-1); i++) {
            this.listImpl.add(null);
          }
          /* create our last object, set and return */
          obj = this.factory.createObject();
          this.listImpl.add(obj);
          return obj;
        }
      }
    
    
      /* proxy the call to the provided list implementation. */
      public List subList(int fromIndex, int toIndex) {
        /* wrap the returned sublist so it can continue the functionality */
        return new LazyList(this.listImpl.subList(fromIndex, toIndex), factory);
      }
      
      /* proxy the call to the provided list implementation.*/
      public int size() {
        return this.listImpl.size();
      }
      
      /* proxy the call to the provided list implementation. */
      public boolean isEmpty() {
        return this.listImpl.isEmpty();
      }
      
      /* proxy the call to the provided list implementation. */
      public boolean contains(Object o) {
        return this.listImpl.contains(o);
      }
      
      /* proxy the call to the provided list implementation. */
      public Iterator iterator() {
        return this.listImpl.iterator();
      }
      
      /* proxy the call to the provided list implementation. */
      public Object[] toArray() {
        return this.listImpl.toArray();
      }
      
      /* proxy the call to the provided list implementation. */
      public Object[] toArray(Object[] a) {
        return this.listImpl.toArray(a);
      }
      
      /* proxy the call to the provided list implementation. */
      public boolean add(Object o) {
        return this.listImpl.add(o);
      }
      
      /* proxy the call to the provided list implementation. */
      public boolean remove(Object o) {
        return this.listImpl.remove(o);
      }
      
      /* proxy the call to the provided list implementation. */
      public boolean containsAll(Collection c) {
        return this.listImpl.containsAll(c);
      }
      
      /* proxy the call to the provided list implementation. */
      public boolean addAll(Collection c) {
        return this.listImpl.addAll(c);
      }
      
      /* proxy the call to the provided list implementation. */
      public boolean addAll(int index, Collection c) {
        return this.listImpl.addAll(index, c);
      }
      
      /* proxy the call to the provided list implementation. */
      public boolean removeAll(Collection c) {
        return this.listImpl.removeAll(c);
      }
      
      /* proxy the call to the provided list implementation. */
      public boolean retainAll(Collection c) {
        return this.listImpl.retainAll(c);
      }
      
      /* proxy the call to the provided list implementation. */
      public void clear() {
        this.listImpl.clear();
      }
      
      /* proxy the call to the provided list implementation. */
      public Object set(int index, Object element) {
        return this.listImpl.set(index, element);
      }
      
      /* proxy the call to the provided list implementation. */
      public void add(int index, Object element) {
        this.listImpl.add(index, element);
      }
      
      /* proxy the call to the provided list implementation. */
      public Object remove(int index) {
        return this.listImpl.remove(index);
      }
      
      /* proxy the call to the provided list implementation. */
      public int indexOf(Object o) {
        return this.listImpl.indexOf(o);
      }
      
      /* proxy the call to the provided list implementation. */
      public int lastIndexOf(Object o) {
        return this.listImpl.lastIndexOf(o);
      }
      
      /* proxy the call to the provided list implementation. */
      public ListIterator listIterator() {
        return this.listImpl.listIterator();
      }
      
      /* proxy the call to the provided list implementation. */
      public ListIterator listIterator(int index) {
        return this.listImpl.listIterator(index); 
      }
      
    
    
      /* java.util.List implementation to proxy against */
      private List listImpl;
      
      /* optional object factory */
      private SimpleObjectFactory factory;
    }
      
      
      
      
    /* This is a java.util.Map implementation which provides the means of objects
     * when requested. When a system expects an object to be provided when accessed
     * via a key, this collection has been provided the rules (factory reference)
     * to create an object, add it to the map and return it to the request.
     *
     * For example, when a request comes into the Struts controller for a bean, it
     * will created the bean. These request references can be indexed or mapped.
     * Problem for many reasons is that there is not an object waiting within the
     * session object. To recieve these updates, objects have to be created from the
     * collections that hold them.
     */
    private static class LazyMap implements Map {
      
      
      /* Builds a LazyMap with the provided SimpleObjectFactory as the means of
       * creating the objects.
       */
      public LazyMap(Map inMap, SimpleObjectFactory factory) {
        this.mapImpl = inMap;
        this.factory = factory;
      }
      
      
      /* Proxy method to the impl's get method. With the exception that if there
       * is no keyed object waiting for it, an object will be created, set and
       * returned.
       */
      public Object get(Object key) {
        Object obj = this.mapImpl.get(key);
        if (obj == null) {
          /* create our last object, set and return */
          obj = this.factory.createObject();
          this.mapImpl.put(key, obj);
        }
        return obj;
      }
      
      
      /* proxy the call to the provided Map implementation. */
      public int size() {
        return this.mapImpl.size();
      }
      
      /* proxy the call to the provided Map implementation. */
      public boolean isEmpty() {
        return this.mapImpl.isEmpty();
      }
      
      /* proxy the call to the provided Map implementation. */
      public boolean containsKey(Object key) {
        return this.mapImpl.containsKey(key);
      }
      
      /* proxy the call to the provided Map implementation. */
      public boolean containsValue(Object value) {
        return this.mapImpl.containsValue(value);
      }
      
      /* proxy the call to the provided Map implementation. */
      public Object put(Object key, Object value) {
        return this.mapImpl.put(key, value);
      }
      
      /* proxy the call to the provided Map implementation. */
      public Object remove(Object key) {
        return this.mapImpl.remove(key);
      }
      
      /* proxy the call to the provided Map implementation. */
      public void putAll(Map t) {
        this.mapImpl.putAll(t);
      }
      
      /* proxy the call to the provided Map implementation. */
      public void clear() {
        this.mapImpl.clear();
      }
      
      /* proxy the call to the provided Map implementation. */
      public Set keySet() {
        return this.mapImpl.keySet();
      }
      
      /* proxy the call to the provided Map implementation. */
      public Collection values() {
        return this.mapImpl.values();
      }
      
      /* proxy the call to the provided Map implementation. */
      public Set entrySet() {
        return this.mapImpl.entrySet();
      }
      
      /* proxy the call to the provided Map implementation. */
      public boolean equals(Object o) {
        return this.mapImpl.equals(o);
      }
      
      /* proxy the call to the provided Map implementation. */
      public int hashCode() {
        return this.mapImpl.hashCode();
      }
    
    
      /* java.util.Map implementation to proxy against */
      protected Map mapImpl;
      
      /* optional object factory */
      protected SimpleObjectFactory factory;
    }
    
    
    
    
    
    /* This is a java.util.SortedMap implementation which provides the means of objects
     * when requested. When a system expects an object to be provided when accessed
     * via a key, this collection has been provided the rules (factory reference)
     * to create an object, add it to the map and return it to the request.
     *
     * For example, when a request comes into the Struts controller for a bean, it
     * will created the bean. These request references can be indexed or mapped.
     * Problem for many reasons is that there is not an object waiting within the
     * session object. To recieve these updates, objects have to be created from the
     * collections that hold them.
     */
    private static class LazySortedMap extends LazyMap implements SortedMap {
      
      
      /* Builds a LazySortedMap with the provided SimpleObjectFactory as the means of
       * creating the objects.
       */
      public LazySortedMap(SortedMap inMap, SimpleObjectFactory factory) {
        super(inMap, factory);
      }
      
      
      /* proxy the call to the provided LazySortedMap implementation. */
      public Comparator comparator() {
        return ((SortedMap)super.mapImpl).comparator();
      }
      
      /* proxy the call to the provided LazySortedMap implementation. */
      public SortedMap subMap(Object fromKey, Object toKey) {
        SortedMap subby = ((SortedMap)super.mapImpl).subMap(fromKey, toKey);
        return new LazySortedMap(subby, super.factory);
      }
      
      /* proxy the call to the provided LazySortedMap implementation. */
      public SortedMap headMap(Object toKey) {
        SortedMap heady = ((SortedMap)super.mapImpl).headMap(toKey);
        return new LazySortedMap(heady, super.factory);
      }
      
      /* proxy the call to the provided LazySortedMap implementation. */
      public SortedMap tailMap(Object fromKey) {
        SortedMap tailer = ((SortedMap)super.mapImpl).tailMap(fromKey);
        return new LazySortedMap(tailer, super.factory);
      }
      
      /* proxy the call to the provided LazySortedMap implementation. */
      public Object firstKey() {
        return ((SortedMap)super.mapImpl).firstKey();
      }
      
      /* proxy the call to the provided LazySortedMap implementation. */
      public Object lastKey() {
        return ((SortedMap)super.mapImpl).lastKey();
      }
    }
  }
  
  
  1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/SimpleObjectFactory.java
  
  Index: SimpleObjectFactory.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/SimpleObjectFactory.java,v 1.1 2002/05/29 02:57:41 arron Exp $
   * $Revision: 1.1 $
   * $Date: 2002/05/29 02:57:41 $
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2001 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 acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Struts", 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 Group.
   *
   * 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;
  
  import java.util.*;
  import java.lang.reflect.*;
  
  /**
   * SimpleObjectFactory
   * A simple interface that describes the most basic means of having the ability
   * to create an object.
   *
   * @author Arron Bates
   * @version $Revision: 1.1 $
   */
  public interface SimpleObjectFactory {
  
    /** Simple method from which will come the new object from the factory.
     *
     * @return Object reference to the new object.
     */
    public Object createObject();
    
  }
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>