You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@onami.apache.org by as...@apache.org on 2013/01/28 14:59:42 UTC

svn commit: r1439406 - in /incubator/onami/trunk/lifecycle/src: main/java/org/apache/onami/lifecycle/ test/java/org/apache/onami/lifecycle/

Author: ash2k
Date: Mon Jan 28 13:59:41 2013
New Revision: 1439406

URL: http://svn.apache.org/viewvc?rev=1439406&view=rev
Log:
[ONAMI-46] Register objects for disposal from @Provides methods

Added:
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DefaultDisposer.java   (with props)
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposable.java   (with props)
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java   (with props)
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java   (with props)
Modified:
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeModule.java
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposer.java
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeTestCase.java

Added: incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DefaultDisposer.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DefaultDisposer.java?rev=1439406&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DefaultDisposer.java (added)
+++ incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DefaultDisposer.java Mon Jan 28 13:59:41 2013
@@ -0,0 +1,93 @@
+package org.apache.onami.lifecycle;
+
+/*
+ * 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.
+ */
+
+import java.util.Stack;
+
+/**
+ * Default {@link Disposer} implementation.
+ *
+ * @since 0.2.0
+ */
+public class DefaultDisposer implements Disposer
+{
+
+    /**
+     * Stack of elements have to be disposed.
+     */
+    private final Stack<Disposable> disposables = new Stack<Disposable>();
+
+    /**
+     * {@inheritDoc}
+     */
+    public void register( Disposable disposable )
+    {
+        disposables.push( disposable );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void dispose()
+    {
+        dispose( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void dispose( DisposeHandler disposeHandler )
+    {
+        if ( disposeHandler == null )
+        {
+            disposeHandler = new NoOpDisposeHandler();
+        }
+        while ( !disposables.isEmpty() )
+        {
+            disposables.pop().dispose( disposeHandler );
+        }
+    }
+
+    /**
+     * NOOP {@code DisposeHandler} implementation.
+     */
+    private static final class NoOpDisposeHandler
+        implements DisposeHandler
+    {
+
+        /**
+         * {@inheritDoc}
+         */
+        public <I, E extends Throwable> void onError( I injectee, E error )
+        {
+            // do nothing
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public <I> void onSuccess( I injectee )
+        {
+            // do nothing
+        }
+
+    }
+
+}

Propchange: incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DefaultDisposer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposable.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposable.java?rev=1439406&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposable.java (added)
+++ incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposable.java Mon Jan 28 13:59:41 2013
@@ -0,0 +1,39 @@
+package org.apache.onami.lifecycle;
+
+/*
+ * 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.
+ */
+
+/**
+ * Object that knows how to dispose some resources.
+ *
+ * @since 0.2.0
+ */
+public interface Disposable
+{
+
+    /**
+     * Disposes allocated resources, tracking progresses in the
+     * input {@code DisposeHandler}.
+     *
+     * @param disposeHandler the handler to track dispose progresses.
+     * @since 0.2.0
+     */
+    void dispose( DisposeHandler disposeHandler );
+
+}

Propchange: incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposable.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeModule.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeModule.java?rev=1439406&r1=1439405&r2=1439406&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeModule.java (original)
+++ incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeModule.java Mon Jan 28 13:59:41 2013
@@ -60,7 +60,7 @@ public final class DisposeModule
                                                  Matcher<? super TypeLiteral<?>> typeMatcher )
     {
         super( disposeAnnotationType, typeMatcher );
-        disposer = new Disposer();
+        disposer = new DefaultDisposer();
     }
 
     /**
@@ -94,7 +94,7 @@ public final class DisposeModule
 
                     public void afterInjection( I injectee )
                     {
-                        disposer.register( disposeMethod, injectee );
+                        disposer.register( new MethodDisposable( disposeMethod, injectee ) );
                     }
 
                 } );
@@ -126,7 +126,7 @@ public final class DisposeModule
 
         Matcher<? super TypeLiteral<?>> typeMatcher = any();
 
-        Disposer disposer = new Disposer();
+        Disposer disposer = new DefaultDisposer();
 
         /**
          * Hidden constructor.

Modified: incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposer.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposer.java?rev=1439406&r1=1439405&r2=1439406&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposer.java (original)
+++ incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposer.java Mon Jan 28 13:59:41 2013
@@ -19,141 +19,42 @@ package org.apache.onami.lifecycle;
  * under the License.
  */
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Stack;
-
 /**
  * A Disposer is a mini-container that releases resources
- * invoking injectees methods annotated by {@code Dispose}.
+ * invoking {@link Disposable#dispose(DisposeHandler)}.
+ * <p>
+ * Order of disposal is reverse to the order of registration. Each disposable
+ * may register zero or more objects for disposal too.
+ * <p>
+ * Implementations must be threadsafe because registration can be done from
+ * any thread.
+ *
+ * @since 0.2.0
  */
-public final class Disposer
+public interface Disposer
 {
 
     /**
-     * List of elements have to be disposed.
-     */
-    private final Stack<Disposable> disposables = new Stack<Disposable>();
-
-    /**
-     * Register an injectee and its related method to release resources.
+     * Register a {@link Disposable} to release resources.
      *
-     * @param disposeMethod the method to be invoked to release resources
-     * @param injectee the target injectee has to release the resources
-     */
-    <I> void register( Method disposeMethod, I injectee )
-    {
-        disposables.push( new Disposable( disposeMethod, injectee ) );
-    }
-
-    /**
-     * Releases resources invoking the {@code Dispose} annotated methods,
-     * successes/errors will be muted.
+     * @param disposable object to be invoked to release resources.
+     * @since 0.2.0
      */
-    public void dispose()
-    {
-        dispose( new NoOpDisposeHandler() );
-    }
+    void register( Disposable disposable );
 
     /**
-     * Releases resources invoking the {@code Dispose} annotated methods,
-     * successes/errors will be tracked in the input {@link DisposeHandler}.
+     * Releases resources invoking {@link Disposable#dispose(DisposeHandler)}.
      *
-     * @param disposeHandler the DisposeHandler instance that tracks dispose progresses.
+     * @since 0.2.0
      */
-    public void dispose( DisposeHandler disposeHandler )
-    {
-        if ( disposeHandler == null )
-        {
-            disposeHandler = new NoOpDisposeHandler();
-        }
-        while ( !disposables.isEmpty() )
-        {
-            disposables.pop().dispose( disposeHandler );
-        }
-    }
+    void dispose();
 
     /**
-     * NOOP {@code DisposeHandler} implementation.
-     */
-    private static final class NoOpDisposeHandler
-        implements DisposeHandler
-    {
-
-        /**
-         * {@inheritDoc}
-         */
-        public <I, E extends Throwable> void onError( I injectee, E error )
-        {
-            // do nothing
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        public <I> void onSuccess( I injectee )
-        {
-            // do nothing
-        }
-
-    }
-
-    /**
-     * A {@code Disposable} is a reference to a disposable injectee and related method to release resources.
+     * Releases resources invoking {@link Disposable#dispose(DisposeHandler)}.
+     *
+     * @param disposeHandler the {@link DisposeHandler} instance that tracks dispose progresses.
+     * @since 0.2.0
      */
-    private static final class Disposable
-    {
-
-        /**
-         * The method to be invoked to release resources.
-         */
-        private final Method disposeMethod;
-
-        /**
-         * The target injectee has to release the resources.
-         */
-        private final Object injectee;
-
-        /**
-         * Creates a new {@code Disposable} reference.
-         *
-         * @param disposeMethod the method to be invoked to release resources
-         * @param injectee the target injectee has to release the resources
-         */
-        public Disposable( Method disposeMethod, Object injectee )
-        {
-            this.disposeMethod = disposeMethod;
-            this.injectee = injectee;
-        }
-
-        /**
-         * Disposes allocated resources by invoking the injectee method
-         * annotated by {@code Dispose}, tracking progresses in the
-         * input {@code DisposeHandler}.
-         *
-         * @param disposeHandler the handler to track dispose progresses.
-         */
-        public void dispose( DisposeHandler disposeHandler )
-        {
-            try
-            {
-                disposeMethod.invoke( injectee );
-                disposeHandler.onSuccess( injectee );
-            }
-            catch ( IllegalArgumentException e )
-            {
-                disposeHandler.onError( injectee, e );
-            }
-            catch ( IllegalAccessException e )
-            {
-                disposeHandler.onError( injectee, e );
-            }
-            catch ( InvocationTargetException e )
-            {
-                disposeHandler.onError( injectee, e.getTargetException() );
-            }
-        }
-
-    }
+    void dispose( DisposeHandler disposeHandler );
 
 }

Added: incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java?rev=1439406&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java (added)
+++ incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java Mon Jan 28 13:59:41 2013
@@ -0,0 +1,85 @@
+package org.apache.onami.lifecycle;
+
+/*
+ * 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.
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * A {@link MethodDisposable} is a reference to a disposable injectee
+ * and related method to release resources.
+ *
+ * @since 0.2.0
+ */
+public final class MethodDisposable implements Disposable
+{
+
+    /**
+     * The method to be invoked to release resources.
+     */
+    private final Method disposeMethod;
+
+    /**
+     * The target injectee has to release the resources.
+     */
+    private final Object injectee;
+
+    /**
+     * Creates a new {@link MethodDisposable} reference.
+     *
+     * @param disposeMethod the method to be invoked to release resources.
+     * @param injectee the target injectee has to release the resources.
+     * @since 0.2.0
+     */
+    public MethodDisposable( Method disposeMethod, Object injectee )
+    {
+        this.disposeMethod = disposeMethod;
+        this.injectee = injectee;
+    }
+
+    /**
+     * Disposes allocated resources by invoking the injectee method,
+     * tracking progresses in the input {@link DisposeHandler}.
+     *
+     * @param disposeHandler the handler to track dispose progresses.
+     * @since 0.2.0
+     */
+    public void dispose( DisposeHandler disposeHandler )
+    {
+        try
+        {
+            disposeMethod.invoke( injectee );
+            disposeHandler.onSuccess( injectee );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            disposeHandler.onError( injectee, e );
+        }
+        catch ( IllegalAccessException e )
+        {
+            disposeHandler.onError( injectee, e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            disposeHandler.onError( injectee, e.getCause() );
+        }
+    }
+
+}
\ No newline at end of file

Propchange: incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java?rev=1439406&r1=1439405&r2=1439406&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java (original)
+++ incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java Mon Jan 28 13:59:41 2013
@@ -24,10 +24,15 @@ import static junit.framework.Assert.ass
 import static junit.framework.Assert.assertTrue;
 import static junit.framework.Assert.fail;
 
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
 import org.junit.Test;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.CreationException;
+import com.google.inject.Provides;
 
 public final class DisposeModuleTestCase
 {
@@ -35,7 +40,7 @@ public final class DisposeModuleTestCase
     @Test
     public void disposeUsingModuleOnInjectorFailure()
     {
-        Disposer disposer = new Disposer();
+        Disposer disposer = new DefaultDisposer();
         try
         {
             createInjector( DisposeModule.builder().withDisposer( disposer ).build(), new AbstractModule()
@@ -76,4 +81,73 @@ public final class DisposeModuleTestCase
         }
     }
 
+    @Test
+    public void disposeUsingModuleWithProvidesMethodOnInjectorFailure()
+    {
+        Disposer disposer = new DefaultDisposer();
+        try
+        {
+            createInjector( DisposeModule.builder().withDisposer( disposer ).build(), new AbstractModule()
+            {
+
+                @Override
+                protected void configure()
+                {
+                    bind( ThrowingExceptionConstructor2.class ).asEagerSingleton();
+                }
+
+                @Provides
+                public ExecutorService provideExecutorService( Disposer disposer )
+                {
+                    final ExecutorService executorService = Executors.newCachedThreadPool();
+                    disposer.register( new Disposable()
+                    {
+
+                        public void dispose( DisposeHandler disposeHandler )
+                        {
+                            executorService.shutdown();
+                            try
+                            {
+                                executorService.awaitTermination( 1, TimeUnit.MINUTES );
+                                disposeHandler.onSuccess( executorService );
+                            }
+                            catch ( InterruptedException e )
+                            {
+                                disposeHandler.onError( executorService, e );
+                            }
+                        }
+
+                    });
+                    return executorService;
+                }
+
+            } );
+            fail( "Expected exception was not thrown" );
+        }
+        catch( CreationException e )
+        {
+            Throwable cause = e.getCause();
+            assertTrue( cause instanceof IllegalArgumentException );
+            assertEquals( "Expected exception", cause.getMessage() );
+        }
+        finally
+        {
+            disposer.dispose( new DisposeHandler()
+            {
+
+                public <I> void onSuccess( I injectee )
+                {
+                    assertTrue( injectee instanceof ExecutorService );
+                    assertTrue( ((ExecutorService) injectee).isShutdown() );
+                }
+
+                public <I, E extends Throwable> void onError( I injectee, E error )
+                {
+                    fail( error.toString() );
+                }
+
+            });
+        }
+    }
+
 }

Modified: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeTestCase.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeTestCase.java?rev=1439406&r1=1439405&r2=1439406&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeTestCase.java (original)
+++ incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeTestCase.java Mon Jan 28 13:59:41 2013
@@ -4,10 +4,6 @@ import static com.google.inject.Guice.cr
 import static junit.framework.Assert.assertTrue;
 import static junit.framework.Assert.fail;
 
-import org.apache.onami.lifecycle.Dispose;
-import org.apache.onami.lifecycle.DisposeHandler;
-import org.apache.onami.lifecycle.DisposeModule;
-import org.apache.onami.lifecycle.Disposer;
 import org.junit.Before;
 import org.junit.Test;
 

Added: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java?rev=1439406&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java (added)
+++ incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java Mon Jan 28 13:59:41 2013
@@ -0,0 +1,35 @@
+package org.apache.onami.lifecycle;
+
+/*
+ * 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.
+ */
+
+import java.util.concurrent.ExecutorService;
+
+import javax.inject.Inject;
+
+public final class ThrowingExceptionConstructor2
+{
+
+    @Inject
+    public ThrowingExceptionConstructor2( ExecutorService executorService )
+    {
+        throw new IllegalArgumentException( "Expected exception" );
+    }
+
+}

Propchange: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain