You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gn...@apache.org on 2009/07/01 12:48:23 UTC

svn commit: r790110 - in /geronimo/sandbox/blueprint/blueprint-core/src: main/java/org/apache/geronimo/blueprint/container/ main/java/org/apache/geronimo/blueprint/di/ main/java/org/apache/geronimo/blueprint/namespace/ main/java/org/apache/geronimo/blu...

Author: gnodet
Date: Wed Jul  1 10:48:23 2009
New Revision: 790110

URL: http://svn.apache.org/viewvc?rev=790110&view=rev
Log:
Refactor support for environment managers, add a few validation tests

Added:
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/EnvironmentRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/EnvironmentMetadataImpl.java
Modified:
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/Repository.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java
    geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/AbstractBlueprintTest.java
    geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java Wed Jul  1 10:48:23 2009
@@ -40,6 +40,7 @@
 import org.apache.geronimo.blueprint.ExtendedServiceReferenceMetadata;
 import org.apache.geronimo.blueprint.di.AbstractRecipe;
 import org.apache.geronimo.blueprint.di.Recipe;
+import org.apache.geronimo.blueprint.di.CollectionRecipe;
 import org.apache.geronimo.blueprint.utils.BundleDelegatingClassLoader;
 import org.apache.geronimo.blueprint.utils.ReflectionUtils;
 import org.osgi.framework.Constants;
@@ -72,7 +73,7 @@
 
     protected final ExtendedBlueprintContainer blueprintContainer;
     protected final ServiceReferenceMetadata metadata;
-    protected final Recipe listenersRecipe;
+    protected final CollectionRecipe listenersRecipe;
     protected final List<Recipe> explicitDependencies;
     protected final ClassLoader proxyClassLoader;
     protected final boolean optional;
@@ -91,7 +92,7 @@
     protected AbstractServiceReferenceRecipe(String name,
                                              ExtendedBlueprintContainer blueprintContainer,
                                              ServiceReferenceMetadata metadata,
-                                             Recipe listenersRecipe,
+                                             CollectionRecipe listenersRecipe,
                                              List<Recipe> explicitDependencies) {
         super(name);
         this.prototype = false;
@@ -111,6 +112,10 @@
         this.filter = createOsgiFilter(metadata);
     }
 
