001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999 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: JServiceEndpoint.java 7900 2006-01-18 16:04:21Z durieuxp $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas_ejb.container;
025:
026: import java.rmi.NoSuchObjectException;
027: import java.rmi.Remote;
028: import java.rmi.RemoteException;
029:
030: import javax.ejb.EJBException;
031: import javax.naming.NamingException;
032: import javax.rmi.PortableRemoteObject;
033: import javax.xml.rpc.ServiceException;
034: import javax.xml.rpc.handler.MessageContext;
035: import javax.xml.rpc.server.ServiceLifecycle;
036:
037: import org.objectweb.jonas.common.Log;
038: import org.objectweb.jonas_ejb.deployment.api.MethodDesc;
039: import org.objectweb.jonas_ejb.deployment.api.SessionStatelessDesc;
040: import org.objectweb.jonas_ejb.lib.EJBInvocation;
041:
042: import org.objectweb.util.monolog.api.BasicLevel;
043: import org.objectweb.util.monolog.api.Logger;
044:
045: /**
046: * Implementation of the Service Endpoint Interface.
047: * The lifeCycle of this object is managed by the JOnASEJBProvider.
048: * Although this object implements Remote, it is accessed locally today.
049: * @author Guillaume Sauthier, Philippe Durieux
050: */
051: public class JServiceEndpoint extends PortableRemoteObject implements
052: Remote, ServiceLifecycle {
053:
054: /**
055: * Logger, used also in the generated part.
056: */
057: protected static Logger logger = null;
058:
059: /**
060: * switch instance to use
061: */
062: protected JSessionSwitch bs;
063:
064: /**
065: * bean factory
066: */
067: protected JStatelessFactory bf;
068:
069: private MessageContext messageContext = null;
070:
071: /**
072: * @throws java.rmi.RemoteException
073: */
074: public JServiceEndpoint(JStatelessFactory sf)
075: throws RemoteException {
076: super ();
077: logger = Log.getLogger(Log.JONAS_WS_EJBPROVIDER_PREFIX);
078: if (logger.isLoggable(BasicLevel.DEBUG)) {
079: logger.log(BasicLevel.DEBUG, "");
080: }
081: bf = sf;
082: }
083:
084: // ---------------------------------------------------------------
085: // other public methods
086: // ---------------------------------------------------------------
087:
088: /**
089: * Set the MessageContext in the StatelessContext
090: * @param msgctx Axis MessageContext
091: */
092: public void setMessageContext(MessageContext msgctx) {
093: messageContext = msgctx;
094: }
095:
096: /**
097: * Get the messageContext
098: * @param mc JAX-RPC MessageContext
099: */
100: public MessageContext getMessageContext() {
101: return messageContext;
102: }
103:
104: /**
105: * finish initialization
106: * @param bs The Session Switch
107: */
108: public void setSessionSwitch(JSessionSwitch bs) {
109: if (logger.isLoggable(BasicLevel.DEBUG)) {
110: logger.log(BasicLevel.DEBUG, "");
111: }
112: this .bs = bs;
113: }
114:
115: /**
116: * preInvoke is called before any request.
117: * @param txa Transaction Attribute (Supports, Required, ...)
118: * @return A RequestCtx object
119: * @throws RemoteException preInvoke fail
120: */
121: public RequestCtx preInvoke(int txa) throws RemoteException {
122: if (logger.isLoggable(BasicLevel.DEBUG)) {
123: logger.log(BasicLevel.DEBUG, "");
124: }
125: return bf.preInvokeRemote(txa);
126: }
127:
128: /**
129: * Check if the access to the bean is authorized
130: * @param ejbInv object containing security signature of the method, args of
131: * method, etc
132: */
133: public void checkSecurity(EJBInvocation ejbInv) {
134: if (logger.isLoggable(BasicLevel.DEBUG)) {
135: logger.log(BasicLevel.DEBUG, "");
136: }
137: bf.checkSecurity(ejbInv);
138: }
139:
140: /**
141: * postInvoke is called after any request.
142: * @param rctx The RequestCtx that was returned at preInvoke()
143: * @throws RemoteException postInvoke fail
144: */
145: public void postInvoke(RequestCtx rctx) throws RemoteException {
146: if (logger.isLoggable(BasicLevel.DEBUG)) {
147: logger.log(BasicLevel.DEBUG, "");
148: }
149: try {
150: bf.postInvokeRemote(rctx);
151: } finally {
152: // put instance in the pool for future reuse.
153: bs.releaseICtx(rctx, false);
154: }
155: }
156:
157: // --------------------------------------------------------------------
158: // ServiceLifeCycle implementation
159: // --------------------------------------------------------------------
160:
161: /**
162: * Nothing to do here.
163: */
164: public void init(Object arg0) throws ServiceException {
165: if (logger.isLoggable(BasicLevel.DEBUG)) {
166: logger.log(BasicLevel.DEBUG, "");
167: }
168: }
169:
170: /**
171: * remove the bean instance.
172: */
173: public void destroy() {
174: if (logger.isLoggable(BasicLevel.DEBUG)) {
175: logger.log(BasicLevel.DEBUG, "");
176: }
177: RequestCtx rctx = null;
178: try {
179: rctx = bf.preInvoke(MethodDesc.TX_NOT_SET);
180: bf.checkSecurity(null);
181: } catch (Exception e) {
182: logger.log(BasicLevel.ERROR, "preInvoke failed: ", e);
183: return;
184: }
185: try {
186: JSessionContext bctx = bs.getICtx(rctx.currTx);
187: bctx.setRemoved();
188: } catch (Exception e) {
189: rctx.sysExc = e;
190: logger.log(BasicLevel.ERROR, "EJB exception thrown:", e);
191: } catch (Error e) {
192: rctx.sysExc = e;
193: logger.log(BasicLevel.ERROR, "error thrown:", e);
194: } finally {
195: try {
196: bf.postInvoke(rctx);
197: } catch (Exception e) {
198: logger.log(BasicLevel.ERROR,
199: "exception on postInvoke: ", e);
200: }
201: }
202:
203: }
204:
205: }
|