private static void deployPersistenceUnit(
            final DeploymentUnit deploymentUnit,
            final EEModuleDescription eeModuleDescription,
            final ServiceTarget serviceTarget,
            final ModuleClassLoader classLoader,
            final PersistenceUnitMetadata pu,
            final PersistenceProvider provider,
            final PersistenceProviderAdaptor adaptor,
            final boolean allowCdiBeanManagerAccess) throws DeploymentUnitProcessingException {
        pu.setClassLoader(classLoader);
        TransactionManager transactionManager = ContextTransactionManager.getInstance();
        TransactionSynchronizationRegistry transactionSynchronizationRegistry = deploymentUnit.getAttachment(JpaAttachments.TRANSACTION_SYNCHRONIZATION_REGISTRY);
        CapabilityServiceSupport capabilitySupport = deploymentUnit.getAttachment(Attachments.CAPABILITY_SERVICE_SUPPORT);
        try {
            ValidatorFactory validatorFactory = null;
            final HashMap<String, ValidatorFactory> properties = new HashMap<>();

            CapabilityServiceSupport css = deploymentUnit.getAttachment(Attachments.CAPABILITY_SERVICE_SUPPORT);
            if (!ValidationMode.NONE.equals(pu.getValidationMode())) {
                if (css.hasCapability("org.wildfly.bean-validation")) {
                    // Get the CDI-enabled ValidatorFactory
                    validatorFactory = deploymentUnit.getAttachment(BeanValidationAttachments.VALIDATOR_FACTORY);
                }
            }
            BeanManagerAfterDeploymentValidation beanManagerAfterDeploymentValidation = registerJPAEntityListenerRegister(deploymentUnit, capabilitySupport);

            final PersistenceAdaptorRemoval persistenceAdaptorRemoval = new PersistenceAdaptorRemoval(pu, adaptor);
            deploymentUnit.addToAttachmentList(REMOVAL_KEY, persistenceAdaptorRemoval);

            // add persistence provider specific properties
            adaptor.addProviderProperties(properties, pu);

            final ServiceName puServiceName = PersistenceUnitServiceImpl.getPUServiceName(pu);
            deploymentUnit.putAttachment(JpaAttachments.PERSISTENCE_UNIT_SERVICE_KEY, puServiceName);

            deploymentUnit.addToAttachmentList(Attachments.DEPLOYMENT_COMPLETE_SERVICES, puServiceName);

            deploymentUnit.addToAttachmentList(Attachments.WEB_DEPENDENCIES, puServiceName);

            final PersistenceUnitServiceImpl service =
                    new PersistenceUnitServiceImpl(properties, classLoader, pu, adaptor, provider, PersistenceUnitRegistryImpl.INSTANCE,
                            deploymentUnit.getServiceName(), validatorFactory, deploymentUnit.getAttachment(org.jboss.as.ee.naming.Attachments.JAVA_NAMESPACE_SETUP_ACTION),
                            beanManagerAfterDeploymentValidation );

            ServiceBuilder<PersistenceUnitService> builder = serviceTarget.addService(puServiceName, service);
            boolean useDefaultDataSource = Configuration.allowDefaultDataSourceUse(pu);
            final String jtaDataSource = adjustJndi(pu.getJtaDataSourceName());
            final String nonJtaDataSource = adjustJndi(pu.getNonJtaDataSourceName());

            if (jtaDataSource != null && jtaDataSource.length() > 0) {
                if (jtaDataSource.equals(EE_DEFAULT_DATASOURCE)) { // explicit use of default datasource
                    useDefaultDataSource = true;
                }
                else {
                    builder.addDependency(ContextNames.bindInfoForEnvEntry(eeModuleDescription.getApplicationName(), eeModuleDescription.getModuleName(), eeModuleDescription.getModuleName(), false, jtaDataSource).getBinderServiceName(), ManagedReferenceFactory.class, new ManagedReferenceFactoryInjector(service.getJtaDataSourceInjector()));
                    useDefaultDataSource = false;
                }
            }
            if (nonJtaDataSource != null && nonJtaDataSource.length() > 0) {
                builder.addDependency(ContextNames.bindInfoForEnvEntry(eeModuleDescription.getApplicationName(), eeModuleDescription.getModuleName(), eeModuleDescription.getModuleName(), false, nonJtaDataSource).getBinderServiceName(), ManagedReferenceFactory.class, new ManagedReferenceFactoryInjector(service.getNonJtaDataSourceInjector()));
                useDefaultDataSource = false;
            }
            // JPA 2.0 8.2.1.5, container provides default JTA datasource
            if (useDefaultDataSource) {
                // try the default datasource defined in the ee subsystem
                String defaultJtaDataSource = null;
                if (eeModuleDescription != null) {
                    defaultJtaDataSource = eeModuleDescription.getDefaultResourceJndiNames().getDataSource();
                }

                if (defaultJtaDataSource == null ||
                        defaultJtaDataSource.isEmpty()) {
                    // try the datasource defined in the jpa subsystem
                    defaultJtaDataSource = adjustJndi(JPAService.getDefaultDataSourceName());
                }
                if (defaultJtaDataSource != null &&
                    !defaultJtaDataSource.isEmpty()) {
                    builder.addDependency(ContextNames.bindInfoFor(defaultJtaDataSource).getBinderServiceName(), ManagedReferenceFactory.class, new ManagedReferenceFactoryInjector(service.getJtaDataSourceInjector()));
                    ROOT_LOGGER.tracef("%s is using the default data source '%s'", puServiceName, defaultJtaDataSource);
                }
            }

            // JPA 2.1 sections 3.5.1 + 9.1 require the CDI bean manager to be passed to the peristence provider
            // if the persistence unit is contained in a deployment that is a CDI bean archive (has beans.xml).
            final CapabilityServiceSupport support = deploymentUnit.getAttachment(Attachments.CAPABILITY_SERVICE_SUPPORT);
            if (support.hasCapability(WELD_CAPABILITY_NAME) && allowCdiBeanManagerAccess) {
                support.getOptionalCapabilityRuntimeAPI(WELD_CAPABILITY_NAME, WeldCapability.class).get()
                        .addBeanManagerService(deploymentUnit, builder, service.getBeanManagerInjector());
            }

            try {
                // save a thread local reference to the builder for setting up the second level cache dependencies
                CacheDeploymentListener.setInternalDeploymentSupport(builder, capabilitySupport);
                adaptor.addProviderDependencies(pu);
            }
            finally {
                CacheDeploymentListener.clearInternalDeploymentSupport();
            }

            /**
             * handle extension that binds a transaction scoped entity manager to specified JNDI location
             */
            entityManagerBind(eeModuleDescription, serviceTarget, pu, puServiceName, transactionManager, transactionSynchronizationRegistry);

            /**
             * handle extension that binds an entity manager factory to specified JNDI location
             */
            entityManagerFactoryBind(eeModuleDescription, serviceTarget, pu, puServiceName);

            // get async executor from Services.addServerExecutorDependency
            addServerExecutorDependency(builder, service.getExecutorInjector());

            builder.install();

            ROOT_LOGGER.tracef("added PersistenceUnitService for '%s'.  PU is ready for injector action.", puServiceName);
            addManagementConsole(deploymentUnit, pu, adaptor, persistenceAdaptorRemoval);

        } catch (ServiceRegistryException e) {
            throw JpaLogger.ROOT_LOGGER.failedToAddPersistenceUnit(e, pu.getPersistenceUnitName());
        }
    }
