package com.webobjects.eocontrol; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Enumeration; import java.util.Iterator; import java.util.ListIterator; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSMutableArray; import com.webobjects.foundation._NSUtilities; /** * Reimplementation which fixes a bug in NSArray, where the iterator methods won't trigger the fault. * * @author ak */ public class _EOCheapCopyArray extends NSArray implements EOFaulting { public static final Class _CLASS = _NSUtilities._classWithFullySpecifiedName("com.webobjects.eocontrol._EOCheapCopyArray"); static final long serialVersionUID = -1712494429L; private transient EOFaultHandler _faultHandler; public _EOCheapCopyArray() { } public _EOCheapCopyArray(NSArray otherArray) { super(otherArray); } public void _setArray(NSArray otherArray) { willRead(); int count = otherArray.count(); _objects = null; if (count > 0) { _objects = new Object[count]; System.arraycopy(((otherArray.objects())), 0, ((_objects)), 0, count); } _setMustRecomputeHash(true); } public void clearFault() { _faultHandler = null; } @Override public int count() { willRead(); return super.count(); } public EOFaultHandler faultHandler() { return _faultHandler; } public boolean isFault() { return _faultHandler != null; } @Override public NSMutableArray mutableClone() { if (_faultHandler != null) { return _faultHandler._mutableCloneForArray(this); } return super.mutableClone(); } @Override public NSArray immutableClone() { if (_faultHandler != null) { return _faultHandler._immutableCloneForArray(this); } return new _EOCheapCopyArray(this); } @Override public Object get(int index) { willRead(); return super.get(index); } @Override public Object objectAtIndex(int index) { willRead(); return super.objectAtIndex(index); } @Override public Enumeration objectEnumerator() { willRead(); return super.objectEnumerator(); } @Override public int hashCode() { // willRead(); return super.hashCode(); } @Override public Iterator iterator() { willRead(); return super.iterator(); } @Override public ListIterator listIterator() { willRead(); return super.listIterator(); } @Override public ListIterator listIterator(int index) { willRead(); return super.listIterator(index); } @Override protected Object[] objectsNoCopy() { willRead(); return super.objectsNoCopy(); } @Override public Enumeration reverseObjectEnumerator() { willRead(); return super.reverseObjectEnumerator(); } @Override public int lastIndexOf(Object element) { willRead(); return super.lastIndexOf(element); } @Override public String toString() { if (isFault()) { return getClass().getName() + "[" + Integer.toHexString(System.identityHashCode(this)) + "]"; } return super.toString(); } public void turnIntoFault(EOFaultHandler handler) { _faultHandler = handler; _initializeWithCapacity(0); } public void willRead() { if (_faultHandler != null) { EOFaultHandler localHandler = _faultHandler; localHandler.completeInitializationOfObject(this); if (_faultHandler != null) { return; } _setMustRecomputeHash(true); } } private void writeObject(ObjectOutputStream s) throws IOException { willRead(); s.defaultWriteObject(); } }