/*
* 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.tuscany.das.rdb.test;
/*
* This provdes the simplest examples that make use of the change history. The assumptions are:
*
* Single type Change history utilized Dynamic DataObjects
*
*
*/
import java.util.Iterator;
import org.apache.tuscany.das.rdb.Command;
import org.apache.tuscany.das.rdb.ConfigHelper;
import org.apache.tuscany.das.rdb.DAS;
import org.apache.tuscany.das.rdb.config.Table;
import org.apache.tuscany.das.rdb.test.data.CustomerData;
import org.apache.tuscany.das.rdb.test.data.OrderDetailsData;
import org.apache.tuscany.das.rdb.test.framework.DasTest;
import commonj.sdo.DataObject;
public class CrudWithChangeHistory extends DasTest {
protected void setUp() throws Exception {
super.setUp();
new CustomerData(getAutoConnection()).refresh();
new OrderDetailsData(getAutoConnection()).refresh();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testDeleteAndCreate() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConfig("basicCustomerMappingWithCUD2.xml"), getConnection());
// Read customer 1
Command select = das.createCommand("Select * from CUSTOMER");
DataObject root = select.executeQuery();
DataObject customer = (DataObject) root.get("CUSTOMER[1]");
int customerId = customer.getInt("ID");
// Modify customer
customer.delete();
DataObject newCustomer = root.createDataObject("CUSTOMER");
newCustomer.setInt("ID", 9999);
newCustomer.setString("LASTNAME", "Jones");
// Build apply changes command
das.applyChanges(root);
// Verify changes
root = select.executeQuery();
boolean found = false;
Iterator i = root.getList("CUSTOMER").iterator();
while (i.hasNext()) {
customer = (DataObject) i.next();
assertFalse(customerId == customer.getInt("ID"));
if (customer.getInt("ID") == 9999) {
found = true;
}
}
assertTrue(found);
}
/**
* Read and modify a customer. Provide needed Create/Update/Delete statements programatically
*/
public void testReadModifyApply() throws Exception {
// Provide updatecommand programmatically via config
ConfigHelper helper = new ConfigHelper();
Table customerTable = helper.addTable("CUSTOMER", "CUSTOMER");
helper.addUpdateStatement(customerTable, "update CUSTOMER set LASTNAME = ?, ADDRESS = ? "
+ "where ID = ?", "LASTNAME ADDRESS ID");
DAS das = DAS.FACTORY.createDAS(helper.getConfig(), getConnection());
// Read customer 1
Command select = das.createCommand("Select * from CUSTOMER where ID = 1");
DataObject root = select.executeQuery();
assertFalse(root.get("CUSTOMER[1]/LASTNAME").equals("Pavick"));
DataObject customer = (DataObject) root.get("CUSTOMER[1]");
// Modify customer
customer.set("LASTNAME", "Pavick");
// Build apply changes command
das.applyChanges(root);
// Verify changes
root = select.executeQuery();
assertEquals("Pavick", root.getString("CUSTOMER[1]/LASTNAME"));
}
/**
* Read and modify a customer. Provide needed Create/Update/Delete statements via xml file
*/
public void testReadModifyApply1() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConfig("basicCustomerMappingWithCUD.xml"), getConnection());
// Read customer 1
Command select = das.createCommand("Select * from CUSTOMER where ID = 1");
DataObject root = select.executeQuery();
assertFalse(root.get("CUSTOMER[1]/LASTNAME").equals("Pavick"));
DataObject customer = (DataObject) root.get("CUSTOMER[1]");
// Modify customer
customer.set("LASTNAME", "Pavick");
// Build apply changes command
das.applyChanges(root);
// Verify changes
root = select.executeQuery();
assertEquals("Pavick", root.getString("CUSTOMER[1]/LASTNAME"));
}
/**
* Same as previous but: Utilizes generated CUD statements Key info provided programatically
*/
public void testReadModifyApply2() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConnection());
// Read customer with particular ID
Command select = das.createCommand("Select * from CUSTOMER where ID = 1");
DataObject root = select.executeQuery();
assertFalse(root.get("CUSTOMER[1]/LASTNAME").equals("Pavick"));
DataObject customer = root.getDataObject("CUSTOMER[1]");
// Modify customer
customer.set("LASTNAME", "Pavick");
// Build apply changes command
das.applyChanges(root);
// Verify the change
root = select.executeQuery();
assertEquals("Pavick", root.getDataObject("CUSTOMER[1]").getString("LASTNAME"));
}
/**
* Builds on previous but: 1. Key info provided via XML file
*/
public void testReadModifyApply3() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConfig("basicCustomerMapping.xml"), getConnection());
// Read customer with particular ID
Command select = das.createCommand("Select * from CUSTOMER where ID = 1");
DataObject root = select.executeQuery();
assertFalse(root.get("CUSTOMER[1]/LASTNAME").equals("Pavick"));
DataObject customer = (DataObject) root.get("CUSTOMER[1]");
// Modify customer
customer.set("LASTNAME", "Pavick");
// Build apply changes command
das.applyChanges(root);
// Verify the change
root = select.executeQuery();
assertEquals("Pavick", root.getDataObject("CUSTOMER[1]").getString("LASTNAME"));
}
/**
* Builds on previous but: 1. Uses a named command
*/
public void testReadModifyApply4() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConfig("CustomerConfig.xml"), getConnection());
// Read customer with particular ID
Command select = das.getCommand("getCustomer");
select.setParameter(1, new Integer(1));
DataObject root = select.executeQuery();
assertFalse(root.get("CUSTOMER[1]/LASTNAME").equals("Pavick"));
DataObject customer = (DataObject) root.get("CUSTOMER[1]");
// Modify customer
customer.set("LASTNAME", "Pavick");
// Build apply changes command
das.applyChanges(root);
// Verify the change
root = select.executeQuery();
assertEquals("Pavick", root.getDataObject("CUSTOMER[1]").getString("LASTNAME"));
}
public void testReadModifyApplyMultipleRows() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConnection());
// Verify pre-condition
Command select = das.createCommand("Select * from CUSTOMER");
DataObject root = select.executeQuery();
assertFalse(root.get("CUSTOMER[1]/LASTNAME").equals("Pavick"));
assertFalse(root.get("CUSTOMER[2]/LASTNAME").equals("Silva"));
// Read and modify customer 1
DataObject customer1 = (DataObject) root.get("CUSTOMER[1]");
customer1.set("LASTNAME", "Pavick");
// Read and modify customer 2
DataObject customer2 = (DataObject) root.get("CUSTOMER[2]");
customer2.set("LASTNAME", "Silva");
// Build apply changes command
das.applyChanges(root);
// Verify changes
root = select.executeQuery();
assertEquals("Pavick", root.getString("CUSTOMER[1]/LASTNAME"));
assertEquals("Silva", root.getString("CUSTOMER[2]/LASTNAME"));
}
/**
* Test ability to handle multiple changes to the graph including Creates/Updates/Deletes Employs generated CUD
*/
public void testReadModifyDeleteInsertApply() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConfig("basicCustomerMapping.xml"), getConnection());
// Read some customers
Command select = das.createCommand("Select * from CUSTOMER where LASTNAME = 'Williams'");
DataObject root = select.executeQuery();
DataObject cust1 = (DataObject) root.getList("CUSTOMER").get(0);
DataObject cust2 = (DataObject) root.getList("CUSTOMER").get(1);
DataObject cust3 = (DataObject) root.getList("CUSTOMER").get(2);
// Modify a customer
cust1.set("LASTNAME", "Pavick");
int cust1ID = cust1.getInt("ID");
// Save IDs before delete
int cust2ID = cust2.getInt("ID");
int cust3ID = cust3.getInt("ID");
// Delete a couple
cust2.delete();
cust3.delete();
// Create a new customer
DataObject cust4 = root.createDataObject("CUSTOMER");
cust4.set("ID", new Integer(100));
cust4.set("ADDRESS", "5528 Wells Fargo Drive");
cust4.set("LASTNAME", "Gerkin");
// Build apply changes command
das.applyChanges(root);
// Verify deletes
select = das.createCommand("Select * from CUSTOMER where ID = ?");
select.setParameter(1, new Integer(cust2ID));
root = select.executeQuery();
assertTrue(root.getList("CUSTOMER").isEmpty());
// reparameterize same command
select.setParameter(1, new Integer(cust3ID));
root = select.executeQuery();
assertTrue(root.getList("CUSTOMER").isEmpty());
// verify insert
select.setParameter(1, new Integer(100));
root = select.executeQuery();
assertEquals(1, root.getList("CUSTOMER").size());
assertEquals("5528 Wells Fargo Drive", root.getString("CUSTOMER[1]/ADDRESS"));
assertEquals("Gerkin", root.getString("CUSTOMER[1]/LASTNAME"));
// verify update
select.setParameter(1, new Integer(cust1ID));
root = select.executeQuery();
assertEquals("Pavick", root.getString("CUSTOMER[1]/LASTNAME"));
}
public void testReadModifyApplyWithAssumedID() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConnection());
// Read customer with particular ID
Command select = das.createCommand("Select * from CUSTOMER");
DataObject root = select.executeQuery();
DataObject customer = root.getDataObject("CUSTOMER[1]");
// Modify customer
customer.set("LASTNAME", "Pavick");
DataObject customerForDelete = getCustomerByLastName(root, "Daniel");
customerForDelete.delete();
DataObject newCustomer = root.createDataObject("CUSTOMER");
newCustomer.set("LASTNAME", "NewCustomer");
newCustomer.setInt("ID", 9000);
// Build apply changes command
das.applyChanges(root);
// Verify the change
root = select.executeQuery();
assertEquals("Pavick", getCustomerByLastName(root, "Pavick").getString("LASTNAME"));
assertEquals("NewCustomer", getCustomerByLastName(root, "NewCustomer").getString("LASTNAME"));
assertNull(getCustomerByLastName(root, "Daniel"));
}
public void testReadModifyApplyWithAssumedIDFailure() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConnection());
Command select = das.createCommand("Select * from ORDERDETAILS");
DataObject root = select.executeQuery();
DataObject od = root.getDataObject("ORDERDETAILS[1]");
// Modify customer
od.setInt("PRODUCTID", 72);
// Flush changes -- This should fail because Order Details does not have
// a column that
// we can assume to be an ID
try {
das.applyChanges(root);
} catch (RuntimeException ex) {
assertTrue(ex.getMessage().indexOf("changed in the DataGraph but is not present in the Config") >= 0);
}
}
public void testReadModifyApplyWithAssumedIDFailure2() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConnection());
Command select = das.createCommand("Select * from ORDERDETAILS");
DataObject root = select.executeQuery();
DataObject od = root.getDataObject("ORDERDETAILS[1]");
od.delete();
// Flush changes -- This should fail because Order Details does not have
// a column that
// we can assume to be an ID
try {
das.applyChanges(root);
} catch (RuntimeException ex) {
assertTrue(ex.getMessage().indexOf("changed in the DataGraph but is not present in the Config") >= 0);
}
}
public void testReadModifyApplyWithAssumedIDFailure3() throws Exception {
DAS das = DAS.FACTORY.createDAS(getConnection());
Command select = das.createCommand("Select * from ORDERDETAILS");
DataObject root = select.executeQuery();
DataObject od = root.createDataObject("ORDERDETAILS");
// Modify customer
od.setInt("PRODUCTID", 72);
od.setInt("ORDERID", 500);
// Flush changes -- This should fail because Order Details does not have
// a column that
// we can assume to be an ID
try {
das.applyChanges(root);
} catch (RuntimeException ex) {
assertTrue(ex.getMessage().indexOf("changed in the DataGraph but is not present in the Config") >= 0);
}
}
private DataObject getCustomerByLastName(DataObject root, String name) {
Iterator i = root.getList("CUSTOMER").iterator();
while (i.hasNext()) {
DataObject obj = (DataObject) i.next();
if (name.equals(obj.getString("LASTNAME"))) {
return obj;
}
}
return null;
}
}