/*
* 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.core.cmp.jpa;
import org.apache.activemq.util.ByteArrayInputStream;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.config.ReadDescriptors;
import org.apache.openejb.core.entity.EntityContext;
import org.apache.openejb.core.entity.EntityEjbHomeHandler;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.junit.ApplicationComposer;
import org.apache.openejb.testing.AppResource;
import org.apache.openejb.testing.Module;
import org.apache.openejb.testing.SimpleLog;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.EJBLocalObject;
import javax.ejb.EntityBean;
import javax.ejb.RemoveException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.NamingException;
import java.lang.reflect.Proxy;
import java.rmi.RemoteException;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@SimpleLog
@RunWith(ApplicationComposer.class)
public class SimpleCmpTest {
@AppResource
private Context ctx;
@Test
public void checkNoLeak() throws NamingException, RemoteException {
TestBeanEJBHome home = (TestBeanEJBHome) ctx.lookup("TestBeanRemoteHome");
TestBeanEJBObject bean = home.create();
bean.check(bean.createHotelBean(0)); // the bean has the asserts
}
@Module
public EjbJar jar() throws OpenEJBException {
return ReadDescriptors.readEjbJar(new ByteArrayInputStream(
("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<ejb-jar xsi:schemaLocation=\"" +
"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xmlns=\"http://java.sun.com/xml/ns/j2ee\" version=\"2.1\" id=\"ejb-jar_ID\">\n" +
"<display-name>OMEApp</display-name>\n" +
"<enterprise-beans>\n" +
"<entity id=\"ContainerManagedEntity_1\">\n" +
"<ejb-name>HotelBean</ejb-name>\n" +
"<local-home>" + HotelEJBLocalHome.class.getName() + "</local-home>\n" +
"<local>" + HotelEJBLocalObject.class.getName() + "</local>\n" +
"<ejb-class>" + HotelBean.class.getName() + "</ejb-class>\n" +
"<persistence-type>Container</persistence-type>\n" +
"<prim-key-class>java.lang.String</prim-key-class>\n" +
"<reentrant>false</reentrant>\n" +
"<cmp-version>2.x</cmp-version>\n" +
"<abstract-schema-name>HotelBean</abstract-schema-name>\n" +
"<cmp-field id=\"HotelBean_primKey\">\n" +
"<field-name>hotelId</field-name>\n" +
"</cmp-field>\n" +
"<cmp-field id=\"HotelBean_name\">\n" +
"<field-name>hotelname</field-name>\n" +
"</cmp-field>\n" +
"<primkey-field>hotelId</primkey-field>\n" +
"</entity>\n" +
"<session>\n" +
"<ejb-name>TestBean</ejb-name>\n" +
"<home>" + TestBeanEJBHome.class.getName() + "</home>\n" +
"<remote>" + TestBeanEJBObject.class.getName() + "</remote>\n" +
"<local-home>" + TestBeanEJBLocalHome.class.getName() + "</local-home>\n" +
"<local>" + TestBeanEJBLocalObject.class.getName() + "</local>\n" +
"<ejb-class>" + TestBean.class.getName() + "</ejb-class>\n" +
"<session-type>Stateless</session-type>\n" +
"<transaction-type>Container</transaction-type>\n" +
"<ejb-local-ref>\n" +
"<ejb-ref-name>ejb/HotelEJBLocalHome</ejb-ref-name>\n" +
"<ejb-ref-type>Entity</ejb-ref-type>\n" +
"<local-home>" + HotelEJBLocalHome.class.getName() + "</local-home>\n" +
"<local>" + HotelEJBLocalObject.class.getName() + "</local>\n" +
"</ejb-local-ref>\n" +
"</session>\n" +
"</enterprise-beans>\n" +
"</ejb-jar>").getBytes()));
}
public interface HotelEJBLocalHome extends javax.ejb.EJBLocalHome {
HotelEJBLocalObject create(String id, String name) throws CreateException;
HotelEJBLocalObject findByPrimaryKey(String id);
}
public interface TestBeanEJBHome extends javax.ejb.EJBHome {
TestBeanEJBObject create() throws RemoteException;
}
public interface TestBeanEJBLocalHome extends javax.ejb.EJBLocalHome {
TestBeanEJBLocalObject create();
}
public interface TestBeanEJBLocalObject extends javax.ejb.EJBLocalObject {
void createHotelBean(int num) throws CreateException;
}
public static class TestBean implements SessionBean {
private static final long serialVersionUID = 1L;
protected SessionContext sessionContext;
private HotelEJBLocalHome hotel;
public void ejbCreate() {
}
public void ejbPassivate() throws EJBException, RemoteException {
}
public void ejbRemove() throws EJBException, RemoteException {
}
public void setSessionContext(SessionContext arg0) throws EJBException,
RemoteException {
this.sessionContext = arg0;
}
public void ejbActivate() throws EJBException, RemoteException {
}
public Object createHotelBean(int num) throws CreateException {
hotel = (HotelEJBLocalHome) this.sessionContext.lookup("ejb/HotelEJBLocalHome");
final String pk = hotel.create(String.valueOf(num), "Some Hotel").getPrimaryKey().toString();
assertNotNull(hotel.findByPrimaryKey(pk));
return pk;
}
public void check(final String pk) {
hotel = (HotelEJBLocalHome) this.sessionContext.lookup("ejb/HotelEJBLocalHome");
// main part of the test is there
final EntityEjbHomeHandler handler = EntityEjbHomeHandler.class.cast(Proxy.getInvocationHandler(hotel));
try {
final Object registry = handler.getBeanContext().get(
Thread.currentThread().getContextClassLoader() // private so use reflection
.loadClass("org.apache.openejb.core.ivm.BaseEjbProxyHandler$ProxyRegistry"));
assertNull(registry); // not even instantiated since we have a wrapper (stateless)
} catch (final ClassNotFoundException e) {
throw new IllegalStateException(e);
}
// ensure we didn't deleted the entry
assertNotNull(hotel.findByPrimaryKey(pk));
}
}
public interface HotelEJBLocalObject extends EJBLocalObject {
java.lang.String getHotelId();
void setHotelId(java.lang.String hotelId);
String getHotelname();
void setHotelname(String hotelname);
}
public interface TestBeanEJBObject extends javax.ejb.EJBObject {
String createHotelBean(int num) throws RemoteException;
void check(String pk) throws RemoteException;
}
public static abstract class HotelBean implements EntityBean {
private static final long serialVersionUID = -1740314851444302078L;
public String ejbCreate(String id, String name) throws CreateException {
this.setHotelId(id);
this.setHotelname(name);
return null;
}
public abstract java.lang.String getHotelId();
public abstract void setHotelId(java.lang.String hotelId);
public abstract String getHotelname();
public abstract void setHotelname(String hotelname);
public void ejbPostCreate(String str1, String str2)
throws CreateException {
}
public void ejbRemove() throws RemoveException, EJBException,
RemoteException {
// no-op
}
public void ejbActivate() throws EJBException, RemoteException {
// no-op
}
public void ejbLoad() throws EJBException, RemoteException {
// no-op
}
public void ejbPassivate() throws EJBException, RemoteException {
// no-op
}
public void ejbStore() throws EJBException, RemoteException {
// no-op
}
public void setEntityContext(EntityContext arg0) throws EJBException,
RemoteException {
// no-op
}
public void unsetEntityContext() throws EJBException, RemoteException {
// no-op
}
}
}