+    public CollectionRecipe getListenersRecipe() {
+        return listenersRecipe;
+    }
+
     public void start(SatisfactionListener listener) {
         if (listener == null) throw new NullPointerException("satisfactionListener is null");
         if (started.compareAndSet(false, true)) {

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java Wed Jul  1 10:48:23 2009
@@ -43,6 +43,7 @@
 import org.apache.geronimo.blueprint.ExtendedBlueprintContainer;
 import org.apache.geronimo.blueprint.NamespaceHandler;
 import org.apache.geronimo.blueprint.Processor;
+import org.apache.geronimo.blueprint.reflect.EnvironmentMetadataImpl;
 import org.apache.geronimo.blueprint.di.Recipe;
 import org.apache.geronimo.blueprint.di.Repository;
 import org.apache.geronimo.blueprint.namespace.ComponentDefinitionRegistryImpl;
@@ -239,6 +240,10 @@
                             eventDispatcher.blueprintEvent(new BlueprintEvent(BlueprintEvent.GRACE_PERIOD, getBundleContext().getBundle(), getExtenderBundle(), missing.toArray(new String[missing.size()])));
                             return;
                         }
+                        componentDefinitionRegistry.registerComponentDefinition(new EnvironmentMetadataImpl("blueprintContainer", this));
+                        componentDefinitionRegistry.registerComponentDefinition(new EnvironmentMetadataImpl("blueprintBundle", bundleContext.getBundle()));
+                        componentDefinitionRegistry.registerComponentDefinition(new EnvironmentMetadataImpl("blueprintBundleContext", bundleContext));
+                        componentDefinitionRegistry.registerComponentDefinition(new EnvironmentMetadataImpl("blueprintConverter", converter));
                         parser.populate(handlers, componentDefinitionRegistry);
                         state = State.Populated;
                         break;

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java Wed Jul  1 10:48:23 2009
@@ -182,10 +182,15 @@
     private boolean isCompatible(Bundle bundle) {
         // Check compatibility
         boolean compatible;
-        try {
-            Class clazz = bundle.getBundleContext().getBundle().loadClass(BlueprintContainer.class.getName());
-            compatible = (clazz == BlueprintContainer.class);
-        } catch (ClassNotFoundException e) {
+        if (bundle.getState() == Bundle.ACTIVE) {
+            try {
+                Class clazz = bundle.getBundleContext().getBundle().loadClass(BlueprintContainer.class.getName());
+                compatible = (clazz == BlueprintContainer.class);
+            } catch (ClassNotFoundException e) {
+                compatible = true;
+            }
+        } else {
+            // for lazy bundle, we can't load the class, so just assume it's ok
             compatible = true;
         }
         return compatible;

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java Wed Jul  1 10:48:23 2009
@@ -38,6 +38,7 @@
 import org.apache.geronimo.blueprint.di.Recipe;
 import org.apache.geronimo.blueprint.di.RefRecipe;
 import org.apache.geronimo.blueprint.di.Repository;
+import org.apache.geronimo.blueprint.di.CollectionRecipe;
 import org.osgi.service.blueprint.container.ReifiedType;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
 import org.osgi.service.blueprint.container.NoSuchComponentException;
@@ -57,11 +58,6 @@
     private final ExtendedBlueprintContainer blueprintContainer;
 
     /**
-     * Contains environment objects
-     */
-    private final Map<String, Object> defaults = new ConcurrentHashMap<String, Object>();
-
-    /**
      * Contains object recipes
      */
     private final Map<String, Recipe> recipes = new ConcurrentHashMap<String, Recipe>();
@@ -104,26 +100,13 @@
         return recipes.get(name);
     }
 
-    public Object getDefault(String name) {
-        return defaults.get(name);
-    }
-
     public Set<String> getNames() {
         Set<String> names = new HashSet<String>();
         names.addAll(recipes.keySet());
         names.addAll(instances.keySet());
-        names.addAll(defaults.keySet());
         return names;
     }
 
-    public void putDefault(String name, Object instance) {
-        if (instance != null) {
-            defaults.put(name, instance);
-        } else {
-            defaults.remove(name);
-        }
-    }
-
     public void putRecipe(String name, Recipe recipe) {
         if (instances.get(name) != null) {
             throw new ComponentDefinitionException("Name " + name + " is already registered to instance " + instances.get(name));
@@ -214,25 +197,63 @@
             }
         }
         if (instance == null) {
-            instance = getDefault(name);
-        }
-        if (instance == null) {
             throw new NoSuchComponentException(name);
         }
         return instance;
     }
 
-    public void checkReferences() {
+    public void validate() {
         for (Recipe recipe : getAllRecipes()) {
+            // Check that references are satisfied
             String ref = null;
             if (recipe instanceof RefRecipe) {
                 ref = ((RefRecipe) recipe).getIdRef();
             } else if (recipe instanceof IdRefRecipe) {
                 ref = ((IdRefRecipe) recipe).getIdRef();
             }
-            if (ref != null && getRecipe(ref) == null && getDefault(ref) == null) {
+            if (ref != null && getRecipe(ref) == null) {
                 throw new ComponentDefinitionException("Unresolved ref/idref to component: " + ref);
             }
+            // Check service
+            if (recipe instanceof ServiceRecipe) {
+                Recipe r = ((ServiceRecipe) recipe).getServiceRecipe();
+                if (r instanceof RefRecipe) {
+                    r = getRecipe(((RefRecipe) r).getIdRef());
+                }
+                if (r instanceof ServiceRecipe) {
+                    throw new ComponentDefinitionException("The target for a <service> element must not be <service> element");
+                }
+                if (r instanceof ReferenceListRecipe) {
+                    throw new ComponentDefinitionException("The target for a <service> element must not be <reference-list> element");
+                }
+                CollectionRecipe listeners = ((ServiceRecipe) recipe).getListenersRecipe();
+                for (Recipe l : listeners.getDependencies()) {
+                    if (l instanceof RefRecipe) {
+                        l = getRecipe(((RefRecipe) l).getIdRef());
+                    }
+                    if (l instanceof ServiceRecipe) {
+                        throw new ComponentDefinitionException("The target for a <registration-listener> element must not be <service> element");
+                    }
+                    if (l instanceof ReferenceListRecipe) {
+                        throw new ComponentDefinitionException("The target for a <registration-listener> element must not be <reference-list> element");
+                    }
+                }
+            }
+            // Check references
+            if (recipe instanceof AbstractServiceReferenceRecipe) {
+                CollectionRecipe listeners = ((AbstractServiceReferenceRecipe) recipe).getListenersRecipe();
+                for (Recipe l : listeners.getDependencies()) {
+                    if (l instanceof RefRecipe) {
+                        l = getRecipe(((RefRecipe) l).getIdRef());
+                    }
+                    if (l instanceof ServiceRecipe) {
+                        throw new ComponentDefinitionException("The target for a <reference-listener> element must not be <service> element");
+                    }
+                    if (l instanceof ReferenceListRecipe) {
+                        throw new ComponentDefinitionException("The target for a <reference-listener> element must not be <reference-list> element");
+                    }
+                }
+            }
         }
     }
 
@@ -284,8 +305,7 @@
 
     public boolean containsObject(String name) {
         return getInstance(name) != null
-                || getRecipe(name) != null
-                || getDefault(name) != null;
+                || getRecipe(name) != null;
     }
 
     public Object getObject(String name) {
@@ -293,9 +313,6 @@
         if (object == null) {
             object = getRecipe(name);
         }
-        if (object == null) {
-            object = getDefault(name);
-        }
         return object;
     }
 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java Wed Jul  1 10:48:23 2009
@@ -136,7 +136,6 @@
     public static final String NAME_ATTRIBUTE = "name";
     public static final String ID_ATTRIBUTE = "id";
     public static final String CLASS_ATTRIBUTE = "class";
-    public static final String PARENT_ATTRIBUTE = "parent";
     public static final String INDEX_ATTRIBUTE = "index";
     public static final String TYPE_ATTRIBUTE = "type";
     public static final String VALUE_ATTRIBUTE = "value";
@@ -167,10 +166,6 @@
     public static final String FACTORY_REF_ATTRIBUTE = "factory-ref";
     public static final String FACTORY_METHOD_ATTRIBUTE = "factory-method";
 
-    public static final String BOOLEAN_DEFAULT = "default";
-    public static final String BOOLEAN_TRUE = "true";
-    public static final String BOOLEAN_FALSE = "false";
-
     public static final String AUTO_EXPORT_DISABLED = "disabled";
     public static final String AUTO_EXPORT_INTERFACES = "interfaces";
     public static final String AUTO_EXPORT_CLASS_HIERARCHY = "class-hierarchy";
@@ -492,6 +487,9 @@
         if (metadata.getFactoryComponent() != null && metadata.getFactoryMethod() == null) {
             throw new ComponentDefinitionException("factory-method is required when factory-component is set");
         }
+        if (metadata.getScope().equals(BeanMetadata.SCOPE_PROTOTYPE) && metadata.getDestroyMethod() != null) {
+            throw new ComponentDefinitionException("destroy-method must not be set for a <bean> with a prototype scope");
+        }
 
         // Parse elements
         NodeList nl = element.getChildNodes();

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java Wed Jul  1 10:48:23 2009
@@ -35,10 +35,11 @@
 import org.apache.geronimo.blueprint.di.MapRecipe;
 import org.apache.geronimo.blueprint.di.Recipe;
 import org.apache.geronimo.blueprint.di.RefRecipe;
-import org.apache.geronimo.blueprint.di.Repository;
 import org.apache.geronimo.blueprint.di.ValueRecipe;
+import org.apache.geronimo.blueprint.di.EnvironmentRecipe;
 import org.apache.geronimo.blueprint.mutable.MutableMapMetadata;
 import org.apache.geronimo.blueprint.reflect.MetadataUtil;
+import org.apache.geronimo.blueprint.reflect.EnvironmentMetadataImpl;
 import org.osgi.service.blueprint.reflect.BeanArgument;
 import org.osgi.service.blueprint.reflect.BeanMetadata;
 import org.osgi.service.blueprint.reflect.BeanProperty;
@@ -76,25 +77,15 @@
         this.registry = blueprintContainer.getComponentDefinitionRegistry();
     }
     
-    private void addBuiltinComponents(Repository repository) {
-        if (blueprintContainer != null) {
-            repository.putDefault("blueprintContainer", blueprintContainer);
-            repository.putDefault("blueprintBundle", blueprintContainer.getBundleContext().getBundle());
-            repository.putDefault("blueprintBundleContext", blueprintContainer.getBundleContext());
-            repository.putDefault("blueprintConverter", blueprintContainer.getConverter());
-        }
-    }
-    
     public BlueprintRepository createRepository() {
         BlueprintRepository repository = new BlueprintRepository(blueprintContainer);
-        addBuiltinComponents(repository);
         // Create component recipes
         for (String name : registry.getComponentDefinitionNames()) {
             ComponentMetadata component = registry.getComponentDefinition(name);
             Recipe recipe = createRecipe(component);
             repository.putRecipe(recipe.getName(), recipe);
         }
-        repository.checkReferences();
+        repository.validate();
         return repository;
     }
 
@@ -106,13 +97,20 @@
         } else if (component instanceof ReferenceMetadata) {
             return createReferenceRecipe((ReferenceMetadata) component);
         } else if (component instanceof ReferenceListMetadata) {
-            return createRefCollectionRecipe((ReferenceListMetadata) component);
+            return createReferenceListRecipe((ReferenceListMetadata) component);
+        } else if (component instanceof EnvironmentMetadataImpl) {
+            return createEnvironmentRecipe((EnvironmentMetadataImpl) component);
         } else {
             throw new IllegalStateException("Unsupported component type " + component.getClass());
         }
     }
 
