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