You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@onami.apache.org by ra...@apache.org on 2013/03/09 19:17:25 UTC

svn commit: r1454749 [1/2] - in /incubator/onami/trunk: lifecycle/ lifecycle/core/ lifecycle/core/main/ lifecycle/core/main/java/ lifecycle/core/main/java/org/ lifecycle/core/main/java/org/apache/ lifecycle/core/main/java/org/apache/onami/ lifecycle/co...

Author: randgalt
Date: Sat Mar  9 18:17:23 2013
New Revision: 1454749

URL: http://svn.apache.org/r1454749
Log:
ONAMI-97
Major refactoring of Lifecycle module. Split into separate sub-modules. The previous implementation is moved
to org.apache.onami.lifecycle.standard. A new module, org.apache.onami.lifecycle.core, contains refactored
code that supports more generalized features such as ordered post injection annotations and staged container
style injections. org.apache.onami.lifecycle.standard is completely backward compatible (other than the new
package name).

Added:
    incubator/onami/trunk/lifecycle/core/
    incubator/onami/trunk/lifecycle/core/main/
    incubator/onami/trunk/lifecycle/core/main/java/
    incubator/onami/trunk/lifecycle/core/main/java/org/
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractLifeCycleModule.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/AbstractLifeCycleModule.java
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractMethodTypeListener.java   (with props)
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStageableFactory.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionAfterInjectionMethod.java
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStager.java   (with props)
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleModule.java   (with props)
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleStageModule.java   (with props)
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/ListBuilder.java   (with props)
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/NoOpStageHandler.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/WrongDisposeMethod.java
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageHandler.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeHandler.java
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stageable.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/package-info.java
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableFactory.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableMethod.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java
    incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stager.java   (with props)
    incubator/onami/trunk/lifecycle/core/pom.xml   (with props)
    incubator/onami/trunk/lifecycle/core/test/
    incubator/onami/trunk/lifecycle/core/test/java/
    incubator/onami/trunk/lifecycle/core/test/java/org/
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleObject.java
      - copied, changed from r1452593, incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleTestCase.java   (with props)
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject1.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject2.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StagingOrderTestCase.java   (with props)
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationA.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationB.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java
    incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationC.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java
    incubator/onami/trunk/lifecycle/standard/
    incubator/onami/trunk/lifecycle/standard/main/
    incubator/onami/trunk/lifecycle/standard/main/java/
    incubator/onami/trunk/lifecycle/standard/main/java/org/
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/AfterInjection.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/AfterInjection.java
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/AfterInjectionModule.java
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/DefaultDisposer.java   (with props)
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/Disposable.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposable.java
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/Dispose.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/DisposeHandler.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeHandler.java
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/DisposeModule.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeModule.java
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/Disposer.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposer.java
    incubator/onami/trunk/lifecycle/standard/main/java/org/apache/onami/lifecycle/standard/StagerWrapper.java   (with props)
    incubator/onami/trunk/lifecycle/standard/pom.xml   (with props)
    incubator/onami/trunk/lifecycle/standard/test/
    incubator/onami/trunk/lifecycle/standard/test/java/
    incubator/onami/trunk/lifecycle/standard/test/java/org/
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/AfterInjectionTestCase.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/AfterInjectionTestCase.java
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/DisposableObject.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/DisposeModuleTestCase.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeModuleTestCase.java
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/DisposeTestCase.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposeTestCase.java
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/ThrowingExceptionAfterInjectionMethod.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionAfterInjectionMethod.java
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/ThrowingExceptionConstructor.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor.java
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/ThrowingExceptionConstructor2.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/ThrowingExceptionDisposeMethod.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionDisposeMethod.java
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/WrongAfterInjectionMethod.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/WrongAfterInjectionMethod.java
    incubator/onami/trunk/lifecycle/standard/test/java/org/apache/onami/lifecycle/standard/WrongDisposeMethod.java   (contents, props changed)
      - copied, changed from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/WrongDisposeMethod.java
Removed:
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/AbstractLifeCycleModule.java
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/AbstractMethodTypeListener.java
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/AfterInjection.java
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/AfterInjectionModule.java
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DefaultDisposer.java
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Disposable.java
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeHandler.java
    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/main/java/org/apache/onami/lifecycle/MethodDisposable.java
    incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/package-info.java
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/AfterInjectionTestCase.java
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.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
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionAfterInjectionMethod.java
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor.java
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionDisposeMethod.java
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/WrongAfterInjectionMethod.java
    incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/WrongDisposeMethod.java
Modified:
    incubator/onami/trunk/lifecycle/pom.xml
    incubator/onami/trunk/scopes/pom.xml
    incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedConcurrentLazySingletonObject.java
    incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java
    incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/LazySingletonObject.java
    incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestConcurrentLazySingleton.java
    incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestLazySingleton.java

