pojobean.java

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

JAVA
314
字号
/* * 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.ejb3.gen;import com.caucho.config.ConfigException;import com.caucho.ejb.cfg.*;import com.caucho.ejb.gen.*;import com.caucho.java.JavaWriter;import com.caucho.java.gen.GenClass;import com.caucho.java.gen.JavaClassGenerator;import com.caucho.util.L10N;import com.caucho.webbeans.component.*;import java.io.*;import java.lang.reflect.*;import java.lang.annotation.*;import java.util.*;import javax.ejb.*;import javax.webbeans.*;/** * Generates the skeleton for a session bean. */public class PojoBean extends BeanGenerator {  private static final L10N L = new L10N(PojoBean.class);  private ApiClass _beanClass;  private PojoView _view;  private ArrayList<BusinessMethodGenerator> _businessMethods    = new ArrayList<BusinessMethodGenerator>();  private boolean _isEnhanced;  private boolean _hasXA;  private boolean _hasReadResolve;  private boolean _isReadResolveEnhanced;  private boolean _isSingleton;    public PojoBean(Class beanClass)  {    super(beanClass.getName() + "$ResinWebBean", new ApiClass(beanClass));    setSuperClassName(beanClass.getName());    addInterfaceName("java.io.Serializable");        addImport("javax.transaction.*");        _view = new PojoView(this, getEjbClass());        _beanClass = new ApiClass(beanClass);  }  public void setSingleton(boolean isSingleton)  {    _isSingleton = isSingleton;  }  public void introspect()  {    for (ApiMethod method : _beanClass.getMethods()) {      if (Object.class.equals(method.getDeclaringClass()))	continue;      if (method.getName().equals("readResolve")	  && method.getParameterTypes().length == 0) {	_hasReadResolve = true;      }      int index = _businessMethods.size();      BusinessMethodGenerator bizMethod	= new BusinessMethodGenerator(_view, method, method.getMethod(), index);      bizMethod.introspect(method.getMethod(), method.getMethod());      if (! bizMethod.isEnhanced())	continue;            if (! method.isPublic() && ! method.isProtected())	throw new ConfigException(L.l("{0}: Resin-IoC/WebBeans annotations are not allowed on private methods.", bizMethod));      if (method.isStatic())	throw new ConfigException(L.l("{0}: Resin-Ioc/WebBeans annotations are not allowed on static methods.", bizMethod));      if (method.isFinal())	throw new ConfigException(L.l("{0}: Resin-Ioc/WebBeans annotations are not allowed on final methods.", bizMethod));      if (bizMethod.isEnhanced()) {	_isEnhanced = true;	_businessMethods.add(bizMethod);      }    }        if (Serializable.class.isAssignableFrom(_beanClass.getJavaClass())	&& ! _hasReadResolve	&& hasTransientInject(_beanClass.getJavaClass())) {      _isReadResolveEnhanced = true;      _isEnhanced = true;    }  }  private boolean hasTransientInject(Class cl)  {    if (cl == null || Object.class.equals(cl))      return false;    for (Field field : cl.getDeclaredFields()) {      if (! Modifier.isTransient(field.getModifiers()))	continue;      if (Modifier.isStatic(field.getModifiers()))	continue;      Annotation []annList = field.getDeclaredAnnotations();      if (annList == null)	continue;      for (Annotation ann : annList) {	if (ann.annotationType().isAnnotationPresent(BindingType.class))	  return true;	if (In.class.equals(ann.annotationType()))	  return true;      }    }    return hasTransientInject(cl.getSuperclass());  }  public Class generateClass()  {    if (! isEnhanced())      return _beanClass.getJavaClass();        try {      JavaClassGenerator gen = new JavaClassGenerator();      Class cl = gen.preload(getFullClassName());      if (cl != null)	return cl;      gen.generate(this);      gen.compilePendingJava();      return gen.loadClass(getFullClassName());    } catch (Exception e) {      throw new RuntimeException(e);    }  }  protected boolean isEnhanced()  {    return _isEnhanced;  }  @Override  protected void generateClassContent(JavaWriter out)    throws IOException  {    generateHeader(out);    HashMap map = new HashMap();    for (BusinessMethodGenerator method : _businessMethods) {      method.generatePrologueTop(out, map);    }    for (Constructor ctor : _beanClass.getJavaClass().getDeclaredConstructors()) {      if (Modifier.isPublic(ctor.getModifiers()))	generateConstructor(out, ctor);    }    map = new HashMap();    for (BusinessMethodGenerator method : _businessMethods) {      method.generate(out, map);    }    generateWriteReplace(out);  }  /**   * Generates header and prologue data.   */  protected void generateHeader(JavaWriter out)    throws IOException  {    out.println("private static final java.util.logging.Logger __log");    out.println("  = java.util.logging.Logger.getLogger(\"" + getFullClassName() + "\");");    out.println("private static final boolean __isFiner");    out.println("  = __log.isLoggable(java.util.logging.Level.FINER);");    if (_hasXA) {      out.println();      out.println("private static final com.caucho.ejb3.xa.XAManager _xa");      out.println("  = new com.caucho.ejb3.xa.XAManager();");    }    /*    if (_isReadResolveEnhanced)      generateReadResolve(out);    */  }  protected void generateReadResolve(JavaWriter out)    throws IOException  {    out.println();    out.println("private Object readResolve()");    out.println("{");    out.println("  System.out.println(\"resolve-me\");");        out.println("  return this;");    out.println("}");  }  protected void generateWriteReplace(JavaWriter out)    throws IOException  {    if (_isSingleton) {      out.println("private transient Object __caucho_handle;");      out.println();      out.println("private Object writeReplace()");      out.println("{");      out.println("  return __caucho_handle;");      out.println("}");    }    else {      // XXX: need a handle or serialize to the base class (?)    }  }    protected void generateConstructor(JavaWriter out, Constructor ctor)    throws IOException  {    Class []paramTypes = ctor.getParameterTypes();        out.print("public " + getClassName() + "(");    for (int i = 0; i < paramTypes.length; i++) {      if (i != 0)	out.print(", ");      out.printClass(paramTypes[i]);      out.print(" a" + i);    }        out.println(")");    generateThrows(out, ctor.getExceptionTypes());        out.println("{");    out.pushDepth();    out.print("super(");    for (int i = 0; i < paramTypes.length; i++) {      if (i != 0)	out.print(", ");      out.print("a" + i);    }    out.println(");");    HashMap map = new HashMap();    for (BusinessMethodGenerator method : _businessMethods) {      method.generateConstructorTop(out, map);    }        out.popDepth();    out.println("}");  }  protected void generateThrows(JavaWriter out, Class []exnCls)    throws IOException  {    if (exnCls.length == 0)      return;    out.print(" throws ");        for (int i = 0; i < exnCls.length; i++) {      if (i != 0)	out.print(", ");      out.printClass(exnCls[i]);    }  }}

⌨️ 快捷键说明

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