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