Copied: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractLifeCycleModule.java (from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/AbstractLifeCycleModule.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractLifeCycleModule.java?p2=incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractLifeCycleModule.java&p1=incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/AbstractLifeCycleModule.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/AbstractLifeCycleModule.java (original)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractLifeCycleModule.java Sat Mar  9 18:17:23 2013
@@ -1,4 +1,4 @@
-package org.apache.onami.lifecycle;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,25 +19,29 @@ package org.apache.onami.lifecycle;
  * under the License.
  */
 
-import static com.google.inject.matcher.Matchers.any;
-
-import java.lang.annotation.Annotation;
-
 import com.google.inject.AbstractModule;
 import com.google.inject.TypeLiteral;
 import com.google.inject.matcher.Matcher;
 
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.google.inject.matcher.Matchers.any;
+
 /**
- * Abstract implementation of a module that requires an annotation type and a type matcher.
+ * Abstract implementation of a module that requires an ordered list
+ * of annotation types and a type matcher.
  */
 abstract class AbstractLifeCycleModule
     extends AbstractModule
 {
 
     /**
-     * The annotation type the scanner will look for in the types methods.
+     * The annotation types the scanner will look for in the types methods
+     * in the order that they will be matched.
      */
-    private final Class<? extends Annotation> annotationType;
+    private final List<Class<? extends Annotation>> annotationTypes;
 
     /**
      * The type matcher to filter classes where looking for lifecycle annotations.
@@ -51,7 +55,7 @@ abstract class AbstractLifeCycleModule
      */
     public <A extends Annotation> AbstractLifeCycleModule( Class<A> annotationType )
     {
-        this( annotationType, any() );
+        this( ListBuilder.builder( annotationType ).build(), any() );
     }
 
     /**
@@ -59,12 +63,35 @@ abstract class AbstractLifeCycleModule
      * in types filtered by the input matcher.
      *
      * @param annotationType the lifecycle annotation to be searched.
-     * @param typeMatcher the filter for injectee types.
+     * @param typeMatcher    the filter for injectee types.
      */
     public <A extends Annotation> AbstractLifeCycleModule( Class<A> annotationType,
                                                            Matcher<? super TypeLiteral<?>> typeMatcher )
     {
-        if ( annotationType == null )
+        this( ListBuilder.builder( annotationType ).build(), typeMatcher );
+    }
+
+    /**
+     * Creates a new module which looks for the input lifecycle annotations on methods in any type.
+     *
+     * @param annotationTypes the lifecycle annotations to be searched in the order to be searched.
+     */
+    public AbstractLifeCycleModule( List<Class<? extends Annotation>> annotationTypes )
+    {
+        this( annotationTypes, any() );
+    }
+
+    /**
+     * Creates a new module which looks for the input lifecycle annotations on methods
+     * in types filtered by the input matcher.
+     *
+     * @param annotationTypes the lifecycle annotations to be searched in the order to be searched.
+     * @param typeMatcher     the filter for injectee types.
+     */
+    public AbstractLifeCycleModule( List<Class<? extends Annotation>> annotationTypes,
+                                    Matcher<? super TypeLiteral<?>> typeMatcher )
+    {
+        if ( annotationTypes == null )
         {
             throw new IllegalArgumentException( "annotationType must be specified" );
         }
@@ -72,18 +99,18 @@ abstract class AbstractLifeCycleModule
         {
             throw new IllegalArgumentException( "typeMatcher must be specified" );
         }
-        this.annotationType = annotationType;
+        this.annotationTypes = new ArrayList<Class<? extends Annotation>>( annotationTypes );
         this.typeMatcher = typeMatcher;
     }
 
     /**
-     * Returns the annotation type the scanner will look for in the types methods.
+     * Returns the ordered annotation types the scanner will look for in the types methods.
      *
-     * @return The annotation type the scanner will look for in the types methods.
+     * @return The ordered annotation types the scanner will look for in the types methods.
      */
-    protected final Class<? extends Annotation> getAnnotationType()
+    protected final List<Class<? extends Annotation>> getAnnotationTypes()
     {
-        return annotationType;
+        return annotationTypes;
     }
 
     /**

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractLifeCycleModule.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractLifeCycleModule.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractMethodTypeListener.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractMethodTypeListener.java?rev=1454749&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractMethodTypeListener.java (added)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractMethodTypeListener.java Sat Mar  9 18:17:23 2013
@@ -0,0 +1,120 @@
+package org.apache.onami.lifecycle.core;
+
+/*
+ * 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 com.google.inject.TypeLiteral;
+import com.google.inject.spi.TypeEncounter;
+import com.google.inject.spi.TypeListener;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.util.List;
+
+/**
+ * A Guice {@code TypeListener} to hear annotated methods with lifecycle annotations.
+ */
+abstract class AbstractMethodTypeListener
+    implements TypeListener
+{
+
+    /**
+     * The {@code java} package constants.
+     */
+    private static final String JAVA_PACKAGE = "java";
+
+    /**
+     * The lifecycle annotations to search on methods in the order to be searched.
+     */
+    private final List<Class<? extends Annotation>> annotationTypes;
+
+    /**
+     * Creates a new methods listener instance.
+     *
+     * @param annotationTypes the lifecycle annotations to search on methods in the order to be searched.
+     */
+    public AbstractMethodTypeListener( List<Class<? extends Annotation>> annotationTypes )
+    {
+        this.annotationTypes = annotationTypes;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final <I> void hear( TypeLiteral<I> type, TypeEncounter<I> encounter )
+    {
+        hear( type, type.getRawType(), encounter );
+    }
+
+    /**
+     * Allows traverse the input klass hierarchy.
+     *
+     * @param parentType the owning type being heard
+     * @param klass      encountered by Guice.
+     * @param encounter  the injection context.
+     */
+    private <I> void hear( final TypeLiteral<I> parentType, Class<? super I> klass, TypeEncounter<I> encounter )
+    {
+        if ( klass == null || klass.getPackage().getName().startsWith( JAVA_PACKAGE ) )
+        {
+            return;
+        }
+
+        for ( Class<? extends Annotation> annotationType : annotationTypes )
+        {
+            for ( Method method : klass.getDeclaredMethods() )
+            {
+                if ( method.isAnnotationPresent( annotationType ) )
+                {
+                    if ( method.getParameterTypes().length != 0 )
+                    {
+                        encounter.addError( "Annotated methods with @%s must not accept any argument, found %s",
+                                            annotationType.getName(), method );
+                    }
+
+                    hear( method, parentType, encounter, annotationType );
+                }
+            }
+        }
+
+        hear( parentType, klass.getSuperclass(), encounter );
+    }
+
+    /**
+     * Returns the lifecycle annotation to search on methods.
+     *
+     * @return the lifecycle annotation to search on methods.
+     */
+    protected final List<Class<? extends Annotation>> getAnnotationTypes()
+    {
+        return annotationTypes;
+    }
+
+    /**
+     * Allows implementations to define the behavior when lifecycle annotation is found on the method.
+     *
+     * @param method         encountered by this type handler.
+     * @param parentType     the owning type being heard
+     * @param encounter      the injection context.
+     * @param annotationType the annotation type that was specified.
+     */
+    protected abstract <I> void hear( Method method, TypeLiteral<I> parentType, TypeEncounter<I> encounter,
+                                      Class<? extends Annotation> annotationType );
+
+}

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractMethodTypeListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/AbstractMethodTypeListener.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Copied: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStageableFactory.java (from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionAfterInjectionMethod.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStageableFactory.java?p2=incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStageableFactory.java&p1=incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionAfterInjectionMethod.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionAfterInjectionMethod.java (original)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStageableFactory.java Sat Mar  9 18:17:23 2013
@@ -1,6 +1,4 @@
-package org.apache.onami.lifecycle;
-
-import org.apache.onami.lifecycle.AfterInjection;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -21,13 +19,18 @@ import org.apache.onami.lifecycle.AfterI
  * under the License.
  */
 
-public final class ThrowingExceptionAfterInjectionMethod
-{
+import com.google.inject.TypeLiteral;
+import com.google.inject.spi.TypeEncounter;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
 
-    @AfterInjection
-    public void init()
+public class DefaultStageableFactory
+    implements StageableFactory
+{
+    public <I> Stageable newStageable( I injectee, Method stageMethod, TypeLiteral<I> parentType,
+                                       TypeEncounter<I> encounter, Class<? extends Annotation> annotationType )
     {
-        throw new IllegalStateException();
+        return new StageableMethod( stageMethod, injectee );
     }
-
 }

Added: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStager.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStager.java?rev=1454749&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStager.java (added)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStager.java Sat Mar  9 18:17:23 2013
@@ -0,0 +1,126 @@
+package org.apache.onami.lifecycle.core;
+
+/*
+ * 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.annotation.Annotation;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * Default {@link Stager} implementation.
+ */
+public class DefaultStager<A extends Annotation>
+    implements Stager<A>
+{
+    private final Class<A> stage;
+
+    /**
+     * Stack of elements have to be disposed.
+     */
+    private final Queue<Stageable> stageables;
+
+    /**
+     * @param stage the annotation that specifies this stage
+     * @param mode  execution order
+     */
+    public DefaultStager( Class<A> stage, Order mode )
+    {
+        this.stage = stage;
+
+        Queue<Stageable> localStageables;
+        if ( mode == Order.FIRST_IN_LAST_OUT )
+        {
+            localStageables = Collections.asLifoQueue( new LinkedList<Stageable>() );
+        }
+        else
+        {
+            localStageables = new LinkedList<Stageable>();
+        }
+        stageables = localStageables;
+    }
+
+    public static <A extends Annotation> Stager<A> newStager( Class<A> stage )
+    {
+        return newStager( stage, Order.FIRST_IN_FIRST_OUT );
+    }
+
+    public static <A extends Annotation> Stager<A> newStager( Class<A> stage, Order mode )
+    {
+        return new DefaultStager<A>( stage, mode );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public synchronized void register( Stageable stageable )
+    {
+        stageables.offer( stageable );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stage()
+    {
+        stage( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public synchronized void stage( StageHandler stageHandler )
+    {
+        if ( stageHandler == null )
+        {
+            stageHandler = new NoOpStageHandler();
+        }
+
+        while ( !stageables.isEmpty() )
+        {
+            stageables.remove().stage( stageHandler );
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Class<A> getStage()
+    {
+        return stage;
+    }
+
+    /**
+     * specifies ordering for a {@link DefaultStager}
+     */
+    public static enum Order
+    {
+        /**
+         * FIFO
+         */
+        FIRST_IN_FIRST_OUT,
+
+        /**
+         * FILO/LIFO
+         */
+        FIRST_IN_LAST_OUT
+    }
+
+}

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/DefaultStager.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleModule.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleModule.java?rev=1454749&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleModule.java (added)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleModule.java Sat Mar  9 18:17:23 2013
@@ -0,0 +1,136 @@
+package org.apache.onami.lifecycle.core;
+
+/*
+ * 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 com.google.inject.ProvisionException;
+import com.google.inject.TypeLiteral;
+import com.google.inject.matcher.Matcher;
+import com.google.inject.spi.InjectionListener;
+import com.google.inject.spi.TypeEncounter;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import static java.lang.String.format;
+
+/**
+ * Guice module to register methods to be invoked after injection is complete.
+ */
+public final class LifeCycleModule
+    extends AbstractLifeCycleModule
+{
+
+    /**
+     * Creates a new module which looks for the input lifecycle annotation on methods in any type.
+     *
+     * @param annotationType the lifecycle annotation to be searched.
+     */
+    public <A extends Annotation> LifeCycleModule( Class<A> annotationType )
+    {
+        super( annotationType );
+    }
+
+    /**
+     * Creates a new module which looks for the input lifecycle annotation on methods
+     * in types filtered by the input matcher.
+     *
+     * @param annotationType the lifecycle annotation to be searched.
+     * @param typeMatcher    the filter for injectee types.
+     */
+    public <A extends Annotation> LifeCycleModule( Class<A> annotationType,
+                                                   Matcher<? super TypeLiteral<?>> typeMatcher )
+    {
+        super( annotationType, typeMatcher );
+    }
+
+    /**
+     * Creates a new module which looks for the input lifecycle annotations on methods in any type.
+     *
+     * @param annotationTypes the lifecycle annotations to be searched in the order to be searched.
+     */
+    public LifeCycleModule( List<Class<? extends Annotation>> annotationTypes )
+    {
+        super( annotationTypes );
+    }
+
+    /**
+     * Creates a new module which looks for the input lifecycle annotations on methods
+     * in types filtered by the input matcher.
+     *
+     * @param annotationTypes the lifecycle annotations to be searched in the order to be searched.
+     * @param typeMatcher     the filter for injectee types.
+     */
+    public LifeCycleModule( List<Class<? extends Annotation>> annotationTypes,
+                            Matcher<? super TypeLiteral<?>> typeMatcher )
+    {
+        super( annotationTypes, typeMatcher );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void configure()
+    {
+        bindListener( getTypeMatcher(), new AbstractMethodTypeListener( getAnnotationTypes() )
+        {
+
+            @Override
+            protected <I> void hear( final Method method, TypeLiteral<I> parentType, TypeEncounter<I> encounter,
+                                     final Class<? extends Annotation> annotationType )
+            {
+                encounter.register( new InjectionListener<I>()
+                {
+
+                    public void afterInjection( I injectee )
+                    {
+                        try
+                        {
+                            method.invoke( injectee );
+                        }
+                        catch ( IllegalArgumentException e )
+                        {
+                            // should not happen, anyway...
+                            throw new ProvisionException(
+                                format( "Method @%s %s requires arguments", annotationType.getName(), method ), e );
+                        }
+                        catch ( IllegalAccessException e )
+                        {
+                            throw new ProvisionException(
+                                format( "Impossible to access to @%s %s on %s", annotationType.getName(), method,
+                                        injectee ), e );
+                        }
+                        catch ( InvocationTargetException e )
+                        {
+                            throw new ProvisionException(
+                                format( "An error occurred while invoking @%s %s on %s", annotationType.getName(),
+                                        method, injectee ), e.getTargetException() );
+                        }
+                    }
+
+                } );
+            }
+
+        } );
+    }
+
+}

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleModule.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleModule.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleStageModule.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleStageModule.java?rev=1454749&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleStageModule.java (added)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleStageModule.java Sat Mar  9 18:17:23 2013
@@ -0,0 +1,226 @@
+package org.apache.onami.lifecycle.core;
+
+/*
+ * 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 com.google.inject.Key;
+import com.google.inject.TypeLiteral;
+import com.google.inject.internal.MoreTypes;
+import com.google.inject.matcher.Matcher;
+import com.google.inject.spi.InjectionListener;
+import com.google.inject.spi.TypeEncounter;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
+import static com.google.inject.matcher.Matchers.any;
+
+/**
+ * Guice module to register methods to be invoked when {@link Stager#stage()} is invoked.
+ * <p/>
+ * Module instance have has so it must not be used to construct more than one {@link com.google.inject.Injector}.
+ */
+public final class LifeCycleStageModule<A extends Annotation>
+    extends AbstractLifeCycleModule
+{
+
+    private final Stager<A> stager;
+
+    private final StageableFactory stageableFactory;
+
+    /**
+     * Creates a new module which register methods annotated with input annotation on methods in any type.
+     *
+     * @param stager the annotation that represents this stage and the methods with this annotation
+     */
+    public LifeCycleStageModule( Stager<A> stager )
+    {
+        this( stager, any() );
+    }
+
+    /**
+     * Creates a new module which register methods annotated with input annotation on methods
+     * in types filtered by the input matcher.
+     *
+     * @param stager      the annotation that represents this stage and the methods with this annotation
+     * @param typeMatcher the filter for injectee types.
+     */
+    public LifeCycleStageModule( Stager<A> stager, Matcher<? super TypeLiteral<?>> typeMatcher )
+    {
+        super( stager.getStage(), typeMatcher );
+        this.stager = stager;
+        stageableFactory = new DefaultStageableFactory();
+    }
+
+    /**
+     * Creates a new module from the supplied {@link Builder}.
+     *
+     * @param builder settings container.
+     */
+    LifeCycleStageModule( Builder<A> builder )
+    {
+        super( builder.stager.getStage(), builder.typeMatcher );
+        this.stager = builder.stager;
+        this.stageableFactory = builder.stageableFactory;
+    }
+
+    /**
+     * Allows one to create {@link LifeCycleStageModule} with builder pattern.
+     *
+     * @param stage the annotation that represents this stage and the methods with this annotation
+     * @return builder for {@link LifeCycleStageModule}.
+     */
+    public static <A extends Annotation> Builder<A> builder( Class<A> stage )
+    {
+        return new Builder<A>( stage );
+    }
+
+    /**
+     * Convenience to generate the correct key for retrieving stagers from an injector.
+     * E.g.
+     * <p/>
+     * <code><pre>
+     * Stager&lt;MyAnnotation&gt; stager = injector.getInstance( LifeCycleStageModule.key( MyAnnotation.class ) );
+     * </pre></code>
+     *
+     * @param stage the annotation that represents this stage and the methods with this annotation
+     * @param <A>   the Annotation type
+     * @return the Guice key to use for accessing the stager for the input stage
+     */
+    public static <A extends Annotation> Key<Stager<A>> key( Class<A> stage )
+    {
+        return Key.get( type( stage ) );
+    }
+
+    private static <A extends Annotation> TypeLiteral<Stager<A>> type( Class<A> stage )
+    {
+        MoreTypes.ParameterizedTypeImpl parameterizedType =
+            new MoreTypes.ParameterizedTypeImpl( null, Stager.class, stage );
+        //noinspection unchecked
+        return (TypeLiteral<Stager<A>>) TypeLiteral.get( parameterizedType );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void configure()
+    {
+        binder().bind( type( stager.getStage() ) ).toInstance( stager );
+
+        bindListener( getTypeMatcher(), new AbstractMethodTypeListener( getAnnotationTypes() )
+        {
+
+            @Override
+            protected <I> void hear( final Method stageMethod, final TypeLiteral<I> parentType,
+                                     final TypeEncounter<I> encounter,
+                                     final Class<? extends Annotation> annotationType )
+            {
+                encounter.register( new InjectionListener<I>()
+                {
+
+                    public void afterInjection( I injectee )
+                    {
+                        Stageable stageable =
+                            stageableFactory.newStageable( injectee, stageMethod, parentType, encounter,
+                                                           annotationType );
+                        stager.register( stageable );
+                    }
+
+                } );
+            }
+
+        } );
+    }
+
+    /**
+     * Builder pattern helper.
+     */
+    public static final class Builder<A extends Annotation>
+    {
+
+        private Matcher<? super TypeLiteral<?>> typeMatcher = any();
+
+        private Stager<A> stager;
+
+        private StageableFactory stageableFactory = new DefaultStageableFactory();
+
+        Builder( Class<A> annotationClass )
+        {
+            stager = new DefaultStager<A>( annotationClass, DefaultStager.Order.FIRST_IN_FIRST_OUT );
+        }
+
+        private static <T> T checkNotNull( T object, String message )
+        {
+            if ( object == null )
+            {
+                throw new IllegalArgumentException( message );
+            }
+            return object;
+        }
+
+        /**
+         * Builds {@link LifeCycleStageModule} with given settings.
+         *
+         * @return {@link LifeCycleStageModule} with given settings.
+         */
+        public LifeCycleStageModule<A> build()
+        {
+            return new LifeCycleStageModule<A>( this );
+        }
+
+        /**
+         * Sets the filter for injectee types.
+         *
+         * @param typeMatcher the filter for injectee types.
+         * @return self
+         */
+        public Builder<A> 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 stager container to register disposable objects.
+         * @return self
+         */
+        public Builder<A> withStager( Stager<A> stager )
+        {
+            this.stager = checkNotNull( stager, "Argument 'stager' must be not null." );
+            return this;
+        }
+
+        /**
+         * Sets the StageableFactory
+         *
+         * @param stageableFactory the StageableFactory
+         * @return self
+         */
+        public Builder<A> withStageableMethodFactory( StageableFactory stageableFactory )
+        {
+            this.stageableFactory = checkNotNull( stageableFactory, "Argument 'stageableFactory' must be not null." );
+            return this;
+        }
+
+    }
+
+}

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleStageModule.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/LifeCycleStageModule.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/ListBuilder.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/ListBuilder.java?rev=1454749&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/ListBuilder.java (added)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/ListBuilder.java Sat Mar  9 18:17:23 2013
@@ -0,0 +1,79 @@
+package org.apache.onami.lifecycle.core;
+
+/*
+ * 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.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Convenience for building lists of annotations
+ */
+public class ListBuilder
+{
+    private final List<Class<? extends Annotation>> list = new ArrayList<Class<? extends Annotation>>();
+
+    /**
+     * Return a new builder.
+     *
+     * @return new builder
+     */
+    public static ListBuilder builder()
+    {
+        return new ListBuilder();
+    }
+
+    /**
+     * Return a new builder which has the input annotation as the first item.
+     *
+     * @param annotationClass annotation to initialize the list with.
+     * @return new builder.
+     */
+    public static ListBuilder builder( Class<? extends Annotation> annotationClass )
+    {
+        return new ListBuilder().append( annotationClass );
+    }
+
+    /**
+     * Append the input annotation to the list that is being built.
+     *
+     * @param annotationClass annotation to append.
+     * @return self
+     */
+    public ListBuilder append( Class<? extends Annotation> annotationClass )
+    {
+        list.add( annotationClass );
+        return this;
+    }
+
+    /**
+     * Build and return the list.
+     *
+     * @return list with the built annotations.
+     */
+    public List<Class<? extends Annotation>> build()
+    {
+        return new ArrayList<Class<? extends Annotation>>( list );
+    }
+
+    private ListBuilder()
+    {
+    }
+}

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/ListBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/ListBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Copied: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/NoOpStageHandler.java (from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/WrongDisposeMethod.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/NoOpStageHandler.java?p2=incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/NoOpStageHandler.java&p1=incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/WrongDisposeMethod.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/WrongDisposeMethod.java (original)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/NoOpStageHandler.java Sat Mar  9 18:17:23 2013
@@ -1,6 +1,4 @@
-package org.apache.onami.lifecycle;
-
-import org.apache.onami.lifecycle.Dispose;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -21,11 +19,25 @@ import org.apache.onami.lifecycle.Dispos
  * under the License.
  */
 
-public final class WrongDisposeMethod
+/**
+ * NOP {@code StageHandler} implementation.
+ */
+public final class NoOpStageHandler
+    implements StageHandler
 {
 
-    @Dispose
-    public void close( Integer misplacedArg )
+    /**
+     * {@inheritDoc}
+     */
+    public <I, E extends Throwable> void onError( I injectee, E error )
+    {
+        // do nothing
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <I> void onSuccess( I injectee )
     {
         // do nothing
     }

Copied: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageHandler.java (from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeHandler.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageHandler.java?p2=incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageHandler.java&p1=incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeHandler.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/DisposeHandler.java (original)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageHandler.java Sat Mar  9 18:17:23 2013
@@ -1,4 +1,4 @@
-package org.apache.onami.lifecycle;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -20,23 +20,23 @@ package org.apache.onami.lifecycle;
  */
 
 /**
- * A {@link DisposeHandler} instance is used to track dispose progresses.
+ * A {@link StageHandler} instance is used to track staging progresses.
  */
-public interface DisposeHandler
+public interface StageHandler
 {
 
     /**
-     * Tracks the input injectee successfully released the resources.
+     * Tracks the input injectee successfully staged the resources.
      *
-     * @param injectee the injectee to be released
+     * @param injectee the injectee to be staged
      */
     <I> void onSuccess( I injectee );
 
     /**
-     * Tracks an error occurred while the input injectee released the resources.
+     * Tracks an error occurred while the input injectee staged the resources.
      *
-     * @param injectee the injectee to be released
-     * @param error the exception occurred
+     * @param injectee the injectee to be staged
+     * @param error    the exception occurred
      */
     <I, E extends Throwable> void onError( I injectee, E error );
 

Copied: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stageable.java (from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/package-info.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stageable.java?p2=incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stageable.java&p1=incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/package-info.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/package-info.java (original)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stageable.java Sat Mar  9 18:17:23 2013
@@ -1,3 +1,5 @@
+package org.apache.onami.lifecycle.core;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +20,17 @@
  */
 
 /**
- * Objects lifecycle management made easy with Google Guice.
+ * Object that knows how to stage some resources.
  */
-package org.apache.onami.lifecycle;
+public interface Stageable
+{
+
+    /**
+     * Stage allocated resources, tracking progresses in the
+     * input {@code StageHandler}.
+     *
+     * @param stageHandler the handler to track progresses.
+     */
+    void stage( StageHandler stageHandler );
+
+}

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stageable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stageable.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Copied: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableFactory.java (from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableFactory.java?p2=incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableFactory.java&p1=incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/DisposableObject.java (original)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableFactory.java Sat Mar  9 18:17:23 2013
@@ -1,4 +1,4 @@
-package org.apache.onami.lifecycle;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,15 +19,14 @@ package org.apache.onami.lifecycle;
  * under the License.
  */
 
-public final class DisposableObject
-{
-
-    boolean disposed = false;
+import com.google.inject.TypeLiteral;
+import com.google.inject.spi.TypeEncounter;
 
-    @Dispose
-    public void dispose()
-    {
-        disposed  = true;
-    }
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
 
+public interface StageableFactory
+{
+    public <I> Stageable newStageable( I injectee, Method stageMethod, TypeLiteral<I> parentType,
+                                       TypeEncounter<I> encounter, Class<? extends Annotation> annotationType );
 }

Copied: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableMethod.java (from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableMethod.java?p2=incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableMethod.java&p1=incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/MethodDisposable.java (original)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableMethod.java Sat Mar  9 18:17:23 2013
@@ -1,4 +1,4 @@
-package org.apache.onami.lifecycle;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -23,62 +23,56 @@ import java.lang.reflect.InvocationTarge
 import java.lang.reflect.Method;
 
 /**
- * A {@link MethodDisposable} is a reference to a disposable injectee
+ * A {@link StageableMethod} is a reference to a stageable injectee
  * and related method to release resources.
- *
- * @since 0.2.0
  */
-public final class MethodDisposable implements Disposable
+final class StageableMethod
+    implements Stageable
 {
 
     /**
-     * The method to be invoked to release resources.
+     * The method to be invoked to stage resources.
      */
-    private final Method disposeMethod;
+    private final Method stageMethod;
 
     /**
-     * The target injectee has to release the resources.
+     * The target injectee has to stage the resources.
      */
     private final Object injectee;
 
     /**
-     * Creates a new {@link MethodDisposable} reference.
+     * Creates a new {@link StageableMethod} 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
+     * @param stageMethod the method to be invoked to stage resources.
+     * @param injectee    the target injectee has to stage the resources.
      */
-    public MethodDisposable( Method disposeMethod, Object injectee )
+    StageableMethod( Method stageMethod, Object injectee )
     {
-        this.disposeMethod = disposeMethod;
+        this.stageMethod = stageMethod;
         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
+     * {@inheritDoc}
      */
-    public void dispose( DisposeHandler disposeHandler )
+    public void stage( StageHandler stageHandler )
     {
         try
         {
-            disposeMethod.invoke( injectee );
-            disposeHandler.onSuccess( injectee );
+            stageMethod.invoke( injectee );
+            stageHandler.onSuccess( injectee );
         }
         catch ( IllegalArgumentException e )
         {
-            disposeHandler.onError( injectee, e );
+            stageHandler.onError( injectee, e );
         }
         catch ( IllegalAccessException e )
         {
-            disposeHandler.onError( injectee, e );
+            stageHandler.onError( injectee, e );
         }
         catch ( InvocationTargetException e )
         {
-            disposeHandler.onError( injectee, e.getCause() );
+            stageHandler.onError( injectee, e.getCause() );
         }
     }
 

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableMethod.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/StageableMethod.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stager.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stager.java?rev=1454749&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stager.java (added)
+++ incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stager.java Sat Mar  9 18:17:23 2013
@@ -0,0 +1,64 @@
+package org.apache.onami.lifecycle.core;
+
+/*
+ * 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.annotation.Annotation;
+
+/**
+ * A Stager is a mini-container that stages resources
+ * invoking {@link Stageable#stage(StageHandler)}.
+ * <p/>
+ * Order of disposal is specified by the concrete implementation of this
+ * interface via {@link org.apache.onami.lifecycle.DefaultStager.Order}.
+ * <p/>
+ * Implementations must be thread-safe because registration can be done from
+ * any thread.
+ */
+public interface Stager<A extends Annotation>
+{
+
+    /**
+     * Register a {@link Stageable} to stage resources.
+     *
+     * @param stageable object to be invoked to stage resources.
+     */
+    public void register( Stageable stageable );
+
+    /**
+     * Stages resources invoking {@link Stageable#stage(StageHandler)}.
+     */
+    public void stage();
+
+    /**
+     * Stages resources invoking {@link Stageable#stage(StageHandler)}.
+     *
+     * @param stageHandler the {@link StageHandler} instance that tracks progresses.
+     * @since 0.2.0
+     */
+    public void stage( StageHandler stageHandler );
+
+    /**
+     * Returns the annotation that represents this stage.
+     *
+     * @return stage annotation.
+     */
+    public Class<A> getStage();
+
+}

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/main/java/org/apache/onami/lifecycle/core/Stager.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: incubator/onami/trunk/lifecycle/core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/pom.xml?rev=1454749&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/core/pom.xml (added)
+++ incubator/onami/trunk/lifecycle/core/pom.xml Sat Mar  9 18:17:23 2013
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.onami</groupId>
+        <artifactId>org.apache.onami.lifecycle</artifactId>
+        <version>0.2.0-incubating-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>org.apache.onami.lifecycle.core</artifactId>
+</project>
\ No newline at end of file

Propchange: incubator/onami/trunk/lifecycle/core/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/onami/trunk/lifecycle/core/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/onami/trunk/lifecycle/core/pom.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Copied: incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleObject.java (from r1452593, incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleObject.java?p2=incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleObject.java&p1=incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java (original)
+++ incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleObject.java Sat Mar  9 18:17:23 2013
@@ -1,4 +1,4 @@
-package org.apache.onami.scopes;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,25 +19,58 @@ package org.apache.onami.scopes;
  * under the License.
  */
 
-import org.apache.onami.lifecycle.AfterInjection;
+import com.google.inject.Singleton;
 
-import java.util.concurrent.atomic.AtomicInteger;
-
-@LazySingleton
-public class AnnotatedLazySingletonObject
+@Singleton
+public class MultiLifeCycleObject
 {
-    public static final AtomicInteger constructorCount = new AtomicInteger( 0 );
+    private final StringBuilder str = new StringBuilder();
+
+    @TestAnnotationC
+    public void foo()
+    {
+        str.append( "c" );
+    }
+
+    @TestAnnotationA
+    public void aaa()
+    {
+        str.append( "a" );
+    }
+
+    @TestAnnotationB
+    public void bbb()
+    {
+        str.append( "b" );
+    }
 
-    public static final AtomicInteger postConstructCount = new AtomicInteger( 0 );
+    @TestAnnotationA
+    public void mmm()
+    {
+        str.append( "a" );
+    }
+
+    @TestAnnotationB
+    public void nnn()
+    {
+        str.append( "b" );
+    }
+
+    @TestAnnotationB
+    public void qqq()
+    {
+        str.append( "b" );
+    }
 
-    public AnnotatedLazySingletonObject()
+    @TestAnnotationA
+    public void zzz()
     {
-        constructorCount.incrementAndGet();
+        str.append( "a" );
     }
 
-    @AfterInjection
-    public void postConstruct()
+    @Override
+    public String toString()
     {
-        postConstructCount.incrementAndGet();
+        return str.toString();
     }
 }

Added: incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleTestCase.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleTestCase.java?rev=1454749&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleTestCase.java (added)
+++ incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/MultiLifeCycleTestCase.java Sat Mar  9 18:17:23 2013
@@ -0,0 +1,105 @@
+package org.apache.onami.lifecycle.core;
+
+/*
+ * 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 com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MultiLifeCycleTestCase
+{
+    @Test
+    public void testOrdering()
+    {
+        LifeCycleModule lifeCycleModule = new LifeCycleModule(
+            ListBuilder.builder().append( TestAnnotationA.class ).append( TestAnnotationB.class ).append(
+                TestAnnotationC.class ).build() );
+        MultiLifeCycleObject obj = Guice.createInjector( lifeCycleModule ).getInstance( MultiLifeCycleObject.class );
+        Assert.assertEquals( "aaabbbc", obj.toString() );
+    }
+
+    public static class Foo
+    {
+        @Inject
+        public Foo( Stager<TestAnnotationA> stager )
+        {
+            System.out.println( stager.getStage() );
+        }
+    }
+
+    @Test
+    public void testStaging()
+    {
+        LifeCycleStageModule<TestAnnotationA> moduleA =
+            new LifeCycleStageModule<TestAnnotationA>( DefaultStager.newStager( TestAnnotationA.class ) );
+        LifeCycleStageModule<TestAnnotationB> moduleB =
+            new LifeCycleStageModule<TestAnnotationB>( DefaultStager.newStager( TestAnnotationB.class ) );
+        LifeCycleStageModule<TestAnnotationC> moduleC =
+            new LifeCycleStageModule<TestAnnotationC>( DefaultStager.newStager( TestAnnotationC.class ) );
+
+        Injector injector = Guice.createInjector( moduleA, moduleB, moduleC );
+        MultiLifeCycleObject obj = injector.getInstance( MultiLifeCycleObject.class );
+
+        Assert.assertEquals( obj.toString(), "" );
+
+        injector.getInstance( LifeCycleStageModule.key( TestAnnotationA.class ) ).stage();
+        Assert.assertEquals( "aaa", obj.toString() );
+        injector.getInstance( LifeCycleStageModule.key( TestAnnotationB.class ) ).stage();
+        Assert.assertEquals( "aaabbb", obj.toString() );
+        injector.getInstance( LifeCycleStageModule.key( TestAnnotationC.class ) ).stage();
+        Assert.assertEquals( "aaabbbc", obj.toString() );
+
+        injector.getInstance( Foo.class );
+    }
+
+    @Test
+    public void testStagingOrdering()
+    {
+        LifeCycleStageModule<TestAnnotationA> moduleA =
+            new LifeCycleStageModule<TestAnnotationA>( DefaultStager.newStager( TestAnnotationA.class, DefaultStager.Order.FIRST_IN_FIRST_OUT ) );
+        LifeCycleStageModule<TestAnnotationB> moduleB =
+            new LifeCycleStageModule<TestAnnotationB>( DefaultStager.newStager( TestAnnotationB.class, DefaultStager.Order.FIRST_IN_LAST_OUT ) );
+
+        final StringBuilder str = new StringBuilder();
+        Module m = new AbstractModule()
+        {
+            @Override
+            protected void configure()
+            {
+                binder().bind( StringBuilder.class ).toInstance( str );
+            }
+        };
+
+        Injector injector = Guice.createInjector( moduleA, moduleB, m );
+        injector.getInstance( StageObject1.class );
+        injector.getInstance( StageObject2.class );
+
+        injector.getInstance( LifeCycleStageModule.key( TestAnnotationA.class ) ).stage();
+        Assert.assertEquals( "1a2a", str.toString() );
+        str.setLength( 0 );
+
+        injector.getInstance( LifeCycleStageModule.key( TestAnnotationB.class ) ).stage();
+        Assert.assertEquals( "2b1b", str.toString() );
+    }
+}

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

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

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

Copied: incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject1.java (from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject1.java?p2=incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject1.java&p1=incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java (original)
+++ incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject1.java Sat Mar  9 18:17:23 2013
@@ -1,4 +1,4 @@
-package org.apache.onami.lifecycle;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,17 +19,27 @@ package org.apache.onami.lifecycle;
  * under the License.
  */
 
-import java.util.concurrent.ExecutorService;
+import com.google.inject.Inject;
 
-import javax.inject.Inject;
-
-public final class ThrowingExceptionConstructor2
+public class StageObject1
 {
+    private final StringBuilder str;
 
     @Inject
-    public ThrowingExceptionConstructor2( ExecutorService executorService )
+    public StageObject1( StringBuilder str )
+    {
+        this.str = str;
+    }
+
+    @TestAnnotationA
+    public void stageA()
     {
-        throw new IllegalArgumentException( "Expected exception" );
+        str.append( "1a" );
     }
 
+    @TestAnnotationB
+    public void stageB()
+    {
+        str.append( "1b" );
+    }
 }

Copied: incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject2.java (from r1452593, incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject2.java?p2=incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject2.java&p1=incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/test/java/org/apache/onami/lifecycle/ThrowingExceptionConstructor2.java (original)
+++ incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StageObject2.java Sat Mar  9 18:17:23 2013
@@ -1,4 +1,4 @@
-package org.apache.onami.lifecycle;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,17 +19,27 @@ package org.apache.onami.lifecycle;
  * under the License.
  */
 
-import java.util.concurrent.ExecutorService;
+import com.google.inject.Inject;
 
-import javax.inject.Inject;
-
-public final class ThrowingExceptionConstructor2
+public class StageObject2
 {
+    private final StringBuilder str;
 
     @Inject
-    public ThrowingExceptionConstructor2( ExecutorService executorService )
+    public StageObject2( StringBuilder str )
+    {
+        this.str = str;
+    }
+
+    @TestAnnotationA
+    public void stageA()
     {
-        throw new IllegalArgumentException( "Expected exception" );
+        str.append( "2a" );
     }
 
+    @TestAnnotationB
+    public void stageB()
+    {
+        str.append( "2b" );
+    }
 }

Added: incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StagingOrderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StagingOrderTestCase.java?rev=1454749&view=auto
==============================================================================
--- incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StagingOrderTestCase.java (added)
+++ incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/StagingOrderTestCase.java Sat Mar  9 18:17:23 2013
@@ -0,0 +1,82 @@
+package org.apache.onami.lifecycle.core;
+
+/*
+ * 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 org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class StagingOrderTestCase
+{
+    @Test
+    public void testFifo()
+    {
+        List<Integer> order = new ArrayList<Integer>();
+        DefaultStager<TestAnnotationA> stager = makeStager( order, DefaultStager.Order.FIRST_IN_FIRST_OUT );
+        stager.stage();
+
+        Assert.assertEquals( Arrays.asList( 1, 2, 3 ), order );
+    }
+
+    @Test
+    public void testFilo()
+    {
+        List<Integer> order = new ArrayList<Integer>();
+        DefaultStager<TestAnnotationA> stager = makeStager( order, DefaultStager.Order.FIRST_IN_LAST_OUT );
+        stager.stage();
+
+        Assert.assertEquals( Arrays.asList( 3, 2, 1 ), order );
+    }
+
+    private DefaultStager<TestAnnotationA> makeStager( final List<Integer> order, DefaultStager.Order stagingOrder )
+    {
+        Stageable stageable1 = new Stageable()
+        {
+            public void stage( StageHandler stageHandler )
+            {
+                order.add( 1 );
+            }
+        };
+        Stageable stageable2 = new Stageable()
+        {
+            public void stage( StageHandler stageHandler )
+            {
+                order.add( 2 );
+            }
+        };
+        Stageable stageable3 = new Stageable()
+        {
+            public void stage( StageHandler stageHandler )
+            {
+                order.add( 3 );
+            }
+        };
+
+        DefaultStager<TestAnnotationA> stager =
+            new DefaultStager<TestAnnotationA>( TestAnnotationA.class, stagingOrder );
+        stager.register( stageable1 );
+        stager.register( stageable2 );
+        stager.register( stageable3 );
+        return stager;
+    }
+}

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

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

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

Copied: incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationA.java (from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationA.java?p2=incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationA.java&p1=incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java (original)
+++ incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationA.java Sat Mar  9 18:17:23 2013
@@ -1,4 +1,4 @@
-package org.apache.onami.lifecycle;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,20 +19,15 @@ package org.apache.onami.lifecycle;
  * under the License.
  */
 
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
-/**
- * The method annotated with {@code Dispose} is typically used to release resources that it has been holding.
- */
-@Documented
-@Retention( RUNTIME )
-@Target( METHOD )
-public @interface Dispose
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Retention(RUNTIME)
+@Target(METHOD)
+public @interface TestAnnotationA
 {
 
 }

Copied: incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationB.java (from r1452593, incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java)
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationB.java?p2=incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationB.java&p1=incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java&r1=1452593&r2=1454749&rev=1454749&view=diff
==============================================================================
--- incubator/onami/trunk/lifecycle/src/main/java/org/apache/onami/lifecycle/Dispose.java (original)
+++ incubator/onami/trunk/lifecycle/core/test/java/org/apache/onami/lifecycle/core/TestAnnotationB.java Sat Mar  9 18:17:23 2013
@@ -1,4 +1,4 @@
-package org.apache.onami.lifecycle;
+package org.apache.onami.lifecycle.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,20 +19,15 @@ package org.apache.onami.lifecycle;
  * under the License.
  */
 
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
-/**
- * The method annotated with {@code Dispose} is typically used to release resources that it has been holding.
- */
-@Documented
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
 @Retention( RUNTIME )
 @Target( METHOD )
-public @interface Dispose
+public @interface TestAnnotationB
 {
 
 }