You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2009/07/27 21:03:41 UTC
svn commit: r798257 - in /geronimo/sandbox/blueprint/blueprint-core/src:
main/java/org/apache/geronimo/blueprint/container/
main/java/org/apache/geronimo/blueprint/di/
test/java/org/apache/geronimo/blueprint/
test/java/org/apache/geronimo/blueprint/poj...
Author: gawor
Date: Mon Jul 27 19:03:41 2009
New Revision: 798257
URL: http://svn.apache.org/viewvc?rev=798257&view=rev
Log:
handle dynamic cycles and cycles in prototype scoped beans
Added:
geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/pojos/PojoRecursive.java (with props)
Modified:
geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.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/BlueprintRepository.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/AbstractRecipe.java
geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java
geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/Repository.java
geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java
geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-circular.xml
Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.java?rev=798257&r1=798256&r2=798257&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.java Mon Jul 27 19:03:41 2009
@@ -494,7 +494,7 @@
// Add partially created object to the container
// if (initMethod == null) {
- addObject(obj, true);
+ addPartialObject(obj);
// }
// inject properties
@@ -509,7 +509,6 @@
try {
invoke(initMethod, obj, null);
} catch (Throwable t) {
- LOGGER.info("Error invoking init method", getRealCause(t));
throw new ComponentDefinitionException("Unable to intialize bean " + getName(), getRealCause(t));
}
}
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=798257&r1=798256&r2=798257&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 Mon Jul 27 19:03:41 2009
@@ -607,7 +607,7 @@
}
LOGGER.debug("Instantiating components: {}", components);
try {
- repository.createAll(components);
+ repository.createAll(components, false);
} catch (ComponentDefinitionException e) {
throw e;
} catch (Throwable t) {
@@ -685,7 +685,7 @@
}
try {
LOGGER.debug("Instantiating component {}", id);
- return repository.create(id);
+ return repository.create(id, false);
} catch (NoSuchComponentException e) {
throw e;
} catch (ComponentDefinitionException e) {
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=798257&r1=798256&r2=798257&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 Mon Jul 27 19:03:41 2009
@@ -87,6 +87,8 @@
* stack is used to detect circular dependencies.
*/
private final LinkedList<Recipe> stack = new LinkedList<Recipe>();
+
+ private int createReentered = 0;
public BlueprintRepository(ExtendedBlueprintContainer container) {
blueprintContainer = container;
@@ -115,20 +117,24 @@
}
public Object create(String name) throws ComponentDefinitionException {
- Map<String, Object> instances = createAll(Arrays.asList(name));
- return instances.get(name);
+ return create(name, true);
}
-
- public Map<String, Object> createAll(String... names) throws ComponentDefinitionException {
- return createAll(Arrays.asList(names));
+
+ public Object create(String name, boolean allowReentry) throws ComponentDefinitionException {
+ Map<String, Object> instances = createAll(Arrays.asList(name), allowReentry);
+ return instances.get(name);
}
public Map<String, Object> createAll(Collection<String> names) throws ComponentDefinitionException {
+ return createAll(names, true);
+ }
+
+ public Map<String, Object> createAll(Collection<String> names, boolean allowReentry) throws ComponentDefinitionException {
ExecutionContext oldContext = ExecutionContext.Holder.setContext(this);
try {
Map<String, Object> instances = new LinkedHashMap<String, Object>();
for (String name : names) {
- Object obj = createInstance(name);
+ Object obj = createInstance(name, allowReentry);
try {
// Make sure to go through the conversion step in case we have a Convertible object
obj = convert(obj, new ReifiedType(Object.class));
@@ -180,18 +186,27 @@
}
}
- private Object createInstance(String name) {
+ private Object createInstance(String name, boolean allowReentry) {
// We need to synchronize recipe creation on the repository
// so that we don't end up with multiple threads creating the
// same instance at the same time.
Object instance = getInstance(name);
if (instance == null) {
synchronized (instanceLock) {
- instance = getInstance(name);
- if (instance == null) {
- Recipe recipe = getRecipe(name);
- if (recipe != null) {
- instance = recipe.create();
+ try {
+ if (!allowReentry) {
+ createReentered++;
+ }
+ instance = getInstance(name);
+ if (instance == null) {
+ Recipe recipe = getRecipe(name);
+ if (recipe != null) {
+ instance = recipe.create();
+ }
+ }
+ } finally {
+ if (!allowReentry) {
+ createReentered--;
}
}
}
@@ -202,6 +217,10 @@
return instance;
}
+ public boolean isCreateReentered() {
+ return createReentered >= 2;
+ }
+
public void validate() {
for (Recipe recipe : getAllRecipes()) {
// Check that references are satisfied
@@ -322,19 +341,23 @@
return object;
}
- public void addObject(String name, Object object, boolean partialObject) {
- if (partialObject) {
- partialObjects.put(name, object);
- } else {
- if (instances.get(name) != null) {
- throw new ComponentDefinitionException("Name " + name + " is already registered to instance " + instances.get(name));
- }
- instances.put(name, object);
- creationOrder.add(name);
- partialObjects.remove(name);
+ public void addFullObject(String name, Object object) {
+ if (instances.get(name) != null) {
+ throw new ComponentDefinitionException("Name " + name + " is already registered to instance " + instances.get(name));
}
+ instances.put(name, object);
+ creationOrder.add(name);
+ partialObjects.remove(name);
}
-
+
+ public void addPartialObject(String name, Object object) {
+ partialObjects.put(name, object);
+ }
+
+ public Object removePartialObject(String name) {
+ return partialObjects.remove(name);
+ }
+
public Object getPartialObject(String name) {
Object obj = partialObjects.get(name);
if (obj == null) {
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=798257&r1=798256&r2=798257&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 Mon Jul 27 19:03:41 2009
@@ -75,7 +75,7 @@
}
}
ProvidedObject object = new ProvidedObject();
- addObject(object, true);
+ addPartialObject(object);
// Handle initial references
createListeners();
retrack();
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=798257&r1=798256&r2=798257&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 Mon Jul 27 19:03:41 2009
@@ -84,7 +84,7 @@
// Add partially created proxy to the context
ServiceProxyWrapper wrapper = new ServiceProxyWrapper();
- addObject(wrapper, true);
+ addPartialObject(wrapper);
// Handle initial references
createListeners();
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=798257&r1=798256&r2=798257&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 Mon Jul 27 19:03:41 2009
@@ -126,7 +126,7 @@
}
}
ServiceRegistrationProxy proxy = new ServiceRegistrationProxy();
- addObject(proxy, true);
+ addPartialObject(proxy);
internalGetService(null, null); // null bundle means we don't want to retrieve the actual service when used with a ServiceFactory
return proxy;
}
Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/AbstractRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/AbstractRecipe.java?rev=798257&r1=798256&r2=798257&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/AbstractRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/AbstractRecipe.java Mon Jul 27 19:03:41 2009
@@ -18,6 +18,7 @@
package org.apache.geronimo.blueprint.di;
import java.lang.reflect.Type;
+import java.util.ArrayList;
import org.apache.geronimo.blueprint.container.GenericType;
import org.osgi.service.blueprint.container.ReifiedType;
@@ -53,6 +54,11 @@
// if this recipe has already been executed in this container, return the currently registered value
Object obj = context.getPartialObject(name);
if (obj != null) {
+ if (context.isCreateReentered()) {
+ ArrayList<Recipe> circularity = new ArrayList<Recipe>();
+ circularity.add(this);
+ throw new CircularDependencyException("Dynamic cycle detected in recipe", circularity);
+ }
return obj;
}
@@ -60,7 +66,11 @@
context.push(this);
try {
obj = internalCreate();
- addObject(obj, false);
+ if (prototype) {
+ context.removePartialObject(name);
+ } else {
+ context.addFullObject(name, obj);
+ }
return obj;
} finally {
Recipe popped = context.pop();
@@ -75,11 +85,8 @@
protected abstract Object internalCreate() throws ComponentDefinitionException;
- protected void addObject(Object obj, boolean partial) {
- if (prototype) {
- return;
- }
- ExecutionContext.Holder.getContext().addObject(name, obj, partial);
+ protected void addPartialObject(Object obj) {
+ ExecutionContext.Holder.getContext().addPartialObject(name, obj);
}
protected Object convert(Object obj, ReifiedType type) throws Exception {
Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java?rev=798257&r1=798256&r2=798257&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java Mon Jul 27 19:03:41 2009
@@ -81,14 +81,11 @@
*/
public abstract Object getObject(String name);
- /**
- * Add an object to the repository.
- *
- * @param name the unique name of the object instance
- * @param object the object instance
- * @throws org.osgi.service.blueprint.container.ComponentDefinitionException if another object instance is already registered with the name
- */
- public abstract void addObject(String name, Object object, boolean partialObject);
+ public abstract void addFullObject(String name, Object object);
+
+ public abstract void addPartialObject(String name, Object object);
+
+ public abstract Object removePartialObject(String name);
public abstract Object getPartialObject(String name);
@@ -97,5 +94,7 @@
public abstract Class loadClass(String className) throws ClassNotFoundException;
public abstract Recipe getRecipe(String name);
+
+ public abstract boolean isCreateReentered();
}
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=798257&r1=798256&r2=798257&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 Mon Jul 27 19:03:41 2009
@@ -53,8 +53,6 @@
Object create(String name) throws ComponentDefinitionException;
- Map<String,Object> createAll(String... names) throws ComponentDefinitionException;
-
Map<String, Object> createAll(Collection<String> names) throws ComponentDefinitionException;
<T> List<T> getAllRecipes(Class<T> clazz, String... names);
Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java?rev=798257&r1=798256&r2=798257&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java Mon Jul 27 19:03:41 2009
@@ -21,6 +21,7 @@
import java.math.BigInteger;
import java.net.URI;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -28,6 +29,7 @@
import java.util.Set;
import org.apache.geronimo.blueprint.CallbackTracker.Callback;
+import org.apache.geronimo.blueprint.di.CircularDependencyException;
import org.apache.geronimo.blueprint.di.Repository;
import org.apache.geronimo.blueprint.namespace.ComponentDefinitionRegistryImpl;
import org.apache.geronimo.blueprint.pojos.BeanD;
@@ -35,11 +37,14 @@
import org.apache.geronimo.blueprint.pojos.Multiple;
import org.apache.geronimo.blueprint.pojos.PojoA;
import org.apache.geronimo.blueprint.pojos.PojoB;
+import org.apache.geronimo.blueprint.pojos.PojoCircular;
import org.apache.geronimo.blueprint.pojos.PojoGenerics;
import org.apache.geronimo.blueprint.pojos.PojoListener;
import org.apache.geronimo.blueprint.container.AggregateConverter;
+import org.apache.geronimo.blueprint.container.BlueprintRepository;
import org.apache.geronimo.blueprint.container.GenericType;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
public class WiringTest extends AbstractBlueprintTest {
@@ -167,7 +172,7 @@
ComponentDefinitionRegistryImpl registry = parse("/test-depends-on.xml");
Repository repository = new TestBlueprintContainer(registry).getRepository();
- Map instances = repository.createAll("c", "d", "e");
+ Map instances = repository.createAll(Arrays.asList("c", "d", "e"));
List<Callback> callback = CallbackTracker.getCallbacks();
assertEquals(3, callback.size());
@@ -359,4 +364,64 @@
assertEquals(obj2, ((PojoListener) obj3).getService() );
}
+ public void testCircularPrototype() throws Exception {
+ ComponentDefinitionRegistryImpl registry = parse("/test-circular.xml");
+ BlueprintRepository repository = new TestBlueprintContainer(registry).getRepository();
+
+ PojoCircular driver1 = (PojoCircular) repository.create("circularPrototypeDriver");
+
+ assertTrue(driver1.getCircular() == driver1.getCircular().getCircular());
+
+ PojoCircular driver2 = (PojoCircular) repository.create("circularPrototypeDriver");
+
+ assertTrue(driver1 != driver2);
+ assertTrue(driver1.getCircular() != driver2.getCircular());
+ assertTrue(driver1.getCircular().getCircular() != driver2.getCircular().getCircular());
+
+ PojoCircular prototype = (PojoCircular) repository.create("circularPrototype");
+
+ assertTrue(prototype != driver1.getCircular());
+ assertTrue(prototype != driver2.getCircular());
+ }
+
+ public void testRecursive() throws Exception {
+ ComponentDefinitionRegistryImpl registry = parse("/test-circular.xml");
+ BlueprintRepository repository = new TestBlueprintContainer(registry).getRepository();
+
+ try {
+ repository.create("recursiveConstructor", false);
+ fail("Did not throw exception");
+ } catch (ComponentDefinitionException e) {
+ if (e.getCause() instanceof CircularDependencyException) {
+ // that's what we expect
+ } else {
+ fail("Did not throw expected exception");
+ throw e;
+ }
+ }
+
+ try {
+ repository.create("recursiveSetter", false);
+ fail("Did not throw exception");
+ } catch (ComponentDefinitionException e) {
+ if (e.getCause() instanceof CircularDependencyException) {
+ // that's what we expect
+ } else {
+ fail("Did not throw expected exception");
+ throw e;
+ }
+ }
+
+ try {
+ repository.create("recursiveInitMethod", false);
+ fail("Did not throw exception");
+ } catch (ComponentDefinitionException e) {
+ if (e.getCause() instanceof CircularDependencyException) {
+ // that's what we expect
+ } else {
+ fail("Did not throw expected exception");
+ throw e;
+ }
+ }
+ }
}
Added: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/pojos/PojoRecursive.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/pojos/PojoRecursive.java?rev=798257&view=auto
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/pojos/PojoRecursive.java (added)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/pojos/PojoRecursive.java Mon Jul 27 19:03:41 2009
@@ -0,0 +1,46 @@
+/*
+ * 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.pojos;
+
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+public class PojoRecursive {
+
+ private BlueprintContainer container;
+ private String component;
+
+ public PojoRecursive(BlueprintContainer container, String component) {
+ this.container = container;
+ this.component = component;
+ }
+
+ public PojoRecursive(BlueprintContainer container, String component, int foo) {
+ this.container = container;
+ this.component = component;
+ container.getComponentInstance(component);
+ }
+
+ public void setFoo(int foo) {
+ container.getComponentInstance(component);
+ }
+
+ public void init() {
+ container.getComponentInstance(component);
+ }
+}
Propchange: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/pojos/PojoRecursive.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/pojos/PojoRecursive.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/pojos/PojoRecursive.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-circular.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-circular.xml?rev=798257&r1=798256&r2=798257&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-circular.xml (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-circular.xml Mon Jul 27 19:03:41 2009
@@ -36,6 +36,7 @@
</bean>
+
<bean id="serviceBean" class="org.apache.geronimo.blueprint.pojos.PojoB">
<property name="uri" value="urn:myuri" />
</bean>
@@ -53,5 +54,34 @@
registration-method="register"
unregistration-method="unregister"/>
</service>
+
+
+
+ <bean id="circularPrototype" class="org.apache.geronimo.blueprint.pojos.PojoCircular" scope = "prototype">
+ <property name="circular" ref="circularPrototype"/>
+ </bean>
+
+ <bean id="circularPrototypeDriver" class="org.apache.geronimo.blueprint.pojos.PojoCircular" scope = "prototype">
+ <property name="circular" ref="circularPrototypeDriver"/>
+ </bean>
+
+
+
+ <bean id="recursiveConstructor" class="org.apache.geronimo.blueprint.pojos.PojoRecursive">
+ <argument ref="blueprintContainer"/>
+ <argument value="recursiveConstructor"/>
+ <argument value="1"/>
+ </bean>
+
+ <bean id="recursiveSetter" class="org.apache.geronimo.blueprint.pojos.PojoRecursive">
+ <argument ref="blueprintContainer"/>
+ <argument value="recursiveSetter"/>
+ <property name="foo" value="1"/>
+ </bean>
+
+ <bean id="recursiveInitMethod" class="org.apache.geronimo.blueprint.pojos.PojoRecursive" init-method = "init">
+ <argument ref="blueprintContainer"/>
+ <argument value="recursiveInitMethod"/>
+ </bean>
</blueprint>
\ No newline at end of file