private void populateModelWithCoreEnvConfig(ModelNode operation, ModelNode model)
      throws OperationFailedException {
    // core environment
    TransactionSubsystemRootResourceDefinition.NODE_IDENTIFIER.validateAndSet(operation, model);

    // We have some complex logic for the 'process-id' stuff because of the alternatives
    if (operation.hasDefined(TransactionSubsystemRootResourceDefinition.PROCESS_ID_UUID.getName())
        && operation
            .get(TransactionSubsystemRootResourceDefinition.PROCESS_ID_UUID.getName())
            .asBoolean()) {
      TransactionSubsystemRootResourceDefinition.PROCESS_ID_UUID.validateAndSet(operation, model);
      if (operation.hasDefined(
          TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_BINDING.getName())) {
        throw new OperationFailedException(
            String.format(
                "%s must be undefined if %s is 'true'.",
                TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_BINDING.getName(),
                TransactionSubsystemRootResourceDefinition.PROCESS_ID_UUID.getName()));
      } else if (operation.hasDefined(
          TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_MAX_PORTS.getName())) {
        throw new OperationFailedException(
            String.format(
                "%s must be undefined if %s is 'true'.",
                TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_MAX_PORTS.getName(),
                TransactionSubsystemRootResourceDefinition.PROCESS_ID_UUID.getName()));
      }
      // model.get(TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_BINDING.getName());
      // model.get(TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_MAX_PORTS.getName());
    } else if (operation.hasDefined(
        TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_BINDING.getName())) {
      TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_BINDING.validateAndSet(
          operation, model);
      TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_MAX_PORTS.validateAndSet(
          operation, model);
    } else if (operation.hasDefined(
        TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_MAX_PORTS.getName())) {
      throw new OperationFailedException(
          String.format(
              "%s must be defined if %s is defined.",
              TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_BINDING.getName(),
              TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_MAX_PORTS.getName()));
    } else {
      // not uuid and also not sockets!
      throw new OperationFailedException(
          String.format(
              "Either %s must be 'true' or  %s must be defined.",
              TransactionSubsystemRootResourceDefinition.PROCESS_ID_UUID.getName(),
              TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_BINDING.getName()));
    }
  }
  private void performCoreEnvironmentBootTime(OperationContext context, ModelNode coreEnvModel)
      throws OperationFailedException {

    // Configure the core configuration.
    final String nodeIdentifier =
        TransactionSubsystemRootResourceDefinition.NODE_IDENTIFIER
            .resolveModelAttribute(context, coreEnvModel)
            .asString();
    TransactionLogger.ROOT_LOGGER.debugf("nodeIdentifier=%s%n", nodeIdentifier);
    final CoreEnvironmentService coreEnvironmentService =
        new CoreEnvironmentService(nodeIdentifier);

    String socketBindingName = null;
    if (TransactionSubsystemRootResourceDefinition.PROCESS_ID_UUID
        .resolveModelAttribute(context, coreEnvModel)
        .asBoolean(false)) {
      // Use the UUID based id
      UuidProcessId id = new UuidProcessId();
      coreEnvironmentService.setProcessImplementation(id);
    } else {
      // Use the socket process id
      coreEnvironmentService.setProcessImplementationClassName(ProcessIdType.SOCKET.getClazz());
      socketBindingName =
          TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_BINDING
              .resolveModelAttribute(context, coreEnvModel)
              .asString();
      int ports =
          TransactionSubsystemRootResourceDefinition.PROCESS_ID_SOCKET_MAX_PORTS
              .resolveModelAttribute(context, coreEnvModel)
              .asInt();
      coreEnvironmentService.setSocketProcessIdMaxPorts(ports);
    }

    final ServiceBuilder<?> coreEnvBuilder =
        context
            .getServiceTarget()
            .addService(TxnServices.JBOSS_TXN_CORE_ENVIRONMENT, coreEnvironmentService);
    if (socketBindingName != null) {
      // Add a dependency on the socket id binding
      ServiceName bindingName = SocketBinding.JBOSS_BINDING_NAME.append(socketBindingName);
      coreEnvBuilder.addDependency(
          bindingName,
          SocketBinding.class,
          coreEnvironmentService.getSocketProcessBindingInjector());
    }
    coreEnvBuilder.setInitialMode(ServiceController.Mode.ACTIVE).install();
  }