FrontBaseTransactionTweaker.java from redshed at Krugle
Show FrontBaseTransactionTweaker.java syntax highlighted
// FrontBaseTransactionTweaker.java
//
// Copyright (c) 2002 Red Shed Software. All rights reserved.
// by Jonathan 'Wolf' Rentzsch (jon * redshed * net)
//
// Fri May 24 2002 wolf: Created.
// Sun Jul 07 2002 wolf: Was incorrectly using EOAdapter.adapterWithName() instead of EOAdapter.adapterWithModel().
import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;
import com.webobjects.jdbcadaptor.JDBCAdaptor;
import com.webobjects.jdbcadaptor.JDBCPlugIn;
import com.webobjects.jdbcadaptor.FrontbasePlugIn;
import org.apache.log4j.Category;
public class FrontBaseTransactionTweaker {
// Isolation Levels
public static interface IsolationLevel {
public String toString();
}
public static class ReadUncommitted implements IsolationLevel {
public String toString(){ return "READ UNCOMMITTED"; }
}
public static final ReadUncommitted readUncommitted = new ReadUncommitted();
public static class ReadCommitted implements IsolationLevel {
public String toString(){ return "READ COMMITTED"; }
}
public static final ReadCommitted readCommitted = new ReadCommitted();
public static class RepeatableRead implements IsolationLevel {
public String toString(){ return "REPEATABLE READ"; }
}
public static final RepeatableRead repeatableRead = new RepeatableRead();
public static class Serializable implements IsolationLevel {
public String toString(){ return "SERIALIZABLE"; }
}
public static final Serializable serializable = new Serializable();
public static class Versioned implements IsolationLevel {
public String toString(){ return "VERSIONED"; }
}
public static final Versioned versioned = new Versioned();
// Locking Discipline
public static interface LockingDiscipline {
public String toString();
}
public static class Pessimistic implements LockingDiscipline {
public String toString(){ return "PESSIMISTIC"; }
}
public static final Pessimistic pessimistic = new Pessimistic();
public static class Optimistic implements LockingDiscipline {
public String toString(){ return "OPTIMISTIC"; }
}
public static final Optimistic optimistic = new Optimistic();
public static class Deferred implements LockingDiscipline {
public String toString(){ return "DEFERRED"; }
}
public static final Deferred deferred = new Deferred();
public static void
setDefaultModelGroupTransactionSettings(
IsolationLevel isolation,
LockingDiscipline locking ) {
///JAssert.notNull( isolation );
///JAssert.notNull( locking );
EOEditingContext ec = null;
NSArray models = modelsInDefaultModelGroupConnectingToFrontBase();
for( java.util.Enumeration e = models.objectEnumerator(); e.hasMoreElements(); ) {
EOModel model = (EOModel) e.nextElement();
if( ec == null ) {
ec = new EOEditingContext();
ec.lock();
}
executeSQL( ec, model, isolation.toString(), locking.toString() );
addManuallyTweakedModel( model );
model = null;
}
if( ec != null ) {
ec.unlock();
ec.dispose();
ec = null;
}
}
public static void
setModelTransactionSettings(
EOModel model,
IsolationLevel isolation,
LockingDiscipline locking ) {
EOEditingContext ec = new EOEditingContext();
ec.lock();
executeSQL( ec, model, isolation.toString(), locking.toString() );
ec.unlock();
ec.dispose();
ec = null;
addManuallyTweakedModel( model );
}
// = = = = = = = = = = = =
// Private Implementation
// Vars.
private NSMutableArray _manuallyTweakedModels = new NSMutableArray();
private static final FrontBaseTransactionTweaker _singleton = new FrontBaseTransactionTweaker();
private static Category log = Category.getInstance( FrontBaseTransactionTweaker.class.getName() );
// Methods.
private static NSArray
modelsInDefaultModelGroupConnectingToFrontBase() {
NSMutableArray result = new NSMutableArray();
NSArray models = EOModelGroup.defaultGroup().models();
for( java.util.Enumeration e = models.objectEnumerator(); e.hasMoreElements(); ) {
EOModel model = (EOModel) e.nextElement();
///JAssert.notNull( model );
if( log.isDebugEnabled() ) log.debug( "examining model "+model );
EOAdaptor adaptor = EOAdaptor.adaptorWithModel( model );
if( log.isDebugEnabled() ) log.debug( "got adaptor "+adaptor );
///JAssert.notNull( adaptor );
if( adaptor instanceof JDBCAdaptor ) {
JDBCPlugIn plugin = ((JDBCAdaptor)adaptor).plugIn();
///JAssert.notNull( plugIn );
if( plugin instanceof FrontbasePlugIn ) {
log.info( "adding model "+model.name()+" to the list of FrontBase-connected models" );
result.addObject( model );
}
plugin = null;
}
adaptor = null;
model = null;
}
return result;
}
public void
initializeOnNotification(
NSNotification notification ) {
EOEditingContext ec = null;
NSArray models = modelsInDefaultModelGroupConnectingToFrontBase();
for( java.util.Enumeration e = models.objectEnumerator(); e.hasMoreElements(); ) {
EOModel model = (EOModel) e.nextElement();
if( !wasModelManuallyTweaked( model ) ) {
String isolation = (String) model.userInfo().objectForKey( "isolation" );
String locking = (String) model.userInfo().objectForKey( "locking" );
if( isolation != null && locking != null ) {
if( ec == null ) {
ec = new EOEditingContext();
ec.lock();
}
executeSQL( ec, model, isolation, locking );
}
}
}
if( ec != null ) {
ec.unlock();
ec.dispose();
ec = null;
}
}
private static void
executeSQL(
EOEditingContext ec,
EOModel model,
String isolation,
String locking ) {
if( log.isDebugEnabled() ) {
log.debug( "model: "+model
+" isolation: "+isolation
+" locking: "+locking );
}
EOUtilities.rawRowsForSQL( ec, model.name(),
"SET TRANSACTION ISOLATION LEVEL "+isolation
+", LOCKING "+locking
+", READ WRITE;" );
}
private static void
addManuallyTweakedModel(
EOModel model ) {
log.debug( "adding model "+model.name()+" to manually tweaked list" );
_singleton._manuallyTweakedModels.addObject( model );
}
private static boolean
wasModelManuallyTweaked(
EOModel model ) {
return _singleton._manuallyTweakedModels.indexOfObject( model ) != NSArray.NotFound;
}
static {
NSNotificationCenter.defaultCenter().addObserver(
_singleton,
new NSSelector( "initializeOnNotification",
new Class[] { NSNotification.class } ),
WOApplication.ApplicationWillFinishLaunchingNotification,
null );
}
}
See more files for this project here