public static ArchiveFactory getArchiveFactory(ClassLoader loader) {
    if (ARCHIVE_FACTORY != null) {
      return ARCHIVE_FACTORY;
    }

    ArchiveFactory factory = null;
    String factoryClassName = System.getProperty(SystemProperties.ARCHIVE_FACTORY, null);

    if (factoryClassName == null) {
      return new ArchiveFactoryImpl();
    } else {
      try {
        if (loader != null) {
          Class archiveClass = loader.loadClass(factoryClassName);
          if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
            try {
              factory =
                  (ArchiveFactory)
                      AccessController.doPrivileged(
                          new PrivilegedNewInstanceFromClass(archiveClass));
            } catch (PrivilegedActionException exception) {
              throw PersistenceUnitLoadingException.exceptionCreatingArchiveFactory(
                  factoryClassName, exception);
            }
          } else {
            factory = (ArchiveFactory) PrivilegedAccessHelper.newInstanceFromClass(archiveClass);
          }
        }
      } catch (ClassNotFoundException cnfe) {
        throw PersistenceUnitLoadingException.exceptionCreatingArchiveFactory(
            factoryClassName, cnfe);
      } catch (IllegalAccessException iae) {
        throw PersistenceUnitLoadingException.exceptionCreatingArchiveFactory(
            factoryClassName, iae);
      } catch (InstantiationException ie) {
        throw PersistenceUnitLoadingException.exceptionCreatingArchiveFactory(factoryClassName, ie);
      }
    }

    return factory;
  }