blob: c22b2818c629d8c5b3b185a33463a15e79b0418c [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.persistence.validation;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.ValidationMode;
import org.apache.openjpa.conf.OpenJPAConfiguration;
import org.apache.openjpa.event.LifecycleEvent;
import org.apache.openjpa.event.PersistListener;
import org.apache.openjpa.event.StoreListener;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
import org.apache.openjpa.persistence.OpenJPAPersistence;
import org.apache.openjpa.persistence.PersistenceException;
import org.apache.openjpa.persistence.query.SimpleEntity;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
/**
* Tests the new Bean Validation Mode support in the JPA 2.0 spec.
* Basic (no provider) Validation scenarios being tested:
* 1) By default, validation mode is AUTO
* 2) Validation mode of AUTO in persistence.xml is the same as default
* 3) Validation mode of NONE in persistence.xml overrides default AUTO
* 4) Validation mode of CALLBACK in persistence.xml overrides default AUTO
* 5) Validation mode in createEMF(Map props) overrides no persistence.xml
* 6) Validation mode in createEMF(Map props) overrides persistence.xml
* 7) Validation mode in createEMF(Map props) can be a ValidationMode enum
*
* @version $Rev$ $Date$
*/
public class TestValidationMode extends SingleEMFTestCase {
@Override
public void setUp() {
super.setUp(CLEAR_TABLES, SimpleEntity.class);
}
/**
* Scenario being tested:
* 1) By default, validation mode == AUTO
*/
public void testValidationMode1() {
getLog().trace("testValidationMode1() - Default mode is AUTO");
// create our EMF
OpenJPAEntityManagerFactorySPI emf = (OpenJPAEntityManagerFactorySPI)
OpenJPAPersistence.createEntityManagerFactory(
"simple",
"org/apache/openjpa/persistence/validation/persistence.xml");
assertNotNull(emf);
try {
// verify default validation mode
OpenJPAConfiguration conf = emf.getConfiguration();
assertNotNull(conf);
assertEquals("Default validation mode",
String.valueOf(ValidationMode.AUTO),
conf.getValidationMode());
} finally {
cleanup(emf);
}
}
/**
* Scenario being tested:
* 2) Validation mode of AUTO in persistence.xml is the same as default
*/
public void testValidationMode2() {
getLog().trace("testValidationMode1() - AUTO in persistence.xml");
// create our EMF
OpenJPAEntityManagerFactorySPI emf = (OpenJPAEntityManagerFactorySPI)
OpenJPAPersistence.createEntityManagerFactory(
"simple-auto-mode",
"org/apache/openjpa/persistence/validation/persistence.xml");
assertNotNull(emf);
try {
// verify expected validation mode
OpenJPAConfiguration conf = emf.getConfiguration();
assertNotNull(conf);
assertEquals("Validation mode",
String.valueOf(ValidationMode.AUTO),
conf.getValidationMode());
} finally {
cleanup(emf);
}
}
/**
* Scenario being tested:
* 3) Validation mode of NONE in persistence.xml overrides default
*/
public void testValidationMode3() {
getLog().trace("testValidationMode3() - persistence.xml overrides " +
"Default");
// create our EMF
OpenJPAEntityManagerFactorySPI emf = (OpenJPAEntityManagerFactorySPI)
OpenJPAPersistence.createEntityManagerFactory(
"simple-none-mode",
"org/apache/openjpa/persistence/validation/persistence.xml");
assertNotNull(emf);
try {
// verify validation mode
OpenJPAConfiguration conf = emf.getConfiguration();
assertNotNull(conf);
assertEquals("Validation mode",
String.valueOf(ValidationMode.NONE),
conf.getValidationMode());
} finally {
cleanup(emf);
}
}
/**
* Scenario being tested:
* 4) Validation mode of CALLBACK in persistence.xml overrides default
* and causes an exception when neither the Validation APIs nor
* a provider are available
*/
public void testValidationMode4() {
getLog().trace("testValidationMode4() - persistence.xml overrides " +
"Default");
OpenJPAEntityManagerFactorySPI emf = null;
try {
// create our EMF
emf = (OpenJPAEntityManagerFactorySPI)
OpenJPAPersistence.createEntityManagerFactory(
"simple-callback-mode",
"org/apache/openjpa/persistence/validation/persistence.xml");
assertNotNull(emf);
// verify validation mode
OpenJPAConfiguration conf = emf.getConfiguration();
assertNotNull(conf);
assertEquals("Validation mode",
String.valueOf(ValidationMode.CALLBACK),
conf.getValidationMode());
} catch (PersistenceException e) {
// expected when no Validation APIs or provider are available
getLog().trace("testValidationMode4() - caught expected " +
"exception", e);
} finally {
cleanup(emf);
}
}
/**
* Scenario being tested:
* 5) Validation mode in createEMF(Map props) overrides no persistence.xml
*/
public void testValidationMode5() {
getLog().trace("testValidationMode5() - Map(NONE) overrides default");
// create the Map to test overrides
Map<String,String> props = new HashMap<>();
props.put("javax.persistence.validation.mode",
String.valueOf(ValidationMode.NONE));
// create our EMF
OpenJPAEntityManagerFactorySPI emf = (OpenJPAEntityManagerFactorySPI)
OpenJPAPersistence.createEntityManagerFactory(
"simple",
"org/apache/openjpa/persistence/validation/persistence.xml",
props);
assertNotNull(emf);
try {
// verify validation mode
OpenJPAConfiguration conf = emf.getConfiguration();
assertNotNull(conf);
assertEquals("Validation mode",
String.valueOf(ValidationMode.NONE),
conf.getValidationMode());
} finally {
cleanup(emf);
}
}
/**
* Scenario being tested:
* 6) Validation mode in createEMF(Map props) overrides persistence.xml
*/
public void testValidationMode6() {
getLog().trace("testValidationMode6() - Map(NONE) overrides PU " +
"provided mode=callback");
// create the Map to test overrides
Map<String,String> props = new HashMap<>();
props.put("javax.persistence.validation.mode",
String.valueOf(ValidationMode.NONE));
// create our EMF
OpenJPAEntityManagerFactorySPI emf = (OpenJPAEntityManagerFactorySPI)
OpenJPAPersistence.createEntityManagerFactory(
"simple-callback-mode",
"org/apache/openjpa/persistence/validation/persistence.xml",
props);
assertNotNull(emf);
try {
// verify validation mode
OpenJPAConfiguration conf = emf.getConfiguration();
assertNotNull(conf);
assertEquals("Validation mode",
String.valueOf(ValidationMode.NONE),
conf.getValidationMode());
} finally {
cleanup(emf);
}
}
/**
* Scenario being tested:
* 7) Validation mode in createEMF(Map props) can be a ValidationMode enum
*/
public void testValidationMode7() {
getLog().trace("testValidationMode7() - Map(ValidationMode.NONE) " +
"overrides PU provided mode=callback");
// create the Map to test overrides
Map<String,Object> props = new HashMap<>();
props.put("javax.persistence.validation.mode",
ValidationMode.NONE);
// create our EMF
OpenJPAEntityManagerFactorySPI emf = (OpenJPAEntityManagerFactorySPI)
OpenJPAPersistence.createEntityManagerFactory(
"simple-callback-mode",
"org/apache/openjpa/persistence/validation/persistence.xml",
props);
assertNotNull(emf);
try {
// verify validation mode
OpenJPAConfiguration conf = emf.getConfiguration();
assertNotNull(conf);
assertEquals("Validation mode",
String.valueOf(ValidationMode.NONE),
conf.getValidationMode());
} finally {
cleanup(emf);
}
}
/**
* Scenario being tested:
* 8) Life cycle event should be entity manager (Broker) specific.
*/
public void testUniqueLifecycleManager() {
getLog().trace("testUniqueLifecycleManager() - Life cycle event tests");
// create our EMF
Map<String,String> prop = new HashMap<>();
prop.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
// prop.put("openjpa.Compatibility", "SingletonLifecycleEventManager=true");
OpenJPAEntityManagerFactorySPI emf = (OpenJPAEntityManagerFactorySPI)
OpenJPAPersistence.createEntityManagerFactory(
"simple",
"org/apache/openjpa/persistence/validation/persistence.xml",
prop);
assertNotNull(emf);
try {
final OpenJPAEntityManagerSPI em = emf.createEntityManager();
final OpenJPAEntityManagerSPI em2 = emf.createEntityManager();
UniqueLifecycleListener l1 = new UniqueLifecycleListener();
UniqueLifecycleListener l2 = new UniqueLifecycleListener();
em.addLifecycleListener(l1, (Class<?>[])null);
em2.addLifecycleListener(l2, (Class<?>[])null);
l1.assertCounts(0, 0, 0, 0);
l2.assertCounts(0, 0, 0, 0);
em.getTransaction().begin();
SimpleEntity e1 = new SimpleEntity();
em.persist(e1);
l1.assertCounts(1, 1, 0, 0);
l2.assertCounts(0, 0, 0, 0);
em2.getTransaction().begin();
SimpleEntity e2 = new SimpleEntity();
em2.persist(e2);
l1.assertCounts(1, 1, 0, 0);
l2.assertCounts(1, 1, 0, 0);
em2.getTransaction().commit();
l1.assertCounts(1, 1, 0, 0);
l2.assertCounts(1, 1, 1, 1);
em.getTransaction().commit();
l1.assertCounts(1, 1, 1, 1);
l2.assertCounts(1, 1, 1, 1);
} finally {
cleanup(emf);
}
}
class UniqueLifecycleListener implements PersistListener, StoreListener {
public int beforePersistCount;
public int afterPersistCount;
public int beforeStoreCount;
public int afterStoreCount;
@Override
public void beforePersist(LifecycleEvent event) {
beforePersistCount++;
}
@Override
public void afterPersist(LifecycleEvent event) {
afterPersistCount++;
}
@Override
public void beforeStore(LifecycleEvent event) {
beforeStoreCount++;
}
@Override
public void afterStore(LifecycleEvent event) {
afterStoreCount++;
}
public void assertCounts(int beforePersist, int afterPersist, int beforeStore, int afterStore) {
assertEquals(beforePersist, beforePersistCount);
assertEquals(afterPersist, afterPersistCount);
assertEquals(beforeStore, beforeStoreCount);
assertEquals(afterStore, afterStoreCount);
}
}
/**
* Helper method to remove entities and close the emf an any open em's.
* @param emf
*/
private void cleanup(OpenJPAEntityManagerFactorySPI emf) {
clear(emf);
closeEMF(emf);
}
}