/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.cts.ejb;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.EJBObject;
import javax.ejb.Handle;
import javax.ejb.RemoveException;
import javax.ejb.SessionSynchronization;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.jboss.logging.Logger;
import org.jboss.ejb.AllowedOperationsAssociation;
import org.jboss.test.cts.interfaces.BeanContextInfo;
import org.jboss.test.cts.interfaces.CtsCmpLocal;
import org.jboss.test.cts.interfaces.CtsCmpLocalHome;
import org.jboss.test.cts.interfaces.StatefulSession;
import org.jboss.test.cts.interfaces.StatefulSessionHome;
import org.jboss.test.cts.interfaces.StatelessSession;
import org.jboss.test.cts.interfaces.StatelessSessionHome;
import org.jboss.test.cts.keys.AccountPK;
import org.jboss.test.util.ejb.SessionSupport;
/**
* The stateful session ejb implementation
*
* @author Scott.Stark@jboss.org
* @author Dimitris.Andreadis@jboss.org
* @version $Revision: 81036 $
*/
public class StatefulSessionBean extends SessionSupport
implements SessionSynchronization
{
/** The serialVersionUID */
private static final long serialVersionUID = 1L;
private static transient Logger log = Logger.getLogger(StatefulSessionBean.class);
private transient int counterAtTxStart;
private String testName;
private int counter;
private CtsCmpLocal entityBean;
private Context enc;
private Handle sessionHandle;
private SessionRef sessionRef;
private byte[] statefulHandle;
private boolean wasActivated;
private boolean wasPassivated;
public void ejbCreate(String testName)
{
this.testName = testName;
log = Logger.getLogger(StatefulSessionBean.class.getName()+"#"+testName);
log.debug("ejbCreate("+testName+"), ctx="+sessionCtx);
}
public void ejbCreateAlt(String testName)
{
this.testName = testName + "Alt";
log = Logger.getLogger(StatefulSessionBean.class.getName()+"#"+testName);
log.debug("ejbCreateAlt("+testName+"), ctx="+sessionCtx);
}
public void ejbActivate()
{
log = Logger.getLogger(StatefulSessionBean.class.getName()+"#"+testName);
// Expecting : AllowedOperationsFlags.IN_EJB_ACTIVATE
log.info("ejbActivate( ) - inMethodFlag : " + AllowedOperationsAssociation.peekInMethodFlagAsString());
// JBAS-2660, should be able to call these
super.sessionCtx.getEJBObject();
super.sessionCtx.getEJBLocalObject();
wasActivated = true;
}
public void ejbPassivate()
{
// Expecting : AllowedOperationsFlags.IN_EJB_PASSIVATE
log.info("ejbPassivate( ) - inMethodFlag : " + AllowedOperationsAssociation.peekInMethodFlagAsString());
// JBAS-2660, should be able to call these
super.sessionCtx.getEJBObject();
super.sessionCtx.getEJBLocalObject();
wasPassivated = true;
}
public void afterBegin ()
{
log.debug("afterBegin()..., counter="+counter);
counterAtTxStart = counter;
}
public void afterCompletion (boolean isCommited)
{
log.debug("afterCompletion(), isCommited="+isCommited
+", counter="+counter+", counterAtTxStart="+counterAtTxStart);
if( isCommited == false )
{
counter = counterAtTxStart;
log.debug("Rolling counter back to: "+counter);
}
else
{
log.debug("Committed updated counter: "+counter);
}
}
public void beforeCompletion ()
{
log.debug("beforeCompletion(), counter="+counter
+", counterAtTxStart="+counterAtTxStart);
}
public String getTestName()
{
return testName;
}
public String method1(String msg)
{
log.debug("method1( ), msg="+msg);
return msg;
}
public void incCounter ()
{
counter++;
}
public void decCounter ()
{
counter--;
}
public int getCounter ()
{
return counter;
}
public void setCounter (int value)
{
counter = value;
}
public BeanContextInfo getBeanContextInfo ()
throws java.rmi.RemoteException
{
BeanContextInfo ctx = new BeanContextInfo();
log.debug("Getting EJBObject..");
Class remoteInterface = sessionCtx.getEJBObject().getClass();
ctx.remoteInterface = remoteInterface.getName();
log.debug("Getting EJBHome...");
Class homeInterface = sessionCtx.getEJBHome().getClass();
ctx.homeInterface = homeInterface.getName();
log.debug("calling setRollbackOnly( ) on context");
sessionCtx.setRollbackOnly();
ctx.isRollbackOnly = new Boolean(sessionCtx.getRollbackOnly());
return ctx;
}
public void loopbackTest ()
throws java.rmi.RemoteException
{
try
{
Context ctx = new InitialContext();
StatefulSessionHome home = (StatefulSessionHome) ctx.lookup("ejbcts/StatefulSessionBean");
StatefulSession sessionBean;
try
{
sessionBean = home.create(testName);
}
catch (CreateException crex)
{
log.debug("Loopback CreateException: " + crex);
throw new EJBException(crex);
}
sessionBean.loopbackTest(sessionCtx.getEJBObject());
}
catch (javax.naming.NamingException nex)
{
log.debug("Could not locate bean instance");
throw new EJBException(nex);
}
}
public void loopbackTest (EJBObject obj)
throws java.rmi.RemoteException
{
// This should throw an exception.
StatefulSession bean = ( StatefulSession ) obj;
bean.method1("Hello");
}
public void ping()
{
}
public void sleep(long wait)
{
try
{
Thread.sleep(wait);
}
catch (InterruptedException e)
{
throw new EJBException("Interrupted", e);
}
}
public boolean getWasActivated()
{
log.debug("getWasActivated( ), wasActivated="+wasActivated);
return wasActivated;
}
public boolean getWasPassivated()
{
log.debug("getWasPassivated( ), wasPassivated="+wasPassivated);
return wasPassivated;
}
public void createLocalEntity(AccountPK pk, String personsName)
throws CreateException
{
try
{
InitialContext ctx = new InitialContext();
enc = (Context) ctx.lookup("java:comp/env");
CtsCmpLocalHome home = (CtsCmpLocalHome) enc.lookup("ejb/CMPBeanLocalHome");
entityBean = home.create(pk, personsName);
}
catch(Exception e)
{
log.error("CtsCmpLocal create failed", e);
throw new EJBException("CtsCmpLocal create failed", e);
}
}
public String readAndRemoveEntity()
throws RemoveException
{
String name = entityBean.getPersonsName();
entityBean.remove();
return name;
}
public void createSessionHandle()
{
log.info("createSessionHandle");
try
{
InitialContext ctx = new InitialContext();
enc = (Context) ctx.lookup("java:comp/env");
StatelessSessionHome home = (StatelessSessionHome) enc.lookup("ejb/StatelessSessionHome");
StatelessSession bean = home.create();
sessionHandle = bean.getHandle();
}
catch(Exception e)
{
log.error("StatelessSessionHome create failed", e);
throw new EJBException("StatelessSessionHome create failed", e);
}
}
public String useSessionHandle(String arg)
{
log.info("useSessionHandle");
try
{
StatelessSession bean = (StatelessSession) sessionHandle.getEJBObject();
arg = bean.method1(arg);
}
catch(Exception e)
{
log.error("StatelessSession handle failed", e);
throw new EJBException("StatelessSession handle failed", e);
}
return arg;
}
public void createStatefulSessionHandle(String testName)
{
log.info("createStatefulSessionHandle");
try
{
StatefulSessionHome home = (StatefulSessionHome) sessionCtx.getEJBHome();
StatefulSession bean = home.create(testName);
bean.incCounter();
Handle handle = bean.getHandle();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(handle);
this.statefulHandle = baos.toByteArray();
}
catch(Exception e)
{
log.error("Failed to serialize session handle", e);
throw new EJBException("Failed to serialize session handle", e);
}
}
public void useStatefulSessionHandle()
{
log.info("useStatefulSessionHandle");
try
{
ByteArrayInputStream bais = new ByteArrayInputStream(statefulHandle);
ObjectInputStream ois = new ObjectInputStream(bais);
Handle handle = (Handle) ois.readObject();
StatefulSession bean = (StatefulSession) handle.getEJBObject();
bean.incCounter();
int count = bean.getCounter();
log.info("useStatefulSessionHandle, count="+count);
}
catch(Exception e)
{
log.error("Failed to read session from handle", e);
throw new EJBException("SFailed to read session from handle", e);
}
}
public void createSessionRef()
throws RemoteException
{
log.info("createSessionRef");
Handle handle = super.sessionCtx.getEJBObject().getHandle();
this.sessionRef = new SessionRef(handle);
}
public String useSessionRef()
throws RemoteException
{
log.info("useSessionRef");
Handle handle = sessionRef.getHandle();
return handle.toString();
}
public Handle getHandle()
{
try
{
return sessionCtx.getEJBObject().getHandle();
}
catch (RemoteException e)
{
throw new EJBException(e);
}
}
public void testBadUserTx()
{
throw new Error("Not Applicable");
}
}