/*--------------------------------------------------------------------------
 *
 * 	You may freely copy, distribute, and reuse the code in this example.
 * 	SHL Systemhouse disclaims any warranty of any kind, expressed or  
 *	implied, as to its fitness for any particular use.
 *
 *
 *	DataSource
 *
 *	Inherits From:		NSObject
 *
 *	Conforms To:		EOQualifiedDataSources, EORollbackDataSources
 *
 *	Declared In:		DataSource.h
 *
 *
 *------------------------------------------------------------------------*/
#import "DataSource.h"
#import "Motorcycle.h"
#import <foundation/NSUtilities.h>
#import <appkit/Application.h>

#define print_trace [[NXApp delegate] perform: @selector (console:) with:\
[NSString stringWithFormat: @"DATASOURCE  %s\n", sel_getName(_cmd)]]




@implementation DataSource

/*--------------------------------------------------------------------------
 *	EODataSources Protocol
 *
 *  The EODataSources protocol defines the interface for a source of
 *  data-bearing objects retrieved from some external store, such as an RDBMS.
 *  EODataSources uses a simple insert/delete/update/fetch model.
 * 
 *  Changes to the objects provided by a data source are made in two phases.
 *  First, you can modify an object independently of the data source.  These
 *  changes don't affect the external store until you send an -insertObject:,
 *  -deleteObject:, or -updateObject: message.  For example, if you release an
 *  object you received from the data source, it isn't deleted from the
 *  external store.  Invoking one of the messages listed sends the changes
 *  associated with the object to the external store.  You must invoke
 *  -saveObjects to make your changes permanent.  If an external store supports
 *  rolling back of changes you can invoke -rollback (declared in the
 *  EORollbackDataSources protocol) to undo the changes made since the last
 *  -saveObjects message.
 *
 *------------------------------------------------------------------------*/
- (NSArray *) keys
{
    // Returns the names of the keys that describe the data-bearing objects.

	print_trace;
	return [NSArray arrayWithObject: @"Model"];
}


- createObject
{
    // Returns a new data bearing object with no values set, or nil if the
    // data source won't allow object insertion.  You're responsible for
    // assigning a proper primary key.

	print_trace;
	return [[Motorcycle alloc] init];
}


- (BOOL) insertObject: object
{
    // Inserts object into the data source.  Returns YES on success, NO on
    // failure for any reason.

	print_trace;

	if ([object isKindOf: [Motorcycle class]] == NO)  return NO;

	if (workingStore == nil) 
		workingStore = [[NSMutableArray allocWithZone: [self zone]]
			 initWithCapacity: 1];

	[workingStore addObject: object];
	return YES;
}


- (BOOL) deleteObject: object
{
    // Deletes object from the data source.  Returns YES on success, NO on
    // failure for any reason.

	print_trace;

	if ([object isKindOf: [Motorcycle class]] == NO)  return NO;
	if (workingStore == nil)  return NO;
	
	[workingStore removeObject: object];
	return YES;
}


- (BOOL) updateObject: object
{
    // Saves changes to object to the data source.  Returns YES on success,
    // NO on failure for any reason.

	print_trace;
	return YES;
}


- (NSArray *) fetchObjects
{
    // Returns an array of the data-bearing objects in the data source.

	print_trace;
	return persistentStore;
}


- (BOOL) saveObjects
{
    // Saves objects to persistent storage, if needed.  Returns YES on
    // success, NO on failure for any reason.

	print_trace;

	if (persistentStore == nil) 
		persistentStore = [[NSMutableArray allocWithZone: [self zone]]
			 initWithCapacity: [workingStore count]];

	[persistentStore removeAllObjects];
	[persistentStore addObjectsFromArray: workingStore];
	return YES;
}


- (BOOL) canDelete
{
    // Returns YES if the data source allows objects to be deleted, NO if it
    // doesn't.

	print_trace;
	return YES;
}


/*--------------------------------------------------------------------------
 *	EOQualifiedDataSources Protocol
 *
 *  The EOQualifiedDataSources protocol decalres methods that must be
 *  implemented by data sources that provide sub data sources rooted in the
 *  super data source.
 *
 *------------------------------------------------------------------------*/
- (NSArray *) keysForPath: (NSString *)aPath
{
    // The path supplied is a concatenation of all the keys used to get to
    // a detail datasource with each key separated by a '.'; for example,
    // "toAuthor.toPublisher.address".
    
	print_trace;
	return nil;
}


- (id <EODataSources>) dataSourceQualifiedByKey:(NSString *)key ofObject:object
{
    // Returns a data source that supplies objects associated with object's
    // key. This can be used for creating master-detail data sources.

	print_trace;
	return nil;
}


/*--------------------------------------------------------------------------
 *	EORollbackDataSources Protocol
 *------------------------------------------------------------------------*/
- (void) rollback
{
    // Reverses any changes made by -insertObject:, -deleteObject:, or
    // -updateObject: since the data source was last sent a -saveObjects
    // message.

	print_trace;
	[workingStore removeAllObjects];
	[workingStore addObjectsFromArray: persistentStore];
}


@end
