You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2011/01/30 02:46:14 UTC

svn commit: r1065164 - in /cayenne/main/trunk: docs/doc/src/main/resources/ framework/cayenne-jdk1.5-unpublished/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayen...

Author: aadamchik
Date: Sun Jan 30 01:46:13 2011
New Revision: 1065164

URL: http://svn.apache.org/viewvc?rev=1065164&view=rev
Log:
CAY-1536 Expand deserialization context to provide Injector object instead of just a DataChannel

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/CayenneRuntimeTest.java
      - copied, changed from r1065163, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/BaseContextTest.java
Modified:
    cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/pom.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneDataObject.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/CayenneRuntime.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/BaseContextTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSerializationTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/unit/MultiContextCase.java

Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Sun Jan 30 01:46:13 2011
@@ -19,6 +19,7 @@ CAY-1509 Lifecycle event annotations sup
 CAY-1532 Import cayenne-lifecycle from sandbox
 CAY-1533 Deprecate org.apache.cayenne.xml
 CAY-1534 cayenne-lifecycle: implement AuditableFilter
+CAY-1536 Expand deserialization context to provide Injector object instead of just a DataChannel.
 
 Bug Fixes Since 3.1M1:
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/pom.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/pom.xml?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/pom.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/pom.xml Sun Jan 30 01:46:13 2011
@@ -32,6 +32,10 @@
 			<artifactId>junit</artifactId>
 		</dependency>
 		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+		</dependency>
+		<dependency>
 			<groupId>org.apache.cayenne.build-tools</groupId>
 			<artifactId>cayenne-test-utilities</artifactId>
 			<version>${version}</version>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java Sun Jan 30 01:46:13 2011
@@ -26,7 +26,6 @@ import java.util.Map;
 
 import org.apache.cayenne.cache.MapQueryCache;
 import org.apache.cayenne.cache.QueryCache;
-import org.apache.cayenne.configuration.web.CayenneFilter;
 import org.apache.cayenne.event.EventManager;
 import org.apache.cayenne.exp.ValueInjector;
 import org.apache.cayenne.graph.CompoundDiff;
@@ -62,14 +61,6 @@ public abstract class BaseContext implem
     protected static final ThreadLocal<ObjectContext> threadObjectContext = new ThreadLocal<ObjectContext>();
 
     /**
-     * A holder of a DataChannel bound to the current thread. Used mainly for proper
-     * contexts and objects deserialization.
-     * 
-     * @since 3.1
-     */
-    protected static final ThreadLocal<DataChannel> threadDeserializationChannel = new ThreadLocal<DataChannel>();
-
-    /**
      * Returns the ObjectContext bound to the current thread.
      * 
      * @since 3.0
@@ -97,33 +88,6 @@ public abstract class BaseContext implem
         threadObjectContext.set(context);
     }
 
-    /**
-     * Binds a DataChannel to the current thread that should be used for deserializing of
-     * ObjectContexts. An ObjectContext implementation may call
-     * {@link #getThreadDeserializationChannel()} from its deserialization method to
-     * attach to the currently active channel.
-     * <p>
-     * {@link CayenneFilter} will automatically bind the right channel to each request
-     * thread. If you are not using CayenneFilter, your application is responsible for
-     * calling this method at appropriate points of the lifecycle.
-     * 
-     * @since 3.1
-     */
-    public static void bindThreadDeserializationChannel(DataChannel dataChannel) {
-        threadDeserializationChannel.set(dataChannel);
-    }
-
-    /**
-     * Returns the DataChannel bound to the current thread. May return null if none is
-     * bound (unlike {@link #getThreadObjectContext()} that throws if a context is not
-     * bound).
-     * 
-     * @since 3.1
-     */
-    public static DataChannel getThreadDeserializationChannel() {
-        return threadDeserializationChannel.get();
-    }
-
     // if we are to pass the context around, channel should be left alone and
     // reinjected later if needed
     protected transient DataChannel channel;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneDataObject.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneDataObject.java?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneDataObject.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneDataObject.java Sun Jan 30 01:46:13 2011
