001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999-2004 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: JSessionLocal.java 7900 2006-01-18 16:04:21Z durieuxp $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas_ejb.container;
025:
026: import javax.ejb.EJBException;
027: import javax.ejb.EJBLocalHome;
028: import javax.ejb.EJBLocalObject;
029: import javax.ejb.RemoveException;
030:
031: import org.objectweb.jonas_ejb.lib.EJBInvocation;
032:
033: import org.objectweb.util.monolog.api.BasicLevel;
034:
035: /**
036: * Generic part of the EJBLocalObject implementation
037: * @author Philippe Durieux
038: */
039: public abstract class JSessionLocal extends JLocal {
040:
041: protected JSessionFactory bf;
042:
043: protected JSessionSwitch bs;
044:
045: /**
046: * constructor
047: * @param bf The Session Factory
048: */
049: public JSessionLocal(JSessionFactory bf) {
050: super (bf);
051: if (TraceEjb.isDebugIc()) {
052: TraceEjb.interp.log(BasicLevel.DEBUG, "");
053: }
054: this .bf = bf;
055: }
056:
057: // --------------------------------------------------------------------------
058: // EJBLocalObject implementation
059: // remove() is implemented in the generated part.
060: // --------------------------------------------------------------------------
061:
062: public abstract void remove() throws RemoveException;
063:
064: /**
065: * @return the enterprise Bean's local home interface.
066: */
067: public EJBLocalHome getEJBLocalHome() {
068: return bf.getLocalHome();
069: }
070:
071: /**
072: * @return the Primary Key for this EJBObject
073: * @throws EJBException Always : Session bean has no primary key
074: */
075: public Object getPrimaryKey() throws EJBException {
076: throw new EJBException("Session bean has no primary key");
077: }
078:
079: /**
080: * Tests if a given EJB is identical to the invoked EJB object. This is
081: * different whether the bean is stateless or stateful.
082: * @param EJBLocalObject obj - An object to test for identity with the
083: * invoked object.
084: * @return True if the given EJB object is identical to the invoked object.
085: * @throws EJBException: Thrown when the method failed due to a system-level
086: * failure.
087: */
088: public boolean isIdentical(EJBLocalObject obj) {
089: if (TraceEjb.isDebugIc()) {
090: TraceEjb.interp.log(BasicLevel.DEBUG, "");
091: }
092: boolean ret = false;
093: JSessionFactory sf = bf;
094: if (sf.isStateful()) {
095: // For stateful sessions, just compare both objects.
096: if (obj != null) {
097: ret = obj.equals(this );
098: }
099: } else {
100: // In case of Stateless session bean, we must compare the 2
101: // factories
102: if (obj != null) {
103: try {
104: //a simple cast should work on a local object
105: JSessionLocal ejb2 = (JSessionLocal) obj;
106: JSessionSwitch bs2 = ejb2.getSessionSwitch();
107: JSessionFactory bf2 = bs2.getBeanFactory();
108: ret = bf2.equals(sf);
109: } catch (Exception e) {
110: TraceEjb.logger.log(BasicLevel.WARN, "exception:"
111: + e);
112: throw new EJBException("isIdentical failed", e);
113: }
114: }
115: }
116: return ret;
117: }
118:
119: // ---------------------------------------------------------------
120: // other public methods, for internal use.
121: // ---------------------------------------------------------------
122:
123: /**
124: * finish initialization
125: * @param bs The Session Switch
126: */
127: public void setSessionSwitch(JSessionSwitch bs) {
128: if (TraceEjb.isDebugIc()) {
129: TraceEjb.interp.log(BasicLevel.DEBUG, "");
130: }
131: this .bs = bs;
132: }
133:
134: /**
135: * @return the JSessionSwitch for this Session
136: */
137: public JSessionSwitch getSessionSwitch() {
138: return bs;
139: }
140:
141: /**
142: * preInvoke is called before any request.
143: * @param txa Transaction Attribute (Supports, Required, ...)
144: * @return A RequestCtx object
145: * @throws EJBException
146: */
147: public RequestCtx preInvoke(int txa) {
148: if (TraceEjb.isDebugIc()) {
149: TraceEjb.interp.log(BasicLevel.DEBUG, "");
150: }
151: RequestCtx rctx = bf.preInvoke(txa);
152: bs.setMustCommit(rctx.mustCommit); // for remove stateful session
153: bs.enlistConnections(rctx.currTx); // Enlist connection list to tx
154: return rctx;
155: }
156:
157: /**
158: * Check if the access to the bean is authorized
159: * @param ejbInv object containing security signature of the method, args of
160: * method, etc
161: */
162: public void checkSecurity(EJBInvocation ejbInv) {
163: if (TraceEjb.isDebugIc()) {
164: TraceEjb.interp.log(BasicLevel.DEBUG, "");
165: }
166: bf.checkSecurity(ejbInv);
167: }
168:
169: /**
170: * postInvoke is called after any request.
171: * @param rctx The RequestCtx that was returned at preInvoke()
172: * @throws EJBException
173: */
174: public void postInvoke(RequestCtx rctx) {
175: if (TraceEjb.isDebugIc()) {
176: TraceEjb.interp.log(BasicLevel.DEBUG, "");
177: }
178: bs.delistConnections(rctx.currTx);
179: // save current tx (for Stateful Bean Managed only)
180: bs.saveBeanTx();
181: try {
182: bf.postInvoke(rctx);
183: } finally {
184: bs.releaseICtx(rctx, rctx.sysExc != null);
185: }
186: }
187:
188: }
|