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