private static void deployPersistenceUnit(
            final DeploymentUnit deploymentUnit,
            final EEModuleDescription eeModuleDescription,
            final ServiceTarget serviceTarget,
            final ModuleClassLoader classLoader,
            final PersistenceUnitMetadata pu,
            final PersistenceProvider provider,
            final PersistenceProviderAdaptor adaptor,
            final boolean allowCdiBeanManagerAccess) throws DeploymentUnitProcessingException {
        pu.setClassLoader(classLoader);
        TransactionManager transactionManager = ContextTransactionManager.getInstance();
        TransactionSynchronizationRegistry transactionSynchronizationRegistry = deploymentUnit.getAttachment(JpaAttachments.TRANSACTION_SYNCHRONIZATION_REGISTRY);
        CapabilityServiceSupport capabilitySupport = deploymentUnit.getAttachment(Attachments.CAPABILITY_SERVICE_SUPPORT);
        try {
            ValidatorFactory validatorFactory = null;
            final HashMap<String, ValidatorFactory> properties = new HashMap<>();

            CapabilityServiceSupport css = deploymentUnit.getAttachment(Attachments.CAPABILITY_SERVICE_SUPPORT);
            if (!ValidationMode.NONE.equals(pu.getValidationMode())) {
                if (css.hasCapability("org.wildfly.bean-validation")) {
                    
                    validatorFactory = deploymentUnit.getAttachment(BeanValidationAttachments.VALIDATOR_FACTORY);
                }
            }
            BeanManagerAfterDeploymentValidation beanManagerAfterDeploymentValidation = registerJPAEntityListenerRegister(deploymentUnit, capabilitySupport);

            final PersistenceAdaptorRemoval persistenceAdaptorRemoval = new PersistenceAdaptorRemoval(pu, adaptor);
            deploymentUnit.addToAttachmentList(REMOVAL_KEY, persistenceAdaptorRemoval);

            
            adaptor.addProviderProperties(properties, pu);

            final ServiceName puServiceName = PersistenceUnitServiceImpl.getPUServiceName(pu);
            deploymentUnit.putAttachment(JpaAttachments.PERSISTENCE_UNIT_SERVICE_KEY, puServiceName);

            deploymentUnit.addToAttachmentList(Attachments.DEPLOYMENT_COMPLETE_SERVICES, puServiceName);

            deploymentUnit.addToAttachmentList(Attachments.WEB_DEPENDENCIES, puServiceName);

            final PersistenceUnitServiceImpl service =
                    new PersistenceUnitServiceImpl(properties, classLoader, pu, adaptor, provider, PersistenceUnitRegistryImpl.INSTANCE,
                            deploymentUnit.getServiceName(), validatorFactory, deploymentUnit.getAttachment(org.jboss.as.ee.naming.Attachments.JAVA_NAMESPACE_SETUP_ACTION),
                            beanManagerAfterDeploymentValidation );

            ServiceBuilder<PersistenceUnitService> builder = serviceTarget.addService(puServiceName, service);
            boolean useDefaultDataSource = Configuration.allowDefaultDataSourceUse(pu);
            final String jtaDataSource = adjustJndi(pu.getJtaDataSourceName());
            final String nonJtaDataSource = adjustJndi(pu.getNonJtaDataSourceName());

            if (jtaDataSource != null && jtaDataSource.length() > 0) {
                if (jtaDataSource.equals(EE_DEFAULT_DATASOURCE)) { 
                    useDefaultDataSource = true;
                }
                else {
                    builder.addDependency(ContextNames.bindInfoForEnvEntry(eeModuleDescription.getApplicationName(), eeModuleDescription.getModuleName(), eeModuleDescription.getModuleName(), false, jtaDataSource).getBinderServiceName(), ManagedReferenceFactory.class, new ManagedReferenceFactoryInjector(service.getJtaDataSourceInjector()));
                    useDefaultDataSource = false;
                }
            }
            if (nonJtaDataSource != null && nonJtaDataSource.length() > 0) {
                builder.addDependency(ContextNames.bindInfoForEnvEntry(eeModuleDescription.getApplicationName(), eeModuleDescription.getModuleName(), eeModuleDescription.getModuleName(), false, nonJtaDataSource).getBinderServiceName(), ManagedReferenceFactory.class, new ManagedReferenceFactoryInjector(service.getNonJtaDataSourceInjector()));
                useDefaultDataSource = false;
            }
            
            if (useDefaultDataSource) {
                
                String defaultJtaDataSource = null;
                if (eeModuleDescription != null) {
                    defaultJtaDataSource = eeModuleDescription.getDefaultResourceJndiNames().getDataSource();
                }

                if (defaultJtaDataSource == null ||
                        defaultJtaDataSource.isEmpty()) {
                    
                    defaultJtaDataSource = adjustJndi(JPAService.getDefaultDataSourceName());
                }
                if (defaultJtaDataSource != null &&
                    !defaultJtaDataSource.isEmpty()) {
                    builder.addDependency(ContextNames.bindInfoFor(defaultJtaDataSource).getBinderServiceName(), ManagedReferenceFactory.class, new ManagedReferenceFactoryInjector(service.getJtaDataSourceInjector()));
                    ROOT_LOGGER.tracef("%s is using the default data source '%s'", puServiceName, defaultJtaDataSource);
                }
            }

            
            
            final CapabilityServiceSupport support = deploymentUnit.getAttachment(Attachments.CAPABILITY_SERVICE_SUPPORT);
            if (support.hasCapability(WELD_CAPABILITY_NAME) && allowCdiBeanManagerAccess) {
                support.getOptionalCapabilityRuntimeAPI(WELD_CAPABILITY_NAME, WeldCapability.class).get()
                        .addBeanManagerService(deploymentUnit, builder, service.getBeanManagerInjector());
            }

            try {
                
                CacheDeploymentListener.setInternalDeploymentSupport(builder, capabilitySupport);
                adaptor.addProviderDependencies(pu);
            }
            finally {
                CacheDeploymentListener.clearInternalDeploymentSupport();
            }

            
            entityManagerBind(eeModuleDescription, serviceTarget, pu, puServiceName, transactionManager, transactionSynchronizationRegistry);

            
            entityManagerFactoryBind(eeModuleDescription, serviceTarget, pu, puServiceName);

            
            addServerExecutorDependency(builder, service.getExecutorInjector());

            builder.install();

            ROOT_LOGGER.tracef("added PersistenceUnitService for '%s'.  PU is ready for injector action.", puServiceName);
            addManagementConsole(deploymentUnit, pu, adaptor, persistenceAdaptorRemoval);

        } catch (ServiceRegistryException e) {
            throw JpaLogger.ROOT_LOGGER.failedToAddPersistenceUnit(e, pu.getPersistenceUnitName());
        }
    }
