Project Wonder 5.0.0.8795

er.extensions.eof
Class ERXDatabaseContextDelegate

java.lang.Object
  extended by er.extensions.eof.ERXDatabaseContextDelegate

public class ERXDatabaseContextDelegate
extends Object

This delegate implements several methods from the formal interface EODatabaseContext.Delegate. Of special note this class adds the ability for enterpriseobjects to generate their own primary keys, correctly throws an exception when a toOne relationship object is not found in the database and adds debugging abilities to tracking down when faults are fired. It also supports a cache for array fault that is checked before they are fetched from the database.


Nested Class Summary
static class ERXDatabaseContextDelegate.ObjectNotAvailableException
           
 
Field Summary
static String DatabaseContextFailedToFetchObject
           
static Logger dbLog
          Faulting logging support, logging category: er.transaction.adaptor.FaultFiring
static Logger exLog
          Faulting logging support, logging category: er.transaction.adaptor.Exceptions
static Logger log
          Basic logging support
 
Constructor Summary
ERXDatabaseContextDelegate()
           
 
Method Summary
 ERXArrayFaultCache arrayFaultCache()
           
 void databaseContextDidFetchObjects(EODatabaseContext dbc, NSArray eos, EOFetchSpecification fs, EOEditingContext ec)
          Sets the cache enty for the fetched objects.
 void databaseContextDidSelectObjects(EODatabaseContext dc, EOFetchSpecification fs, EODatabaseChannel channel)
          This delegate method is called every time a fault is fired that needs to go to the database.
 boolean databaseContextFailedToFetchObject(EODatabaseContext context, Object object, EOGlobalID gid)
          This is Kelly Hawks' fix for the missing to one relationship.
 NSDictionary databaseContextNewPrimaryKey(EODatabaseContext databaseContext, Object object, EOEntity entity)
          Provides the ability for new enterprise objects that implement the interface ERXGeneratesPrimaryKeyInterface to provide their own primary key dictionary.
 boolean databaseContextShouldFetchArrayFault(EODatabaseContext eodatabasecontext, Object obj)
          This delegate method first checks the arrayFaultCache if it is set before trying to resolve the fault from the DB.
 NSArray databaseContextShouldFetchObjects(EODatabaseContext dbc, EOFetchSpecification fs, EOEditingContext ec)
          Returns an array of already fetched objects or null if they were not already fetched.
 boolean databaseContextShouldHandleDatabaseException(EODatabaseContext dbc, Exception e)
          Allows custom handling of dropped connection exceptions.
 boolean databaseContextShouldHandleDatabaseException(EODatabaseContext databaseContext, Throwable throwable)
          Provides for a hook to get at the original exceptions from the JDBC driver, as opposed to the cooked EOGeneralAdaptorException you get from EOF.
 NSArray databaseContextWillPerformAdaptorOperations(EODatabaseContext dbCtxt, NSArray adaptorOps, EOAdaptorChannel adChannel)
          Overridden to remove inserts and deletes of the "same" row.
static ERXDatabaseContextDelegate defaultDelegate()
          Returns the singleton of the database context delegate
 ERXFetchResultCache fetchResultCache()
           
 void setArrayFaultCache(ERXArrayFaultCache value)
           
static void setDefaultDelegate(ERXDatabaseContextDelegate delegate)
           
 void setFetchResultCache(ERXFetchResultCache value)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DatabaseContextFailedToFetchObject

public static final String DatabaseContextFailedToFetchObject
See Also:
Constant Field Values

log

public static final Logger log
Basic logging support


dbLog

public static final Logger dbLog
Faulting logging support, logging category: er.transaction.adaptor.FaultFiring


exLog

public static final Logger exLog
Faulting logging support, logging category: er.transaction.adaptor.Exceptions

Constructor Detail

ERXDatabaseContextDelegate

public ERXDatabaseContextDelegate()
Method Detail

defaultDelegate

public static ERXDatabaseContextDelegate defaultDelegate()
Returns the singleton of the database context delegate


setDefaultDelegate

public static void setDefaultDelegate(ERXDatabaseContextDelegate delegate)
Parameters:
delegate - - the singleton database context delegate to set

arrayFaultCache

public ERXArrayFaultCache arrayFaultCache()

setArrayFaultCache

public void setArrayFaultCache(ERXArrayFaultCache value)

fetchResultCache

public ERXFetchResultCache fetchResultCache()

setFetchResultCache

public void setFetchResultCache(ERXFetchResultCache value)

databaseContextShouldFetchObjects

public NSArray databaseContextShouldFetchObjects(EODatabaseContext dbc,
                                                 EOFetchSpecification fs,
                                                 EOEditingContext ec)