-    private Recipe createRefCollectionRecipe(ReferenceListMetadata metadata) {
+    private Recipe createEnvironmentRecipe(EnvironmentMetadataImpl environmentMetadata) {
+        return new EnvironmentRecipe(environmentMetadata.getId(), environmentMetadata.getObject());
+    }
+
+
+    private Recipe createReferenceListRecipe(ReferenceListMetadata metadata) {
         CollectionRecipe listenersRecipe = null;
         if (metadata.getReferenceListeners() != null) {
             listenersRecipe = new CollectionRecipe(getName(null), ArrayList.class);

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java Wed Jul  1 10:48:23 2009
@@ -34,6 +34,7 @@
 import org.apache.geronimo.blueprint.ExtendedBlueprintContainer;
 import org.apache.geronimo.blueprint.ExtendedReferenceListMetadata;
 import org.apache.geronimo.blueprint.di.Recipe;
+import org.apache.geronimo.blueprint.di.CollectionRecipe;
 import org.apache.geronimo.blueprint.utils.DynamicCollection;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -62,7 +63,7 @@
     public ReferenceListRecipe(String name,
                          ExtendedBlueprintContainer blueprintContainer,
                          ReferenceListMetadata metadata,
-                         Recipe listenersRecipe,
+                         CollectionRecipe listenersRecipe,
                          List<Recipe> explicitDependencies) {
         super(name, blueprintContainer, metadata, listenersRecipe, explicitDependencies);
         this.metadata = metadata;

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java Wed Jul  1 10:48:23 2009
@@ -24,6 +24,7 @@
 
 import org.apache.geronimo.blueprint.ExtendedBlueprintContainer;
 import org.apache.geronimo.blueprint.di.Recipe;
+import org.apache.geronimo.blueprint.di.CollectionRecipe;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.blueprint.container.BlueprintEvent;
 import org.osgi.service.blueprint.container.ReifiedType;
@@ -58,7 +59,7 @@
     public ReferenceRecipe(String name,
                            ExtendedBlueprintContainer blueprintContainer,
                            ReferenceMetadata metadata,
-                           Recipe listenersRecipe,
+                           CollectionRecipe listenersRecipe,
                            List<Recipe> explicitDependencies) {
         super(name, blueprintContainer, metadata, listenersRecipe, explicitDependencies);
         this.metadata = metadata;

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java Wed Jul  1 10:48:23 2009
@@ -93,6 +93,14 @@
         this.prototypeService = isPrototypeService(metadata.getServiceComponent());
     }
 
+    public Recipe getServiceRecipe() {
+        return serviceRecipe;
+    }
+
+    public CollectionRecipe getListenersRecipe() {
+        return listenersRecipe;
+    }
+
     public List<Recipe> getDependencies() {
         List<Recipe> recipes = new ArrayList<Recipe>();
         if (serviceRecipe != null) {

Added: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/EnvironmentRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/EnvironmentRecipe.java?rev=790110&view=auto
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/EnvironmentRecipe.java (added)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/EnvironmentRecipe.java Wed Jul  1 10:48:23 2009
@@ -0,0 +1,52 @@
+/**
+ * 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.
+ */
+package org.apache.geronimo.blueprint.di;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
+
+/**
+ * @version $Rev: 6685 $ $Date: 2005-12-28T00:29:37.967210Z $
+ */
+public class EnvironmentRecipe extends AbstractRecipe {
+
+    private Object object;
+
+    public EnvironmentRecipe(String id, Object object) {
+        super(id);
+        this.prototype = false;
+        this.object = object;
+    }
+
+    protected Object internalCreate() throws ComponentDefinitionException {
+        return object;
+    }
+
+    public List<Recipe> getDependencies() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public String toString() {
+        return "EnvironmentRecipe[" +
+                "name='" + name + '\'' +
+                ", object=" + object +
+                ']';
+    }
+}

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/Repository.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/Repository.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/Repository.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/Repository.java Wed Jul  1 10:48:23 2009
@@ -49,18 +49,8 @@
      */
     Recipe getRecipe(String name);
 
-    /**
-     * Return the environment object for a given name.
-     *
-     * @param name
-     * @return the environment object or <code>null</code>
-     */
-    Object getDefault(String name);
-
     void putRecipe(String name, Recipe recipe);
 
-    void putDefault(String name, Object instance);
-
     Object create(String name) throws ComponentDefinitionException;
 
     Map<String,Object> createAll(String... names) throws ComponentDefinitionException;

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java Wed Jul  1 10:48:23 2009
@@ -27,6 +27,7 @@
 
 import org.apache.geronimo.blueprint.ComponentDefinitionRegistry;
 import org.apache.geronimo.blueprint.ComponentNameAlreadyInUseException;
+import org.apache.geronimo.blueprint.reflect.EnvironmentMetadataImpl;
 import org.osgi.service.blueprint.reflect.ComponentMetadata;
 import org.osgi.service.blueprint.reflect.Target;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
@@ -69,10 +70,7 @@
             // TODO: should we generate a unique name?
             throw new IllegalArgumentException("Component must have a valid id");
         }
-        if (id.equals("blueprintContainer") || id.equals("blueprintBundle")
-                || id.equals("blueprintBundleContext") || id.equals("blueprintConverter")) {
-            throw new ComponentDefinitionException("Can not override an environment manager (" + id + ")");
-        } else if (id.startsWith("blueprint")) {
+        if (id.startsWith("blueprint") && !(component instanceof EnvironmentMetadataImpl)) {
             // TODO: log a warning
         }
         // TODO: perform other validation: scope, class/runtimeClass/factoryMethod, etc...

Added: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/EnvironmentMetadataImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/EnvironmentMetadataImpl.java?rev=790110&view=auto
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/EnvironmentMetadataImpl.java (added)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/EnvironmentMetadataImpl.java Wed Jul  1 10:48:23 2009
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+package org.apache.geronimo.blueprint.reflect;
+
+/**
+ * A metadata for environment managers.
+ *
+ * @author <a href="mailto:dev@geronimo.apache.org">Apache Geronimo Project</a>
+ * @version $Rev: 760378 $, $Date: 2009-03-31 11:31:38 +0200 (Tue, 31 Mar 2009) $
+ */
+public class EnvironmentMetadataImpl extends ComponentMetadataImpl {
+
+    private Object object;
+
+    public EnvironmentMetadataImpl(String id, Object object) {
+        this.id = id;
+        this.object = object;
+    }
+
+    public Object getObject() {
+        return object;
+    }
+}

Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/AbstractBlueprintTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/AbstractBlueprintTest.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/AbstractBlueprintTest.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/AbstractBlueprintTest.java Wed Jul  1 10:48:23 2009
@@ -25,6 +25,7 @@
 import org.apache.geronimo.blueprint.container.NamespaceHandlerRegistry;
 import org.apache.geronimo.blueprint.container.Parser;
 import org.apache.geronimo.blueprint.namespace.ComponentDefinitionRegistryImpl;
+import org.apache.geronimo.blueprint.reflect.EnvironmentMetadataImpl;
 
 public abstract class AbstractBlueprintTest extends TestCase {
 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java?rev=790110&r1=790109&r2=790110&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java Wed Jul  1 10:48:23 2009
@@ -20,6 +20,7 @@
 
 import org.apache.geronimo.blueprint.container.BlueprintContainerImpl;
 import org.apache.geronimo.blueprint.namespace.ComponentDefinitionRegistryImpl;
+import org.apache.geronimo.blueprint.reflect.EnvironmentMetadataImpl;
 
 public class TestBlueprintContainer extends BlueprintContainerImpl {
 
@@ -28,6 +29,12 @@
     public TestBlueprintContainer(ComponentDefinitionRegistryImpl registry) {
         super(new TestBundleContext(), null, null, null, null, null);
         this.registry = registry;
+        if (registry != null) {
+            registry.registerComponentDefinition(new EnvironmentMetadataImpl("blueprintContainer", this));
+            registry.registerComponentDefinition(new EnvironmentMetadataImpl("blueprintBundle", getBundleContext().getBundle()));
+            registry.registerComponentDefinition(new EnvironmentMetadataImpl("blueprintBundleContext", getBundleContext()));
+            registry.registerComponentDefinition(new EnvironmentMetadataImpl("blueprintConverter", getConverter()));
+        }
     }
 
     @Override