/**
* 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.openejb.assembler.classic;
import junit.framework.TestCase;
import org.apache.openejb.OpenEJB;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.config.AppModule;
import org.apache.openejb.config.ConfigurationFactory;
import org.apache.openejb.config.EjbModule;
import org.apache.openejb.core.ivm.naming.InitContextFactory;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.jee.StatelessBean;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.spi.ContainerSystem;
import org.junit.AfterClass;
import javax.ejb.EJB;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.IOException;
/**
* A potential issue with this feature is that the stateless bean is created
* and the object it references does not exist at the time it is instantiated
* and put into the pool. Later the bean is deployed yet the instances in the
* pool remain with null references, only new instances will be able to reference
* the newly deployed bean.
*
* @version $Rev$ $Date$
*/
public class EjbRefTest extends TestCase {
private InitialContext context;
private Assembler assembler;
private ConfigurationFactory config;
protected void setUp() throws Exception {
config = new ConfigurationFactory();
assembler = new Assembler();
assembler.createProxyFactory(config.configureService(ProxyFactoryInfo.class));
assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
assembler.createContainer(config.configureService(StatelessSessionContainerInfo.class));
System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, InitContextFactory.class.getName());
context = new InitialContext();
}
protected void tearDown() throws Exception {
for (final AppInfo appInfo : assembler.getDeployedApplications()) {
assembler.destroyApplication(appInfo.path);
}
SystemInstance.get().setComponent(Assembler.class, null);
SystemInstance.get().setComponent(ContainerSystem.class, null);
super.tearDown();
}
@AfterClass
public static void afterClass() throws Exception {
OpenEJB.destroy();
}
public void testInterfaceOnlyRefs() throws Exception {
ear(ejbjar(Apple.class, AmbiguousFruitRef.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final FruitRef fruitRef = get(AmbiguousFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), apple);
}
public void testBeanNameRef() throws Exception {
ear(ejbjar(Apple.class, OrangeFruitRef.class, Orange.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(OrangeFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), orange);
}
public void testMappedNameRef() throws Exception {
ear(ejbjar(Apple.class, AppleFruitRef.class, Orange.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(AppleFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), apple);
}
public void testIntraEarInterfaceRef1() throws Exception {
ear(ejbjar(Apple.class), ejbjar(AmbiguousFruitRef.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final FruitRef fruitRef = get(AmbiguousFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), apple);
}
public void testIntraEarInterfaceRef() throws Exception {
ear(ejbjar(Apple.class, AmbiguousFruitRef.class), ejbjar(Orange.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(AmbiguousFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), apple);
}
public void testIntraEarBeanNameRef1() throws Exception {
ear(ejbjar(Apple.class), ejbjar(OrangeFruitRef.class), ejbjar(Orange.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(OrangeFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), orange);
}
public void testIntraEarBeanNameRef2() throws Exception {
ear(ejbjar(Apple.class, OrangeFruitRef.class), ejbjar(Orange.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(OrangeFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), orange);
}
public void testInterEarInterfaceRef1() throws Exception {
ear(ejbjar(Apple.class));
ear(ejbjar(AmbiguousFruitRef.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final FruitRef fruitRef = get(AmbiguousFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), apple);
}
public void testInterEarInterfaceRef2() throws Exception {
ear(ejbjar(Apple.class), ejbjar(AmbiguousFruitRef.class));
ear(ejbjar(Orange.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(AmbiguousFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), apple);
}
public void testInterEarBeanNameRef1() throws Exception {
ear(ejbjar(Orange.class));
ear(ejbjar(Apple.class, OrangeFruitRef.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(OrangeFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), orange);
}
public void testInterEarBeanNameRef2() throws Exception {
ear(ejbjar(Orange.class));
ear(ejbjar(Apple.class));
ear(ejbjar(OrangeFruitRef.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(OrangeFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), orange);
}
public void testInterEarLazyInterfaceRef1() throws Exception {
ear(ejbjar(AmbiguousFruitRef.class));
ear(ejbjar(Apple.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final FruitRef fruitRef = get(AmbiguousFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), apple);
}
public void testInterEarLazyBeanNameRef1() throws Exception {
ear(ejbjar(Apple.class, OrangeFruitRef.class));
ear(ejbjar(Orange.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(OrangeFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), orange);
}
public void testInterEarLazyBeanNameRef2() throws Exception {
ear(ejbjar(OrangeFruitRef.class));
ear(ejbjar(Apple.class));
ear(ejbjar(Orange.class));
final Fruit apple = get(Apple.class, Fruit.class);
assertNotNull(apple);
final Fruit orange = get(Orange.class, Fruit.class);
assertNotNull(orange);
final FruitRef fruitRef = get(OrangeFruitRef.class, FruitRef.class);
assertNotNull(fruitRef);
assertEquals(fruitRef.getFruit(), orange);
}
public void testInterEarCircularBeanNameRef() throws Exception {
ear(ejbjar(BlueBean.class));
ear(ejbjar(WhiteBean.class));
final Blue blue = get(BlueBean.class, Blue.class);
final White white = get(WhiteBean.class, White.class);
assertNotNull(blue);
assertNotNull(blue.getWhite());
assertNotNull(white);
assertNotNull(white.getBlue());
assertEquals(blue, white.getBlue());
assertEquals(white, blue.getWhite());
}
public void testInterEarCircularInterfaceRef() throws Exception {
ear(ejbjar(RedBean.class));
ear(ejbjar(BlackBean.class));
final Red red = get(RedBean.class, Red.class);
final Black black = get(BlackBean.class, Black.class);
assertNotNull(red);
assertNotNull(red.getBlack());
assertNotNull(black);
assertNotNull(black.getRed());
assertEquals(red, black.getRed());
assertEquals(black, red.getBlack());
}
public void testSameInterfaceDifferentName() throws Exception {
ear(ejbjar(Yellow.class, Green.class, YellowGreenBean.class));
final YellowGreen bean = get(YellowGreenBean.class, YellowGreen.class);
assertNotNull(bean);
assertEquals("Yellow", bean.getYellow());
assertEquals("Green", bean.getGreen());
}
public void ear(final Class... beans) throws Exception {
final EjbJar ejbJar = ejbjar(beans);
ear(ejbJar);
}
private void ear(final EjbJar... ejbJars) throws OpenEJBException, NamingException, IOException {
final AppModule app = new AppModule(this.getClass().getClassLoader(), "classpath-" + ejbJars.hashCode());
for (final EjbJar ejbJar : ejbJars) {
app.getEjbModules().add(new EjbModule(ejbJar));
}
assembler.createApplication(config.configureApplication(app));
}
private EjbJar ejbjar(final Class... beans) {
final EjbJar ejbJar = new EjbJar();
for (final Class bean : beans) {
ejbJar.addEnterpriseBean(new StatelessBean(bean));
}
return ejbJar;
}
public <T> T get(final Class bean, final Class<T> intrface) {
try {
return (T) context.lookup(bean.getSimpleName() + "Local");
} catch (final NamingException e) {
throw new IllegalStateException(e);
}
}
// ------------------------------------------------------- //
// Ref not unique by interface alone
// ------------------------------------------------------- //
public static class Apple implements Fruit {
}
public static class Orange implements Fruit {
}
public static interface Fruit {
}
public static class AmbiguousFruitRef implements FruitRef {
@EJB
Fruit fruit;
public Fruit getFruit() {
return fruit;
}
}
public static class OrangeFruitRef implements FruitRef {
@EJB(beanName = "Orange")
Fruit fruit;
public Fruit getFruit() {
return fruit;
}
}
public static class AppleFruitRef implements FruitRef {
@EJB(mappedName = "Apple")
Fruit fruit;
public Fruit getFruit() {
return fruit;
}
}
public static interface FruitRef {
Fruit getFruit();
}
// ------------------------------------------------------- //
// bi-directional relationship
// ------------------------------------------------------- //
public static class RedBean implements Red {
@EJB
Black black;
public Black getBlack() {
return black;
}
}
public static interface Red {
public Black getBlack();
}
public static class BlackBean implements Black {
@EJB
Red red;
public Red getRed() {
return red;
}
}
public static interface Black {
public Red getRed();
}
public static class BlueBean implements Blue {
@EJB(beanName = "WhiteBean")
White white;
public White getWhite() {
return white;
}
}
public static interface Blue {
public White getWhite();
}
public static class WhiteBean implements White {
@EJB(beanName = "BlueBean")
Blue blue;
public Blue getBlue() {
return blue;
}
}
public static interface White {
public Blue getBlue();
}
public interface Color {
String getColor();
}
public static class Yellow implements Color {
public String getColor() {
return "Yellow";
}
}
public static class Green implements Color {
public String getColor() {
return "Green";
}
}
public static class YellowGreenBean implements YellowGreen {
@EJB
Color yellow;
@EJB
Color green;
public String getGreen() {
return green.getColor();
}
public String getYellow() {
return yellow.getColor();
}
}
public static interface YellowGreen {
String getYellow();
String getGreen();
}
}