/*
* 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.sql.Connection;
import java.sql.DatabaseMetaData;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import junit.framework.Assert;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
import org.apache.openjpa.persistence.test.SQLListenerTestCase;
public class TestAttrOverridesXml extends SQLListenerTestCase {
public int numPersons = 4;
public List<String> namedQueries = new ArrayList<String>();
public int eId = 1;
public void setUp() {
setUp(
org.apache.openjpa.persistence.embed.attrOverrides.AnnoOverEmbed.class,
DROP_TABLES);
}
@Override
protected String getPersistenceUnitName() {
return "embed-pu";
}
public void testAttrOverride1() {
sql.clear();
createObj1();
findObj1();
queryObj1();
assertAttrOverrides("CustomerXml1");
}
/**
* This test verifies that an embeddable column attribute override defined
* in XML overrides the base column definition.
*/
public void testBasicEmbedAttrOverride() {
OpenJPAEntityManagerSPI em = emf.createEntityManager();
BasicEntityXML be = new BasicEntityXML();
be.setId(new Random().nextInt());
BasicEmbedXML bem = new BasicEmbedXML();
bem.setNotIntegerValue(new Random().nextInt());
ArrayList<BasicEmbedXML> al = new ArrayList<BasicEmbedXML>();
al.add(bem);
be.setListIntAttrOverEmbed(al);
em.getTransaction().begin();
em.persist(be);
em.getTransaction().commit();
assertTrue(verifyColumnOverride(em, "listIntAttrOverEmbedColTable",
"intValueAttributeOverride"));
em.close();
}
/**
* This test verifies that an XML defined entity with an annotated
* only embeddable has attribute overrides applied correctly.
*/
public void testXMLEntityWithAnnotatedOverrideEmbed() {
OpenJPAEntityManagerSPI em = emf.createEntityManager();
XMLOverEntity xoe = new XMLOverEntity();
xoe.setId(new Random().nextInt());
AnnoOverEmbed aoe = new AnnoOverEmbed();
aoe.setIntEmbed(1);
aoe.setStrEmbed("StrVal");
xoe.setEmbed(aoe);
em.getTransaction().begin();
em.persist(xoe);
em.getTransaction().commit();
assertTrue(verifyColumnOverride(em, "XMLOverEntity",
"intOverEmbed"));
assertFalse(verifyColumnOverride(em, "XMLOverEntity",
"intEmbed"));
assertTrue(verifyColumnOverride(em, "XMLOverEntity",
"strOverEmbed"));
assertFalse(verifyColumnOverride(em, "XMLOverEntity",
"strEmbed"));
em.close();
}
public void createObj1() {
EntityManager em = emf.createEntityManager();
EntityTransaction tran = em.getTransaction();
for (int i = 0; i < numPersons; i++)
createCustomer1(em, eId++);
tran.begin();
em.flush();
tran.commit();
em.close();
}
public CustomerXml createCustomer1(EntityManager em, int id) {
CustomerXml p = new CustomerXml();
p.setId(id);
AddressXml addr = new AddressXml();
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();
CustomerXml p = em.find(CustomerXml.class, 1);
Assert.assertEquals(p.getId(), new Integer(1));
Assert.assertEquals(p.getAddress().getCity(), "city_1");
Assert.assertEquals(p.getAddress().getStreet(), "street_1");
Assert.assertEquals(p.getAddress().getState(), "state_1");
Assert.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 CustomerXml1 p";
Query q = em.createQuery(jpql);
List<CustomerXml> ps = q.getResultList();
Assert.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("CustomerXml1")) {
found = true;
if (sqlStr.indexOf("ADDR_STATE") == -1 ||
sqlStr.indexOf("ADDR_ZIP") == -1)
fail();
}
}
}
if (!found)
fail();
}
private boolean verifyColumnOverride(
OpenJPAEntityManagerSPI em, String tableName,
String columnName) {
JDBCConfiguration conf = (JDBCConfiguration)
em.getEntityManagerFactory().getConfiguration();
DBDictionary dict = conf.getDBDictionaryInstance();
Connection conn = (Connection)em.getConnection();
try {
DatabaseMetaData dbmd = conn.getMetaData();
// (meta, catalog, schemaName, tableName, conn)
Column[] cols = dict.getColumns(dbmd, null, null,
tableName, columnName, conn);
if (cols != null && cols.length == 1) {
Column col = cols[0];
String colName = col.getName();
if (col.getTableName().equalsIgnoreCase(tableName) &&
colName.equalsIgnoreCase(columnName))
return true;
}
} catch (Throwable e) {
fail("Unable to get column information.");
}
return false;
}
}