public void say() {
    if (null != list && 0 != list.size()) {
      System.out.println("list...");
      for (BeanInterface bean : list) {
        System.out.println(bean.getClass().getName());
      }
    } else {
      System.out.println("List<BeanInterface> list is null !!!!!!!!!!");
    }

    System.out.println();

    if (null != map && 0 != map.size()) {
      System.out.println("map...");
      for (Map.Entry<String, BeanInterface> entry : map.entrySet()) {
        System.out.println(entry.getKey() + "      " + entry.getValue().getClass().getName());
      }
    } else {
      System.out.println("Map<String, BeanInterface> map is null !!!!!!!!!!");
    }

    System.out.println();
    if (null != beanInterface) {
      System.out.println(beanInterface.getClass().getName());
    } else {
      System.out.println("beanInterface is null...");
    }
  }
  public void test() throws Exception {
    System.setProperty(
        javax.naming.Context.INITIAL_CONTEXT_FACTORY, LocalInitialContextFactory.class.getName());
    final Assembler assembler = new Assembler();
    final ConfigurationFactory config = new ConfigurationFactory();

    assembler.createProxyFactory(config.configureService(ProxyFactoryInfo.class));
    assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
    assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));

    final EjbJar ejbJar = new EjbJar();
    final AssemblyDescriptor assemblyDescriptor = ejbJar.getAssemblyDescriptor();

    final Interceptor interceptor = new Interceptor(SimpleInterceptor.class);
    ejbJar.addInterceptor(interceptor);

    // Test SessionSynchronization interface
    final StatefulBean subBeanA = new StatefulBean(SubBeanA.class);
    ejbJar.addEnterpriseBean(subBeanA);
    assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(subBeanA, interceptor));

    // Test configure session synchronization callback methods in deployment plan
    final StatefulBean subBeanB = new StatefulBean(SubBeanB.class);
    subBeanB.setAfterBeginMethod(new NamedMethod(SubBeanB.class.getDeclaredMethod("afterBegin")));
    subBeanB.setBeforeCompletionMethod(
        new NamedMethod(SubBeanB.class.getDeclaredMethod("beforeCompletion")));
    subBeanB.setAfterCompletionMethod(
        new NamedMethod(SubBeanB.class.getDeclaredMethod("afterCompletion", boolean.class)));
    ejbJar.addEnterpriseBean(subBeanB);
    assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(subBeanB, interceptor));

    // Test session synchronization methods via annotations
    final StatefulBean subBeanC = new StatefulBean(SubBeanC.class);
    ejbJar.addEnterpriseBean(subBeanC);
    assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(subBeanC, interceptor));

    // Test override the annotations by deployment plan
    final StatefulBean subBeanD = new StatefulBean(SubBeanD.class);
    subBeanD.setAfterBeginMethod(
        new NamedMethod(SubBeanD.class.getDeclaredMethod("afterBeginNew")));
    subBeanD.setBeforeCompletionMethod(
        new NamedMethod(SubBeanD.class.getDeclaredMethod("beforeCompletionNew")));
    subBeanD.setAfterCompletionMethod(
        new NamedMethod(SubBeanD.class.getDeclaredMethod("afterCompletionNew", boolean.class)));
    ejbJar.addEnterpriseBean(subBeanD);
    assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(subBeanD, interceptor));

    // Test only one session synchronization method @AfterBegin
    final StatefulBean subBeanE = new StatefulBean(SubBeanE.class);
    ejbJar.addEnterpriseBean(subBeanE);
    assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(subBeanE, interceptor));

    // Test only one session synchronization method @AfterCompletion
    final StatefulBean subBeanF = new StatefulBean(SubBeanF.class);
    ejbJar.addEnterpriseBean(subBeanF);
    assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(subBeanF, interceptor));

    // Test only one session synchronization method @BeforeCompletion
    final StatefulBean subBeanG = new StatefulBean(SubBeanG.class);
    ejbJar.addEnterpriseBean(subBeanG);
    assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(subBeanG, interceptor));

    // Test SessionSynchronization interface but methods are in the parent class
    // Interceptor is declared on the bean method
    final StatefulBean subBeanH = new StatefulBean(SubBeanH.class);
    ejbJar.addEnterpriseBean(subBeanH);

    // Test SessionSynchronization interface but methods are in the parent class
    // using @LocalBean
    final StatefulBean subBeanI = new StatefulBean(SubBeanI.class);
    ejbJar.addEnterpriseBean(subBeanI);

    final EjbJarInfo ejbJarInfo = config.configureApplication(ejbJar);
    assembler.createApplication(ejbJarInfo);
    final InitialContext context = new InitialContext();

    final List<Call> expectedResult =
        Arrays.asList(
            Call.INTERCEPTOR_AFTER_BEGIN,
            Call.BEAN_AFTER_BEGIN,
            Call.INTERCEPTOR_AROUND_INVOKE_BEGIN,
            Call.BEAN_AROUND_INVOKE_BEGIN,
            Call.BEAN_METHOD,
            Call.BEAN_AROUND_INVOKE_AFTER,
            Call.INTERCEPTOR_AROUND_INVOKE_AFTER,
            Call.INTERCEPTOR_BEFORE_COMPLETION,
            Call.BEAN_BEFORE_COMPLETION,
            Call.INTERCEPTOR_AFTER_COMPLETION,
            Call.BEAN_AFTER_COMPLETION);

    {
      final BeanInterface beanA = (BeanInterface) context.lookup("SubBeanALocal");
      beanA.simpleMethod();
      assertEquals(expectedResult, result);
      result.clear();
    }

    {
      final BeanInterface beanB = (BeanInterface) context.lookup("SubBeanBLocal");
      beanB.simpleMethod();
      assertEquals(expectedResult, result);
      result.clear();
    }

    {
      final BeanInterface beanC = (BeanInterface) context.lookup("SubBeanCLocal");
      beanC.simpleMethod();
      assertEquals(expectedResult, result);
      result.clear();
    }

    {
      final BeanInterface beanD = (BeanInterface) context.lookup("SubBeanDLocal");
      beanD.simpleMethod();
      assertEquals(expectedResult, result);
      result.clear();
    }

    {
      final BeanInterface beanE = (BeanInterface) context.lookup("SubBeanELocal");
      beanE.simpleMethod();
      assertEquals(
          Arrays.asList(
              Call.INTERCEPTOR_AFTER_BEGIN,
              Call.BEAN_AFTER_BEGIN,
              Call.INTERCEPTOR_AROUND_INVOKE_BEGIN,
              Call.BEAN_AROUND_INVOKE_BEGIN,
              Call.BEAN_METHOD,
              Call.BEAN_AROUND_INVOKE_AFTER,
              Call.INTERCEPTOR_AROUND_INVOKE_AFTER,
              Call.INTERCEPTOR_BEFORE_COMPLETION,
              Call.INTERCEPTOR_AFTER_COMPLETION),
          result);
      result.clear();
    }

    {
      final BeanInterface beanF = (BeanInterface) context.lookup("SubBeanFLocal");
      beanF.simpleMethod();
      assertEquals(
          Arrays.asList(
              Call.INTERCEPTOR_AFTER_BEGIN,
              Call.INTERCEPTOR_AROUND_INVOKE_BEGIN,
              Call.BEAN_AROUND_INVOKE_BEGIN,
              Call.BEAN_METHOD,
              Call.BEAN_AROUND_INVOKE_AFTER,
              Call.INTERCEPTOR_AROUND_INVOKE_AFTER,
              Call.INTERCEPTOR_BEFORE_COMPLETION,
              Call.INTERCEPTOR_AFTER_COMPLETION,
              Call.BEAN_AFTER_COMPLETION),
          result);
      result.clear();
    }

    {
      final BeanInterface beanG = (BeanInterface) context.lookup("SubBeanGLocal");
      beanG.simpleMethod();
      assertEquals(
          Arrays.asList(
              Call.INTERCEPTOR_AFTER_BEGIN,
              Call.INTERCEPTOR_AROUND_INVOKE_BEGIN,
              Call.BEAN_AROUND_INVOKE_BEGIN,
              Call.BEAN_METHOD,
              Call.BEAN_AROUND_INVOKE_AFTER,
              Call.INTERCEPTOR_AROUND_INVOKE_AFTER,
              Call.INTERCEPTOR_BEFORE_COMPLETION,
              Call.BEAN_BEFORE_COMPLETION,
              Call.INTERCEPTOR_AFTER_COMPLETION),
          result);
      result.clear();
    }

    final List<Call> synchAndArroundInvokeResult =
        Arrays.asList(
            Call.BEAN_AFTER_BEGIN,
            Call.INTERCEPTOR_AROUND_INVOKE_BEGIN,
            Call.BEAN_AROUND_INVOKE_BEGIN,
            Call.BEAN_METHOD,
            Call.BEAN_AROUND_INVOKE_AFTER,
            Call.INTERCEPTOR_AROUND_INVOKE_AFTER,
            Call.BEAN_BEFORE_COMPLETION,
            Call.BEAN_AFTER_COMPLETION);
    {
      final BeanInterface beanH = (BeanInterface) context.lookup("SubBeanHLocal");
      beanH.simpleMethod();
      assertEquals(synchAndArroundInvokeResult, result);
      result.clear();
    }

    {
      final BeanInterface beanI = (BeanInterface) context.lookup("SubBeanILocalBean");
      beanI.simpleMethod();
      assertEquals(synchAndArroundInvokeResult, result);
      result.clear();
    }
  }