/* 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. * * */