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