private static void deployPersistenceUnit ( final DeploymentUnit deploymentUnit , final EEModuleDescription eeModuleDescription , final ServiceTarget serviceTarget , final ModuleClassLoader classLoader , final PersistenceUnitMetadata pu , final PersistenceProvider provider , final PersistenceProviderAdaptor adaptor , final boolean allowCdiBeanManagerAccess ) throws DeploymentUnitProcessingException { pu . setClassLoader ( classLoader ) ; TransactionManager transactionManager = ContextTransactionManager . getInstance ( ) ; TransactionSynchronizationRegistry transactionSynchronizationRegistry = deploymentUnit . getAttachment ( JpaAttachments . TRANSACTION_SYNCHRONIZATION_REGISTRY ) ; CapabilityServiceSupport capabilitySupport = deploymentUnit . getAttachment ( Attachments . CAPABILITY_SERVICE_SUPPORT ) ; try { ValidatorFactory validatorFactory = null ; final HashMap < String , ValidatorFactory > properties = new HashMap <> ( ) ; CapabilityServiceSupport css = deploymentUnit . getAttachment ( Attachments . CAPABILITY_SERVICE_SUPPORT ) ; if ( ! ValidationMode . NONE . equals ( pu . getValidationMode ( ) ) ) { if ( css . hasCapability ( "org.wildfly.bean-validation" ) ) { // Get the CDI-enabled ValidatorFactory validatorFactory = deploymentUnit . getAttachment ( BeanValidationAttachments . VALIDATOR_FACTORY ) ; } } BeanManagerAfterDeploymentValidation beanManagerAfterDeploymentValidation = registerJPAEntityListenerRegister ( deploymentUnit , capabilitySupport ) ; final PersistenceAdaptorRemoval persistenceAdaptorRemoval = new PersistenceAdaptorRemoval ( pu , adaptor ) ; deploymentUnit . addToAttachmentList ( REMOVAL_KEY , persistenceAdaptorRemoval ) ; // add persistence provider specific properties adaptor . addProviderProperties ( properties , pu ) ; final ServiceName puServiceName = PersistenceUnitServiceImpl . getPUServiceName ( pu ) ; deploymentUnit . putAttachment ( JpaAttachments . PERSISTENCE_UNIT_SERVICE_KEY , puServiceName ) ; deploymentUnit . addToAttachmentList ( Attachments . DEPLOYMENT_COMPLETE_SERVICES , puServiceName ) ; deploymentUnit . addToAttachmentList ( Attachments . WEB_DEPENDENCIES , puServiceName ) ; final PersistenceUnitServiceImpl service = new PersistenceUnitServiceImpl ( properties , classLoader , pu , adaptor , provider , PersistenceUnitRegistryImpl . INSTANCE , deploymentUnit . getServiceName ( ) , validatorFactory , deploymentUnit . getAttachment ( org . jboss . as . ee . naming . Attachments . JAVA_NAMESPACE_SETUP_ACTION ) , beanManagerAfterDeploymentValidation ) ; ServiceBuilder < PersistenceUnitService > builder = serviceTarget . addService ( puServiceName , service ) ; boolean useDefaultDataSource = Configuration . allowDefaultDataSourceUse ( pu ) ; final String jtaDataSource = adjustJndi ( pu . getJtaDataSourceName ( ) ) ; final String nonJtaDataSource = adjustJndi ( pu . getNonJtaDataSourceName ( ) ) ; if ( jtaDataSource != null && jtaDataSource . length ( ) > 0 ) { if ( jtaDataSource . equals ( EE_DEFAULT_DATASOURCE ) ) { // explicit use of default datasource useDefaultDataSource = true ; } else { builder . addDependency ( ContextNames . bindInfoForEnvEntry ( eeModuleDescription . getApplicationName ( ) , eeModuleDescription . getModuleName ( ) , eeModuleDescription . getModuleName ( ) , false , jtaDataSource ) . getBinderServiceName ( ) , ManagedReferenceFactory . class , new ManagedReferenceFactoryInjector ( service . getJtaDataSourceInjector ( ) ) ) ; useDefaultDataSource = false ; } } if ( nonJtaDataSource != null && nonJtaDataSource . length ( ) > 0 ) { builder . addDependency ( ContextNames . bindInfoForEnvEntry ( eeModuleDescription . getApplicationName ( ) , eeModuleDescription . getModuleName ( ) , eeModuleDescription . getModuleName ( ) , false , nonJtaDataSource ) . getBinderServiceName ( ) , ManagedReferenceFactory . class , new ManagedReferenceFactoryInjector ( service . getNonJtaDataSourceInjector ( ) ) ) ; useDefaultDataSource = false ; } // JPA 2.0 8.2.1.5, container provides default JTA datasource if ( useDefaultDataSource ) { // try the default datasource defined in the ee subsystem String defaultJtaDataSource = null ; if ( eeModuleDescription != null ) { defaultJtaDataSource = eeModuleDescription . getDefaultResourceJndiNames ( ) . getDataSource ( ) ; } if ( defaultJtaDataSource == null || defaultJtaDataSource . isEmpty ( ) ) { // try the datasource defined in the jpa subsystem defaultJtaDataSource = adjustJndi ( JPAService . getDefaultDataSourceName ( ) ) ; } if ( defaultJtaDataSource != null && ! defaultJtaDataSource . isEmpty ( ) ) { builder . addDependency ( ContextNames . bindInfoFor ( defaultJtaDataSource ) . getBinderServiceName ( ) , ManagedReferenceFactory . class , new ManagedReferenceFactoryInjector ( service . getJtaDataSourceInjector ( ) ) ) ; ROOT_LOGGER . tracef ( "%s is using the default data source '%s'" , puServiceName , defaultJtaDataSource ) ; } } // JPA 2.1 sections 3.5.1 + 9.1 require the CDI bean manager to be passed to the peristence provider // if the persistence unit is contained in a deployment that is a CDI bean archive (has beans.xml). final CapabilityServiceSupport support = deploymentUnit . getAttachment ( Attachments . CAPABILITY_SERVICE_SUPPORT ) ; if ( support . hasCapability ( WELD_CAPABILITY_NAME ) && allowCdiBeanManagerAccess ) { support . getOptionalCapabilityRuntimeAPI ( WELD_CAPABILITY_NAME , WeldCapability . class ) . get ( ) . addBeanManagerService ( deploymentUnit , builder , service . getBeanManagerInjector ( ) ) ; } try { // save a thread local reference to the builder for setting up the second level cache dependencies CacheDeploymentListener . setInternalDeploymentSupport ( builder , capabilitySupport ) ; adaptor . addProviderDependencies ( pu ) ; } finally { CacheDeploymentListener . clearInternalDeploymentSupport ( ) ; } /**
             * handle extension that binds a transaction scoped entity manager to specified JNDI location
             */ entityManagerBind ( eeModuleDescription , serviceTarget , pu , puServiceName , transactionManager , transactionSynchronizationRegistry ) ; /**
             * handle extension that binds an entity manager factory to specified JNDI location
             */ entityManagerFactoryBind ( eeModuleDescription , serviceTarget , pu , puServiceName ) ; // get async executor from Services.addServerExecutorDependency addServerExecutorDependency ( builder , service . getExecutorInjector ( ) ) ; builder . install ( ) ; ROOT_LOGGER . tracef ( "added PersistenceUnitService for '%s'.  PU is ready for injector action." , puServiceName ) ; addManagementConsole ( deploymentUnit , pu , adaptor , persistenceAdaptorRemoval ) ; } catch ( ServiceRegistryException e ) { throw JpaLogger . ROOT_LOGGER . failedToAddPersistenceUnit ( e , pu . getPersistenceUnitName ( ) ) ; } }
start the persistence unit in one phase

@param deploymentUnit
@param eeModuleDescription
@param serviceTarget
@param classLoader
@param pu
@param provider
@param adaptor
@param allowCdiBeanManagerAccess
@throws DeploymentUnitProcessingException
start the persistence unit in one phase