diff options
| author | Benjamin Culkin <scorpress@gmail.com> | 2024-05-19 17:56:33 -0400 |
|---|---|---|
| committer | Benjamin Culkin <scorpress@gmail.com> | 2024-05-19 17:56:33 -0400 |
| commit | aedc34d55462a75e329bbf342251ff6504cd117e (patch) | |
| tree | bcc8f1f2352582717b484df302aeea6696b8f000 /projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/ChildDataSource.java | |
Initial import from SVN
Diffstat (limited to 'projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/ChildDataSource.java')
| -rw-r--r-- | projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/ChildDataSource.java | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/ChildDataSource.java b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/ChildDataSource.java new file mode 100644 index 0000000..8123668 --- /dev/null +++ b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/ChildDataSource.java @@ -0,0 +1,187 @@ +package net.wotonomy.control; + +import java.util.Collection; +import java.util.Iterator; + +import net.wotonomy.foundation.NSArray; +import net.wotonomy.foundation.NSMutableArray; + +/** +* A data source that automates the process of +* creating a child editing context and copying +* objects from a parent context into it. +* Attach this data source to a display group +* that represents a "detail" or "drill-down" +* view. <br><br> +* +* Once created, editingContext() will return the +* child context, and fetch() will return the objects +* that were copied into the child context. +*/ +public class ChildDataSource extends EODataSource +{ + private EODataSource parent; + private EOEditingContext context; + private EOClassDescription classDescription; + private NSMutableArray objects; + + /** + * Creates a child editing context for the + * specified parent's context and copies the + * specified object into the child context. + * The object must exist in the parent context. + * fetch() will return the child's object. + */ + public ChildDataSource( + EODataSource aParentSource, + Object anObject ) + { + this( aParentSource, new NSArray( (Object) anObject ) ); + } + + /** + * Creates a child editing context for the + * specified parent's context and copies the + * specified objects into the child context. + * The objects must exist in the parent context. + * The order of the parent's objects in the + * collection will determine the order in + * which the child objects are returned from + * fetch(). + */ + public ChildDataSource( + EODataSource aParentSource, + Collection anObjectList ) + { + EOEditingContext parentContext = + aParentSource.editingContext(); + + parent = aParentSource; + context = new EOEditingContext( parentContext ); +//!new net.wotonomy.ui.swing.util.ObjectInspector( context ); + objects = new NSMutableArray(); + classDescription = null; + + Object o; + Object copy; + boolean allSameClass = true; + Iterator it = anObjectList.iterator(); + while ( it.hasNext() ) + { + o = it.next(); + + // determine class + if ( allSameClass == true ) + { + Class c = o.getClass(); + if ( classDescription == null ) + { + classDescription = + EOClassDescription.classDescriptionForClass( c ); + } + else + { + if ( c != classDescription.getDescribedClass() ) + { + allSameClass = false; + classDescription = null; + } + } + } + + // copy and add to list + objects.addObject( parentContext.faultForGlobalID( + parentContext.globalIDForObject( o ), context ) ); + } + } + + /** + * Returns the editing context for this data source, + * which was created in the constructor and whose + * parent is the editing context specified in the + * constructor. + */ + public EOEditingContext editingContext() + { + return context; + } + + /** + * This implementation does nothing. + */ + public void insertObject ( Object anObject ) + { + + } + + /** + * This implementation does nothing. + */ + public void deleteObject ( Object anObject ) + { + + } + + /** + * Returns a List containing the objects in this + * data source. This implementation returns all + * TestObjects that have been persisted to the + * datastore in the data directory. + */ + public NSArray fetchObjects () + { + return new NSArray( (Collection) objects ); + } + + /** + * Returns a data source that is capable of + * manipulating objects of the type returned by + * applying the specified key to objects + * vended by this data source. + * This implementation forwards the call to + * the parent data source. + * @see #qualifyWithRelationshipKey + */ + public EODataSource + dataSourceQualifiedByKey ( String aKey ) + { + //FIXME: This is fundamentally broken. + // Objects vended from the returned source + // are not registered in our editing context. + // We probably need yet another utility data + // source class that would wrap another source + // and convert vended objects into a different + // context. + + return parent.dataSourceQualifiedByKey( aKey ); + } + + /** + * Restricts this data source to vend those + * objects that are associated with the specified + * key on the specified object. + * This implementation forwards the call to + * the parent data source. + */ + public void + qualifyWithRelationshipKey ( + String aKey, Object anObject ) + { + parent.qualifyWithRelationshipKey( aKey, anObject ); + } + + /** + * Returns the description of the class of the + * objects that is vended by this data source, + * or null if this cannot be determined. + * This implementation returns the class of the + * objects passed to the constructor if they are + * all the same class, otherwise returns null. + */ + public EOClassDescription + classDescriptionForObjects () + { + return classDescription; + } + +} |
