/* Wotonomy: OpenStep design patterns for pure Java applications. Copyright (C) 2001 Intersect Software Corporation This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, see http://www.gnu.org */ package net.wotonomy.control; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import net.wotonomy.foundation.NSArray; /** * A class that extends NSArray to intercept any accessor calls in order to * defer loading until the last possible moment.
*
* * Because ArrayFault inherits from NSArray which implements List which * implements Collection, data objects may declare their relationships to be of * type NSArray, List, or Collection.
*
* * This class should be returned by implementations of * EOObjectStore.arrayFaultForSourceGlobalID(). */ public class ArrayFault extends NSArray { private EOEditingContext editingContext; private EOGlobalID sourceID; private String relationshipKey; private boolean fetched; public ArrayFault(EOGlobalID aSourceID, String aRelationshipKey, EOEditingContext aContext) { super(); editingContext = aContext; sourceID = aSourceID; relationshipKey = aRelationshipKey; fetched = false; } public boolean isFetched() { return fetched; } protected void fireFault() { if (!fetched) { //new net.wotonomy.ui.swing.util.StackTraceInspector(); //System.out.println( "ArrayFault.fireFault: before:" + this ); fetched = true; super.protectedAddAll(editingContext.parentObjectStore().objectsForSourceGlobalID(sourceID, relationshipKey, editingContext)); //System.out.println( "ArrayFault.fireFault: after:" + this ); } } public Object clone() { fireFault(); return super.clone(); } public boolean contains(Object elem) { fireFault(); return super.contains(elem); } public boolean equals(Object o) { fireFault(); return super.equals(o); } public Object get(int index) { fireFault(); return super.get(index); } /** * Overridden to return the identity hash. This somewhat violates the List * contract, but otherwise calling hash code would fire the fault. Bottom line: * don't use array faults as keys in hash maps. */ public int hashCode() { return System.identityHashCode(this); } public int indexOf(Object o) { fireFault(); return super.indexOf(o); } public boolean isEmpty() { fireFault(); return super.isEmpty(); } public Iterator iterator() { fireFault(); return super.iterator(); } public int lastIndexOf(Object o) { fireFault(); return super.lastIndexOf(o); } public ListIterator listIterator() { fireFault(); return super.listIterator(); } public ListIterator listIterator(int index) { fireFault(); return super.listIterator(index); } public int size() { fireFault(); return super.size(); } public List subList(int fromIndex, int toIndex) { fireFault(); return super.subList(fromIndex, toIndex); } public Object[] toArray() { fireFault(); return super.toArray(); } public Object[] toArray(Object[] a) { fireFault(); return super.toArray(a); } /** * Overridden to display information about the fault only if not fetched. Calls * to super if fetched. */ public String toString() { if (isFetched()) { return super.toString(); } return "[ArrayFault@" + Integer.toHexString(System.identityHashCode(this)) + ":" + sourceID + ":" + relationshipKey + "]"; } } /* * $Log$ Revision 1.2 2006/02/16 16:47:14 cgruber Move some classes in to * "internal" packages and re-work imports, etc. * * Also use UnsupportedOperationExceptions where appropriate, instead of * WotonomyExceptions. * * Revision 1.1 2006/02/16 13:19:57 cgruber Check in all sources in * eclipse-friendly maven-enabled packages. * * Revision 1.5 2003/12/18 15:37:38 mpowers Changes to retain ability to work * with objects that don't necessarily implement EOEnterpriseObject. I would * still like to preserve this case for general usage, however the access * package is free to assume that those objects will be EOs and cast * appropriately. * * Revision 1.4 2003/08/19 01:53:12 chochos EOObjectStore had some incompatible * return types (Object instead of EOEnterpriseObject, in fault methods mostly). * It's internally consistent but I hope it doesn't break anything based on * this, even though fault methods mostly throw exceptions for now. * * Revision 1.3 2002/10/24 18:17:37 mpowers ArrayFaults are now read-only. * * Revision 1.2 2001/05/06 22:22:55 mpowers Debugging. * * Revision 1.1 2001/05/05 23:05:42 mpowers Implemented Array Faults. * * */