/* Wotonomy: OpenStep design patterns for pure Java applications. Copyright (C) 2000 Michael Powers 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.List; import java.util.Map; import net.wotonomy.foundation.NSArray; /** * EOObjectStore defines an object repository that tracks object creations, * deletions, and updates made by EOEditingContexts.
*
* * A concrete implementation would probably write these changes to some kind of * persistent storage, like a database.
*
* * EOEditingContext is itself a subclass of EOObjectStore that requires an * EOObjectStore parent for committing its changes. This means that * EOEditingContexts can use other EOEditingContexts as their parent, but there * still must exist an EOObjectStore as the root of the editing graph. * * @author michael@mpowers.net * @author $Author: cgruber $ * @version $Revision: 894 $ */ public abstract class EOObjectStore { /** * Key for the user info of ObjectsChangedInStoreNotifications. The key should * retrieve an array of deleted EOGlobalIDs. */ public static final String DeletedKey = "deleted"; /** * Key for the user info of ObjectsChangedInStoreNotifications. The key should * retrieve an array of inserted EOGlobalIDs. */ public static final String InsertedKey = "inserted"; /** * Key for the user info of ObjectsChangedInStoreNotifications. The key should * retrieve an array of updated EOGlobalIDs. EOEditingContexts should refault * their copies of these objects. */ public static final String UpdatedKey = "updated"; /** * Key for the user info of ObjectsChangedInStoreNotification. The key should * retrieve an array of EOGlobalIDs. */ public static final String InvalidatedKey = "invalidated"; /** * Key for the NSNotification posted when this object store is asked to * invalidate all objects. Object of the notification will be this object store, * and user info will contain the InvalidatedKey. */ public static final String InvalidatedAllObjectsInStoreNotification = "EOInvalidatedAllObjectsInStoreNotification"; /** * Key for the NSNotification posted when this object store is changed. Object * of the notification will be this object store, and user info will contain * InsertedKey, UpdatedKey, DeletedKey, and InvalidatedKey. */ public static final String ObjectsChangedInStoreNotification = "EOObjectsChangedInStoreNotification"; /** * Default constructor is responsible for initializing internal state. */ public EOObjectStore() { } /** * Called by editing contexts when they no longer need to track the specified * id. You will not need to call this method, but you use use it for a hint that * the specified global id is not in use by that child editing context. */ public void editingContextDidForgetObjectWithGlobalID(EOEditingContext aContext, EOGlobalID aGlobalID) { } /** * Returns a List of objects associated with the object with the specified id * for the specified property relationship, or may return a placeholder array * that will defer the fetch until accessed (an array fault). All objects must * be registered the specified editing context. The specified relationship key * must produce a result of type Collection for the source object or an * exception is thrown. */ public abstract NSArray arrayFaultWithSourceGlobalID(EOGlobalID aGlobalID, String aRelationship, EOEditingContext aContext); /** * Returns the object for the specified id. The returned object may be a fault. * The object will be registered in the specified editing context. */ public abstract /* EOEnterpriseObject */ Object faultForGlobalID(EOGlobalID aGlobalID, EOEditingContext aContext); /** * Returns a fault representing an object of the specified entity type with * values from the specified dictionary. The fault should belong to the * specified editing context. */ public abstract /* EOEnterpriseObject */ Object faultForRawRow(Map aDictionary, String anEntityName, EOEditingContext aContext); /** * Given a newly instantiated object, this method initializes its properties to * values appropriate for the specified id. The object should already belong to * the specified editing context. This method is called to populate faults. */ public abstract void initializeObject(/* EOEnterpriseObject */ Object eo, EOGlobalID aGlobalID, EOEditingContext aContext); /** * Remove all values from all objects in memory, turning them into faults, and * posts an NSNotification that all objects have been invalidated. The * notification should be named with the string constant * InvalidatedAllObjectsInStoreNotification with this object store as the object * and no user info. */ public abstract void invalidateAllObjects(); /** * Removes values with the specified ids from memory, turning them into faults, * and posts a notification that those objects have been invalidated. The * notification should be named with the string constant * ObjectsChangedInStoreNotification with this object store as the object and * user info containing a key named InvalidateKey that returns a List of the * EOGlobalIDs of the invalidated objects. */ public abstract void invalidateObjectsWithGlobalIDs(List aList); /** * Returns whether the object corresponding to the specified id is locked. The * concept of object locking is implementation-specific. */ public abstract boolean isObjectLockedWithGlobalID(EOGlobalID aGlobalID, EOEditingContext aContext); /** * Locks the object corresponding to the specified id is locked. The concept of * object locking is implementation-specific. The lock may be released when * objects are invalidated or commited, but this behavior is not required. */ public abstract void lockObjectWithGlobalID(EOGlobalID aGlobalID, EOEditingContext aContext); /** * Returns a List of objects associated with the object with the specified id * for the specified property relationship. This method may not return an array * fault because array faults call this method to fetch on demand. All objects * must be registered the specified editing context. The specified relationship * key must produce a result of type Collection for the source object or an * exception is thrown. */ public abstract NSArray objectsForSourceGlobalID(EOGlobalID aGlobalID, String aRelationship, EOEditingContext aContext); /** * Returns a List of objects the meet the criteria of the supplied * specification. Faults are not allowed in the array. Each object is registered * with the specified editing context. If any object is already fetched in the * specified context, it is not refetched and that object should be used in the * array. */ public abstract NSArray objectsWithFetchSpecification(EOFetchSpecification aFetchSpec, EOEditingContext aContext); /** * Removes all values from the specified object, converting it into a fault for * the specified id. New or deleted objects should not be refaulted. */ public abstract void refaultObject(Object anObject, EOGlobalID aGlobalID, EOEditingContext aContext); /** * Writes all changes in the specified editing context to the respository. The * object store is expected to post a notification that should be named with the * string constant ObjectsChangedInStoreNotification with this object store as * the object and user info containing keys named UpdatedKey, InsertedKey, and * DeletedKey that return Lists of the EOGlobalIDs of the corresponding objects. */ public abstract void saveChangesInEditingContext(EOEditingContext aContext); } /* * $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.15 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.14 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.13 2002/02/13 21:20:15 mpowers Updated comments. * * Revision 1.12 2001/05/05 23:05:42 mpowers Implemented Array Faults. * * Revision 1.11 2001/02/21 21:17:32 mpowers Now retaining a reference to the * recent changes observer. Better documented need to retain reference. Started * implementing notifications. * * Revision 1.10 2001/02/16 22:51:29 mpowers Now deep-cloning objects passed * between editing contexts. * * Revision 1.9 2001/02/16 18:34:19 mpowers Implementing nested contexts. * * Revision 1.8 2001/02/15 21:13:30 mpowers First draft implementation is * complete. Now on to debugging. * * Revision 1.7 2001/02/14 23:03:02 mpowers A near-complete first draft of * EOEditingContext. * * Revision 1.6 2001/02/13 23:24:29 mpowers Implementing more of editing * context. * * Revision 1.5 2001/02/12 20:36:36 mpowers Documented methods. * * Revision 1.4 2001/02/09 22:09:34 mpowers Completed implementation of * EOObjectStore. * * Revision 1.3 2001/02/06 15:24:11 mpowers Widened parameters on abstract * method to fix build. * * Revision 1.2 2001/02/06 14:57:42 mpowers Defined abstract methods. * * Revision 1.1.1.1 2000/12/21 15:46:42 mpowers Contributing wotonomy. * * Revision 1.2 2000/12/20 16:25:35 michael Added log to all files. * * */