/**
   * PUBLIC: Return a session broker that behaves as a client session broker. An acquire session
   * broker is done under the covers on each session inside the session broker, and a new broker is
   * returned.
   *
   * <p>NOTE: when finished with the client broker, it should be releases. See
   * releaseClientSessionBroker.
   */
  public SessionBroker acquireClientSessionBroker() {
    log(SessionLog.FINER, SessionLog.CONNECTION, "acquire_client_session_broker");
    SessionBroker clientBroker = copySessionBroker();
    clientBroker.parent = this;
    clientBroker
        .getIdentityMapAccessorInstance()
        .setIdentityMapManager(getIdentityMapAccessorInstance().getIdentityMapManager());
    clientBroker.commitManager = getCommitManager();
    clientBroker.commandManager = getCommandManager();
    clientBroker.externalTransactionController = getExternalTransactionController();
    clientBroker.setServerPlatform(getServerPlatform());
    String sessionName;
    AbstractSession serverSession;
    Iterator names = this.getSessionsByName().keySet().iterator();
    while (names.hasNext()) {
      sessionName = (String) names.next();
      serverSession = getSessionForName(sessionName);
      if (serverSession instanceof org.eclipse.persistence.sessions.server.ServerSession) {
        if (serverSession.getProject().hasIsolatedClasses()) {
          throw ValidationException.isolatedDataNotSupportedInSessionBroker(sessionName);
        }
        clientBroker.internalRegisterSession(
            sessionName,
            ((org.eclipse.persistence.sessions.server.ServerSession) serverSession)
                .acquireClientSession());
      } else {
        throw ValidationException.cannotAcquireClientSessionFromSession();
      }
    }

    clientBroker.initializeSequencing();
    return clientBroker;
  }
    @Override
    public void bootstrapBeanValidation(
        Map puProperties, AbstractSession session, ClassLoader appClassLoader) {

      ValidatorFactory validatorFactory = getValidatorFactory(puProperties);

      // Check user/environment has specified the validator factory
      if (validatorFactory != null) {
        // We could obtain a validator factory => Bean Validation API is available at runtime. It is
        // ok to cast now
        ValidatorFactory beanValidatorFactory = validatorFactory;

        Class[] groupPrePersit =
            translateValidationGroups(
                (String) puProperties.get(PersistenceUnitProperties.VALIDATION_GROUP_PRE_PERSIST),
                appClassLoader);
        Class[] groupPreUpdate =
            translateValidationGroups(
                (String) puProperties.get(PersistenceUnitProperties.VALIDATION_GROUP_PRE_UPDATE),
                appClassLoader);
        Class[] groupPreRemove =
            translateValidationGroups(
                (String) puProperties.get(PersistenceUnitProperties.VALIDATION_GROUP_PRE_REMOVE),
                appClassLoader);

        BeanValidationListener validationListener =
            new BeanValidationListener(
                beanValidatorFactory, groupPrePersit, groupPreUpdate, groupPreRemove);
        // Install BeanValidationListener on the desc
        for (ClassDescriptor descriptor : session.getProject().getOrderedDescriptors()) {
          if (descriptor.isDescriptorTypeNormal()) {
            // add only to entities
            descriptor.getEventManager().addInternalListener(validationListener);
          }
        }
      }
    }