blob: 50786b6a38aee9b0e91e3be8863f09b9dbbf0ca2 [file] [log] [blame]
/*
* Copyright (c) 2013 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Christian W. Damus (CEA) - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.bugzilla;
import org.eclipse.emf.cdo.internal.net4j.Net4jSessionFactory;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.net4j.util.container.ContainerUtil;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.container.IManagedContainerFactory;
import org.eclipse.net4j.util.factory.Factory;
import org.eclipse.net4j.util.factory.IFactory;
import org.eclipse.net4j.util.factory.ProductCreationException;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
/**
* Bug 399641: Tests that factories in managed containers can use their containers
* to get dependencies.
*/
public class Bugzilla_399641_Test extends AbstractCDOTest
{
public void testContainerAwareFactories() throws Exception
{
IManagedContainer container = ContainerUtil.createContainer();
LifecycleUtil.activate(container);
try
{
container.registerFactory(new MyFactory());
container.registerFactory(new MyOtherFactory());
Object product = container.getElement(MyFactory.PRODUCT_GROUP, MyFactory.TYPE, null);
assertInstanceOf(MyProduct.class, product);
assertNotNull(((MyProduct)product).getOther());
}
finally
{
LifecycleUtil.deactivate(container);
}
}
public void testNet4jSessionFactory() throws Exception
{
IManagedContainer container = getClientContainer();
IFactory factory = container.getFactory(Net4jSessionFactory.PRODUCT_GROUP, Net4jSessionFactory.TYPE);
assertInstanceOf(IManagedContainerFactory.class, factory);
IManagedContainer actualContainer = ((IManagedContainerFactory)factory).getManagedContainer();
assertSame(container, actualContainer);
}
private static class MyProduct
{
private final MyOtherProduct other;
MyProduct(MyOtherProduct other)
{
this.other = other;
}
public MyOtherProduct getOther()
{
return other;
}
}
private static class MyFactory extends Factory implements IManagedContainerFactory
{
static final String PRODUCT_GROUP = MyFactory.class.getName();
static final String TYPE = "default";
private IManagedContainer container;
public MyFactory()
{
super(PRODUCT_GROUP, TYPE);
}
public Object create(String description) throws ProductCreationException
{
return new MyProduct((MyOtherProduct)getManagedContainer().getElement(MyOtherFactory.PRODUCT_GROUP,
MyOtherFactory.TYPE, null));
}
public IManagedContainer getManagedContainer()
{
return container;
}
public void setManagedContainer(IManagedContainer container)
{
this.container = container;
}
}
private static class MyOtherProduct
{
MyOtherProduct()
{
super();
}
}
private static class MyOtherFactory extends Factory
{
static final String PRODUCT_GROUP = MyOtherFactory.class.getName();
static final String TYPE = "default";
public MyOtherFactory()
{
super(PRODUCT_GROUP, TYPE);
}
public Object create(String description) throws ProductCreationException
{
return new MyOtherProduct();
}
}
}