/* * 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.integration.validation; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import org.apache.openjpa.lib.log.Log; import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI; import org.apache.openjpa.persistence.OpenJPAPersistence; import org.apache.openjpa.persistence.test.AbstractPersistenceTestCase; public class TestConstraintViolation extends AbstractPersistenceTestCase { EntityManagerFactory emf2 = null; Log log = null; public void setUp() { Map<String, String> props = new HashMap<String, String>(); props.put("javax.persistence.validation.group.pre-remove", "javax.validation.groups.Default"); // This test case uses a different persistence xml file because validation require 2.0 xsd. emf2 = OpenJPAPersistence.createEntityManagerFactory("ConstraintViolationTestPU", "org/apache/openjpa/integration/validation/persistence.xml", props); log = ((OpenJPAEntityManagerFactorySPI)emf2).getConfiguration().getLog("Tests"); EntityManager em = emf2.createEntityManager(); Image img = em.find(Image.class, 1); if (img != null) { em.getTransaction().begin(); em.remove(img); em.getTransaction().commit(); } em.close(); } public void testPersistNormalValidation() { EntityManager em = emf2.createEntityManager(); // Persist with successful validations Location loc = new Location(); loc.setCity("Rochester"); loc.setStreet(null); loc.setState("MN"); loc.setZipCode("55901"); loc.setCountry("USA"); Image img = new Image(); img.setId(1); img.setFileName("Winter_01.gif"); img.setLocation(loc); try { em.getTransaction().begin(); log.trace("------------------------------------------------"); log.trace("** Persist with successful validations"); em.persist(img); } catch (ConstraintViolationException cve) { // Transaction was marked for rollback, roll it back and start a new TX Set<ConstraintViolation<?>> cvs = cve.getConstraintViolations(); for (ConstraintViolation<?> cv : cvs) { log.trace("Message: " + cv.getMessage()); log.trace("RootBean: " + cv.getRootBean()); log.trace("LeafBean: " + cv.getLeafBean()); log.trace("PropertyPath: " + cv.getPropertyPath()); log.trace("Invalid value: " + cv.getInvalidValue()); } fail(); } finally { em.getTransaction().rollback(); em.close(); emf2.close(); } } public void testPersistImageNullValidation() { EntityManager em = emf2.createEntityManager(); // Persist with null filename in Image Location loc = new Location(); loc.setCity("Rochester"); loc.setStreet("3605 Hwy 52 N"); loc.setState("MN"); loc.setZipCode("55901"); loc.setCountry("USA"); Image img = new Image(); img.setId(1); img.setFileName(null); img.setLocation(loc); try { em.getTransaction().begin(); log.trace("------------------------------------------------"); log.trace("** Persist with null filename in Image"); em.persist(img); fail(); } catch (ConstraintViolationException cve) { // Transaction was marked for rollback, roll it back and start a new TX Set<ConstraintViolation<?>> cvs = cve.getConstraintViolations(); assertEquals(1, cvs.size()); for (ConstraintViolation<?> cv : cvs) { log.trace("Message: " + cv.getMessage()); log.trace("RootBean: " + cv.getRootBean()); log.trace("LeafBean: " + cv.getLeafBean()); log.trace("PropertyPath: " + cv.getPropertyPath()); log.trace("Invalid value: " + cv.getInvalidValue()); assertEquals("Image file name must not be null.", cv.getMessage()); assertEquals("Image", cv.getRootBeanClass().getSimpleName()); assertEquals("Image", cv.getLeafBean().getClass().getSimpleName()); assertTrue(cv.getLeafBean().getClass() == cv.getRootBeanClass()); assertEquals("fileName", cv.getPropertyPath().toString()); assertNull(cv.getInvalidValue()); } } finally { em.getTransaction().rollback(); em.close(); emf2.close(); } } public void testPersistEmbedCityNullValidation() { EntityManager em = emf2.createEntityManager(); // Persist with null city name in location Location loc = new Location(); loc.setCity(null); loc.setStreet("3605 Hwy 52 N"); loc.setState("MN"); loc.setZipCode("55901"); loc.setCountry("USA"); Image img = new Image(); img.setId(1); img.setFileName("Winter_01.gif"); img.setLocation(loc); try { em.getTransaction().begin(); log.trace("------------------------------------------------"); log.trace("** Persist with null city name in location" ); em.persist(img); fail(); } catch (ConstraintViolationException cve) { // Transaction was marked for rollback, roll it back and start a new TX Set<ConstraintViolation<?>> cvs = cve.getConstraintViolations(); assertEquals(1, cvs.size()); for (ConstraintViolation<?> cv : cvs) { log.trace("Message: " + cv.getMessage()); log.trace("RootBean: " + cv.getRootBean()); log.trace("LeafBean: " + cv.getLeafBean()); log.trace("PropertyPath: " + cv.getPropertyPath()); log.trace("Invalid value: " + cv.getInvalidValue()); assertEquals("City must be specified.", cv.getMessage()); assertEquals("Image", cv.getRootBeanClass().getSimpleName()); // The violation occurred on a leaf bean (embeddable) assertEquals("Location", cv.getLeafBean().getClass().getSimpleName()); assertTrue(cv.getLeafBean().getClass() != cv.getRootBeanClass()); assertEquals("location.city", cv.getPropertyPath().toString()); assertNull(cv.getInvalidValue()); } } finally { em.getTransaction().rollback(); em.close(); emf2.close(); } } public void testRemoveEmbedCityNullValidation() { EntityManager em = emf2.createEntityManager(); // Remove with null city name in location Location loc = new Location(); loc.setCity("Rochester"); loc.setStreet("3605 Hwy 52 N"); loc.setState("MN"); loc.setZipCode("55901"); loc.setCountry("USA"); Image img = new Image(); img.setId(1); img.setFileName("Winter_01.gif"); img.setLocation(loc); try { em.getTransaction().begin(); log.trace("------------------------------------------------"); log.trace("** Create normal Image/location" ); em.persist(img); em.getTransaction().commit(); } catch (ConstraintViolationException cve) { fail(); } try { em.getTransaction().begin(); log.trace("** set null city name in location and remove" ); img.getLocation().setCity(null); em.remove(img); fail(); } catch (ConstraintViolationException cve) { // Transaction was marked for rollback, roll it back and // start a new TX Set<ConstraintViolation<?>> cvs = cve.getConstraintViolations(); assertEquals(1, cvs.size()); for (ConstraintViolation<?> cv : cvs) { log.trace("Message: " + cv.getMessage()); log.trace("RootBean: " + cv.getRootBean()); log.trace("LeafBean: " + cv.getLeafBean()); log.trace("PropertyPath: " + cv.getPropertyPath()); log.trace("Invalid value: " + cv.getInvalidValue()); assertEquals("City must be specified.", cv.getMessage()); assertEquals("Image", cv.getRootBeanClass().getSimpleName()); // The violation occurred on a leaf bean (embeddable) assertEquals("Location", cv.getLeafBean().getClass().getSimpleName()); assertTrue(cv.getLeafBean().getClass() != cv.getRootBeanClass()); assertEquals("location.city", cv.getPropertyPath().toString()); assertNull(cv.getInvalidValue()); } } finally { em.getTransaction().rollback(); em.close(); emf2.close(); } } public void testFlushEmbedCityNullValidation() { EntityManager em = emf2.createEntityManager(); // set invalid zipCode in location and flush testing pre-update Location loc = new Location(); loc.setCity("Rochester"); loc.setStreet("3605 Hwy 52 N"); loc.setState("MN"); loc.setZipCode("55901"); loc.setCountry("USA"); Image img = new Image(); img.setId(1); img.setFileName("Winter_01.gif"); img.setLocation(loc); try { em.getTransaction().begin(); log.trace("------------------------------------------------"); log.trace("** Create normal Image/location" ); em.persist(img); em.getTransaction().commit(); } catch (ConstraintViolationException cve) { fail(); } try { em.getTransaction().begin(); log.trace("** set invalid zipCode and flush testing pre-update" ); img.getLocation().setZipCode("abcde"); em.flush(); fail(); } catch (ConstraintViolationException cve) { // Transaction was marked for rollback, roll it back and start a new TX Set<ConstraintViolation<?>> cvs = cve.getConstraintViolations(); assertEquals(1, cvs.size()); for (ConstraintViolation<?> cv : cvs) { log.trace("Message: " + cv.getMessage()); log.trace("RootBean: " + cv.getRootBean()); log.trace("LeafBean: " + cv.getLeafBean()); log.trace("PropertyPath: " + cv.getPropertyPath()); log.trace("Invalid value: " + cv.getInvalidValue()); assertEquals("Zip code must be 5 digits or use the 5+4 format.", cv.getMessage()); assertEquals("Image", cv.getRootBeanClass().getSimpleName()); // The violation occurred on a leaf bean (embeddable) assertEquals("Location", cv.getLeafBean().getClass().getSimpleName()); assertTrue(cv.getLeafBean().getClass() != cv.getRootBeanClass()); assertEquals("location.zipCode", cv.getPropertyPath().toString()); assertEquals("abcde", cv.getInvalidValue()); } } finally { em.getTransaction().rollback(); em.close(); emf2.close(); } } }