@Override
 public void configure(
     final DeploymentPhaseContext context,
     final ComponentConfiguration componentConfiguration,
     final ViewDescription description,
     final ViewConfiguration configuration)
     throws DeploymentUnitProcessingException {
   final EJBComponentDescription ejbComponentDescription =
       (EJBComponentDescription) componentConfiguration.getComponentDescription();
   if (ejbComponentDescription.getTransactionManagementType()
       == TransactionManagementType.CONTAINER) {
     configuration.addViewInterceptor(
         EjbIIOPTransactionInterceptor.FACTORY, InterceptorOrder.View.EJB_IIOP_TRANSACTION);
   }
 }
  @Override
  public void configure(
      DeploymentPhaseContext context,
      ComponentConfiguration componentConfiguration,
      ViewDescription viewDescription,
      ViewConfiguration viewConfiguration)
      throws DeploymentUnitProcessingException {
    if (componentConfiguration.getComponentDescription() instanceof EJBComponentDescription
        == false) {
      throw MESSAGES.invalidEjbComponent(
          componentConfiguration.getComponentName(), componentConfiguration.getComponentClass());
    }
    final EJBComponentDescription ejbComponentDescription =
        (EJBComponentDescription) componentConfiguration.getComponentDescription();
    // if security is not enabled on the EJB, then do *not* add the security related interceptors
    if (!ejbComponentDescription.isSecurityEnabled()) {
      ROOT_LOGGER.debug(
          "Security is *not* enabled on EJB: "
              + ejbComponentDescription.getEJBName()
              + ", no security interceptors will apply");
      return;
    }
    final String viewClassName = viewDescription.getViewClassName();
    // setup the security context interceptor
    viewConfiguration.addViewInterceptor(
        new SecurityContextInterceptorFactory(), InterceptorOrder.View.SECURITY_CONTEXT);

    // now setup the rest of the method specific security interceptor(s)
    final List<Method> viewMethods = viewConfiguration.getProxyFactory().getCachedMethods();
    for (final Method viewMethod : viewMethods) {
      // TODO: proxy factory exposes non-public methods, is this a bug in the no-interface view?
      if (!Modifier.isPublic(viewMethod.getModifiers())) {
        continue;
      }
      if (viewMethod.getDeclaringClass() == WriteReplaceInterface.class) {
        continue;
      }
      final EJBMethodSecurityMetaData ejbMethodSecurityMetaData =
          new EJBMethodSecurityMetaData(componentConfiguration, viewClassName, viewMethod);
      // setup the authorization interceptor
      final Interceptor authorizationInterceptor =
          new AuthorizationInterceptor(ejbMethodSecurityMetaData, viewClassName, viewMethod);
      viewConfiguration.addViewInterceptor(
          viewMethod,
          new ImmediateInterceptorFactory(authorizationInterceptor),
          InterceptorOrder.View.EJB_SECURITY_AUTHORIZATION_INTERCEPTOR);
    }
  }
  public void resolve(final DeploymentPhaseContext phaseContext)
      throws DeploymentUnitProcessingException {
    final Set<ViewDescription> componentsForViewName = getViews(phaseContext);
    if (componentsForViewName.isEmpty()) {
      error = "No component found for type '" + typeName + "' with name " + beanName;
      return;
    }
    if (componentsForViewName.size() > 1) {
      error = "More than 1 component found for type '" + typeName + "' and bean name " + beanName;
      return;
    }
    ViewDescription description = componentsForViewName.iterator().next();
    if (description instanceof EJBViewDescription) {
      final EJBViewDescription ejbViewDescription = (EJBViewDescription) description;
      // for remote interfaces we do not want to use a normal binding
      // we need to bind the remote proxy factory into JNDI instead to get the correct behaviour

      if (ejbViewDescription.getMethodIntf() == MethodIntf.REMOTE
          || ejbViewDescription.getMethodIntf() == MethodIntf.HOME) {
        final EJBComponentDescription componentDescription =
            (EJBComponentDescription) description.getComponentDescription();
        final EEModuleDescription moduleDescription = componentDescription.getModuleDescription();
        final String earApplicationName = moduleDescription.getEarApplicationName();
        remoteFactory =
            new RemoteViewManagedReferenceFactory(
                earApplicationName,
                moduleDescription.getModuleName(),
                moduleDescription.getDistinctName(),
                componentDescription.getComponentName(),
                description.getViewClassName(),
                componentDescription.isStateful());
      }
    }
    ServiceName serviceName = description.getServiceName();
    resolvedViewName = serviceName;
  }
  @Override
  public void deploy(final DeploymentPhaseContext phaseContext)
      throws DeploymentUnitProcessingException {

    final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
    if (!IIOPDeploymentMarker.isIIOPDeployment(deploymentUnit)) {
      return;
    }

    final EEModuleDescription moduleDescription =
        deploymentUnit.getAttachment(Attachments.EE_MODULE_DESCRIPTION);
    if (!EjbDeploymentMarker.isEjbDeployment(deploymentUnit)) {
      return;
    }

    // a bean-name -> IIOPMetaData map, reflecting the assembly descriptor IIOP configuration.
    Map<String, IIOPMetaData> iiopMetaDataMap = new HashMap<String, IIOPMetaData>();
    final EjbJarMetaData ejbMetaData =
        deploymentUnit.getAttachment(EjbDeploymentAttachmentKeys.EJB_JAR_METADATA);
    if (ejbMetaData != null && ejbMetaData.getAssemblyDescriptor() != null) {
      List<IIOPMetaData> iiopMetaDatas =
          ejbMetaData.getAssemblyDescriptor().getAny(IIOPMetaData.class);
      if (iiopMetaDatas != null && iiopMetaDatas.size() > 0) {
        for (IIOPMetaData metaData : iiopMetaDatas) {
          iiopMetaDataMap.put(metaData.getEjbName(), metaData);
        }
      }
    }

    final DeploymentClassIndex classIndex =
        deploymentUnit.getAttachment(org.jboss.as.server.deployment.Attachments.CLASS_INDEX);
    final DeploymentReflectionIndex deploymentReflectionIndex =
        deploymentUnit.getAttachment(org.jboss.as.server.deployment.Attachments.REFLECTION_INDEX);
    final Module module =
        deploymentUnit.getAttachment(org.jboss.as.server.deployment.Attachments.MODULE);
    if (moduleDescription != null) {
      for (final ComponentDescription componentDescription :
          moduleDescription.getComponentDescriptions()) {
        if (componentDescription instanceof EJBComponentDescription) {
          final EJBComponentDescription ejbComponentDescription =
              (EJBComponentDescription) componentDescription;
          if (ejbComponentDescription.getEjbRemoteView() != null
              && ejbComponentDescription.getEjbHomeView() != null) {
            // check if there is IIOP metadata for the bean - first using the bean name, then the
            // wildcard "*" if needed.
            IIOPMetaData iiopMetaData = iiopMetaDataMap.get(ejbComponentDescription.getEJBName());
            if (iiopMetaData == null) {
              iiopMetaData = iiopMetaDataMap.get(IIOPMetaData.WILDCARD_BEAN_NAME);
            }
            // the bean will be exposed via IIOP if it has IIOP metadata that applies to it or if
            // IIOP access
            // has been enabled by default in the EJB3 subsystem.
            if (iiopMetaData != null || settingsService.isEnabledByDefault()) {
              processEjb(
                  ejbComponentDescription,
                  classIndex,
                  deploymentReflectionIndex,
                  module,
                  phaseContext.getServiceTarget(),
                  iiopMetaData);
            }
          }
        }
      }
    }
  }
  private void processEjb(
      final EJBComponentDescription componentDescription,
      final DeploymentClassIndex classIndex,
      final DeploymentReflectionIndex deploymentReflectionIndex,
      final Module module,
      final ServiceTarget serviceTarget,
      final IIOPMetaData iiopMetaData) {
    componentDescription.setExposedViaIiop(true);

    // Create bean method mappings for container invoker

    final EJBViewDescription remoteView = componentDescription.getEjbRemoteView();
    final ClassIndex remoteClass;
    try {
      remoteClass = classIndex.classIndex(remoteView.getViewClassName());
    } catch (ClassNotFoundException e) {
      throw EjbLogger.ROOT_LOGGER.failedToLoadViewClassForComponent(
          e, componentDescription.getEJBClassName());
    }
    final EJBViewDescription homeView = componentDescription.getEjbHomeView();
    final ClassIndex homeClass;
    try {
      homeClass = classIndex.classIndex(homeView.getViewClassName());
    } catch (ClassNotFoundException e) {
      throw EjbLogger.ROOT_LOGGER.failedToLoadViewClassForComponent(
          e, componentDescription.getEJBClassName());
    }

    componentDescription
        .getEjbHomeView()
        .getConfigurators()
        .add(new IIOPInterceptorViewConfigurator());
    componentDescription
        .getEjbRemoteView()
        .getConfigurators()
        .add(new IIOPInterceptorViewConfigurator());

    final InterfaceAnalysis remoteInterfaceAnalysis;
    try {
      // TODO: change all this to use the deployment reflection index
      remoteInterfaceAnalysis =
          InterfaceAnalysis.getInterfaceAnalysis(remoteClass.getModuleClass());
    } catch (RMIIIOPViolationException e) {
      throw EjbLogger.ROOT_LOGGER.failedToAnalyzeRemoteInterface(
          e, componentDescription.getComponentName());
    }

    final Map<String, SkeletonStrategy> beanMethodMap = new HashMap<String, SkeletonStrategy>();

    final AttributeAnalysis[] remoteAttrs = remoteInterfaceAnalysis.getAttributes();
    for (int i = 0; i < remoteAttrs.length; i++) {
      final OperationAnalysis op = remoteAttrs[i].getAccessorAnalysis();
      if (op != null) {
        EjbLogger.ROOT_LOGGER.debugf(
            "    %s\n                %s", op.getJavaName(), op.getIDLName());
        // translate to the deployment reflection index method
        // TODO: this needs to be fixed so it just returns the correct method
        final Method method = translateMethod(deploymentReflectionIndex, op);

        beanMethodMap.put(op.getIDLName(), new SkeletonStrategy(method));
        final OperationAnalysis setop = remoteAttrs[i].getMutatorAnalysis();
        if (setop != null) {
          EjbLogger.ROOT_LOGGER.debugf(
              "    %s\n                %s", setop.getJavaName(), setop.getIDLName());
          // translate to the deployment reflection index method
          // TODO: this needs to be fixed so it just returns the correct method
          final Method realSetmethod = translateMethod(deploymentReflectionIndex, setop);
          beanMethodMap.put(setop.getIDLName(), new SkeletonStrategy(realSetmethod));
        }
      }
    }

    final OperationAnalysis[] ops = remoteInterfaceAnalysis.getOperations();
    for (int i = 0; i < ops.length; i++) {
      EjbLogger.ROOT_LOGGER.debugf(
          "    %s\n                %s", ops[i].getJavaName(), ops[i].getIDLName());
      beanMethodMap.put(
          ops[i].getIDLName(),
          new SkeletonStrategy(translateMethod(deploymentReflectionIndex, ops[i])));
    }

    // Initialize repository ids of remote interface
    final String[] beanRepositoryIds = remoteInterfaceAnalysis.getAllTypeIds();

    // Create home method mappings for container invoker
    final InterfaceAnalysis homeInterfaceAnalysis;
    try {
      // TODO: change all this to use the deployment reflection index
      homeInterfaceAnalysis = InterfaceAnalysis.getInterfaceAnalysis(homeClass.getModuleClass());
    } catch (RMIIIOPViolationException e) {
      throw EjbLogger.ROOT_LOGGER.failedToAnalyzeRemoteInterface(
          e, componentDescription.getComponentName());
    }

    final Map<String, SkeletonStrategy> homeMethodMap = new HashMap<String, SkeletonStrategy>();

    final AttributeAnalysis[] attrs = homeInterfaceAnalysis.getAttributes();
    for (int i = 0; i < attrs.length; i++) {
      final OperationAnalysis op = attrs[i].getAccessorAnalysis();
      if (op != null) {
        EjbLogger.ROOT_LOGGER.debugf(
            "    %s\n                %s", op.getJavaName(), op.getIDLName());
        homeMethodMap.put(
            op.getIDLName(), new SkeletonStrategy(translateMethod(deploymentReflectionIndex, op)));
        final OperationAnalysis setop = attrs[i].getMutatorAnalysis();
        if (setop != null) {
          EjbLogger.ROOT_LOGGER.debugf(
              "    %s\n                %s", setop.getJavaName(), setop.getIDLName());
          homeMethodMap.put(
              setop.getIDLName(),
              new SkeletonStrategy(translateMethod(deploymentReflectionIndex, setop)));
        }
      }
    }

    final OperationAnalysis[] homeops = homeInterfaceAnalysis.getOperations();
    for (int i = 0; i < homeops.length; i++) {
      EjbLogger.ROOT_LOGGER.debugf(
          "    %s\n                %s", homeops[i].getJavaName(), homeops[i].getIDLName());
      homeMethodMap.put(
          homeops[i].getIDLName(),
          new SkeletonStrategy(translateMethod(deploymentReflectionIndex, homeops[i])));
    }

    // Initialize repository ids of home interface
    final String[] homeRepositoryIds = homeInterfaceAnalysis.getAllTypeIds();

    final EjbIIOPService service =
        new EjbIIOPService(
            beanMethodMap,
            beanRepositoryIds,
            homeMethodMap,
            homeRepositoryIds,
            settingsService.isUseQualifiedName(),
            iiopMetaData,
            module);
    final ServiceBuilder<EjbIIOPService> builder =
        serviceTarget.addService(
            componentDescription.getServiceName().append(EjbIIOPService.SERVICE_NAME), service);
    builder.addDependency(
        componentDescription.getCreateServiceName(),
        EJBComponent.class,
        service.getEjbComponentInjectedValue());
    builder.addDependency(homeView.getServiceName(), ComponentView.class, service.getHomeView());
    builder.addDependency(
        remoteView.getServiceName(), ComponentView.class, service.getRemoteView());
    builder.addDependency(CorbaORBService.SERVICE_NAME, ORB.class, service.getOrb());
    builder.addDependency(POARegistry.SERVICE_NAME, POARegistry.class, service.getPoaRegistry());
    builder.addDependency(
        CorbaPOAService.INTERFACE_REPOSITORY_SERVICE_NAME, POA.class, service.getIrPoa());
    builder.addDependency(
        CorbaNamingService.SERVICE_NAME, NamingContextExt.class, service.getCorbaNamingContext());
    builder.addDependency(
        IORSecConfigMetaDataService.SERVICE_NAME,
        IORSecurityConfigMetaData.class,
        service.getIORSecConfigMetaDataInjectedValue());
    builder.addDependency(
        Services.JBOSS_SERVICE_MODULE_LOADER,
        ServiceModuleLoader.class,
        service.getServiceModuleLoaderInjectedValue());

    // we need the arjunta transaction manager to be up, as it performs some initialization that is
    // required by the orb interceptors
    builder.addDependency(TxnServices.JBOSS_TXN_ARJUNA_TRANSACTION_MANAGER);
    builder.install();
  }