/* * 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.enhance.ids; import java.util.List; import java.util.Random; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import org.apache.openjpa.persistence.test.SingleEMFTestCase; /** * Verifies the use of the openjpa.OptimizeIdCopy configuration parameter. This parameter * changes the behavior of the enhancer and thus, must be set before enhancement occurs. There * is special enhancement task in main/ant/enhancer.xml to ensure this value is set * during the enhancement process for the entities used by this test. */ public class TestOptimizeIdCopy extends SingleEMFTestCase { @Override public void setUp() { setUp(Device.class,Hardware.class,Software.class, CLEAR_TABLES); } /* * Verifies that constructor-based Id optimization occurs during Id copy. Asserts * only the proper/expected public constructor is called during the id copy operation. */ public void testIdOptimization() { EntityManager em = emf.createEntityManager(); // Add a software entity Software sw = new Software(); int id = new Random().nextInt(); sw.setIdInt(id); sw.setIdInteger(10); sw.setIdString("StringIdVal"); em.getTransaction().begin(); em.persist(sw); em.getTransaction().commit(); em.clear(); TypedQuery<Software> swq = em.createQuery("select sw from Software sw", Software.class); List<Software> swl = swq.getResultList(); assertTrue("Software result list > 0", swl.size() > 0); // Id copy optimization should have used the 3rd constructor assertFalse("First constructor was not used", SoftwareId.usedConstructor[0]); assertFalse("Second constructor was not used", SoftwareId.usedConstructor[1]); assertTrue("Third (correct) constructor was used", SoftwareId.usedConstructor[2]); em.close(); } /* * Verifies that constructor based optimization functions even if parms * are different than field order */ public void testIdOptimizationConstructorOutOfOrder() { EntityManager em = emf.createEntityManager(); Hardware hw = new Hardware(); String id = "Model" + (new Random().nextInt()); hw.setModel("Model" + id); hw.setSerial("123XYZ"); em.getTransaction().begin(); em.persist(hw); em.getTransaction().commit(); em.clear(); TypedQuery<Hardware> hwq = em.createQuery("select hw from Hardware hw", Hardware.class); List<Hardware> hwl = hwq.getResultList(); assertTrue("Hardware result list > 0", hwl.size() > 0); // Id copy optimization should have used the first constructor assertTrue("First (correct) constructor was used", HardwareId.usedConstructor[0]); assertFalse("Second constructor was not used", HardwareId.usedConstructor[1]); em.close(); } /* * Verifies that classes without a proper constructor do not get optimized */ public void testNoOptimization() { EntityManager em = emf.createEntityManager(); int id = new Random().nextInt(); Device d = new Device(); d.setId(id); d.setType(10); em.getTransaction().begin(); em.persist(d); em.getTransaction().commit(); em.clear(); TypedQuery<Device> dq = em.createQuery("select d from Device d", Device.class); List<Device> dl = dq.getResultList(); assertTrue("Device result list > 0", dl.size() > 0); // Only the first, default constructor should have been called assertTrue("First (default) constructor was used", DeviceId.usedConstructor[0]); assertFalse("Second constructor was not used", DeviceId.usedConstructor[1]); assertFalse("Third constructor was not used", DeviceId.usedConstructor[2]); em.close(); } }