/*
* 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.example.gallery;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.apache.openjpa.example.gallery.model.Image;
import org.apache.openjpa.example.gallery.model.Location;
public class TestJPAValidation extends junit.framework.TestCase {
/**
* Shows usage of BV constraints with JPA at pre-update, pre-remove,
* and pre-persist lifecycle events.
*/
public void testValidation() {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("BeanValidation");
EntityManager em = emf.createEntityManager();
// Create a valid location
Location loc = new Location();
loc.setCity("Rochester");
loc.setState("MN");
loc.setZipCode("55901");
loc.setCountry("USA");
// Create an Image with non-matching type and file extension
Image img = new Image();
img.setType(ImageType.JPEG);
img.setFileName("Winter_01.gif");
loadImage(img);
img.setLocation(loc);
// *** PERSIST ***
try {
em.getTransaction().begin();
System.out.println("Persisting an entity with non-matching extension and type");
em.persist(img);
fail();
} catch (ConstraintViolationException cve) {
// Transaction was marked for rollback, roll it back and
// start a new TX
em.getTransaction().rollback();
handleConstraintViolation(cve);
em.getTransaction().begin();
System.out.println("Fixing the file type and re-attempting the persist.");
img.setType(ImageType.GIF);
em.persist(img);
em.getTransaction().commit();
System.out.println("Persist was successful");
}
// *** UPDATE ***
try {
em.getTransaction().begin();
// Modify the file name to a non-matching file name
// and commit to trigger an update
System.out.println("Modifying file name to use an extension that does not");
System.out.println("match the file type. This will cause a CVE.");
img.setFileName("Winter_01.jpg");
em.getTransaction().commit();
fail();
} catch (ConstraintViolationException cve) {
// Handle the exception. The commit failed so the transaction
// was already rolled back.
System.out.println("Update failed as expected");
handleConstraintViolation(cve);
}
// The update failure caused img to be detached. It must be merged back
// into the persistence context.
img = em.merge(img);
// *** REMOVE ***
em.getTransaction().begin();
try {
// Remove the type and commit to trigger removal
System.out.println("Setting the type to an invalid type. This will cause a");
System.out.println("validation exception upon removal");
img.setType(null);
em.remove(img);
em.getTransaction().commit();
fail();
} catch (ConstraintViolationException cve) {
// Rollback the active transaction and handle the exception
em.getTransaction().rollback();
System.out.println("Remove failed as expected");
handleConstraintViolation(cve);
}
em.close();
emf.close();
System.out.println("Done");
}
// Handles constraint violations by printing out violation information
private static void handleConstraintViolation(ConstraintViolationException cve) {
Set<ConstraintViolation<?>> cvs = cve.getConstraintViolations();
for (ConstraintViolation<?> cv : cvs) {
System.out.println("------------------------------------------------");
System.out.println("Violation: " + cv.getMessage());
System.out.println("Entity: " + cv.getRootBeanClass().getSimpleName());
// The violation occurred on a leaf bean (embeddable)
if (cv.getLeafBean() != null && cv.getRootBean() != cv.getLeafBean()) {
System.out.println("Embeddable: " + cv.getLeafBean().getClass().getSimpleName());
}
System.out.println("Attribute: " + cv.getPropertyPath());
System.out.println("Invalid value: " + cv.getInvalidValue());
System.out.println("------------------------------------------------");
}
}
// Mock image loading utility... simply loads the GIF89a header to satisfy the
// constraint validator.
private static void loadImage(Image img) {
img.setData(new byte[] { 'G', 'I', 'F', '8', '9', 'a' });
}
}