@@ -29,6 +29,8 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cayenne.configuration.CayenneRuntime;
+import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
@@ -706,13 +708,15 @@ public class CayenneDataObject extends P
      */
     public void decodeFromXML(XMLDecoder decoder) {
 
-        DataChannel channel = BaseContext.getThreadDeserializationChannel();
-        if (channel == null) {
-            throw new IllegalStateException(
-                    "Can't perform deserialization - no DataChannel bound to the current thread.");
+        Injector injector = CayenneRuntime.getThreadInjector();
+        if (injector == null) {
+            throw new IllegalStateException("Can't perform deserialization - "
+                    + "no Injector bound to the current thread.");
         }
 
-        EntityResolver resolver = channel.getEntityResolver();
+        EntityResolver resolver = injector
+                .getInstance(DataChannel.class)
+                .getEntityResolver();
         ObjEntity objectEntity = resolver.lookupObjEntity(getClass());
 
         for (final ObjAttribute att : objectEntity.getDeclaredAttributes()) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java Sun Jan 30 01:46:13 2011
@@ -44,6 +44,8 @@ import org.apache.cayenne.QueryResponse;
 import org.apache.cayenne.access.util.IteratedSelectObserver;
 import org.apache.cayenne.cache.QueryCache;
 import org.apache.cayenne.cache.QueryCacheFactory;
+import org.apache.cayenne.configuration.CayenneRuntime;
+import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.event.EventManager;
 import org.apache.cayenne.graph.ChildDiffLoader;
 import org.apache.cayenne.graph.CompoundDiff;
@@ -95,7 +97,7 @@ public class DataContext extends BaseCon
 
     /**
      * Creates a new DataContext with parent DataChannel and ObjectStore.
-     *
+     * 
      * @since 1.2
      */
     public DataContext(DataChannel channel, ObjectStore objectStore) {
@@ -117,7 +119,7 @@ public class DataContext extends BaseCon
      * Returns {@link QueryCache} used by this DataContext, creating it on the fly if
      * needed. Uses parent DataDomain {@link QueryCacheFactory} to initialize the cache
      * for the first time, passing parent DataDomain's properties.
-     *
+     * 
      * @since 3.0
      */
     @Override
@@ -138,7 +140,7 @@ public class DataContext extends BaseCon
 
     /**
      * Creates and returns a new child ObjectContext.
-     *
+     * 
      * @since 3.0
      */
     public ObjectContext createChildContext() {
@@ -197,23 +199,16 @@ public class DataContext extends BaseCon
         }
     }
 
-    @Override
-    public DataChannel getChannel() {
-        awakeFromDeserialization();
-        return super.getChannel();
-    }
-
     /**
      * Returns a DataDomain used by this DataContext. DataDomain is looked up in the
      * DataChannel hierarchy. If a channel is not a DataDomain or a DataContext, null is
      * returned.
-     *
+     * 
      * @return DataDomain that is a direct or indirect parent of this DataContext in the
      *         DataChannel hierarchy.
      * @since 1.1
      */
     public DataDomain getParentDataDomain() {
-        awakeFromDeserialization();
 
         if (channel == null) {
             return null;
@@ -237,7 +232,7 @@ public class DataContext extends BaseCon
     /**
      * Sets a DataContextDelegate for this context. Delegate is notified of certain events
      * in the DataContext lifecycle and can customize DataContext behavior.
-     *
+     * 
      * @since 1.1
      */
     public void setDelegate(DataContextDelegate delegate) {
@@ -246,7 +241,7 @@ public class DataContext extends BaseCon
 
     /**
      * Returns a delegate currently associated with this DataContext.
-     *
+     * 
      * @since 1.1
      */
     public DataContextDelegate getDelegate() {
@@ -307,7 +302,7 @@ public class DataContext extends BaseCon
 
     /**
      * Returns a collection of all uncommitted registered objects.
-     *
+     * 
      * @since 1.2
      */
     @Override
@@ -344,7 +339,7 @@ public class DataContext extends BaseCon
      * temporary ids. DO NOT USE this method if you expect a DataRow to represent a
      * complete object state.
      * </p>
-     *
+     * 
      * @since 1.1
      */
     public DataRow currentSnapshot(final Persistent object) {
@@ -452,7 +447,7 @@ public class DataContext extends BaseCon
     /**
      * Converts a list of DataRows to a List of DataObject registered with this
      * DataContext.
-     *
+     * 
      * @since 3.0
      */
     public List objectsFromDataRows(
@@ -479,7 +474,7 @@ public class DataContext extends BaseCon
 
     /**
      * Creates a DataObject from DataRow.
-     *
+     * 
      * @deprecated Use objectFromDataRow(Class<T> objectClass, DataRow dataRow) instead.
      * @see DataRow
      */
@@ -493,7 +488,7 @@ public class DataContext extends BaseCon
 
     /**
      * Creates a DataObject from DataRow.
-     *
+     * 
      * @see DataRow
      * @since 3.1
      */
@@ -515,7 +510,7 @@ public class DataContext extends BaseCon
     /**
      * Creates a DataObject from DataRow. This variety of the 'objectFromDataRow' method
      * is normally used for generic classes.
-     *
+     * 
      * @deprecated Use objectFromDataRow(String entityName, DataRow dataRow) instead.
      * @see DataRow
      * @since 3.0
@@ -531,13 +526,11 @@ public class DataContext extends BaseCon
     /**
      * Creates a DataObject from DataRow. This variety of the 'objectFromDataRow' method
      * is normally used for generic classes.
-     *
+     * 
      * @see DataRow
      * @since 3.1
      */
-    public DataObject objectFromDataRow(
-            String entityName,
-            DataRow dataRow) {
+    public DataObject objectFromDataRow(String entityName, DataRow dataRow) {
         ClassDescriptor descriptor = getEntityResolver().getClassDescriptor(entityName);
         List<?> list = objectsFromDataRows(descriptor, Collections.singletonList(dataRow));
 
@@ -546,7 +539,7 @@ public class DataContext extends BaseCon
 
     /**
      * Creates and registers a new persistent object.
-     *
+     * 
      * @since 1.2
      */
     @Override
@@ -570,7 +563,7 @@ public class DataContext extends BaseCon
      * <p/>
      * <i>Note: in most cases {@link #newObject(Class)} method should be used, however
      * this method is helpful when generic persistent classes are used.</i>
-     *
+     * 
      * @since 3.0
      */
     public Persistent newObject(String entityName) {
@@ -607,7 +600,7 @@ public class DataContext extends BaseCon
      * <p/>
      * <i>Note that since 3.0 this method takes Object as an argument instead of a
      * {@link DataObject}.</i>
-     *
+     * 
      * @param object new object that needs to be made persistent.
      */
     @Override
@@ -711,7 +704,7 @@ public class DataContext extends BaseCon
      * Unregisters a Collection of DataObjects from the DataContext and the underlying
      * ObjectStore. This operation also unsets DataContext and ObjectId for each object
      * and changes its state to TRANSIENT.
-     *
+     * 
      * @see #invalidateObjects(Collection)
      */
     public void unregisterObjects(Collection dataObjects) {
@@ -721,7 +714,7 @@ public class DataContext extends BaseCon
     /**
      * If the parent channel is a DataContext, reverts local changes to make this context
      * look like the parent, if the parent channel is a DataDomain, reverts all changes.
-     *
+     * 
      * @since 1.2
      */
     @Override
@@ -771,7 +764,7 @@ public class DataContext extends BaseCon
      * update. If it is a DataDomain (the most common case), the changes are written to
      * the database. To cause cascading commit all the way to the database, one must use
      * {@link #commitChanges()}.
-     *
+     * 
      * @since 1.2
      * @see #commitChanges()
      */
@@ -815,7 +808,7 @@ public class DataContext extends BaseCon
 
     /**
      * Synchronizes with the parent channel, performing a flush or a commit.
-     *
+     * 
      * @since 1.2
      */
     GraphDiff flushToParent(boolean cascade) {
@@ -949,7 +942,7 @@ public class DataContext extends BaseCon
 
     /**
      * Runs an iterated query in transactional context provided by the caller.
-     *
+     * 
      * @since 1.2
      */
     ResultIterator internalPerformIteratedQuery(Query query) throws CayenneException {
@@ -962,7 +955,7 @@ public class DataContext extends BaseCon
 
     /**
      * Executes a query returning a generic response.
-     *
+     * 
      * @since 1.2
      */
     @Override
@@ -996,7 +989,7 @@ public class DataContext extends BaseCon
      * <p>
      * <i>Since 1.2 takes any Query parameter, not just GenericSelectQuery</i>
      * </p>
-     *
+     * 
      * @return A list of DataObjects or a DataRows, depending on the value returned by
      *         {@link QueryMetadata#isFetchingDataRows()}.
      */
@@ -1015,7 +1008,7 @@ public class DataContext extends BaseCon
     /**
      * An implementation of a {@link DataChannel} method that is used by child contexts to
      * execute queries. Not intended for direct use.
-     *
+     * 
      * @since 1.2
      */
     public QueryResponse onQuery(ObjectContext context, Query query) {
@@ -1025,7 +1018,7 @@ public class DataContext extends BaseCon
     /**
      * Performs a single database query that does not select rows. Returns an array of
      * update counts.
-     *
+     * 
      * @since 1.1
      */
     public int[] performNonSelectingQuery(Query query) {
@@ -1036,7 +1029,7 @@ public class DataContext extends BaseCon
     /**
      * Performs a named mapped query that does not select rows. Returns an array of update
      * counts.
-     *
+     * 
      * @since 1.1
      */
     public int[] performNonSelectingQuery(String queryName) {
@@ -1046,7 +1039,7 @@ public class DataContext extends BaseCon
     /**
      * Performs a named mapped non-selecting query using a map of parameters. Returns an
      * array of update counts.
-     *
+     * 
      * @since 1.1
      */
     public int[] performNonSelectingQuery(String queryName, Map<String, ?> parameters) {
@@ -1057,7 +1050,7 @@ public class DataContext extends BaseCon
      * Returns a list of objects or DataRows for a named query stored in one of the
      * DataMaps. Internally Cayenne uses a caching policy defined in the named query. If
      * refresh flag is true, a refresh is forced no matter what the caching policy is.
-     *
+     * 
      * @param queryName a name of a GenericSelectQuery defined in one of the DataMaps. If
      *            no such query is defined, this method will throw a
      *            CayenneRuntimeException.
@@ -1073,7 +1066,7 @@ public class DataContext extends BaseCon
      * Returns a list of objects or DataRows for a named query stored in one of the
      * DataMaps. Internally Cayenne uses a caching policy defined in the named query. If
      * refresh flag is true, a refresh is forced no matter what the caching policy is.
-     *
+     * 
      * @param queryName a name of a GenericSelectQuery defined in one of the DataMaps. If
      *            no such query is defined, this method will throw a
      *            CayenneRuntimeException.
@@ -1097,14 +1090,13 @@ public class DataContext extends BaseCon
      */
     @Override
     public EntityResolver getEntityResolver() {
-        awakeFromDeserialization();
         return entityResolver;
     }
 
     /**
      * Returns <code>true</code> if the ObjectStore uses shared cache of a parent
      * DataDomain.
-     *
+     * 
      * @since 1.1
      */
     public boolean isUsingSharedSnapshotCache() {
@@ -1121,7 +1113,7 @@ public class DataContext extends BaseCon
     /**
      * Returns whether this DataContext performs object validation before commit is
      * executed.
-     *
+     * 
      * @since 1.1
      */
     public boolean isValidatingObjectsOnCommit() {
@@ -1131,7 +1123,7 @@ public class DataContext extends BaseCon
     /**
      * Sets the property defining whether this DataContext should perform object
      * validation before commit is executed.
-     *
+     * 
      * @since 1.1
      */
     public void setValidatingObjectsOnCommit(boolean flag) {
@@ -1164,6 +1156,18 @@ public class DataContext extends BaseCon
             objectStore.setDataRowCache(cache);
         }
 
+        // 3. set parent channel
+        // call a channel setter to ensure EntityResolver is extracted from channel
+        // call it after DataRowCache is deserialized to avoid incorrect DataRowCache lazy
+        // creation
+        Injector injector = CayenneRuntime.getThreadInjector();
+        if (injector != null) {
+            setChannel(injector.getInstance(DataChannel.class));
+        }
+        else {
+            // throw?
+        }
+
         // CayenneDataObjects have a transient datacontext
         // because at deserialize time the datacontext may need to be different
         // than the one at serialize time (for programmer defined reasons).
@@ -1181,19 +1185,8 @@ public class DataContext extends BaseCon
     }
 
     /**
-     * Re-attaches itself to a DataChannel attached to the current thread. The DataChannel
-     * is taken from {@link BaseContext#getThreadDeserializationChannel()}.
-     */
-    private final void awakeFromDeserialization() {
-        if (channel == null) {
-            // call a channel setter to ensure EntityResolver is extracted from channel
-            setChannel(BaseContext.getThreadDeserializationChannel());
-        }
-    }
-
-    /**
      * Returns this context's ObjectStore.
-     *
+     * 
      * @since 1.2
      */
     @Override
@@ -1209,7 +1202,7 @@ public class DataContext extends BaseCon
      * In case you pass a non-null second parameter, you are responsible for setting
      * correct persistence state of the returned local object, as generally there is no
      * way for Cayenne to determine the resulting local object state.
-     *
+     * 
      * @since 1.2
      */
     @Override

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/CayenneRuntime.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/CayenneRuntime.java?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/CayenneRuntime.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/CayenneRuntime.java Sun Jan 30 01:46:13 2011
@@ -22,6 +22,7 @@ import java.util.Collection;
 
 import org.apache.cayenne.DataChannel;
 import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.configuration.web.CayenneFilter;
 import org.apache.cayenne.di.BeforeScopeEnd;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
@@ -38,6 +39,38 @@ import org.apache.cayenne.di.Module;
  */
 public abstract class CayenneRuntime {
 
+    /**
+     * A holder of an Injector bound to the current thread. Used mainly to allow
+     * serializable contexts to attach to correct Cayenne stack on deserialization.
+     * 
+     * @since 3.1
+     */
+    protected static final ThreadLocal<Injector> threadInjector = new ThreadLocal<Injector>();
+
+    /**
+     * Binds a DI {@link Injector} bound to the current thread. It is primarily intended
+     * for deserialization of ObjectContexts.
+     * <p>
+     * {@link CayenneFilter} will automatically bind the right injector to each request
+     * thread. If you are not using CayenneFilter, your application is responsible for
+     * calling this method at appropriate points of the lifecycle.
+     * 
+     * @since 3.1
+     */
+    public static void bindThreadInjector(Injector injector) {
+        threadInjector.set(injector);
+    }
+
+    /**
+     * Returns the {@link Injector} bound to the current thread. Will return null if none
+     * is bound.
+     * 
+     * @since 3.1
+     */
+    public static Injector getThreadInjector() {
+        return threadInjector.get();
+    }
+
     protected Injector injector;
     protected Module[] modules;
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java Sun Jan 30 01:46:13 2011
@@ -24,8 +24,8 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpSession;
 
 import org.apache.cayenne.BaseContext;
-import org.apache.cayenne.DataChannel;
 import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.configuration.CayenneRuntime;
 import org.apache.cayenne.configuration.ObjectContextFactory;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.di.Injector;
@@ -35,7 +35,7 @@ import org.apache.cayenne.di.Injector;
  * {@link ObjectContext} in a web session and binds it to request thread. Note that using
  * this handler would force {@link HttpSession} creation, that may not be desirable in
  * many cases. Also session-bound context may result in a race condition with two user
- * requests updating the same periststent objects in parallel.
+ * requests updating the same persistent objects in parallel.
  * <p>
  * User applications in most cases should provide a custom RequestHandler that implements
  * a smarter app-specific strategy for providing ObjectContext.
@@ -55,8 +55,7 @@ public class SessionContextRequestHandle
 
     public void requestStart(ServletRequest request, ServletResponse response) {
 
-        BaseContext.bindThreadDeserializationChannel(injector
-                .getInstance(DataChannel.class));
+        CayenneRuntime.bindThreadInjector(injector);
 
         if (request instanceof HttpServletRequest) {
 
@@ -80,7 +79,7 @@ public class SessionContextRequestHandle
     }
 
     public void requestEnd(ServletRequest request, ServletResponse response) {
-        BaseContext.bindThreadDeserializationChannel(null);
+        CayenneRuntime.bindThreadInjector(null);
         BaseContext.bindThreadObjectContext(null);
     }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/BaseContextTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/BaseContextTest.java?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/BaseContextTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/BaseContextTest.java Sun Jan 30 01:46:13 2011
@@ -32,20 +32,4 @@ public class BaseContextTest extends Tes
         assertNotNull(properties);
         assertSame(properties, context.getUserProperties());
     }
-
-    public void testBindThreadDeserializationChannel() {
-
-        assertNull(BaseContext.getThreadDeserializationChannel());
-
-        try {
-            DataChannel channel = new MockDataChannel();
-            BaseContext.bindThreadDeserializationChannel(channel);
-            assertSame(channel, BaseContext.getThreadDeserializationChannel());
-        }
-        finally {
-            BaseContext.bindThreadDeserializationChannel(null);
-        }
-
-        assertNull(BaseContext.getThreadDeserializationChannel());
-    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSerializationTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSerializationTest.java?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSerializationTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSerializationTest.java Sun Jan 30 01:46:13 2011
@@ -19,12 +19,17 @@
 
 package org.apache.cayenne.access;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import java.util.List;
 
-import org.apache.cayenne.BaseContext;
 import org.apache.cayenne.Cayenne;
+import org.apache.cayenne.DataChannel;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.configuration.CayenneRuntime;
+import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.unit.CayenneCase;
 import org.apache.cayenne.util.Util;
@@ -33,13 +38,15 @@ public class DataContextSerializationTes
 
     @Override
     protected void setUp() throws Exception {
-        BaseContext.bindThreadDeserializationChannel(getDomain());
+        Injector injector = mock(Injector.class);
+        when(injector.getInstance(DataChannel.class)).thenReturn(getDomain());
+        CayenneRuntime.bindThreadInjector(injector);
         deleteTestData();
     }
 
     @Override
     protected void tearDown() throws Exception {
-        BaseContext.bindThreadDeserializationChannel(null);
+        CayenneRuntime.bindThreadInjector(null);
         super.tearDown();
     }
 

Copied: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/CayenneRuntimeTest.java (from r1065163, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/BaseContextTest.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/CayenneRuntimeTest.java?p2=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/CayenneRuntimeTest.java&p1=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/BaseContextTest.java&r1=1065163&r2=1065164&rev=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/BaseContextTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/CayenneRuntimeTest.java Sun Jan 30 01:46:13 2011
@@ -1,51 +1,45 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne;
-
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-public class BaseContextTest extends TestCase {
-
-    public void testUserPropertiesLazyInit() {
-        BaseContext context = new MockBaseContext();
-        assertNull(context.userProperties);
-
-        Map<String, Object> properties = context.getUserProperties();
-        assertNotNull(properties);
-        assertSame(properties, context.getUserProperties());
-    }
-
-    public void testBindThreadDeserializationChannel() {
-
-        assertNull(BaseContext.getThreadDeserializationChannel());
-
-        try {
-            DataChannel channel = new MockDataChannel();
-            BaseContext.bindThreadDeserializationChannel(channel);
-            assertSame(channel, BaseContext.getThreadDeserializationChannel());
-        }
-        finally {
-            BaseContext.bindThreadDeserializationChannel(null);
-        }
-
-        assertNull(BaseContext.getThreadDeserializationChannel());
-    }
-}
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.configuration;
+
+import static org.mockito.Mockito.mock;
+
+import org.apache.cayenne.di.Injector;
+
+import junit.framework.TestCase;
+
+public class CayenneRuntimeTest extends TestCase {
+
+    public void testBindThreadInjector() {
+
+        Injector injector = mock(Injector.class);
+
+        assertNull(CayenneRuntime.getThreadInjector());
+
+        try {
+            CayenneRuntime.bindThreadInjector(injector);
+            assertSame(injector, CayenneRuntime.getThreadInjector());
+        }
+        finally {
+            CayenneRuntime.bindThreadInjector(null);
+        }
+
+        assertNull(CayenneRuntime.getThreadInjector());
+    }
+}

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/unit/MultiContextCase.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/unit/MultiContextCase.java?rev=1065164&r1=1065163&r2=1065164&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/unit/MultiContextCase.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/unit/MultiContextCase.java Sun Jan 30 01:46:13 2011
@@ -19,8 +19,13 @@
 
 package org.apache.cayenne.unit;
 
-import org.apache.cayenne.BaseContext;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.cayenne.DataChannel;
 import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.configuration.CayenneRuntime;
+import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.util.Util;
 
 /**
@@ -47,7 +52,11 @@ public abstract class MultiContextCase e
     protected DataContext mirrorDataContext(DataContext context) throws Exception {
 
         DataContext mirror;
-        BaseContext.bindThreadDeserializationChannel(getDomain());
+        
+        Injector injector = mock(Injector.class);
+        when(injector.getInstance(DataChannel.class)).thenReturn(getDomain());
+        CayenneRuntime.bindThreadInjector(injector);
+        
         try {
             mirror = (DataContext) Util.cloneViaSerialization(context);
 
@@ -55,7 +64,7 @@ public abstract class MultiContextCase e
             mirror.getChannel();
         }
         finally {
-            BaseContext.bindThreadDeserializationChannel(null);
+            CayenneRuntime.bindThreadInjector(null);
         }
 
         assertNotSame(context, mirror);