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