/**
*
* 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.config;
import junit.framework.TestCase;
import org.apache.openejb.OpenEJB;
import org.apache.openejb.assembler.classic.Assembler;
import org.apache.openejb.assembler.classic.ProxyFactoryInfo;
import org.apache.openejb.assembler.classic.SecurityServiceInfo;
import org.apache.openejb.assembler.classic.StatelessSessionContainerInfo;
import org.apache.openejb.assembler.classic.TransactionServiceInfo;
import org.apache.openejb.core.LocalInitialContextFactory;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.jee.EnvEntry;
import org.apache.openejb.jee.InjectionTarget;
import org.apache.openejb.jee.ResourceEnvRef;
import org.apache.openejb.jee.StatelessBean;
import javax.annotation.Resource;
import javax.ejb.EJBContext;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.concurrent.TimeUnit;
/**
* @version $Revision$ $Date$
*/
public class InjectionTest extends TestCase {
public void testInjections() throws Exception {
final InitialContext ctx = new InitialContext();
final Object object = ctx.lookup("WidgetBeanLocal");
assertTrue("instanceof widget", object instanceof Widget);
final Widget widget = (Widget) object;
// injected via annotations
assertEquals("2", widget.getString());
assertEquals(3.0D, widget.getDouble());
assertEquals(new Long(4), widget.getLong());
assertEquals(new Float(5f), widget.getFloat());
assertEquals(new Integer(6), widget.getInteger());
assertEquals(new Short((short) 7), widget.getShort());
assertEquals(Boolean.FALSE, widget.getBoolean());
assertEquals(new Character('9'), widget.getCharacter());
assertEquals(Widget.class, widget.getMyClass());
assertEquals(TimeUnit.HOURS, widget.getTimeUnit());
// injected via DD
assertEquals(true, widget.getInjectedBoolean());
assertEquals(true, widget.lookup("injectedBoolean"));
assertNotNull(widget.getInjectedContext());
}
protected void setUp() throws Exception {
super.setUp();
System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, LocalInitialContextFactory.class.getName());
final ConfigurationFactory config = new ConfigurationFactory();
final Assembler assembler = new Assembler();
assembler.createProxyFactory(config.configureService(ProxyFactoryInfo.class));
assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
// containers
final StatelessSessionContainerInfo statelessContainerInfo = config.configureService(StatelessSessionContainerInfo.class);
statelessContainerInfo.properties.setProperty("TimeOut", "10");
statelessContainerInfo.properties.setProperty("MaxSize", "0");
statelessContainerInfo.properties.setProperty("StrictPooling", "false");
assembler.createContainer(statelessContainerInfo);
// Setup the descriptor information
final StatelessBean bean = new StatelessBean(WidgetBean.class);
bean.addBusinessLocal(Widget.class.getName());
bean.addBusinessRemote(RemoteWidget.class.getName());
final EjbJar ejbJar = new EjbJar();
ejbJar.addEnterpriseBean(bean);
bean.getEnvEntry().add(new EnvEntry(name("myString"), "java.lang.String", "2"));
bean.getEnvEntry().add(new EnvEntry(name("myDouble"), "java.lang.Double", "3.0"));
bean.getEnvEntry().add(new EnvEntry(name("myLong"), "java.lang.Long", "4"));
bean.getEnvEntry().add(new EnvEntry(name("myFloat"), "java.lang.Float", "5"));
bean.getEnvEntry().add(new EnvEntry(name("myInteger"), "java.lang.Integer", "6"));
bean.getEnvEntry().add(new EnvEntry(name("myShort"), "java.lang.Short", "7"));
bean.getEnvEntry().add(new EnvEntry(name("myBoolean"), "java.lang.Boolean", "false"));
bean.getEnvEntry().add(new EnvEntry(name("myByte"), "java.lang.Byte", "8"));
bean.getEnvEntry().add(new EnvEntry(name("myCharacter"), "java.lang.Character", "9"));
bean.getEnvEntry().add(new EnvEntry(name("myClass"), "java.lang.Class", Widget.class.getName()));
bean.getEnvEntry().add(new EnvEntry(name("myTimeUnit"), TimeUnit.class.getName(), "HOURS"));
final EnvEntry entry = new EnvEntry("injectedBoolean", (String) null, "true");
entry.getInjectionTarget().add((new InjectionTarget(WidgetBean.class.getName(), "injectedBoolean")));
bean.getEnvEntry().add(entry);
final ResourceEnvRef resourceEnvRef = new ResourceEnvRef("injectedContext", (String) null);
resourceEnvRef.getInjectionTarget().add((new InjectionTarget(WidgetBean.class.getName(), "injectedContext")));
bean.getResourceEnvRef().add(resourceEnvRef);
assembler.createApplication(config.configureApplication(ejbJar));
}
@Override
protected void tearDown() throws Exception {
OpenEJB.destroy();
}
private String name(final String name) {
return "java:comp/env/" + WidgetBean.class.getName() + "/" + name;
}
public static interface Widget {
String getString();
Double getDouble();
Long getLong();
Float getFloat();
Short getShort();
Integer getInteger();
Boolean getBoolean();
Character getCharacter();
Byte getByte();
Class getMyClass();
TimeUnit getTimeUnit();
Object lookup(String name) throws NamingException;
boolean getInjectedBoolean();
EJBContext getInjectedContext();
}
public static interface RemoteWidget extends Widget {
}
@SuppressWarnings("FieldMayBeFinal")
@Stateless
public static class WidgetBean implements Widget, RemoteWidget {
private SessionContext sessionContext;
@Resource
private String myString = "1";
@Resource
private Double myDouble = 1.0D;
@Resource
private Long myLong = 1L;
@Resource
private Float myFloat = 1.0F;
@Resource
private Integer myInteger = 1;
@Resource
private Short myShort = (short) 1;
@Resource
private Boolean myBoolean = true;
@Resource
private Byte myByte = (byte) 1;
@Resource
private Character myCharacter = '1';
@Resource
private Class myClass = Object.class;
@Resource
private TimeUnit myTimeUnit = TimeUnit.DAYS;
// injected via DD
private boolean injectedBoolean = false;
// injected via DD
private EJBContext injectedContext;
public WidgetBean() {
}
@Resource
public void setSessionContext(final SessionContext sessionContext) {
this.sessionContext = sessionContext;
}
public Object lookup(final String name) throws NamingException {
return sessionContext.lookup(name);
}
public Boolean getBoolean() {
return myBoolean;
}
public Byte getByte() {
return myByte;
}
public Character getCharacter() {
return myCharacter;
}
public Double getDouble() {
return myDouble;
}
public Float getFloat() {
return myFloat;
}
public Integer getInteger() {
return myInteger;
}
public Long getLong() {
return myLong;
}
public Class getMyClass() {
return myClass;
}
public Short getShort() {
return myShort;
}
public String getString() {
return myString;
}
public TimeUnit getTimeUnit() {
return myTimeUnit;
}
public boolean getInjectedBoolean() {
return injectedBoolean;
}
public EJBContext getInjectedContext() {
return injectedContext;
}
}
}