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 2010/06/08 19:51:07 UTC
svn commit: r952752 - in /cayenne/main/trunk: docs/doc/src/main/resources/
framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/
framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/
itests/cayenne-di-stack/sr...
Author: aadamchik
Date: Tue Jun 8 17:51:07 2010
New Revision: 952752
URL: http://svn.apache.org/viewvc?rev=952752&view=rev
Log:
CAY-1421 CayenneRuntime shutdown functionality
* shutdown integration tests
* a more robust EM shutdown method
Modified:
cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/DefaultEventManager.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/EventManager.java
cayenne/main/trunk/itests/cayenne-di-stack/src/test/java/org/apache/cayenne/runtime/CayenneServerRuntimeIntegrationTest.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=952752&r1=952751&r2=952752&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 Tue Jun 8 17:51:07 2010
@@ -37,6 +37,7 @@ CAY-1414 Remove org.apache.cayenne.conf
CAY-1415 Replace WebApplicationContextFilter with a DI-enabled filter
CAY-1419 File-based ResourceLocator to replace legacy FileConfiguration
CAY-1420 Migrate ROP server-side components to DI-based stack
+CAY-1421 CayenneRuntime shutdown functionality
CAY-1422 Convert EventManager to an interface, make it injectable
CAY-1424 DI: support for named service injection and flexible map/list binding
CAY-1425 Remove Configuration sharedConfiguration singleton affecting DataContext deserialization, CayenneDataObject XML deserialization, DataContext static factory method.
Modified: cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java?rev=952752&r1=952751&r2=952752&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java Tue Jun 8 17:51:07 2010
@@ -22,6 +22,9 @@ import junit.framework.TestCase;
import org.apache.cayenne.di.Binder;
import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.OnScopeEnd;
+import org.apache.cayenne.di.mock.MockImplementation1_EventAnnotations;
+import org.apache.cayenne.di.mock.MockInterface1;
public class DefaultInjectorTest extends TestCase {
@@ -66,5 +69,33 @@ public class DefaultInjectorTest extends
assertTrue(configureCalled[0]);
assertTrue(configureCalled[1]);
}
+
+ public void testShutdown() {
+
+ MockImplementation1_EventAnnotations.reset();
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(
+ MockImplementation1_EventAnnotations.class).inSingletonScope();
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 instance1 = injector.getInstance(MockInterface1.class);
+ assertEquals("XuI", instance1.getName());
+
+ assertFalse(MockImplementation1_EventAnnotations.shutdown1);
+ assertFalse(MockImplementation1_EventAnnotations.shutdown2);
+ assertFalse(MockImplementation1_EventAnnotations.shutdown3);
+
+ injector.shutdown();
+
+ assertTrue(MockImplementation1_EventAnnotations.shutdown1);
+ assertTrue(MockImplementation1_EventAnnotations.shutdown2);
+ assertTrue(MockImplementation1_EventAnnotations.shutdown3);
+ }
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/DefaultEventManager.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/DefaultEventManager.java?rev=952752&r1=952751&r2=952752&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/DefaultEventManager.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/DefaultEventManager.java Tue Jun 8 17:51:07 2010
@@ -82,6 +82,15 @@ public class DefaultEventManager impleme
}
/**
+ * Returns true if the EventManager was stopped via {@link #shutdown()} method.
+ *
+ * @since 3.1
+ */
+ public boolean isStopped() {
+ return stopped;
+ }
+
+ /**
* Returns true if this EventManager is single-threaded. If so it will throw an
* exception on any attempt to register an unblocking listener or dispatch a
* non-blocking event.
@@ -100,10 +109,15 @@ public class DefaultEventManager impleme
*/
@OnScopeEnd
public void shutdown() {
- this.stopped = true;
- for (DispatchThread thread : dispatchThreads) {
- thread.interrupt();
+ if (!stopped) {
+
+ for (DispatchThread thread : dispatchThreads) {
+ thread.interrupt();
+ }
+
+ dispatchThreads.clear();
+ this.stopped = true;
}
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/EventManager.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/EventManager.java?rev=952752&r1=952751&r2=952752&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/EventManager.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/event/EventManager.java Tue Jun 8 17:51:07 2010
@@ -40,14 +40,6 @@ public interface EventManager {
boolean isSingleThreaded();
/**
- * Stops event threads. After the EventManager is stopped, it can not be restarted and
- * should be discarded.
- *
- * @since 3.0
- */
- void shutdown();
-
- /**
* Register an <code>EventListener</code> for events sent by any sender.
*
* @throws RuntimeException if <code>methodName</code> is not found.
Modified: cayenne/main/trunk/itests/cayenne-di-stack/src/test/java/org/apache/cayenne/runtime/CayenneServerRuntimeIntegrationTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/itests/cayenne-di-stack/src/test/java/org/apache/cayenne/runtime/CayenneServerRuntimeIntegrationTest.java?rev=952752&r1=952751&r2=952752&view=diff
==============================================================================
--- cayenne/main/trunk/itests/cayenne-di-stack/src/test/java/org/apache/cayenne/runtime/CayenneServerRuntimeIntegrationTest.java (original)
+++ cayenne/main/trunk/itests/cayenne-di-stack/src/test/java/org/apache/cayenne/runtime/CayenneServerRuntimeIntegrationTest.java Tue Jun 8 17:51:07 2010
@@ -23,6 +23,8 @@ import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.access.DataDomain;
import org.apache.cayenne.configuration.server.CayenneServerRuntimeCase;
import org.apache.cayenne.configuration.server.RuntimeName;
+import org.apache.cayenne.event.DefaultEventManager;
+import org.apache.cayenne.event.EventManager;
import org.apache.cayenne.itest.di_stack.Table1;
import org.apache.cayenne.query.SelectQuery;
import org.apache.cayenne.test.DBHelper;
@@ -78,4 +80,25 @@ public class CayenneServerRuntimeIntegra
assertEquals(o1.getObjectId(), o2.getObjectId());
}
+
+ public void testShutdown() throws Exception {
+
+ // create a context and save some objects to warm up the stack...
+ ObjectContext context1 = runtime.getContext();
+
+ Table1 t1 = context1.newObject(Table1.class);
+ t1.setName("XmKK");
+ context1.commitChanges();
+
+ // ensure that some of the services that require shutdown are
+ // instantiated and check their state before and after
+ EventManager em = runtime.getInjector().getInstance(EventManager.class);
+ assertNotNull(em);
+ assertTrue(em instanceof DefaultEventManager);
+ assertFalse(((DefaultEventManager) em).isStopped());
+
+ runtime.getInjector().shutdown();
+
+ assertTrue(((DefaultEventManager) em).isStopped());
+ }
}