Returns an array of already fetched objects or null if they were not already fetched.

Parameters:
dbc -
fs -
ec -

databaseContextDidFetchObjects

public void databaseContextDidFetchObjects(EODatabaseContext dbc,
                                           NSArray eos,
                                           EOFetchSpecification fs,
                                           EOEditingContext ec)
Sets the cache enty for the fetched objects.

Parameters:
dbc -
eos -
fs -
ec -

databaseContextShouldHandleDatabaseException

public boolean databaseContextShouldHandleDatabaseException(EODatabaseContext databaseContext,
                                                            Throwable throwable)
Provides for a hook to get at the original exceptions from the JDBC driver, as opposed to the cooked EOGeneralAdaptorException you get from EOF. To see the exceptions trace, set the logger er.transaction.adaptor.Exceptions to DEBUG.

Parameters:
databaseContext -
throwable -

databaseContextNewPrimaryKey

public NSDictionary databaseContextNewPrimaryKey(EODatabaseContext databaseContext,
                                                 Object object,
                                                 EOEntity entity)
Provides the ability for new enterprise objects that implement the interface ERXGeneratesPrimaryKeyInterface to provide their own primary key dictionary. If the enterprise object implements the above interface then the method primaryKeyDictionary(true) will be called on the object. If the object returns null then a primary key will be generated for the object in the usual fashion.

Parameters:
databaseContext - databasecontext
object - the new enterprise object
entity - the entity of the object
Returns:
primary key dictionary to be used or null if a primary key should be generated for the object.

databaseContextShouldHandleDatabaseException

public boolean databaseContextShouldHandleDatabaseException(EODatabaseContext dbc,
                                                            Exception e)
                                                     throws Throwable
Allows custom handling of dropped connection exceptions. This was needed in WebObjects 4.5 because the OracleEOAdaptor wouldn't correctly handle all exceptions of dropped connections. This may not be needed now.

Parameters:
dbc - current database context
e - throw exception
Returns:
if the exception is one of the bad ones that isn't handled then the method handleDroppedConnection is called directly on the database object of the context and false is returned otherwise true.
Throws:
Throwable

databaseContextFailedToFetchObject

public boolean databaseContextFailedToFetchObject(EODatabaseContext context,
                                                  Object object,
                                                  EOGlobalID gid)
This is Kelly Hawks' fix for the missing to one relationship. Delegate on EODatabaseContext that gets called when a to-one fault cannot find its data in the database. The object that is returned is a cleared fault. We raise here to restore the functionality that existed prior to WebObjects 4.5. Whenever a fault fails for a globalID (i.e. the object is NOT found in the database), we raise an EOObjectNotAvailableException.
If you have entities you don't really care about, you can set the system property er.extensions.ERXDatabaseContextDelegate.tolerantEntityPattern to a regular expression that will be tested against the GID entity name. If it matches, then only an error will be logged but no exception will be thrown.

Parameters:
context - database context
object - object that is firing the fault for a given to-one relationship
gid - global id that wasn't found in the database.

databaseContextDidSelectObjects

public void databaseContextDidSelectObjects(EODatabaseContext dc,
                                            EOFetchSpecification fs,
                                            EODatabaseChannel channel)
This delegate method is called every time a fault is fired that needs to go to the database. All we have added is logging statement of the debug priority. This way during runtime a developer can toggle the logger priority settting on and off to see what faults are firing. Also note that when using ERXPatternLayout one can set the option to see full backtraces to the calling method. With this option specified a developer can see exactly which methods are firing faults.

Parameters:
dc - the databasecontext
fs - the fetchspecification
channel - the databasechannel

databaseContextShouldFetchArrayFault

public boolean databaseContextShouldFetchArrayFault(EODatabaseContext eodatabasecontext,
                                                    Object obj)
This delegate method first checks the arrayFaultCache if it is set before trying to resolve the fault from the DB. It can be a severe performance optimisation depending on your setup.

Parameters:
eodatabasecontext -
obj -

databaseContextWillPerformAdaptorOperations

public NSArray databaseContextWillPerformAdaptorOperations(EODatabaseContext dbCtxt,
                                                           NSArray adaptorOps,
                                                           EOAdaptorChannel adChannel)
Overridden to remove inserts and deletes of the "same" row. When you delete from a join table and then re-add the same object, then the order of operations would be insert, then delete and you will get an error because the delete would try to also delete the newly inserted row. Here we just check every insert and see if the deleted contains the same object. If they do, we just skip both operations,

Parameters:
dbCtxt -
adaptorOps -
adChannel -

Last updated: Fri, Jan 9, 2009 • 04:35 AM EST

Copyright © 2002 – 2007 Project Wonder.