Bug 414974: allow eclipselink.archive.factory and eclipselink.target-server to be specified as an integration property of PersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo, Map)

Signed-off-by: Scott Marlow <smarlow@redhat.com>
Reviewed-by: LukasJ, TomasK
diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java
index 789c1bf..04fd493 100644
--- a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 1998, 2016 Oracle and/or its affiliates, IBM Corporation.
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates, IBM Corporation.
  * All rights reserved. This program and the accompanying materials are made available
  * under the terms of the Eclipse Public License v1.0 and Eclipse Distribution License
  * v. 1.0 which accompanies this distribution.
@@ -15,6 +15,8 @@
  *       - 439163: JSE Bootstrapping does not handle "wsjar" URLs referencing war-contained resources
  *     08/29/2016 Jody Grassel
  *       - 500441: Eclipselink core has System.getProperty() calls that are not potentially executed under doPriv()
+ *     11/23/2017: Scott Marlow
+ *       - 414974: allow eclipselink.archive.factory to be specified as an integration property of PersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo, Map)
  ******************************************************************************/
 package org.eclipse.persistence.internal.jpa.deployment;
 
@@ -63,6 +65,7 @@
 import org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAnnotation;
 import org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataClass;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
+import org.eclipse.persistence.internal.security.PrivilegedGetSystemProperty;
 import org.eclipse.persistence.internal.security.PrivilegedNewInstanceFromClass;
 import org.eclipse.persistence.jpa.Archive;
 import org.eclipse.persistence.jpa.ArchiveFactory;
@@ -360,7 +363,7 @@ public static Set<Archive> findPersistenceArchives(ClassLoader loader, String de
      *
      * @param loader the class loader to get the class path from
      */
-    public static Set<Archive> findPersistenceArchives(ClassLoader loader, String descriptorPath, List<URL> jarFileUrls) {
+    public static Set<Archive> findPersistenceArchives(ClassLoader loader, String descriptorPath, List<URL> jarFileUrls, Map properties) {
         Archive archive = null;
 
         Set<Archive> archives = new HashSet<Archive>();
@@ -376,7 +379,7 @@ public static Set<Archive> findPersistenceArchives(ClassLoader loader, String de
         try {
             for(int i=0; i < jarFileUrls.size(); i++) {
                 URL puRootUrl = jarFileUrls.get(i);
-                archive = PersistenceUnitProcessor.getArchiveFactory(loader).createArchive(puRootUrl, descriptorPath, null);
+                archive = PersistenceUnitProcessor.getArchiveFactory(loader, properties).createArchive(puRootUrl, descriptorPath, null);
 
                 // archive = new BundleArchive(puRootUrl, descUrl);
                 if (archive != null){
@@ -398,7 +401,7 @@ public static Set<SEPersistenceUnitInfo> getPersistenceUnits(ClassLoader loader,
         if(descriptorPath == null) {
             descriptorPath = PrivilegedAccessHelper.getSystemProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML_DEFAULT);
         }
-        Set<Archive> archives = findPersistenceArchives(loader, descriptorPath, jarFileUrls);
+        Set<Archive> archives = findPersistenceArchives(loader, descriptorPath, jarFileUrls, m);
         Set<SEPersistenceUnitInfo> puInfos = new HashSet();
         try {
             for(Archive archive : archives) {
@@ -414,12 +417,25 @@ public static Set<SEPersistenceUnitInfo> getPersistenceUnits(ClassLoader loader,
     }
 
     public static ArchiveFactory getArchiveFactory(ClassLoader loader){
+        return getArchiveFactory(loader, null);
+    }
+
+    public static ArchiveFactory getArchiveFactory(ClassLoader loader, Map properties){
         if (ARCHIVE_FACTORY != null){
             return ARCHIVE_FACTORY;
         }
 
         ArchiveFactory factory = null;
-        String factoryClassName = PrivilegedAccessHelper.getSystemProperty(SystemProperties.ARCHIVE_FACTORY, null);
+        String factoryClassName = PrivilegedAccessHelper.shouldUsePrivilegedAccess()
+                ? AccessController.doPrivileged(new PrivilegedGetSystemProperty(SystemProperties.ARCHIVE_FACTORY))
+                : System.getProperty(SystemProperties.ARCHIVE_FACTORY);
+
+        if (factoryClassName == null && properties != null) {
+            Object name = properties.get(SystemProperties.ARCHIVE_FACTORY);
+            if(name instanceof String) {
+                factoryClassName = (String) name;
+            }
+        }
 
         if (factoryClassName == null) {
             return new ArchiveFactoryImpl();
@@ -453,7 +469,7 @@ public static Set<String> getClassNamesFromURL(URL url, ClassLoader loader, Map
         Set<String> classNames = new HashSet<String>();
         Archive archive = null;
         try {
-            archive = PersistenceUnitProcessor.getArchiveFactory(loader).createArchive(url, properties);
+            archive = PersistenceUnitProcessor.getArchiveFactory(loader, properties).createArchive(url, properties);
 
             if (archive != null) {
                 for (Iterator<String> entries = archive.getEntries(); entries.hasNext();) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java
index cb660e8..e3f6fc4 100644
--- a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 1998, 2015 Oracle and/or its affiliates, IBM Corporation. All rights reserved.
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates, IBM Corporation. All rights reserved.
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
  * which accompanies this distribution.
@@ -33,6 +33,8 @@
  *       - 374688: JPA 2.1 Converter support
  *     08/18/2014-2.5 Jody Grassel (IBM Corporation)
  *       - 440802: xml-mapping-metadata-complete does not exclude @Entity annotated entities
+ *     11/23/2017: Scott Marlow
+ *       - 414974: allow eclipselink.archive.factory to be specified as an integration property of PersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo, Map)
  ******************************************************************************/
 package org.eclipse.persistence.internal.jpa.metadata;
 
@@ -468,7 +470,7 @@ protected void loadStandardMappingFiles(String ormXMLFile) {
 
             Archive par = null;
             try {
-                par = PersistenceUnitProcessor.getArchiveFactory(m_loader).createArchive(rootURL, null);
+                par = PersistenceUnitProcessor.getArchiveFactory(m_loader, m_predeployProperties).createArchive(rootURL, null);
 
                 if (par != null) {
                     ormURL = par.getEntryAsURL(ormXMLFile);