blob: eec8a6011e606f60a7d743ea4fff8afb8f20c318 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.lib.conf;
import java.util.Properties;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.apache.openjpa.conf.OpenJPAConfiguration;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.OpenJPAPersistence;
import org.apache.openjpa.persistence.test.DatabasePlatform;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
/**
* Tests that configuration properties can be specified both as new
* javax.persistence.* namespace and old openjpa.* namespace. The two style can
* also be mixed where one property is in javax.* namespace the other in
* openjpa.*. But same property can not be specified in both style.
*
* Tests with different configuration sources such as persistence.xml, System
* properties and runtime properties.
*
* @author Pinaki Poddar
*
*/
@DatabasePlatform("org.apache.derby.jdbc.EmbeddedDriver")
public class TestEquivalentConfiguration extends SingleEMFTestCase {
private EntityManagerFactory emf1 = null;
private Properties _system;
private static final String OLD_STYLE_URL_KEY = "openjpa.ConnectionURL";
private static final String OLD_STYLE_DRIVER_KEY =
"openjpa.ConnectionDriverName";
private static final String NEW_STYLE_DRIVER_KEY =
"javax.persistence.jdbc.driver";
private static final String NEW_STYLE_URL_KEY =
"javax.persistence.jdbc.url";
private static final String[] KEYS = {
OLD_STYLE_DRIVER_KEY, OLD_STYLE_URL_KEY,
NEW_STYLE_DRIVER_KEY, NEW_STYLE_URL_KEY };
// NOTE: Non-standard naming because another test in the harness scans all
// META-INF/persistence.xml and fails as this file contains conflicting
// property keys for testing.
private static final String PERSISTENCE_UNIT =
"org/apache/openjpa/lib/conf/META-INF/persistence-config.xml";
private static final String OLD_STYLE_UNIT_NAME = "old-style";
private static final String NEW_STYLE_UNIT_NAME = "new-style";
private static final String MIXED_STYLE_UNIT_NAME = "mixed-style";
private static final String CONFLICT_STYLE_UNIT_NAME = "conflict-style";
private static final String SYSTEM_CONFIGURED_UNIT_NAME =
"system-configured";
private static final String RUNTIME_CONFIGURED_UNIT_NAME =
"runtime-configured";
private static final String URL =
"jdbc:derby:target/database/openjpa-test-database;create=true";
private static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
/**
* Erase that System properties to ensure they are not impacting the
* configuration as test harness inserts the System properties for
* connection parameters.
*/
@Override
public void setUp() throws Exception {
// Only run on Derby
setSupportedDatabases(
org.apache.openjpa.jdbc.sql.DerbyDictionary.class);
_system = backup();
clear(_system);
}
@Override
public void tearDown() throws Exception {
restore(_system);
super.tearDown();
if (emf1 != null) {
clear(emf1);
closeEMF(emf1);
emf1 = null;
}
}
/**
* Tests that openjpa.* namespace can be used for persistence.xml.
*/
public void testOldStylePersistenceUnitConfiguration() {
emf1 = OpenJPAPersistence.createEntityManagerFactory(OLD_STYLE_UNIT_NAME,
PERSISTENCE_UNIT);
assertNotNull(emf1);
assertTrue(containsProperty(OLD_STYLE_DRIVER_KEY));
assertTrue(containsProperty(OLD_STYLE_URL_KEY));
assertFalse(containsProperty(NEW_STYLE_DRIVER_KEY));
assertFalse(containsProperty(NEW_STYLE_URL_KEY));
verifyDatabaseConnection();
}
/**
* Tests that javax.* namespace can be used for persistence.xml.
*/
public void testNewStylePersistenceUnitConfiguration() {
emf1 = OpenJPAPersistence.createEntityManagerFactory(NEW_STYLE_UNIT_NAME,
PERSISTENCE_UNIT);
assertNotNull(emf1);
assertTrue(containsProperty(NEW_STYLE_DRIVER_KEY));
assertTrue(containsProperty(NEW_STYLE_URL_KEY));
assertFalse(containsProperty(OLD_STYLE_DRIVER_KEY));
assertFalse(containsProperty(OLD_STYLE_URL_KEY));
verifyDatabaseConnection();
}
/**
* Tests that openjpa.* and javax.* namespace can both be used for
* persistence.xml.
*/
public void testMixedStylePersistenceUnitConfiguration() {
emf1 = OpenJPAPersistence.createEntityManagerFactory(
MIXED_STYLE_UNIT_NAME, PERSISTENCE_UNIT);
assertNotNull(emf1);
assertTrue(containsProperty(NEW_STYLE_DRIVER_KEY));
assertFalse(containsProperty(NEW_STYLE_URL_KEY));
assertFalse(containsProperty(OLD_STYLE_DRIVER_KEY));
assertTrue(containsProperty(OLD_STYLE_URL_KEY));
verifyDatabaseConnection();
}
/**
* Tests that openjpa.* and javax.* namespace can not both be used for the
* same property in persistence.xml.
*
*/
public void testConflictStylePersistenceUnitConfiguration() {
try {
emf1 = OpenJPAPersistence.createEntityManagerFactory(
CONFLICT_STYLE_UNIT_NAME, PERSISTENCE_UNIT);
fail();
} catch (RuntimeException ex) {
// good
}
}
/**
* Tests that javax.* namespace can be used for System properties.
*/
public void testNewStyleSystemPropertyConfiguration() {
try {
System.setProperty(NEW_STYLE_DRIVER_KEY, DRIVER);
System.setProperty(NEW_STYLE_URL_KEY, URL);
emf1 = OpenJPAPersistence.createEntityManagerFactory(
SYSTEM_CONFIGURED_UNIT_NAME, PERSISTENCE_UNIT);
} finally {
System.getProperties().remove(NEW_STYLE_DRIVER_KEY);
System.getProperties().remove(NEW_STYLE_URL_KEY);
}
assertNotNull(emf1);
assertTrue(containsProperty(NEW_STYLE_DRIVER_KEY));
assertTrue(containsProperty(NEW_STYLE_URL_KEY));
assertFalse(containsProperty(OLD_STYLE_DRIVER_KEY));
assertFalse(containsProperty(OLD_STYLE_URL_KEY));
verifyDatabaseConnection();
}
/**
* Tests that openjpa.* namespace can be used for System properties.
*/
public void testOldStyleSystemPropertyConfiguration() {
try {
System.setProperty(OLD_STYLE_DRIVER_KEY, DRIVER);
System.setProperty(OLD_STYLE_URL_KEY, URL);
emf1 = OpenJPAPersistence.createEntityManagerFactory(
SYSTEM_CONFIGURED_UNIT_NAME, PERSISTENCE_UNIT);
} finally {
System.getProperties().remove(OLD_STYLE_DRIVER_KEY);
System.getProperties().remove(OLD_STYLE_URL_KEY);
}
assertNotNull(emf1);
assertFalse(containsProperty(NEW_STYLE_DRIVER_KEY));
assertFalse(containsProperty(NEW_STYLE_URL_KEY));
assertTrue(containsProperty(OLD_STYLE_DRIVER_KEY));
assertTrue(containsProperty(OLD_STYLE_URL_KEY));
verifyDatabaseConnection();
}
/**
* Tests that openjpa.* and javax.* namespace can both be used for System
* properties.
*/
public void testMixedStyleSystemPropertyConfiguration() {
System.setProperty(OLD_STYLE_DRIVER_KEY, DRIVER);
System.setProperty(NEW_STYLE_URL_KEY, URL);
try {
emf1 = OpenJPAPersistence.createEntityManagerFactory(
SYSTEM_CONFIGURED_UNIT_NAME, PERSISTENCE_UNIT);
} finally {
System.getProperties().remove(OLD_STYLE_DRIVER_KEY);
System.getProperties().remove(NEW_STYLE_URL_KEY);
}
assertNotNull(emf1);
assertFalse(containsProperty(NEW_STYLE_DRIVER_KEY));
assertTrue(containsProperty(NEW_STYLE_URL_KEY));
assertTrue(containsProperty(OLD_STYLE_DRIVER_KEY));
assertFalse(containsProperty(OLD_STYLE_URL_KEY));
verifyDatabaseConnection();
}
/**
* Tests that openjpa.* and javax.* namespace can not both be used for the
* same property in System configuration.
*/
public void testConflictStyleSystemPropertyConfiguration() {
System.setProperty(OLD_STYLE_DRIVER_KEY, DRIVER);
System.setProperty(NEW_STYLE_DRIVER_KEY, DRIVER);
try {
emf1 = OpenJPAPersistence.createEntityManagerFactory(
SYSTEM_CONFIGURED_UNIT_NAME, PERSISTENCE_UNIT);
fail();
} catch (RuntimeException ex) {
// good
} finally {
System.getProperties().remove(OLD_STYLE_DRIVER_KEY);
System.getProperties().remove(NEW_STYLE_DRIVER_KEY);
}
}
/**
* Tests that openjpa.* namespace can be used for runtime configuration.
*/
public void testOldStyleRuntimePropertyConfiguration() {
Properties conf = new Properties();
conf.setProperty(OLD_STYLE_DRIVER_KEY, DRIVER);
conf.setProperty(OLD_STYLE_URL_KEY, URL);
emf1 = OpenJPAPersistence.createEntityManagerFactory(
RUNTIME_CONFIGURED_UNIT_NAME, PERSISTENCE_UNIT, conf);
assertNotNull(emf1);
assertTrue(containsProperty(OLD_STYLE_DRIVER_KEY));
assertTrue(containsProperty(OLD_STYLE_URL_KEY));
assertFalse(containsProperty(NEW_STYLE_DRIVER_KEY));
assertFalse(containsProperty(NEW_STYLE_URL_KEY));
verifyDatabaseConnection();
}
/**
* Tests that javax.* namespace can be used for runtime configuration.
*/
public void testNewStyleRuntimePropertyConfiguration() {
Properties conf = new Properties();
conf.setProperty(NEW_STYLE_DRIVER_KEY, DRIVER);
conf.setProperty(NEW_STYLE_URL_KEY, URL);
emf1 = OpenJPAPersistence.createEntityManagerFactory(
RUNTIME_CONFIGURED_UNIT_NAME, PERSISTENCE_UNIT, conf);
assertNotNull(emf1);
assertFalse(containsProperty(OLD_STYLE_DRIVER_KEY));
assertFalse(containsProperty(OLD_STYLE_URL_KEY));
assertTrue(containsProperty(NEW_STYLE_DRIVER_KEY));
assertTrue(containsProperty(NEW_STYLE_URL_KEY));
verifyDatabaseConnection();
}
/**
* Tests that openjpa.* and javax.* namespace can both be used for runtime
* configuration.
*/
public void testMixedStyleRuntimePropertyConfiguration() {
Properties conf = new Properties();
conf.setProperty(OLD_STYLE_DRIVER_KEY, DRIVER);
conf.setProperty(NEW_STYLE_URL_KEY, URL);
emf1 = OpenJPAPersistence.createEntityManagerFactory(
RUNTIME_CONFIGURED_UNIT_NAME, PERSISTENCE_UNIT, conf);
assertNotNull(emf1);
assertTrue(containsProperty(OLD_STYLE_DRIVER_KEY));
assertFalse(containsProperty(OLD_STYLE_URL_KEY));
assertFalse(containsProperty(NEW_STYLE_DRIVER_KEY));
assertTrue(containsProperty(NEW_STYLE_URL_KEY));
verifyDatabaseConnection();
}
/**
* Tests that openjpa.* and javax.* namespace can not both be used for the
* same property in runtime configuration.
*/
public void testConflictStyleRuntimePropertyConfiguration() {
Properties conf = new Properties();
conf.setProperty(OLD_STYLE_DRIVER_KEY, DRIVER);
conf.setProperty(NEW_STYLE_DRIVER_KEY, DRIVER);
try {
emf1 = OpenJPAPersistence.createEntityManagerFactory(
RUNTIME_CONFIGURED_UNIT_NAME, PERSISTENCE_UNIT, conf);
fail();
} catch (RuntimeException ex) {
// good
}
}
void verifyDatabaseConnection() {
String driver = OpenJPAPersistence.cast(emf1).getConfiguration()
.getConnectionDriverName();
EntityManager em = emf1.createEntityManager();
em.getTransaction().begin();
em.flush();
em.getTransaction().commit();
}
boolean containsProperty(String key) {
return getConfiguration().toProperties(true).containsKey(key);
}
OpenJPAConfiguration getConfiguration() {
return ((OpenJPAEntityManagerFactorySPI)OpenJPAPersistence.cast(emf1))
.getConfiguration();
}
Properties backup() {
Properties p = new Properties();
for (String key : KEYS) {
if (System.getProperty(key) != null) {
p.setProperty(key, System.getProperty(key));
}
}
return p;
}
private void clear(Properties p) {
for (Object key : p.keySet()) {
System.getProperties().remove(key);
}
}
private void restore(Properties p) {
for (Object key : p.keySet()) {
System.setProperty(key.toString(), p.get(key).toString());
}
}
}