stubgenerator.java

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

JAVA
315
字号
/* * 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.hessian;import com.caucho.config.ConfigException;import com.caucho.java.WorkDir;import com.caucho.make.ClassDependency;import com.caucho.vfs.MergePath;import com.caucho.vfs.PersistentDependency;import java.io.IOException;import java.lang.reflect.Method;import java.util.ArrayList;/** * Generator for stubs. */class StubGenerator extends MarshalGenerator {  private ArrayList<PersistentDependency> _dependList;    StubGenerator()  {    setClassDir(WorkDir.getLocalWorkDir().lookup("ejb"));  }    Class createHomeStub(Class cl)    throws ConfigException  {    return makeClient(cl, "__HessianStub", true);  }    Class createObjectStub(Class cl)    throws ConfigException  {    return makeClient(cl, "__HessianStub", false);  }    Class createStub(Class cl)    throws ConfigException  {    return makeClient(cl, "__HessianStub", true);  }  /**   * Creates a client stub.   *   * @param cl the remote interface of the stub   * @param genSuffix the suffix for the generated class   */  Class makeClient(Class cl, String genSuffix, boolean isHome)    throws ConfigException  {    _cl = cl;    try {      setFullClassName("_ejb." + cl.getName() + genSuffix);      if (cl.getClassLoader() != null)        setParentLoader(cl.getClassLoader());          MergePath mergePath = new MergePath();      if (cl.getClassLoader() != null)        mergePath.addClassPath(cl.getClassLoader());      else        mergePath.addClassPath(Thread.currentThread().getContextClassLoader());      setSearchPath(mergePath);      _dependList = new ArrayList<PersistentDependency>();      _dependList.add(new ClassDependency(cl));      Class stubClass = preload();      if (stubClass != null)        return stubClass;      generate();          return compile();    } catch (Exception e) {      throw ConfigException.create(e);    }  }  public void generateJava()    throws IOException  {    generateJava(_cl.getMethods());  }  /**   * Generates the Java source.   *   * @param methods the methods to generate   */  private void generateJava(Method []methods)    throws IOException  {    if (javax.ejb.EJBHome.class.isAssignableFrom(_cl))      printHeader("HomeStub");    else if (javax.ejb.EJBObject.class.isAssignableFrom(_cl))      printHeader("ObjectStub");    else      printHeader("ObjectStub");    println("public String getHessianType()");    println("{");    println("  return \"" + _cl.getName() + "\";");    println("}");    for (int i = 0; i < methods.length; i++) {      Method method = methods[i];      Class declaringClass = method.getDeclaringClass();      String prefix = "";      if (declaringClass.getName().startsWith("javax.ejb."))        prefix = "_ejb_";      /*      Class []exns = method.getExceptionTypes();      for (int j = 0; j < exns.length; j++) {        if (exns[j].isAssignableFrom(java.rmi.RemoteException.class)) {          printMethod(prefix + method.getName(), method);          break;        }      }      */      printMethod(prefix + method.getName(), method);    }        printDependList(_dependList);    printFooter();  }  /**   * Prints the header for a HomeStub   */  void printHeader(String stubClassName)    throws IOException  {    if (getPackageName() != null)      println("package " + getPackageName() + ";");    println();    println("import java.io.*;");    println("import java.rmi.*;");    println("import com.caucho.vfs.*;");    println("import com.caucho.util.*;");    println("import com.caucho.ejb.hessian.*;");    println("import com.caucho.hessian.io.*;");    println("import " + _cl.getName() + ";");        println();    println("public class " + getClassName() + " extends " + stubClassName);    print("  implements " + _cl.getName());    println(" {");    pushDepth();  }  /**   * Generates the code for a remote stub method.   *   * @param name the name of the remote   * @param method the reflected object for the method   */  void printMethod(String name, Method method)    throws IOException  {    Class ret = method.getReturnType();    Class []params = method.getParameterTypes();    printMethodDeclaration(name, method);        println("{");    pushDepth();    println("HessianWriter out = _hessian_openWriter();");    println("try {");    pushDepth();    String mangleName = mangleMethodName(method.getName(), method, false);        println("out.startCall();");    println("_hessian_writeHeaders(out);");    println("out.writeMethod(\"" + mangleName + "\");");    for (int i = 0; i < params.length; i++)      printMarshalType(params[i], "_arg" + i);    println("HessianInput in = out.doCall();");    if (! void.class.equals(ret)) {      printClass(ret);      println(" _ret;");      print("_ret = ");      printUnmarshalType(ret);    }    else {      println("in.readNull();");    }    println("in.completeReply();");    println("_hessian_freeWriter(out);");    println("out = null;");    if (! void.class.equals(ret))      println("return _ret;");        popDepth();    Class []exn = method.getExceptionTypes();    boolean hasThrowable = false;    boolean hasRuntimeException = false;        loop:    for (int i = 0; i < exn.length; i++) {      for (int j = 0; j < i; j++) {        if (exn[j].isAssignableFrom(exn[i]))          continue loop;      }            if (! hasThrowable) {        println("} catch (" + exn[i].getName() + " e) {");        println("  throw e;");      }            if (exn[i].equals(Throwable.class)) {        hasThrowable = true;        hasRuntimeException = true;      }            if (exn[i].equals(Exception.class))        hasRuntimeException = true;      if (exn[i].equals(RuntimeException.class))        hasRuntimeException = true;    }    if (! hasRuntimeException) {      println("} catch (RuntimeException e) {");      println("  throw e;");    }        if (! hasThrowable) {      println("} catch (Throwable e) {");      println("  throw new com.caucho.ejb.EJBExceptionWrapper(\"stub exception\", e);");    }        println("} finally {");    println("  if (out != null) out.close();");    println("}");    popDepth();    println("}");  }  /**   * Prints the class footer for the generated stub.   */  void printFooter()    throws IOException  {    println();    println("public String toString()");    println("{");    pushDepth();    println("return \"[HessianStub " + _cl.getName() + " \" + _urlPath + \"]\";");    popDepth();    println("}");        popDepth();    println("}");  }  /**   * Generates code for version changes.   */  protected void printVersionChange()    throws IOException  {    println("if (com.caucho.ejb.Version.getVersionId() != " +            com.caucho.ejb.Version.getVersionId() + ")");    println("  return true;");  }}

⌨️ 快捷键说明

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