ejbsessionbean.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 607 行 · 第 1/2 页

JAVA
607
字号
    else if (interfaceList.size() != 1)      throw new ConfigException(L.l("'{0}' has multiple interfaces, but none are marked as @Local or @Remote.\n{1}",                                    type.getName(),                                    interfaceList.toString()));    else {      setLocalWrapper(interfaceList.get(0));    }    // XXX: Check ejb30/bb/session/stateless/migration/twothree/annotated    // There is a conflict between 2.1 and 3.0 interfaces.    // ejb/0f6f    // The session bean might have @RemoteHome for EJB 2.1 and    // the @Remote interface for EJB 3.0 (same with @LocalHome and @Local).    // TCK: ejb30/bb/session/stateful/sessioncontext/annotated    ApiClass ejbClass = getEJBClassWrapper();    LocalHome localHomeAnn = ejbClass.getAnnotation(LocalHome.class);    // ejb/0f6f    if (localHomeAnn != null) {      Class localHome = localHomeAnn.value();      setLocalHome(localHome);    }    RemoteHome remoteHomeAnn = ejbClass.getAnnotation(RemoteHome.class);    // ejb/0f6f    if (remoteHomeAnn != null) {      Class home = remoteHomeAnn.value();      setHome(home);    }  }  /**   * Deploys the bean.   */  @Override  public AbstractServer deployServer(EjbContainer ejbContainer,                                     JavaClassGenerator javaGen)    throws ClassNotFoundException, ConfigException  {    AbstractServer server;    if (isStateless())      server = new StatelessServer(ejbContainer);    else      server = new StatefulServer(ejbContainer);    server.setModuleName(getEJBModuleName());    server.setEJBName(getEJBName());    server.setMappedName(getMappedName());    server.setId(getEJBModuleName() + "#" + getEJBName());    server.setContainerTransaction(_isContainerTransaction);        server.setEjbClass(loadClass(getEJBClass().getName()));    ApiClass remoteHome = getRemoteHome();    if (remoteHome != null)      server.setRemoteHomeClass(loadClass(remoteHome.getName()));    ArrayList<ApiClass> remoteList = _sessionBean.getRemoteApi();    if (remoteList.size() > 0) {      ArrayList<Class> classList = new ArrayList<Class>();      for (ApiClass apiClass : remoteList) {	classList.add(loadClass(apiClass.getName()));      }            server.setRemoteApiList(classList);    }    /*    if (getRemote21() != null)      server.setRemote21(loadClass(getRemote21().getName()));     */    ApiClass localHome = getLocalHome();    if (localHome != null)      server.setLocalHomeClass(loadClass(localHome.getName()));    ArrayList<ApiClass> localList = _sessionBean.getLocalApi();    if (localList.size() > 0) {      ArrayList<Class> classList = new ArrayList<Class>();      for (ApiClass apiClass : localList) {	classList.add(loadClass(apiClass.getName()));      }            server.setLocalApiList(classList);    }    /*    if (getLocal21() != null)      server.setLocal21(loadClass(getLocal21().getName()));     */        Class contextImplClass = javaGen.loadClass(getSkeletonName());    server.setContextImplClass(contextImplClass);    Class beanClass = javaGen.loadClass(getEJBClass().getName());    Thread thread = Thread.currentThread();    ClassLoader oldLoader = thread.getContextClassLoader();    try {      thread.setContextClassLoader(server.getClassLoader());      ContainerProgram initContainer = getInitProgram();      server.setInitProgram(initContainer);      try {        if (getServerProgram() != null)          getServerProgram().configure(server);      } catch (RuntimeException e) {        throw e;      } catch (Exception e) {        throw ConfigException.create(e);      }    } finally {      thread.setContextClassLoader(oldLoader);    }    return server;  }  private void introspectSession()    throws ConfigException  {    ApiClass ejbClass = getEJBClassWrapper();    if (ejbClass.isAnnotationPresent(Stateless.class))      introspectStateless(ejbClass);    else if (ejbClass.isAnnotationPresent(Stateful.class))      introspectStateful(ejbClass);  }  private void introspectStateless(ApiClass type)    throws ConfigException  {    String className = type.getName();    Stateless stateless = type.getAnnotation(Stateless.class);    setAllowPOJO(true);    setSessionType("Stateless");    setTransactionType(type);    String name;    if (stateless != null)      name = stateless.name();    else      name = className;    introspectBean(type, name);  }  private void introspectStateful(ApiClass type)    throws ConfigException  {    String className = type.getName();    Stateful stateful = type.getAnnotation(Stateful.class);    setAllowPOJO(true);    setSessionType("Stateful");    setTransactionType(type);    String name;    if (stateful != null)      name = stateful.name();    else      name = className;    introspectBean(type, name);  }  private void setTransactionType(ApiClass type)  {    TransactionManagement transaction      = type.getAnnotation(TransactionManagement.class);        if (transaction == null)      setTransactionType("Container");    else if (TransactionManagementType.BEAN.equals(transaction.value()))      setTransactionType("Bean");    else      setTransactionType("Container");  }  private void validateMethods()    throws ConfigException  {  }  /**   * Validates the home interface.   */  private void validateHome(ApiClass homeClass, ApiClass objectClass)    throws ConfigException  {    ApiClass beanClass = getEJBClassWrapper();    String beanName = beanClass.getName();    if (homeClass == null)      return;    String homeName = homeClass.getName();    String objectName = objectClass.getName();    boolean hasFindByPrimaryKey = false;    if (! homeClass.isPublic())      throw error(L.l("'{0}' must be public", homeName));    if (beanClass.isFinal())      throw error(L.l("'{0}' must not be final", beanName));    if (beanClass.isAbstract())      throw error(L.l("'{0}' must not be abstract", beanName));    if (! homeClass.isInterface())      throw error(L.l("'{0}' must be an interface", homeName));    boolean hasCreate = false;    for (ApiMethod method : homeClass.getMethods()) {      String name = method.getName();      Class []param = method.getParameterTypes();      Class retType = method.getReturnType();      if (method.getDeclaringClass().isAssignableFrom(EJBHome.class)	  || method.getDeclaringClass().isAssignableFrom(EJBLocalHome.class))        continue;      if (EJBHome.class.isAssignableFrom(homeClass.getJavaClass()))        validateException(method, java.rmi.RemoteException.class);      if (name.startsWith("create")) {        hasCreate = true;        // TCK: ejb30/bb/session/stateless/migration/twothree/descriptor/callLocalSameTxContextTest        // XXX TCK, needs QA: if a stateless session bean has EJB 3.0 and 2.1 interfaces,        // it is not required to have a matching ejbCreate().        // It may have a @PostConstruct method, if any.        if (isStateless() && name.equals("create"))          continue;        if (isStateless() && (! name.equals("create")			      || method.getParameterTypes().length != 0)) {          throw error(L.l("{0}: '{1}' forbidden in stateless session home.  The create() method for a stateless session bean must have zero arguments.",                          method.getFullName(),                          homeName));        }        if (! isAllowPOJO())          validateException(method, CreateException.class);        /* XXX: ejb/0f6f           The session bean might have @RemoteHome for EJB 2.1 and the @Remote interface for EJB 3.0           TCK: ejb30/bb/session/stateful/sessioncontext/annotated        if (! retType.equals(objectClass))          throw error(L.l("{0}: '{1}' must return {2}.  Create methods must return the local or remote interface.",                          homeName,                          method.getFullName(),                          objectClass.getName()));        */        String createName = "ejbC" + name.substring(1);        ApiMethod implMethod =          validateNonFinalMethod(createName, param,                                 method, homeClass, isAllowPOJO());        if (implMethod != null) {          if (! implMethod.getReturnType().getName().equals("void"))            throw error(L.l("'{0}' must return {1} in {2}",                            getFullMethodName(createName, param),                            "void",                            beanName));          validateExceptions(method, implMethod.getExceptionTypes());        }      }      else if (name.startsWith("ejb") || name.startsWith("remove")) {        throw error(L.l("'{0}' forbidden in {1}",                        method.getFullName(),                        homeClass.getName()));      }    }    if (! hasCreate)      throw error(L.l("'{0}' needs at least one create method.  Session beans need a create method.",                      homeClass.getName()));  }}

⌨️ 快捷键说明

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