transactionchain.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 311 行

JAVA
311
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source 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, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the *   Free SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.ejb.gen;import com.caucho.ejb.cfg.*;import com.caucho.java.JavaWriter;import com.caucho.java.gen.BaseMethod;import com.caucho.java.gen.CallChain;import com.caucho.java.gen.FilterCallChain;import com.caucho.java.gen.MethodCallChain;import com.caucho.util.L10N;import java.io.IOException;import java.util.ArrayList;import java.util.logging.*;import javax.ejb.*;import javax.ejb.ApplicationException;/** * Generates the skeleton for a method call. */public class TransactionChain extends FilterCallChain{  private static final Logger log    = Logger.getLogger(TransactionChain.class.getName());  private static final L10N L = new L10N(TransactionChain.class);  private ApiMethod _apiMethod;  private ApiMethod _implMethod;  private ApiClass _businessInterface;  private TransactionAttributeType _xaType;  private boolean _isEJB3;  private ArrayList<ApplicationExceptionConfig> _appExceptions;  public TransactionChain(CallChain next,                          TransactionAttributeType xaType,                          ApiMethod apiMethod,                          ApiMethod implMethod)  {    this(next, xaType, apiMethod, implMethod, false, null);  }  public TransactionChain(CallChain next,                          TransactionAttributeType xaType,                          ApiMethod apiMethod,                          ApiMethod implMethod,                          boolean isEJB3,                          ArrayList<ApplicationExceptionConfig> appExceptions)  {    super(next);    _xaType = xaType;    _apiMethod = apiMethod;    _implMethod = implMethod;    _isEJB3 = isEJB3;    _appExceptions = appExceptions;    if (implMethod == null)      _implMethod = apiMethod;  }  public static TransactionChain create(CallChain next,                                        TransactionAttributeType xaType,                                        ApiMethod apiMethod,                                        ApiMethod implMethod)  {    return new TransactionChain(next, xaType, apiMethod, implMethod);  }  public static TransactionChain create(CallChain next,                                        TransactionAttributeType xaType,                                        ApiMethod apiMethod,                                        ApiMethod implMethod,                                        boolean isEJB3,                                        ArrayList<ApplicationExceptionConfig> appExceptions)  {    return new TransactionChain(next, xaType, apiMethod, implMethod, isEJB3, appExceptions);  }  /**   * Prints a call within the same JVM   *   * @param methodName the name of the method to call   * @param method the method to call   */  public void generateCall(JavaWriter out, String retType,			   String var, String []args)    throws IOException  {    // ejb/0ff0 TCK: ejb30/bb/session/stateful/sessioncontext/annotated/getInvokedBusinessInterfaceRemote2    //out.println("if (getServer().getContext() != null)");    //out.println("  getServer().getContext().__caucho_setInvokedBusinessInterface(_businessInterface);");    if (_isEJB3 && _businessInterface != null) {      out.println("if (_context != null)");      out.println("  _context.__caucho_setInvokedBusinessInterface(" + _businessInterface.getName() + ");");      out.println();    }    out.println("Thread thread = Thread.currentThread();");    out.println("ClassLoader oldLoader = thread.getContextClassLoader();");    out.print("javax.transaction.Transaction oldTrans = _xaManager.getTransaction();");    out.println();    out.print("com.caucho.ejb.xa.TransactionContext trans");    if (_xaType != null) {      switch (_xaType) {	/*	  case EjbMethod.TRANS_SINGLE_READ:	  out.println(" = _xaManager.beginSingleRead();");	  break;	*/      case REQUIRES_NEW:	out.println(" = _xaManager.beginRequiresNew();");	break;	//case EjbMethod.TRANS_BEAN:      case NOT_SUPPORTED:	out.println(" = _xaManager.suspend();");	break;      case NEVER:	out.println(" = _xaManager.beginNever();");	break;      case REQUIRED:	out.println(" = _xaManager.beginRequired();");	break;      case MANDATORY:	out.println(" = _xaManager.beginMandatory();");	break;      default:      case SUPPORTS:	out.println(" = _xaManager.beginSupports();");	break;      }    }    out.println("try {");    out.pushDepth();    out.println("thread.setContextClassLoader(_context._server.getClassLoader());");    out.println();    /* XXX: need to check something like _context.isDead() instead    // ejb/0fe4: throws exception if this context has been removed.    out.println("getServer().getContext(_context.getPrimaryKey());");    out.println();    */    super.generateCall(out, retType, var, args);    out.popDepth();    out.println("} catch (Exception e) {");    out.pushDepth();    Class beanClass = _implMethod.getDeclaringClass();    if (_isEJB3) { // XXX && ! _implMethod.isAnnotationPresent(javax.ejb.Remove.class)) {      generateExceptionHandling(out);    }    /*    if (! out.isSession())      out.println("if (ptr != null) ptr._ejb_state = QEntity._CAUCHO_IS_DEAD;");    */    out.println("e = com.caucho.ejb.EJBExceptionWrapper.create(e);");    out.println();    // TCK: needs QA, ejb30/bb/localaccess/statefulclient/exceptionTest1    //if (_xaType != EjbMethod.TRANS_BEAN) {    if (_xaType != null) {      out.println("if (trans.getTransaction() != oldTrans) {");      out.println("  throw trans.setRollbackOnly(e);");      out.println("}");    }    // ejb/02b1    out.println("throw (javax.ejb.EJBException) e;");    out.popDepth();    out.println("} finally {");    out.pushDepth();    out.println("thread.setContextClassLoader(oldLoader);");    // TCK: needs QA, ejb30/bb/localaccess/statefulclient/exceptionTest1    // if (_xaType != EjbMethod.TRANS_BEAN)    // ejb/0224 vs TCK    //out.println("if (trans.getTransaction() != oldTrans)");    // XXX TCK: ejb30/bb/session/stateful/sessioncontext/annotated/getInvokedBusinessInterfaceLocal1    out.println("  trans.commit();");    /*    if (out.isSession())      out.println("if (ptr != null) ptr._ejb_isActive = false;");    */    out.popDepth();    out.println("}");  }  protected void generateExceptionHandling(JavaWriter out)    throws IOException  {    // boolean isCmt = _xaType != EjbMethod.TRANS_BEAN;    boolean isCmt = _xaType != null;    // ejb/0fb9    out.println("if (e instanceof com.caucho.ejb.EJBExceptionWrapper)");    out.println("  e = (Exception) e.getCause();");    out.println();    out.println("if (e instanceof java.lang.reflect.InvocationTargetException)");    out.println("  e = (Exception) e.getCause();");    out.println();    Class beanClass = _implMethod.getDeclaringClass();    // ejb/0500    Class exnTypes[]; // = getExceptionTypes();    // ejb/0fb3, ejb/0fbg    for (Class cl : _implMethod.getExceptionTypes()) {      if (! Exception.class.isAssignableFrom(cl)) {        // XXX:        // hessian/3600        log.info(cl + " is not handled by EJB");        continue;      }      out.println("if (e instanceof " + cl.getName() + ") {");      out.pushDepth();      if (isCmt) {        // ejb/0fc0, ejb/0fc1        // TCK: ejb30/bb/session/stateful/annotation/appexception/annotated/atCheckedRollbackAppExceptionTest        boolean isApplicationException = false;        boolean isRollback = false;        // Check @ApplicationException(rollback=true/false)        ApplicationException ann =	  (ApplicationException) cl.getAnnotation(ApplicationException.class);        if (ann != null) {          isApplicationException = true;          isRollback = ann.rollback();        } else if (_appExceptions != null) {          // ejb/0fc3          for (ApplicationExceptionConfig cfg : _appExceptions) {            if (cfg.getExceptionClass().equals(cl.getName())) {              isApplicationException = true;              isRollback = cfg.isRollback();              break;            }          }        }        if (! isApplicationException) {          // ejb/0fc0          out.println("if (trans.getTransaction() != oldTrans)");          out.println("  trans.setRollbackOnly(e);");        } else if (isRollback) {          // ejb/0fc1          out.println("trans.setRollbackOnly(e);");        }        // else do not rollback.      }      out.println("throw (" + cl.getName() + ") e;");      out.popDepth();      out.println("}");      out.println();    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?