messagegenerator.java

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

JAVA
252
字号
/* * 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 Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.ejb.gen;import com.caucho.java.JavaWriter;import com.caucho.ejb.cfg.*;import com.caucho.util.L10N;import javax.ejb.*;import static javax.ejb.TransactionAttributeType.*;import java.io.IOException;import java.lang.reflect.*;import java.util.*;/** * Generates the skeleton for a message bean. */public class MessageGenerator extends BeanGenerator {  private static final L10N L = new L10N(BeanGenerator.class);  private MessageView _view;  private ArrayList<View> _views = new ArrayList<View>();    public MessageGenerator(String ejbName, ApiClass ejbClass)  {    super(toFullClassName(ejbName, ejbClass.getSimpleName()), ejbClass);  }  private static String toFullClassName(String ejbName, String className)  {    StringBuilder sb = new StringBuilder();    sb.append("_ejb.");    if (! Character.isJavaIdentifierStart(ejbName.charAt(0)))      sb.append('_');    for (int i = 0; i < ejbName.length(); i++) {      char ch = ejbName.charAt(i);      if (ch == '/')	sb.append('.');      else if (Character.isJavaIdentifierPart(ch))	sb.append(ch);      else	sb.append('_');    }    sb.append(".");    sb.append(className);    sb.append("__EJB");    return sb.toString();  }  public void setApi(ApiClass api)  {    _view = new MessageView(this, api);    _views.add(_view);  }  public ArrayList<View> getViews()  {    return _views;  }  /**   * Introspects the bean.   */  @Override  public void introspect()  {    super.introspect();        for (View view : getViews())      view.introspect();  }    /**   * Generates the message session bean   */  @Override  public void generate(JavaWriter out)    throws IOException  {    generateTopComment(out);    out.println();    out.println("package " + getPackageName() + ";");    out.println();    out.println("import com.caucho.config.*;");    out.println("import com.caucho.ejb.*;");    out.println("import com.caucho.ejb.message.*;");    out.println();    out.println("import java.util.*;");    out.println("import java.lang.reflect.*;");    out.println("import javax.ejb.*;");    out.println("import javax.transaction.*;");    out.println("import javax.transaction.xa.*;");    out.println("import javax.resource.spi.endpoint.*;");        out.println();    out.println("public class " + getClassName()		+ " extends " + getEjbClass().getName()		+ " implements MessageEndpoint, CauchoMessageEndpoint");    out.println("{");    out.pushDepth();    // ejb/0931    out.println();    out.println("private static final com.caucho.ejb3.xa.XAManager _xa");    out.println("  = new com.caucho.ejb3.xa.XAManager();");    out.println("private static HashSet<Method> _xaMethods = new HashSet<Method>();");    out.println();    out.println("private MessageServer _server;");    out.println("private XAResource _xaResource;");    out.println("private boolean _isXa;");    HashMap map = new HashMap();    map.put("caucho.ejb.xa", "true");    for (View view : getViews()) {      // view.generateContextPrologue(out);      view.generateBusinessPrologue(out, map);    }    out.println();    out.println("public " + getClassName() + "(MessageServer server)");    out.println("{");    out.pushDepth();    out.println("_server = server;");    if (MessageDrivenBean.class.isAssignableFrom(getEjbClass().getJavaClass())) {      out.println("setMessageDrivenContext(server.getMessageContext());");    }    _view.generateBusinessConstructor(out);    out.popDepth();    out.println("}");    out.println();    out.println("static {");    out.pushDepth();    out.println("try {");    out.pushDepth();    for (BusinessMethodGenerator bizMethod : _view.getMethods()) {      if (REQUIRED.equals(bizMethod.getXa().getTransactionType())) {	Method api = bizMethod.getApiMethod();		out.print("_xaMethods.add(");	out.printClass(api.getDeclaringClass());	out.print(".class.getMethod(\"");	out.print(api.getName());	out.print("\", new Class[] { ");	for (Class cl : api.getParameterTypes()) {	  out.printClass(cl);	  out.print(".class, ");	}	out.println("}));");      }    }    out.popDepth();    out.println("} catch (Exception e) {");    out.println("  throw new RuntimeException(e);");    out.println("}");        out.popDepth();    out.println("}");    out.println();    out.println("public void __caucho_setXAResource(XAResource xaResource)");    out.println("{");    out.println("  _xaResource = xaResource;");    out.println("}");    out.println();    out.println("public void beforeDelivery(java.lang.reflect.Method method)");    out.println("{");    out.println("  if (_xaMethods.contains(method)) {");    out.println("    _isXa = (_xa.beginRequired() == null);");    out.println("  }");    out.println("}");    out.println("public void afterDelivery()");    out.println("{");    out.println("  if (_isXa) {");    out.println("    _isXa = false;");    out.println("    _xa.commit();");    out.println("  }");    out.println("}");    out.println();    out.println("public void release()");    out.println("{");    out.pushDepth();    if (getEjbClass().hasMethod("ejbRemove", new Class[0])) {      out.println("ejbRemove();");    }        out.popDepth();    out.println("}");    /*    for (View view : getViews()) {      view.generateContextPrologue(out);    }    */    generateViews(out);    generateDependency(out);        out.popDepth();    out.println("}");  }}

⌨️ 快捷键说明

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