Bug 386446: support JSR250 lifecycles in Plexus (optional)
diff --git a/org.eclipse.sisu.plexus/src/org/codehaus/plexus/ContainerConfiguration.java b/org.eclipse.sisu.plexus/src/org/codehaus/plexus/ContainerConfiguration.java
index 521cb96..56d0121 100644
--- a/org.eclipse.sisu.plexus/src/org/codehaus/plexus/ContainerConfiguration.java
+++ b/org.eclipse.sisu.plexus/src/org/codehaus/plexus/ContainerConfiguration.java
@@ -58,4 +58,8 @@
     ContainerConfiguration setContextComponent( Context context );
 
     Context getContextComponent();
+
+    ContainerConfiguration setJSR250Lifecycle( boolean on );
+
+    boolean getJSR250Lifecycle();
 }
diff --git a/org.eclipse.sisu.plexus/src/org/codehaus/plexus/DefaultContainerConfiguration.java b/org.eclipse.sisu.plexus/src/org/codehaus/plexus/DefaultContainerConfiguration.java
index 2f1390d..4c514e6 100644
--- a/org.eclipse.sisu.plexus/src/org/codehaus/plexus/DefaultContainerConfiguration.java
+++ b/org.eclipse.sisu.plexus/src/org/codehaus/plexus/DefaultContainerConfiguration.java
@@ -44,6 +44,8 @@
 
     private Context contextComponent;
 
+    private boolean jsr250Lifecycle;
+
     // ----------------------------------------------------------------------
     // Public methods
     // ----------------------------------------------------------------------
@@ -155,4 +157,15 @@
     {
         return contextComponent;
     }
+
+    public ContainerConfiguration setJSR250Lifecycle( final boolean jsr250Lifecycle )
+    {
+        this.jsr250Lifecycle = jsr250Lifecycle;
+        return this;
+    }
+
+    public boolean getJSR250Lifecycle()
+    {
+        return jsr250Lifecycle;
+    }
 }
diff --git a/org.eclipse.sisu.plexus/src/org/codehaus/plexus/DefaultPlexusContainer.java b/org.eclipse.sisu.plexus/src/org/codehaus/plexus/DefaultPlexusContainer.java
index 8be8d0c..54224e9 100644
--- a/org.eclipse.sisu.plexus/src/org/codehaus/plexus/DefaultPlexusContainer.java
+++ b/org.eclipse.sisu.plexus/src/org/codehaus/plexus/DefaultPlexusContainer.java
@@ -44,6 +44,7 @@
 import org.codehaus.plexus.logging.LoggerManager;
 import org.codehaus.plexus.logging.console.ConsoleLoggerManager;
 import org.eclipse.sisu.bean.BeanManager;
+import org.eclipse.sisu.bean.LifecycleManager;
 import org.eclipse.sisu.inject.DefaultBeanLocator;
 import org.eclipse.sisu.inject.DefaultRankingFunction;
 import org.eclipse.sisu.inject.DeferredClass;
@@ -185,8 +186,9 @@
         scanning = parseScanningOption( configuration.getClassPathScanning() );
 
         plexusBeanLocator = new DefaultPlexusBeanLocator( qualifiedBeanLocator, componentVisibility );
+        final BeanManager jsr250Lifecycle = configuration.getJSR250Lifecycle() ? new LifecycleManager() : null;
         plexusBeanManager = new PlexusLifecycleManager( Providers.of( context ), loggerManagerProvider, //
-                                                        new SLF4JLoggerFactoryProvider() ); // SLF4J (optional)
+                                                        new SLF4JLoggerFactoryProvider(), jsr250Lifecycle );
 
         realmIds.add( containerRealm.getId() );
         setLookupRealm( containerRealm );
diff --git a/org.eclipse.sisu.plexus/src/org/eclipse/sisu/plexus/PlexusLifecycleManager.java b/org.eclipse.sisu.plexus/src/org/eclipse/sisu/plexus/PlexusLifecycleManager.java
index f77ad70..99de24f 100644
--- a/org.eclipse.sisu.plexus/src/org/eclipse/sisu/plexus/PlexusLifecycleManager.java
+++ b/org.eclipse.sisu.plexus/src/org/eclipse/sisu/plexus/PlexusLifecycleManager.java
@@ -64,17 +64,22 @@
 
     private final Provider<?> slf4jLoggerFactoryProvider;
 
+    private final BeanManager delegate;
+
     // ----------------------------------------------------------------------
     // Constructors
     // ----------------------------------------------------------------------
 
     public PlexusLifecycleManager( final Provider<Context> plexusContextProvider,
                                    final Provider<LoggerManager> plexusLoggerManagerProvider,
-                                   final Provider<?> slf4jLoggerFactoryProvider )
+                                   final Provider<?> slf4jLoggerFactoryProvider, //
+                                   final BeanManager delegate )
     {
         this.plexusContextProvider = plexusContextProvider;
         this.plexusLoggerManagerProvider = plexusLoggerManagerProvider;
         this.slf4jLoggerFactoryProvider = slf4jLoggerFactoryProvider;
+
+        this.delegate = delegate;
     }
 
     // ----------------------------------------------------------------------
@@ -95,7 +100,7 @@
                 return true;
             }
         }
-        return false;
+        return null != delegate ? delegate.manage( clazz ) : false;
     }
 
     @SuppressWarnings( "rawtypes" )
@@ -124,7 +129,7 @@
                 }
             };
         }
-        return null;
+        return null != delegate ? delegate.manage( property ) : null;
     }
 
     public boolean manage( final Object bean )
@@ -141,7 +146,7 @@
         {
             schedule( bean );
         }
-        return true;
+        return null != delegate ? delegate.manage( bean ) : true;
     }
 
     public boolean unmanage( final Object bean )
@@ -154,7 +159,7 @@
         {
             dispose( (Disposable) bean );
         }
-        return true;
+        return null != delegate ? delegate.unmanage( bean ) : true;
     }
 
     public boolean unmanage()
@@ -167,7 +172,7 @@
         {
             dispose( bean );
         }
-        return true;
+        return null != delegate ? delegate.unmanage() : true;
     }
 
     // ----------------------------------------------------------------------
diff --git a/org.eclipse.sisu.plexus/src/org/eclipse/sisu/plexus/PlexusSpaceModule.java b/org.eclipse.sisu.plexus/src/org/eclipse/sisu/plexus/PlexusSpaceModule.java
index 91432c6..2a81cc4 100644
--- a/org.eclipse.sisu.plexus/src/org/eclipse/sisu/plexus/PlexusSpaceModule.java
+++ b/org.eclipse.sisu.plexus/src/org/eclipse/sisu/plexus/PlexusSpaceModule.java
@@ -66,7 +66,7 @@
 
         final BeanManager manager = new PlexusLifecycleManager( binder.getProvider( Context.class ), //
                                                                 binder.getProvider( LoggerManager.class ), //
-                                                                slf4jLoggerFactoryProvider ); // SLF4J (optional)
+                                                                slf4jLoggerFactoryProvider, null );
 
         binder.bind( BeanManager.class ).toInstance( manager );