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; }