`

Seam

    博客分类:
  • seam
阅读更多
以Key-组件Class Value-组件@Name内的名称,名称缓存
同时缓存EJB部署描述符及EJB类加载器
//$Id: Seam.java 10262 2009-04-01 07:03:21Z dan.j.allen $
package org.jboss.seam;

import static org.jboss.seam.ComponentType.ENTITY_BEAN;
import static org.jboss.seam.ComponentType.JAVA_BEAN;
import static org.jboss.seam.ComponentType.MESSAGE_DRIVEN_BEAN;
import static org.jboss.seam.ComponentType.STATEFUL_SESSION_BEAN;
import static org.jboss.seam.ComponentType.STATELESS_SESSION_BEAN;
import static org.jboss.seam.util.EJB.MESSAGE_DRIVEN;
import static org.jboss.seam.util.EJB.STATEFUL;
import static org.jboss.seam.util.EJB.STATELESS;
import static org.jboss.seam.util.EJB.name;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import javax.persistence.Entity;

import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Role;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.contexts.Lifecycle;
import org.jboss.seam.init.EjbDescriptor;
import org.jboss.seam.init.DeploymentDescriptor;
import org.jboss.seam.util.Strings;
import org.jboss.seam.web.Session;

/**
 * Convenience methods for accessing annotated information
 * about Seam component classes.
 * 利用全局缓存保存Seam组件,EJB部署描述符,类加载器
 * Model保存bean class或者是说保存Seam组件保存的Class,而Component保存在ApplicationContext中
 * Seam保存Component的Class
 * 
 * @author Gavin King
 */
public class Seam
{
   private static final Map<Class, String> COMPONENT_NAME_CACHE = new ConcurrentHashMap<Class, String>();
   private static final Map<Class, EjbDescriptor> EJB_DESCRIPTOR_CACHE = new ConcurrentHashMap<Class, EjbDescriptor>();
   private static final Set<ClassLoader> CLASSLOADERS_LOADED = new HashSet<ClassLoader>(); 

   // application-scoped property in which the Seam version is stored
   public static final String VERSION = "org.jboss.seam.version";
  /**
   * 获取EJB描述符,如果缓存中没有,则利用ClassLoader进行加载,同时缓存ClassLoader
   */
   public static EjbDescriptor getEjbDescriptor(Class clazz)
   {
      EjbDescriptor info = EJB_DESCRIPTOR_CACHE.get(clazz);
      if (info != null) 
      {
          return info;
      }
      else if (!CLASSLOADERS_LOADED.contains(clazz.getClassLoader()))
      {
         cacheEjbDescriptors(clazz);
         return EJB_DESCRIPTOR_CACHE.get(clazz);
      }
      
      return null;
   }
   /**
    * 对全局变量进行操作,进行了同步
    */
   private synchronized static void cacheEjbDescriptors(Class clazz)
   {
      if (!CLASSLOADERS_LOADED.contains(clazz.getClassLoader()))
      {         
         Map<Class, EjbDescriptor> ejbDescriptors = new DeploymentDescriptor(clazz).getEjbDescriptors();
         EJB_DESCRIPTOR_CACHE.putAll(ejbDescriptors);
         CLASSLOADERS_LOADED.add(clazz.getClassLoader());         
      }
   } 
  
   /**
    * Get the default scope
    * @see Scope
    */
   public static ScopeType getComponentScope(Class<?> clazz)
   {
       return clazz.isAnnotationPresent(Scope.class) ?
               clazz.getAnnotation(Scope.class).value() :
               getComponentType(clazz).getDefaultScope();//根据组件类型 获取默认的Scope
   }
   
   /**
    * Get the scope for a role
    * @see Scope
    */
   public static ScopeType getComponentRoleScope(Class clazz, Role role)
   {
      return role.scope()==ScopeType.UNSPECIFIED ?
            getComponentType(clazz).getDefaultScope() :
            role.scope();
   }
   
   /**
    * Get the component type
    */
   public static ComponentType getComponentType(Class<?> clazz)
   {
      if ( clazz.isAnnotationPresent(STATEFUL) ) //是否标记Seam物状态
      {
          return STATEFUL_SESSION_BEAN;
      } 
      else if ( clazz.isAnnotationPresent(STATELESS) ) 
      {
          return STATELESS_SESSION_BEAN;
      } 
      else if ( clazz.isAnnotationPresent(MESSAGE_DRIVEN) ) 
      {
          return MESSAGE_DRIVEN_BEAN;
      } 
      else if ( clazz.isAnnotationPresent(Entity.class) ) 
      {
          return ENTITY_BEAN;
      } 
      else 
      {          
         EjbDescriptor ejbDescriptor = getEjbDescriptor(clazz);//根据Ejb描述符获取Bean的类型
         if (ejbDescriptor == null) 
         {
            return JAVA_BEAN; //默认为Java bean
         }
         else
         {
            return ejbDescriptor.getBeanType();
         }
      }      
   }
      
   /**
    * Get the component name
    * @see Name
    */
   public static String getComponentName(Class<?> clazz)
   {
      String result = COMPONENT_NAME_CACHE.get(clazz);
      if (result==null)
      {
         result = searchComponentName(clazz);
         if (result!=null)
         {
            COMPONENT_NAME_CACHE.put(clazz, result);
         }
      }
      return result;
   }
   /**
    * 获取@Name的Value,如果没有则找寻父类,一直到Object.class
    */
   public static String searchComponentName(Class<?> clazz)
   {
      while ( clazz!=null && !Object.class.equals(clazz) )
      {
         Name name = clazz.getAnnotation(Name.class);
         if ( name!=null ) return name.value();
         clazz = clazz.getSuperclass();
      }
      return null;
   }
   
   /**
    * Get the bean class from a container-generated proxy
    * class
    * 1.是否有Entity标记 >return 
    *                   < if EJB描述符具有 > if 是EntityBean >return clazz
    *                                                       <return null
    *                                     < clazz = clazz.super..
    * 最后< return
    */
   public static Class getEntityClass(Class clazz)
   {
      while (clazz != null && !Object.class.equals(clazz))
      {
         if (clazz.isAnnotationPresent(Entity.class))
         {
            return clazz;
         }
         else
         {
            EjbDescriptor ejbDescriptor = Seam.getEjbDescriptor(clazz);
            if (ejbDescriptor != null)
            {
               return ejbDescriptor.getBeanType() == ComponentType.ENTITY_BEAN ? clazz : null;
            }
            else
            {
               clazz = clazz.getSuperclass();
            }
         }
      }
      return null;
   }
   
   /**
    * Is the class a container-generated proxy class for an 
    * entity bean?
    */
   public static boolean isEntityClass(Class<?> clazz)
   {
      return getEntityClass(clazz)!=null;
   }
   /**
    * 获取EJB组件名称,1 元数据 2 xml
    */
   public static String getEjbName(Class<?> clazz)
   {
       switch ( getComponentType(clazz) ) 
       {
           case ENTITY_BEAN:
           case JAVA_BEAN:
               return null;
           case STATEFUL_SESSION_BEAN:
               return clazz.isAnnotationPresent(STATEFUL) ? 
                     getStatefulEjbName(clazz) : getEjbNameFromDescriptor(clazz);
           case STATELESS_SESSION_BEAN:
               return clazz.isAnnotationPresent(STATELESS) ?
                     getStatelessEjbName(clazz) : getEjbNameFromDescriptor(clazz);
           case MESSAGE_DRIVEN_BEAN:
               return clazz.isAnnotationPresent(MESSAGE_DRIVEN) ?
                     getMessageDrivenEjbName(clazz) : getEjbNameFromDescriptor(clazz);
           default:
               throw new IllegalArgumentException();
       }
   }

   private static String getMessageDrivenEjbName(Class<?> clazz)
   {
      String mdName = name( clazz.getAnnotation(MESSAGE_DRIVEN) );
      return mdName.equals("") ? unqualifyClassName(clazz) : mdName;
   }

   private static String getStatelessEjbName(Class<?> clazz)
   {
      String statelessName = name( clazz.getAnnotation(STATELESS) );
      return statelessName.equals("") ? unqualifyClassName(clazz) : statelessName;
   }

   private static String getStatefulEjbName(Class<?> clazz)
   {
      String statefulName = name( clazz.getAnnotation(STATEFUL) );
      return statefulName.equals("") ? unqualifyClassName(clazz) : statefulName;
   }

   private static String getEjbNameFromDescriptor(Class<?> clazz)
   {
      EjbDescriptor ejbDescriptor = getEjbDescriptor(clazz);
      return ejbDescriptor==null ? null : ejbDescriptor.getEjbName();
   }
   
   private static String unqualifyClassName(Class<?> clazz) 
   {
      return Strings.unqualify( Strings.unqualify( clazz.getName() ), '$' );
   }
   
   public static boolean isInterceptionEnabled(Class<?> clazz)
   {
      ComponentType componentType = getComponentType(clazz);
      if ( componentType==ENTITY_BEAN )
      {
         return false; //entity bean 无拦截
      }
      else if ( getComponentType(clazz)==MESSAGE_DRIVEN_BEAN )
      {
         return true;
      }
      else if ( clazz.isAnnotationPresent(BypassInterceptors.class) )
      {
         return false;
      }
      else 
      {
         return true;
      }
   }
   
   /**
    * Mark the session for invalidation at the end of the 
    * request cycle
    * 
    * @deprecated use Session.instance().invalidate()
    */
   public static void invalidateSession()
   {
      Session.instance().invalidate();
   }
   
   /**
    * Is the session marked for invalidation?
    * 
    * @deprecated use Session.instance().isInvalidated()
    */
   public static boolean isSessionInvalid()
   {
      return Session.instance().isInvalid();
   }
   
   /**
    * Get the Seam component, even if no application context
    * is associated with the current thread.
    */
   public static Component componentForName(String name)
   {
      if ( Contexts.isApplicationContextActive() )
      {
         return Component.forName(name);
      }
      else
      {
         Lifecycle.setupApplication();
         try
         {
            return Component.forName(name);
         }
         finally
         {
            Lifecycle.cleanupApplication();
         }
      }
   }
   
   public static String getVersion()
   {
      Package pkg = Seam.class.getPackage();
      return pkg != null ? pkg.getImplementationVersion() : null;      
   }
   
   public static void clearComponentNameCache()
   {
      COMPONENT_NAME_CACHE.clear();
      EJB_DESCRIPTOR_CACHE.clear();
   }
   
}


分享到:
评论

相关推荐

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

    seam需要的jar包

    Seam框架是一个全面的Java企业级应用开发框架,它整合了JSF(JavaServer Faces)、EJB、CDI(Contexts and Dependency Injection)以及许多其他Java EE技术,为开发者提供了强大的组件模型和丰富的功能,旨在简化...

    jboss seam 2.01GA REF DOC

    ### JBoss Seam 2.01GA REF DOC #### 引言:JBoss Seam概览与功能介绍 JBoss Seam 是一个为简化企业级 Java 应用开发而设计的框架。它结合了 JavaServer Faces (JSF)、Java Persistence API (JPA) 和 Java ...

    Seam Carving的C++实现代码

    Seam Carving是一种图像内容感知的尺寸调整方法,它能够在保持图像主要结构不变的情况下,智能地减少或增加图像的宽度和高度。这种方法是由Amit Agarwal和Matthieu Salzmann于2007年提出的,其核心思想是通过找到...

    (可直接运行)国外的seam carving matlab源码(包含gui)

    Seam Carving是一种图像处理技术,常用于动态调整图像大小,尤其在保持视觉质量的同时减小或增大图像的尺寸。这种技术的核心理念是通过找出并移除(或添加)图像中的“能量最小”像素行(或列),这些行(或列)被...

    seam_carving 代码实现 seam

    **Seam Carving 技术详解** Seam Carving,又称图像拉链,是一种基于能量最小化的图像调整方法,主要用于图像大小的动态调整,而不仅仅是简单的等比例缩放。它能够在保持图像主要结构不变的情况下,根据需要增加或...

    seam插件下载地址及安装过程

    Seam 是一个开源的 Java 框架,主要用于简化企业级 Java 应用程序的开发,特别是与 JBoss 服务器的集成。它提供了一个统一的框架来整合多种技术,包括 JavaServer Faces (JSF)、Java Persistence API (JPA) 和 Java ...

    Seam框架文档简述

    ### Seam框架核心知识点详解 #### 一、Seam框架简介 Seam,全称为JBoss Seam,是一款基于Java EE 5的技术栈构建的应用框架。它通过整合JSF(JavaServer Faces)与EJB 3.0(Enterprise JavaBeans 3.0)组件,并充分...

    jboss seam 学习资料,seam in action和官方手册

    **JBoss Seam 学习资源概述** JBoss Seam 是一个开源的应用程序框架,它整合了JavaServer Faces (JSF)、Enterprise JavaBeans (EJB)、Java Persistence API (JPA) 和其他Java EE技术,旨在简化开发过程,提高开发...

    Matlab实现SeamCarving算法 放大缩小图片(包含GUI)

    SeamCarving是一种图像处理技术,它通过删除或添加垂直或水平的像素“接缝”来改变图像的尺寸,而尽量保持视觉质量。在Matlab中实现SeamCarving算法,可以为图像的无损缩放提供一种有效的方法。下面我们将深入探讨这...

    MATLAB_Seam_Carving_seamcarving_

    MATLAB_Seam_Carving_seamcarving_ 是一个与图像处理相关的项目,主要涉及到一种称为“seam carving”的技术,这是一种动态图像调整大小的方法,它可以在不改变图像整体视觉效果的情况下,增加或减少图像的宽度和...

    JBOSS SEAM组件中文手册

    **JBoss Seam组件中文手册** **一、Seam框架概述** Seam是一个开源的企业级Java框架,由JBoss公司开发,旨在简化Java EE应用程序的开发。它将多种技术如JavaServer Faces (JSF),Java Persistence API (JPA),EJB 3...

    seam in action 中文 english

    《Seam in Action》是一本专门探讨Seam框架的书籍,该书分为中文和英文两个版本,对于初学者和有经验的开发者来说都是一个宝贵的资源。Seam是一个强大的Java EE框架,它集成了多种技术,如JavaServer Faces (JSF)、...

    SEAM 中文开发指南

    ### SEAM 中文开发指南知识点概述 #### 一、SEAM 框架简介 - **SEAM**:SEAM 是一个基于 Java EE 的企业级应用框架,它简化了复杂的应用程序开发过程,并且提供了丰富的功能来支持业务逻辑的实现。 - **版本信息**...

    seam参考手册中文版

    ### Seam参考手册中文版知识点概览 #### 一、Seam简介及基本概念 ##### JBoss Seam概述 - **Seam**是JBoss家族中的一员,它是一个建立于Java EE平台之上的开源框架,旨在简化企业级应用的开发过程。 - **版本**: ...

    Jboss Seam中文版

    ### JBoss Seam中文版知识点详解 #### JBoss Seam简介 JBoss Seam是一个强大的企业级应用开发框架,基于Java EE标准,特别强调简化Web应用的开发流程。它通过整合多种技术如JSF、EJB 3.0等,提供了一种更为高效、...

    seam_in_action

    根据提供的信息,我们可以推断出这是一本关于 Seam 框架的专业书籍,书名为《Seam in Action》,作者为 Dan Allen 和 Manning 出版社出版。本书主要讲解了 Seam 框架在 Java EE 3 环境中的应用与开发实践。接下来将...

    Seam - 语境相关的组件

    Seam是一种Java EE框架,它在开发企业级应用程序时提供了高度集成和语境相关的组件模型。这个框架的主要目标是简化复杂性,使开发者能够更高效地构建动态、响应式的Web应用。Seam的核心理念是将不同的技术,如Java...

    seam的注解和标签

    Seam是一个Java EE框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Inversion of Control(IoC)和Enterprise JavaBeans(EJB)等技术融合在一起,为开发复杂的Web应用程序提供了便利。在Seam框架...

    整合了seam的一些资源

    Seam 是一个全面的Java开发框架,主要用于构建企业级的Web应用程序。它融合了JavaServer Faces(JSF)和Java Persistence API(JPA),并集成了Enterprise JavaBeans(EJB)、Ajax、CDI(Contexts and Dependency ...

Global site tag (gtag.js) - Google Analytics