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

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

Author: simonetripodi
Date: Mon Jan 14 20:15:47 2013
New Revision: 1433094

URL: http://svn.apache.org/viewvc?rev=1433094&view=rev
Log:
[ONAMI-45] Injector creation can fail and in that case all created resources must be disposed anyway - patch submitted by Mikhail Mazursky

Added:
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java   (with props)
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java   (with props)
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor.java   (with props)
Modified:
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeModule.java

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=1433094&r1=1433093&r2=1433094&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 14 20:15:47 2013
@@ -19,9 +19,12 @@ package org.apache.onami.lifecycle;
  * under the License.
  */
 
+import static com.google.inject.matcher.Matchers.any;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 
+import com.google.inject.Injector;
 import com.google.inject.TypeLiteral;
 import com.google.inject.matcher.Matcher;
 import com.google.inject.spi.InjectionListener;
@@ -29,17 +32,21 @@ import com.google.inject.spi.TypeEncount
 
 /**
  * Guice module to register methods to be invoked when {@link Disposer#dispose()} is invoked.
+ * <p>
+ * Module instance have state so it must not be used to construct more than one {@link Injector}. 
  */
 public final class DisposeModule
     extends AbstractLifeCycleModule
 {
 
+    private final Disposer disposer;
+
     /**
      * Creates a new module which register methods annotated with {@link Dispose} on methods in any type.
      */
     public DisposeModule()
     {
-        super( Dispose.class );
+        this( Dispose.class, any() );
     }
 
     /**
@@ -53,6 +60,19 @@ public final class DisposeModule
                                                  Matcher<? super TypeLiteral<?>> typeMatcher )
     {
         super( disposeAnnotationType, typeMatcher );
+        disposer = new Disposer();
+    }
+
+    /**
+     * Creates a new module from the supplied {@link Builder}.
+     *
+     * @param builder settings container.
+     * @since 0.2.0
+     */
+    DisposeModule( Builder builder )
+    {
+        super( builder.disposeAnnotationType, builder.typeMatcher );
+        this.disposer = builder.disposer;
     }
 
     /**
@@ -61,8 +81,6 @@ public final class DisposeModule
     @Override
     protected void configure()
     {
-        final Disposer disposer = new Disposer();
-
         bind( Disposer.class ).toInstance( disposer );
 
         bindListener( getTypeMatcher(), new AbstractMethodTypeListener( getAnnotationType() )
@@ -85,4 +103,98 @@ public final class DisposeModule
         } );
     }
 
+    /**
+     * Allows to create {@link DisposeModule} with builder pattern.
+     *
+     * @return builder for {@link DisposeModule}.
+     * @since 0.2.0
+     */
+    public static Builder builder()
+    {
+        return new Builder();
+    }
+
+    /**
+     * Builder pattern helper.
+     *
+     * @since 0.2.0
+     */
+    public static final class Builder
+    {
+
+        Class<? extends Annotation> disposeAnnotationType = Dispose.class;
+
+        Matcher<? super TypeLiteral<?>> typeMatcher = any();
+
+        Disposer disposer = new Disposer();
+
+        /**
+         * Hidden constructor.
+         */
+        Builder()
+        {
+        }
+
+        /**
+         * Builds {@link DisposeModule} with given settings.
+         *
+         * @return {@link DisposeModule} with given settings.
+         * @since 0.2.0
+         */
+        public DisposeModule build()
+        {
+            return new DisposeModule( this );
+        }
+
+        /**
+         * Sets <i>Dispose</i> annotation to be searched.
+         *
+         * @param disposeAnnotationType <i>Dispose</i> annotation to be searched.
+         * @return self
+         * @since 0.2.0
+         */
+        public Builder withDisposeAnnotationType( Class<? extends Annotation> disposeAnnotationType )
+        {
+            this.disposeAnnotationType = checkNotNull( disposeAnnotationType,
+                                                       "Argument 'disposeAnnotationType' must be not null." );
+            return this;
+        }
+
+        /**
+         * Sets the filter for injectee types.
+         *
+         * @param typeMatcher the filter for injectee types.
+         * @return self
+         * @since 0.2.0
+         */
+        public Builder withTypeMatcher( Matcher<? super TypeLiteral<?>> typeMatcher )
+        {
+            this.typeMatcher = checkNotNull( typeMatcher, "Argument 'typeMatcher' must be not null." );
+            return this;
+        }
+
+        /**
+         * Sets the container to register disposable objects.
+         *
+         * @param disposer container to register disposable objects.
+         * @return self
+         * @since 0.2.0
+         */
+        public Builder withDisposer( Disposer disposer )
+        {
+            this.disposer = checkNotNull( disposer, "Argument 'disposer' must be not null." );
+            return this;
+        }
+
+        private static <T> T checkNotNull( T object, String message )
+        {
+            if ( object == null )
+            {
+                throw new IllegalArgumentException( message );
+            }
+            return object;
+        }
+
+    }
+
 }

Added: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java?rev=1433094&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java (added)
+++ incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java Mon Jan 14 20:15:47 2013
@@ -0,0 +1,33 @@
+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.
+ */
+
+public final class DisposableObject
+{
+
+    boolean disposed = false;
+
+    @Dispose
+    public void dispose()
+    {
+        disposed  = true;
+    }
+
+}

Propchange: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: 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=1433094&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java (added)
+++ incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java Mon Jan 14 20:15:47 2013
@@ -0,0 +1,79 @@
+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 static com.google.inject.Guice.createInjector;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
+
+import org.junit.Test;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.CreationException;
+
+public final class DisposeModuleTestCase
+{
+
+    @Test
+    public void disposeUsingModuleOnInjectorFailure()
+    {
+        Disposer disposer = new Disposer();
+        try
+        {
+            createInjector( DisposeModule.builder().withDisposer( disposer ).build(), new AbstractModule()
+            {
+
+                @Override
+                protected void configure()
+                {
+                    bind( ThrowingExceptionConstructor.class ).asEagerSingleton();
+                }
+
+            } );
+            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 DisposableObject );
+                    assertTrue( ((DisposableObject) injectee).disposed );
+                }
+
+                public <I, E extends Throwable> void onError( I injectee, E error )
+                {
+                    fail( error.toString() );
+                }
+
+            });
+        }
+    }
+
+}

Propchange: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor.java?rev=1433094&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor.java (added)
+++ incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor.java Mon Jan 14 20:15:47 2013
@@ -0,0 +1,33 @@
+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 javax.inject.Inject;
+
+public final class ThrowingExceptionConstructor
+{
+
+    @Inject
+    public ThrowingExceptionConstructor( DisposableObject disposableObject )
+    {
+        throw new IllegalArgumentException( "Expected exception" );
+    }
+
+}

Propchange: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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