Пример #1
0
 ViewService(final ViewConfiguration viewConfiguration) {
   viewClass = viewConfiguration.getViewClass();
   final ProxyFactory<?> proxyFactory = viewConfiguration.getProxyFactory();
   this.proxyFactory = proxyFactory;
   final Method[] methods = proxyFactory.getCachedMethods();
   final int methodCount = methods.length;
   viewPostConstruct =
       Interceptors.getChainedInterceptorFactory(
           viewConfiguration.getViewPostConstructInterceptors());
   viewPreDestroy =
       Interceptors.getChainedInterceptorFactory(
           viewConfiguration.getViewPreDestroyInterceptors());
   clientPostConstruct =
       Interceptors.getChainedInterceptorFactory(
           viewConfiguration.getClientPostConstructInterceptors());
   clientPreDestroy =
       Interceptors.getChainedInterceptorFactory(
           viewConfiguration.getClientPreDestroyInterceptors());
   final IdentityHashMap<Method, InterceptorFactory> viewInterceptorFactories =
       new IdentityHashMap<Method, InterceptorFactory>(methodCount);
   final IdentityHashMap<Method, InterceptorFactory> clientInterceptorFactories =
       new IdentityHashMap<Method, InterceptorFactory>(methodCount);
   for (Method method : methods) {
     if (method.getName().equals("finalize") && method.getParameterTypes().length == 0) {
       viewInterceptorFactories.put(method, DESTROY_INTERCEPTOR);
     } else {
       viewInterceptorFactories.put(
           method,
           Interceptors.getChainedInterceptorFactory(
               viewConfiguration.getViewInterceptorDeque(method)));
       clientInterceptorFactories.put(
           method,
           Interceptors.getChainedInterceptorFactory(
               viewConfiguration.getClientInterceptorDeque(method)));
     }
   }
   this.viewInterceptorFactories = viewInterceptorFactories;
   this.clientInterceptorFactories = clientInterceptorFactories;
   allowedMethods = Collections.unmodifiableSet(viewInterceptorFactories.keySet());
 }
  /**
   * Construct a new instance.
   *
   * @param componentConfiguration the component configuration
   */
  public EJBComponentCreateService(
      final ComponentConfiguration componentConfiguration,
      final ApplicationExceptions applicationExceptions) {
    super(componentConfiguration);

    this.applicationExceptions = applicationExceptions;
    final EJBComponentDescription ejbComponentDescription =
        (EJBComponentDescription) componentConfiguration.getComponentDescription();
    this.transactionManagementType = ejbComponentDescription.getTransactionManagementType();

    this.timerService = ejbComponentDescription.getTimerService();
    this.policyContextID = ejbComponentDescription.getPolicyContextID();

    // CMTTx
    if (transactionManagementType.equals(TransactionManagementType.CONTAINER)) {
      this.txAttrs = new HashMap<MethodTransactionAttributeKey, TransactionAttributeType>();
      this.txTimeouts = new HashMap<MethodTransactionAttributeKey, Integer>();
    } else {
      this.txAttrs = null;
      this.txTimeouts = null;
    }
    // Setup the security metadata for the bean
    this.securityMetaData = new EJBSecurityMetaData(componentConfiguration);

    if (ejbComponentDescription.isTimerServiceRequired()) {
      Map<Method, InterceptorFactory> timeoutInterceptors =
          new IdentityHashMap<Method, InterceptorFactory>();
      for (Method method : componentConfiguration.getDefinedComponentMethods()) {
        if ((ejbComponentDescription.getTimeoutMethod() != null
                && ejbComponentDescription.getTimeoutMethod().equals(method))
            || ejbComponentDescription.getScheduleMethods().containsKey(method)) {
          final InterceptorFactory interceptorFactory =
              Interceptors.getChainedInterceptorFactory(
                  componentConfiguration.getAroundTimeoutInterceptors(method));
          timeoutInterceptors.put(method, interceptorFactory);
        }
      }
      this.timeoutInterceptors = timeoutInterceptors;
    } else {
      timeoutInterceptors = Collections.emptyMap();
    }

    List<ViewConfiguration> views = componentConfiguration.getViews();
    if (views != null) {
      for (ViewConfiguration view : views) {
        // TODO: Move this into a configurator
        final EJBViewConfiguration ejbView = (EJBViewConfiguration) view;
        final MethodIntf viewType = ejbView.getMethodIntf();
        for (Method method : view.getProxyFactory().getCachedMethods()) {
          // TODO: proxy factory exposes non-public methods, is this a bug in the no-interface view?
          if (!Modifier.isPublic(method.getModifiers())) continue;
          final Method componentMethod =
              getComponentMethod(
                  componentConfiguration, method.getName(), method.getParameterTypes());
          if (componentMethod != null) {
            this.processTxAttr(ejbComponentDescription, viewType, componentMethod);
          } else {
            this.processTxAttr(ejbComponentDescription, viewType, method);
          }
        }
      }
    }

    this.timeoutMethod = ejbComponentDescription.getTimeoutMethod();

    // FIXME: TODO: a temporary measure until EJBTHREE-2120 is fully resolved, let's create tx
    // attribute map
    // for the component methods. Once the issue is resolved, we should get rid of this block and
    // just rely on setting
    // up the tx attributes only for the views exposed by this component
    // AS7-899: We only want to process public methods of the proper sub-class.
    // (getDefinedComponentMethods returns all in random order)
    // TODO: use ClassReflectionIndex (low prio, because we store the result without class name)
    // (which is a bug: AS7-905)
    Set<Method> lifeCycle = new HashSet<>(componentConfiguration.getLifecycleMethods());
    for (Method method : componentConfiguration.getComponentClass().getMethods()) {
      this.processTxAttr(ejbComponentDescription, MethodIntf.BEAN, method);
      lifeCycle.remove(method);
    }
    // now handle non-public lifecycle methods declared on the bean class itself
    // see WFLY-4127
    for (Method method : lifeCycle) {
      if (method.getDeclaringClass().equals(componentConfiguration.getComponentClass())) {
        this.processTxAttr(ejbComponentDescription, MethodIntf.BEAN, method);
      }
    }

    final HashMap<String, ServiceName> viewServices = new HashMap<String, ServiceName>();
    for (ViewDescription view : componentConfiguration.getComponentDescription().getViews()) {
      viewServices.put(view.getViewClassName(), view.getServiceName());
    }
    this.viewServices = viewServices;
    final EjbHomeViewDescription localHome = ejbComponentDescription.getEjbLocalHomeView();
    this.ejbLocalHome =
        localHome == null ? null : ejbComponentDescription.getEjbLocalHomeView().getServiceName();
    final EjbHomeViewDescription home = ejbComponentDescription.getEjbHomeView();
    this.ejbHome = home == null ? null : home.getServiceName();
    final EJBViewDescription ejbObject = ejbComponentDescription.getEjbRemoteView();
    this.ejbObject = ejbObject == null ? null : ejbObject.getServiceName();
    final EJBViewDescription ejbLocalObject = ejbComponentDescription.getEjbLocalView();
    this.ejbLocalObject = ejbLocalObject == null ? null : ejbLocalObject.getServiceName();
    this.applicationName = componentConfiguration.getApplicationName();
    this.earApplicationName =
        componentConfiguration
            .getComponentDescription()
            .getModuleDescription()
            .getEarApplicationName();
    this.moduleName = componentConfiguration.getModuleName();
    this.distinctName =
        componentConfiguration.getComponentDescription().getModuleDescription().getDistinctName();
    this.shutDownInterceptorFactory = ejbComponentDescription.getShutDownInterceptorFactory();
  }
  /**
   * Construct a new instance.
   *
   * @param componentConfiguration the component configuration
   */
  public StatefulSessionComponentCreateService(
      final ComponentConfiguration componentConfiguration,
      final ApplicationExceptions ejbJarConfiguration) {
    super(componentConfiguration, ejbJarConfiguration);

    final StatefulComponentDescription componentDescription =
        (StatefulComponentDescription) componentConfiguration.getComponentDescription();
    final ClassLoader classLoader = componentConfiguration.getModuleClassLoader();
    final InterceptorFactory tcclInterceptorFactory =
        new ImmediateInterceptorFactory(new ContextClassLoaderInterceptor(classLoader));
    final InterceptorFactory namespaceContextInterceptorFactory =
        componentConfiguration.getNamespaceContextInterceptorFactory();

    this.afterBeginMethod = componentDescription.getAfterBegin();
    this.afterBegin =
        (this.afterBeginMethod != null)
            ? Interceptors.getChainedInterceptorFactory(
                tcclInterceptorFactory,
                namespaceContextInterceptorFactory,
                CurrentInvocationContextInterceptor.FACTORY,
                invokeMethodOnTarget(this.afterBeginMethod))
            : null;
    this.afterCompletionMethod = componentDescription.getAfterCompletion();
    this.afterCompletion =
        (this.afterCompletionMethod != null)
            ? Interceptors.getChainedInterceptorFactory(
                tcclInterceptorFactory,
                namespaceContextInterceptorFactory,
                CurrentInvocationContextInterceptor.FACTORY,
                invokeMethodOnTarget(this.afterCompletionMethod))
            : null;
    this.beforeCompletionMethod = componentDescription.getBeforeCompletion();
    this.beforeCompletion =
        (this.beforeCompletionMethod != null)
            ? Interceptors.getChainedInterceptorFactory(
                tcclInterceptorFactory,
                namespaceContextInterceptorFactory,
                CurrentInvocationContextInterceptor.FACTORY,
                invokeMethodOnTarget(this.beforeCompletionMethod))
            : null;
    this.prePassivate =
        Interceptors.getChainedInterceptorFactory(
            componentConfiguration.getPrePassivateInterceptors());
    this.postActivate =
        Interceptors.getChainedInterceptorFactory(
            componentConfiguration.getPostActivateInterceptors());
    this.statefulTimeout = componentDescription.getStatefulTimeout();
    // the interceptor chain for EJB e.x remove methods
    this.ejb2XRemoveMethod =
        Interceptors.getChainedInterceptorFactory(
            StatefulSessionSynchronizationInterceptor.factory(
                componentDescription.getTransactionManagementType()),
            new ImmediateInterceptorFactory(new StatefulRemoveInterceptor(false)),
            Interceptors.getTerminalInterceptorFactory());
    this.cache = componentDescription.getCache();
    this.loader = componentConfiguration.getModuleClassLoader();
    MarshallingConfiguration marshallingConfiguration = new MarshallingConfiguration();
    marshallingConfiguration.setClassResolver(
        ModularClassResolver.getInstance(componentConfiguration.getModuleLoader()));
    marshallingConfiguration.setSerializabilityChecker(
        new StatefulSessionBeanSerializabilityChecker(componentConfiguration.getComponentClass()));
    marshallingConfiguration.setClassTable(new StatefulSessionBeanClassTable());
    // ObjectTable which handles serialization of EJB proxies
    marshallingConfiguration.setObjectTable(new EJBClientContextIdentifierObjectTable());
    this.marshallingConfigurations =
        Collections.singletonMap(CURRENT_MARSHALLING_VERSION, marshallingConfiguration);
    this.serializableInterceptorContextKeys = componentConfiguration.getInterceptorContextKeys();
    this.passivationCapable = componentDescription.isPassivationApplicable();
  }