/*
* 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.ejb;
import java.io.IOException;
import java.io.Serializable;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.rmi.RemoteException;
import java.security.Principal;
import java.util.Date;
import javax.ejb.EJBLocalObject;
import javax.ejb.*;
import javax.transaction.UserTransaction;
import javax.xml.rpc.handler.MessageContext;
/**
* The enterprise context for stateful session beans.
*
* @author <a href="mailto:rickard.oberg@telkel.com">Rickard Oberg</a>
* @author <a href="mailto:docodan@mvcsoft.com">Daniel OConnor</a>
* @version $Revision: 81030 $
*/
public class StatefulSessionEnterpriseContext
extends EnterpriseContext
implements Serializable
{
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
private EJBObject ejbObject;
private EJBLocalObject ejbLocalObject;
private SessionContext ctx;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
public StatefulSessionEnterpriseContext(Object instance, Container con)
throws RemoteException
{
super(instance, con);
ctx = new StatefulSessionContextImpl();
try
{
AllowedOperationsAssociation.pushInMethodFlag(IN_SET_SESSION_CONTEXT);
((SessionBean)instance).setSessionContext(ctx);
}
finally
{
AllowedOperationsAssociation.popInMethodFlag();
}
}
// Public --------------------------------------------------------
public void discard() throws RemoteException
{
// Do nothing
}
public EJBContext getEJBContext()
{
return ctx;
}
/**
* During activation of stateful session beans we replace the instance
* by the one read from the file.
*/
public void setInstance(Object instance)
{
this.instance = instance;
try
{
((SessionBean)instance).setSessionContext(ctx);
}
catch (Exception x)
{
log.error("Failed to setSessionContext", x);
}
}
public void setEJBObject(EJBObject eo) {
ejbObject = eo;
}
public EJBObject getEJBObject() {
return ejbObject;
}
public void setEJBLocalObject(EJBLocalObject eo) {
ejbLocalObject = eo;
}
public EJBLocalObject getEJBLocalObject() {
return ejbLocalObject;
}
public SessionContext getSessionContext()
{
return ctx;
}
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
private void writeObject(ObjectOutputStream out)
throws IOException, ClassNotFoundException
{
// No state
}
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException
{
// No state
}
// Inner classes -------------------------------------------------
protected class StatefulSessionContextImpl
extends EJBContextImpl
implements SessionContext
{
public EJBHome getEJBHome()
{
AllowedOperationsAssociation.assertAllowedIn("getEJBHome",
IN_SET_SESSION_CONTEXT |
IN_EJB_CREATE | IN_EJB_REMOVE | IN_EJB_ACTIVATE | IN_EJB_PASSIVATE | IN_BUSINESS_METHOD |
IN_AFTER_BEGIN | IN_BEFORE_COMPLETION | IN_AFTER_COMPLETION);
return super.getEJBHome();
}
public EJBLocalHome getEJBLocalHome()
{
AllowedOperationsAssociation.assertAllowedIn("getEJBLocalHome",
IN_SET_SESSION_CONTEXT |
IN_EJB_CREATE | IN_EJB_REMOVE | IN_EJB_ACTIVATE | IN_EJB_PASSIVATE | IN_BUSINESS_METHOD |
IN_AFTER_BEGIN | IN_BEFORE_COMPLETION | IN_AFTER_COMPLETION);
return super.getEJBLocalHome();
}
/** Get the Principal for the current caller. This method
cannot return null according to the ejb-spec.
*/
public Principal getCallerPrincipal()
{
AllowedOperationsAssociation.assertAllowedIn("getCallerPrincipal",
IN_EJB_CREATE | IN_EJB_REMOVE | IN_EJB_ACTIVATE | IN_EJB_PASSIVATE | IN_BUSINESS_METHOD |
IN_AFTER_BEGIN | IN_BEFORE_COMPLETION | IN_AFTER_COMPLETION);
return super.getCallerPrincipal();
}
public boolean isCallerInRole(String id)
{
AllowedOperationsAssociation.assertAllowedIn("isCallerInRole",
IN_EJB_CREATE | IN_EJB_REMOVE | IN_EJB_ACTIVATE | IN_EJB_PASSIVATE | IN_BUSINESS_METHOD |
IN_AFTER_BEGIN | IN_BEFORE_COMPLETION | IN_AFTER_COMPLETION);
return super.isCallerInRole(id);
}
public EJBObject getEJBObject()
{
AllowedOperationsAssociation.assertAllowedIn("getEJBObject",
IN_EJB_CREATE | IN_EJB_REMOVE | IN_EJB_ACTIVATE | IN_EJB_PASSIVATE | IN_BUSINESS_METHOD |
IN_AFTER_BEGIN | IN_BEFORE_COMPLETION | IN_AFTER_COMPLETION);
if (((StatefulSessionContainer)con).getRemoteClass()==null)
throw new IllegalStateException( "No remote interface defined." );
if (ejbObject == null)
{
EJBProxyFactory proxyFactory = con.getProxyFactory();
if(proxyFactory == null)
{
String defaultInvokerName = con.getBeanMetaData().
getContainerConfiguration().getDefaultInvokerName();
proxyFactory = con.lookupProxyFactory(defaultInvokerName);
}
ejbObject = (EJBObject) proxyFactory.getStatefulSessionEJBObject(id);
}
return ejbObject;
}
public Object getBusinessObject(Class businessInterface) throws IllegalStateException
{
throw new RuntimeException("NOT IMPLEMENTED");
}
public Class getInvokedBusinessInterface() throws IllegalStateException
{
throw new RuntimeException("NOT IMPLEMENTED");
}
public EJBLocalObject getEJBLocalObject()
{
AllowedOperationsAssociation.assertAllowedIn("getEJBLocalObject",
IN_EJB_CREATE | IN_EJB_REMOVE | IN_EJB_ACTIVATE | IN_EJB_PASSIVATE | IN_BUSINESS_METHOD |
IN_AFTER_BEGIN | IN_BEFORE_COMPLETION | IN_AFTER_COMPLETION);
if (con.getLocalHomeClass()==null)
throw new IllegalStateException( "No local interface for bean." );
if (ejbLocalObject == null)
{
ejbLocalObject = ((StatefulSessionContainer)con).getLocalProxyFactory().getStatefulSessionEJBLocalObject(id);
}
return ejbLocalObject;
}
public boolean getRollbackOnly()
{
AllowedOperationsAssociation.assertAllowedIn("getRollbackOnly",
IN_BUSINESS_METHOD | IN_AFTER_BEGIN | IN_BEFORE_COMPLETION);
return super.getRollbackOnly();
}
public void setRollbackOnly()
{
AllowedOperationsAssociation.assertAllowedIn("setRollbackOnly",
IN_BUSINESS_METHOD | IN_AFTER_BEGIN | IN_BEFORE_COMPLETION);
super.setRollbackOnly();
}
public UserTransaction getUserTransaction()
{
AllowedOperationsAssociation.assertAllowedIn("getUserTransaction",
IN_EJB_CREATE | IN_EJB_REMOVE | IN_EJB_ACTIVATE | IN_EJB_PASSIVATE | IN_BUSINESS_METHOD);
return super.getUserTransaction();
}
public TimerService getTimerService() throws IllegalStateException
{
throw new IllegalStateException("getTimerService should not be access from a stateful session bean");
}
public MessageContext getMessageContext() throws IllegalStateException
{
AllowedOperationsAssociation.assertAllowedIn("getMessageContext",
NOT_ALLOWED);
return null;
}
public Object getPrimaryKey()
{
return id;
}
}
}