/* * 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.embed.attrOverrides; import java.math.BigDecimal; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; import javax.persistence.Query; import org.apache.openjpa.persistence.test.SQLListenerTestCase; public class TestAttrOverrides extends SQLListenerTestCase { public int numPersons = 4; public int numPropertiesPerPersons = 4; public int eId = 1; public int pId = 1; public void setUp() throws Exception { super.setUp(DROP_TABLES, Address.class, Customer.class, PropertyInfo.class, PropertyOwner.class, PropertyRecord.class, Zipcode.class, Person.class); } /** * This is spec 10.1.4 Example 2 * Test AttributeOverride on embeddable fields */ public void testAttrOverride1() { sql.clear(); createObj1(); findObj1(); queryObj1(); assertAttrOverrides("CUS_ATTROVER"); } /** * This is spec 10.1.4. Example 3 * Test AttributeOverrides on embeddable Map field */ public void testAttrOverride2() { sql.clear(); createObj2(); findObj2(); queryObj2(); assertAttrOverrides("PROPREC_ATTROVER_parcels"); } /** * This is spec 10.1.35. Example 3 * Test OrderBy on embeddable field */ public void testEmbeddableOrderBy() { sql.clear(); createObj3(); findObj3(); } public void createObj1() { EntityManager em = emf.createEntityManager(); EntityTransaction tran = em.getTransaction(); for (int i = 0; i < numPersons; i++) createCustomer(em, eId++); tran.begin(); em.flush(); tran.commit(); em.close(); } public Customer createCustomer(EntityManager em, int id) { Customer p = new Customer(); p.setId(id); Address addr = new Address(); addr.setCity("city_" + id); addr.setState("state_" + id); addr.setStreet("street_" + id); p.setAddress(addr); p.setName("name_" + id); em.persist(p); return p; } public void findObj1() { EntityManager em = emf.createEntityManager(); Customer p = em.find(Customer.class, 1); assertEquals(p.getId(), new Integer(1)); assertEquals(p.getAddress().getCity(), "city_1"); assertEquals(p.getAddress().getStreet(), "street_1"); assertEquals(p.getAddress().getState(), "state_1"); assertEquals(p.getName(), "name_1"); em.close(); } public void queryObj1() { EntityManager em = emf.createEntityManager(); EntityTransaction tran = em.getTransaction(); tran.begin(); String jpql = "select p from Customer p"; Query q = em.createQuery(jpql); List<Customer> ps = q.getResultList(); assertEquals(ps.size(), numPersons); tran.commit(); em.close(); } public void createObj2() { EntityManager em = emf.createEntityManager(); EntityTransaction tran = em.getTransaction(); for (int i = 0; i < numPersons; i++) createPropertyRecord(em, pId++); tran.begin(); em.flush(); tran.commit(); em.close(); } public PropertyRecord createPropertyRecord(EntityManager em, int id) { PropertyRecord p = new PropertyRecord(); PropertyOwner owner = new PropertyOwner(); owner.setSsn("ssn_" + id); Address addr = new Address(); addr.setCity("city_" + id); addr.setState("state_" + id); addr.setStreet("street_" + id); Zipcode zipcode = new Zipcode(); zipcode.setZip("zip_" + id); zipcode.setPlusFour("+4_" + id); addr.setZipcode(zipcode); owner.setAddress(addr); p.setOwner(owner); for (int i = 0; i < numPropertiesPerPersons; i++) { PropertyInfo info = new PropertyInfo(); info.setParcelNumber(id*10 + i); info.setSize(id*10 + i); info.setTax(new BigDecimal(id*10 + i)); Address paddr = new Address(); paddr.setCity("pcity_" + id + "_" + i); paddr.setState("pstate_" + id + "_" + i); paddr.setStreet("pstreet_" + id + "_" + i); Zipcode pzipcode = new Zipcode(); pzipcode.setZip("pzip_" + id + "_" + i); pzipcode.setPlusFour("p+4_" + id + "_" + i); paddr.setZipcode(zipcode); p.addParcel(paddr, info); } em.persist(p); return p; } public void findObj2() { EntityManager em = emf.createEntityManager(); PropertyOwner owner = new PropertyOwner(); owner.setSsn("ssn_1"); Address addr = new Address(); addr.setCity("city_1"); addr.setState("state_1"); addr.setStreet("street_1"); Zipcode zipcode = new Zipcode(); zipcode.setZip("zip_1"); zipcode.setPlusFour("+4_1"); addr.setZipcode(zipcode); owner.setAddress(addr); PropertyRecord p = em.find(PropertyRecord.class, owner); assertEquals(p.getOwner().getSsn(), "ssn_1"); assertEquals(p.getOwner().getAddress().getCity(), "city_1"); assertEquals(p.getOwner().getAddress().getStreet(), "street_1"); assertEquals(p.getOwner().getAddress().getState(), "state_1"); assertEquals(p.getOwner().getAddress().getZipcode().getZip(), "zip_1"); assertEquals(p.getOwner().getAddress().getZipcode().getPlusFour(), "+4_1"); assertEquals(p.getParcels().size(), numPropertiesPerPersons); em.close(); } public void queryObj2() { EntityManager em = emf.createEntityManager(); EntityTransaction tran = em.getTransaction(); tran.begin(); String jpql = "select p from PropertyRecord p"; Query q = em.createQuery(jpql); List<PropertyRecord> ps = q.getResultList(); assertEquals(ps.size(), numPersons); tran.commit(); em.close(); } public void assertAttrOverrides(String tableName) { boolean found = false; for (String sqlStr : sql) { if (sqlStr.indexOf("CREATE TABLE " + tableName + " ") != -1) { if (tableName.equals("CUS_ATTROVER")) { found = true; if (sqlStr.indexOf("ADDR_STATE") == -1 || sqlStr.indexOf("ADDR_ZIP") == -1 || sqlStr.indexOf("ADDR_PLUSFOUR") == -1 ) fail(); } else if (tableName.equals("PROPREC_ATTROVER_parcels")) { found = true; if (sqlStr.indexOf("STREET_NAME") == -1 || sqlStr.indexOf("SQUARE_FEET") == -1 || sqlStr.indexOf("ASSESSMENT") == -1 ) fail(); } break; } } if (!found) fail(); } public void createObj3() { EntityManager em = emf.createEntityManager(); EntityTransaction tran = em.getTransaction(); for (int i = 0; i < numPersons; i++) createPerson(em, eId++); tran.begin(); em.flush(); tran.commit(); em.close(); } public Person createPerson(EntityManager em, int id) { Person p = new Person(); p.setSsn("ssn" + id); p.setName("name_" + id); for (int i = 4; i > 0; i--) { Address addr = new Address(); addr.setCity("city_" + id + "_" + i ); addr.setState("state_" + id + "_" + i); addr.setStreet("street_" + id + "_" + i); Zipcode zipCode = new Zipcode(); zipCode.setZip("zip_" + id + "_" + i); zipCode.setPlusFour("plusFour_" + id + "_" + i); addr.setZipcode(zipCode); p.addResidence(addr); p.addNickName("nickName_ + " + i); } em.persist(p); return p; } public void findObj3() { EntityManager em = emf.createEntityManager(); Person p = em.find(Person.class, "ssn1"); List<Address> residences = p.getResidences(); assertEquals(4, residences.size()); int i = 1; for (Address a : residences) { String zip = a.getZipcode().getZip(); String plusFour = a.getZipcode().getPlusFour(); String expZip = "zip_1_"; String expPlusFour = "plusFour_1_"; expZip = expZip + i; expPlusFour = expPlusFour + i; assertEquals(expZip, zip); assertEquals(expPlusFour, plusFour); i++; } List<String> nickNames = p.getNickNames(); assertEquals(4, nickNames.size()); i = 4; for (String s : nickNames) { String expNickName = "nickName_ + " + i; assertEquals(expNickName, s); i--; } em.close(); } }