@Override
    protected void initAndInjectClassLoaderPlugin(
        ManagedConnectionFactory mcf, CommonDataSource dsMetadata) throws DeployException {
      ((BaseWrapperManagedConnectionFactory) mcf)
          .setClassLoaderPlugin(
              new ClassLoaderPlugin() {

                @Override
                public ClassLoader getClassLoader() {
                  return driverClassLoader();
                }
              });
    }
    private void setMcfProperties(
        final BaseWrapperManagedConnectionFactory managedConnectionFactory,
        CommonDataSource dataSourceConfig,
        final Statement statement) {

      if (dataSourceConfig.getTransactionIsolation() != null) {
        managedConnectionFactory.setTransactionIsolation(
            dataSourceConfig.getTransactionIsolation().name());
      }

      final DsSecurity security = dataSourceConfig.getSecurity();
      if (security != null) {
        if (security.getUserName() != null) {
          managedConnectionFactory.setUserName(security.getUserName());
        }
        if (security.getPassword() != null) {
          managedConnectionFactory.setPassword(security.getPassword());
        }
      }

      final TimeOut timeOut = dataSourceConfig.getTimeOut();
      if (timeOut != null) {
        if (timeOut.getUseTryLock() != null) {
          managedConnectionFactory.setUseTryLock(timeOut.getUseTryLock().intValue());
        }
        if (timeOut.getQueryTimeout() != null) {
          managedConnectionFactory.setQueryTimeout(timeOut.getQueryTimeout().intValue());
        }
        if (timeOut.isSetTxQueryTimeout()) {
          managedConnectionFactory.setTransactionQueryTimeout(true);
        }
      }

      if (statement != null) {
        if (statement.getTrackStatements() != null) {
          managedConnectionFactory.setTrackStatements(statement.getTrackStatements().name());
        }
        if (statement.isSharePreparedStatements() != null) {
          managedConnectionFactory.setSharePreparedStatements(
              statement.isSharePreparedStatements());
        }
        if (statement.getPreparedStatementsCacheSize() != null) {
          managedConnectionFactory.setPreparedStatementCacheSize(
              statement.getPreparedStatementsCacheSize().intValue());
        }
      }

      final Validation validation = dataSourceConfig.getValidation();
      if (validation != null) {
        if (validation.getCheckValidConnectionSql() != null) {
          managedConnectionFactory.setCheckValidConnectionSQL(
              validation.getCheckValidConnectionSql());
        }
        final Extension validConnectionChecker = validation.getValidConnectionChecker();
        if (validConnectionChecker != null) {
          if (validConnectionChecker.getClassName() != null) {
            managedConnectionFactory.setValidConnectionCheckerClassName(
                validConnectionChecker.getClassName());
          }
          if (validConnectionChecker.getConfigPropertiesMap() != null) {
            managedConnectionFactory.setValidConnectionCheckerProperties(
                buildConfigPropsString(validConnectionChecker.getConfigPropertiesMap()));
          }
        }
        final Extension exceptionSorter = validation.getExceptionSorter();
        if (exceptionSorter != null) {
          if (exceptionSorter.getClassName() != null) {
            managedConnectionFactory.setExceptionSorterClassName(exceptionSorter.getClassName());
          }
          if (exceptionSorter.getConfigPropertiesMap() != null) {
            managedConnectionFactory.setExceptionSorterProperties(
                buildConfigPropsString(exceptionSorter.getConfigPropertiesMap()));
          }
        }
        final Extension staleConnectionChecker = validation.getStaleConnectionChecker();
        if (staleConnectionChecker != null) {
          if (staleConnectionChecker.getClassName() != null) {
            managedConnectionFactory.setStaleConnectionCheckerClassName(
                staleConnectionChecker.getClassName());
          }
          if (staleConnectionChecker.getConfigPropertiesMap() != null) {
            managedConnectionFactory.setStaleConnectionCheckerProperties(
                buildConfigPropsString(staleConnectionChecker.getConfigPropertiesMap()));
          }
        }
      }
    }