The DAS was not correctly generating code for insert statements in the case where a DataObject was created and then set as the child of another DataObject. The generator was not including foreign key fields in the insert statement.
Brent
Index: src/test/java/org/apache/tuscany/das/rdb/test/DefectTests.java
===================================================================
--- src/test/java/org/apache/tuscany/das/rdb/test/DefectTests.java
(revision 379240)
+++ src/test/java/org/apache/tuscany/das/rdb/test/DefectTests.java
(working copy)
@@ -86,11 +86,11 @@
DataObject cust = root.getDataObject("CUSTOMER[1]");
- // Save ID
- Integer custID = (Integer) cust.get("ID");
- // save order count
- Integer custOrderCount = new Integer(cust.getList("ANORDER").size());
-
+ // Save ID and Order Count
+ int custID = cust.getInt("ID");
+ int custOrderCount = cust.getList("ANORDER").size();
+ int rootCount = root.getList("ANORDER").size();
+
// Create a new Order and add to customer1
DataObject order = root.createDataObject("ANORDER");
@@ -99,6 +99,7 @@
order.set("QUANTITY", new Integer(99));
cust.getList("ANORDER").add(order);
+ assertEquals(custOrderCount + 1, cust.getList("ANORDER").size());
// Build apply changes command
ApplyChangesCommand apply =
Command.FACTORY.createApplyChangesCommand();
apply.setConnection(getConnection());
@@ -122,7 +123,7 @@
select.addPrimaryKey("ANORDER.ID");
root = select.executeQuery();
- assertEquals(custOrderCount.intValue() + 1,
root.getList("CUSTOMER[1]/ANORDER").size());
+ assertEquals(custOrderCount + 1,
root.getList("CUSTOMER[1]/ANORDER").size());
}
Index: src/test/java/org/apache/tuscany/das/rdb/test/OperationOrderingTests.java
===================================================================
--- src/test/java/org/apache/tuscany/das/rdb/test/OperationOrderingTests.java
(revision 379240)
+++ src/test/java/org/apache/tuscany/das/rdb/test/OperationOrderingTests.java
(working copy)
@@ -31,50 +31,55 @@
CityData city = new CityData(getAutoConnection());
StateData state = new StateData(getAutoConnection());
-
+
city.doDeletes();
state.doDeletes();
state.doInserts();
city.doInserts();
-
}
protected void tearDown() throws Exception {
super.tearDown();
}
-
+
public OperationOrderingTests() {
super();
}
-
+
public void testInsert() throws Exception {
- Command select = Command.FACTORY.createCommand("Select * from
STATES inner join CITIES on STATES.ID = CITIES.STATE_ID",
getConfig("cityStates.xml"));
+ Command select = Command.FACTORY
+ .createCommand(
+ "Select * from STATES inner
join CITIES on STATES.ID = CITIES.STATE_ID",
+ getConfig("cityStates.xml"));
select.setConnection(getConnection());
DataObject root = select.executeQuery();
+ int numberOfStates = root.getList("STATES").size();
+ int numberOfCities = root.getList("CITIES").size();
+
DataObject atlanta = root.createDataObject("CITIES");
atlanta.setString("NAME", "Atlanta");
atlanta.setInt("ID", 6);
-
+
// Create a new Company
DataObject georgia = root.createDataObject("STATES");
georgia.setInt("ID", 4);
georgia.setString("NAME", "GA");
-
+
georgia.getList("cities").add(atlanta);
// Create apply command
- ApplyChangesCommand apply =
Command.FACTORY.createApplyChangesCommand();
+ ApplyChangesCommand apply =
Command.FACTORY.createApplyChangesCommand(getConfig("cityStates.xml"));
apply.setConnection(getConnection());
- // Programatically set minimum metadata necessary
- apply.addPrimaryKey("STATES.ID");
- apply.addPrimaryKey("CITIES.ID");
- apply.addRelationship("STATES.ID", "CITIES.STATE_ID");
-
// Flush changes
apply.execute(root);
+
+ select.setConnection(getConnection());
+ root = select.executeQuery();
+ assertEquals(numberOfCities + 1, root.getList("CITIES").size());
+ assertEquals(numberOfStates + 1, root.getList("STATES").size());
}
}
Index: src/main/java/org/apache/tuscany/das/rdb/generator/impl/CudGenerator.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/generator/impl/CudGenerator.java
(revision 379240)
+++ src/main/java/org/apache/tuscany/das/rdb/generator/impl/CudGenerator.java
(working copy)
@@ -42,13 +42,13 @@
return deleteGenerator.getDeleteParameters(table);
}
- public Collection getCreateParameters(DataObject changedObject, Table
table) {
- return insertGenerator.getInsertParameters(changedObject,
table);
+ public Collection getCreateParameters(MappingWrapper mapping,
DataObject changedObject, Table table) {
+ return insertGenerator.getInsertParameters(mapping,
changedObject, table);
}
- public InsertCommandImpl getInsertCommand(DataObject changedObject,
+ public InsertCommandImpl getInsertCommand(MappingWrapper mapping,
DataObject changedObject,
Table table) {
- return insertGenerator.getInsertCommand(changedObject, table);
+ return insertGenerator.getInsertCommand(mapping, changedObject,
table);
}
public WriteCommandImpl getUpdateCommand(MappingWrapper mapping,
Index:
src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
===================================================================
---
src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
(revision 379240)
+++
src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
(working copy)
@@ -33,10 +33,6 @@
import org.apache.tuscany.das.rdb.impl.UpdateCommandImpl;
import org.apache.tuscany.das.rdb.impl.WriteCommandImpl;
import org.apache.tuscany.das.rdb.util.DebugUtil;
-import org.apache.tuscany.sdo.impl.AttributeImpl;
-import org.apache.tuscany.sdo.impl.ChangeSummarySettingImpl;
-import org.apache.tuscany.sdo.impl.ReferenceImpl;
-import org.eclipse.emf.ecore.ETypedElement;
import commonj.sdo.ChangeSummary;
import commonj.sdo.DataObject;
@@ -66,7 +62,7 @@
Iterator i = getChangedFields(mapping, summary,
changedObject).iterator();
while (i.hasNext()) {
- AttributeImpl attr = (AttributeImpl) i.next();
+ Property attr = (Property) i.next();
Column c = t.getColumnByPropertyName(attr.getName());
if ((c != null) && (c.isCollision() ||
c.isPrimaryKey())) {
// get rid of comma if OCC or PK is last field
@@ -75,7 +71,7 @@
.delete(statement.length() - 2, statement.length());
}
} else {
-
parameters.add(type.getProperty(attr.getName()));
+ parameters.add(attr);
statement.append(c == null ? attr.getName() :
c.getName());
statement.append(" = ?");
if (i.hasNext())
@@ -141,17 +137,17 @@
ArrayList changes = new ArrayList();
Iterator i = summary.getOldValues(obj).iterator();
while (i.hasNext()) {
- ChangeSummarySettingImpl setting =
(ChangeSummarySettingImpl) i.next();
- if (setting.getFeature() instanceof AttributeImpl)
- changes.add(setting.getFeature());
- else if ( setting.getFeature() instanceof
ReferenceImpl) {
- ReferenceImpl ref = (ReferenceImpl)
setting.getFeature();
- if ( ref.getUpperBound() !=
ETypedElement.UNBOUNDED_MULTIPLICITY ) {
- RelationshipWrapper r = new
RelationshipWrapper(mapping.getRelationshipByName(ref.getEOpposite().getName()));
+ ChangeSummary.Setting setting = (ChangeSummary.Setting)
i.next();
+ if (setting.getProperty().getType().isDataType()) {
+ changes.add(setting.getProperty());
+ } else {
+ Property ref = setting.getProperty();
+ if ( !ref.isMany() ) {
+ RelationshipWrapper r = new
RelationshipWrapper(mapping.getRelationshipByName(ref.getOpposite().getName()));
Iterator keys =
r.getForeignKeys().iterator();
while ( keys.hasNext()) {
String key = (String)
keys.next();
- AttributeImpl p =
(AttributeImpl) obj.getType().getProperty(key);
+ Property p =
obj.getType().getProperty(key);
changes.add(p);
}
}
@@ -183,7 +179,7 @@
Iterator i = getAttributeProperties(changedObject).iterator();
while (i.hasNext()) {
- AttributeImpl attr = (AttributeImpl) i.next();
+ Property attr = (Property) i.next();
String field = attr.getName();
Parameter p = getParameter(wrapper,
type.getProperty(field));
Index:
src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
===================================================================
---
src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
(revision 379240)
+++
src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
(working copy)
@@ -23,13 +23,14 @@
import org.apache.tuscany.das.rdb.Converter;
import org.apache.tuscany.das.rdb.Parameter;
+import org.apache.tuscany.das.rdb.config.Relationship;
import org.apache.tuscany.das.rdb.config.Table;
+import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
+import org.apache.tuscany.das.rdb.config.wrapper.RelationshipWrapper;
import org.apache.tuscany.das.rdb.config.wrapper.TableWrapper;
import org.apache.tuscany.das.rdb.impl.InsertCommandImpl;
import org.apache.tuscany.das.rdb.impl.ParameterImpl;
import org.apache.tuscany.das.rdb.util.DebugUtil;
-import org.apache.tuscany.sdo.impl.AttributeImpl;
-import org.eclipse.emf.ecore.EObject;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
@@ -44,19 +45,19 @@
super();
}
- public InsertCommandImpl getInsertCommand(DataObject changedObject,
Table t) {
+ public InsertCommandImpl getInsertCommand(MappingWrapper config,
+ DataObject changedObject, Table t) {
ArrayList parameters = new ArrayList();
TableWrapper table = new TableWrapper(t);
StringBuffer statement = new StringBuffer("insert into ");
statement.append(t.getName());
- Iterator i = getAttributeProperties(changedObject).iterator();
+ Iterator i = getAttributeProperties(changedObject,
config).iterator();
ArrayList attributes = new ArrayList();
while (i.hasNext()) {
- AttributeImpl attr = (AttributeImpl) i.next();
- if ((!table.isGeneratedColumnProperty(attr.getName()))
&&
- ((EObject)changedObject).eIsSet(attr)) {
+ Property attr = (Property) i.next();
+ if (!table.isGeneratedColumnProperty(attr.getName())) {
attributes.add(attr.getName());
parameters.add(changedObject.getType().getProperty(
attr.getName()));
@@ -76,7 +77,7 @@
}
statement.append(" values (");
- for ( int idx=1; idx <= attributes.size(); idx++) {
+ for (int idx = 1; idx <= attributes.size(); idx++) {
statement.append('?');
if (idx < attributes.size())
statement.append(", ");
@@ -86,7 +87,7 @@
InsertCommandImpl cmd = new
InsertCommandImpl(statement.toString());
Iterator params = parameters.iterator();
- for (int idx=1; params.hasNext(); idx++ ) {
+ for (int idx = 1; params.hasNext(); idx++) {
Property property = (Property) params.next();
Parameter p = new ParameterImpl();
p.setName(property.getName());
@@ -94,13 +95,13 @@
p.setConverter(getConverter(table, property.getName()));
p.setIndex(idx);
cmd.addParameter(p);
-
+
}
DebugUtil.debugln(getClass(), debug, statement.toString());
return cmd;
}
-
+
private Converter getConverter(TableWrapper tw, String name) {
String converter = tw.getConverter(name);
if ( converter != null ) {
@@ -113,27 +114,45 @@
return null;
}
- private List getAttributeProperties(DataObject obj) {
+ private List getAttributeProperties(DataObject obj, MappingWrapper
config) {
ArrayList fields = new ArrayList();
Iterator i = obj.getType().getProperties().iterator();
- while ( i.hasNext()) {
+ while (i.hasNext()) {
Property p = (Property) i.next();
- if ( p.getType().isDataType())
- fields.add(p);
+ if (p.getType().isDataType()) {
+ if (obj.isSet(p))
+ fields.add(p);
+ } else {
+ if (!p.isMany() && obj.isSet(p)) {
+ Relationship relationship =
config.getRelationshipByName(p
+
.getOpposite().getName());
+
+ RelationshipWrapper r = new
RelationshipWrapper(
+ relationship);
+ Iterator keys =
r.getForeignKeys().iterator();
+ while (keys.hasNext()) {
+ String key = (String)
keys.next();
+ Property keyProp =
obj.getType().getProperty(key);
+ fields.add(keyProp);
+ }
+
+ }
+ }
}
-
+
return fields;
-
+
}
- public Collection getInsertParameters(DataObject changedObject, Table
table) {
+ public Collection getInsertParameters(MappingWrapper config,
+ DataObject changedObject, Table table) {
ArrayList parameters = new ArrayList();
TableWrapper wrapper = new TableWrapper(table);
- Iterator i = getAttributeProperties(changedObject).iterator();
+ Iterator i = getAttributeProperties(changedObject,
config).iterator();
while (i.hasNext()) {
- AttributeImpl attr = (AttributeImpl) i.next();
+ Property attr = (Property) i.next();
if (!wrapper.isGeneratedColumnProperty(attr.getName()))
parameters.add(changedObject.getType().getProperty(
attr.getName()));
@@ -142,6 +161,4 @@
return parameters;
}
-
}
-
Index: src/main/java/org/apache/tuscany/das/rdb/merge/impl/GraphMerger.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/merge/impl/GraphMerger.java
(revision 379240)
+++ src/main/java/org/apache/tuscany/das/rdb/merge/impl/GraphMerger.java
(working copy)
@@ -27,9 +27,10 @@
import org.apache.tuscany.das.rdb.graphbuilder.impl.TableRegistry;
import org.apache.tuscany.sdo.impl.AttributeImpl;
import org.apache.tuscany.sdo.impl.ChangeSummaryImpl;
+import org.apache.tuscany.sdo.impl.ReferenceImpl;
import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
+import commonj.sdo.ChangeSummary;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
@@ -62,7 +63,7 @@
public DataObject merge(DataObject primary, DataObject secondary) {
addGraphToRegistry(primary);
- ChangeSummaryImpl summary = (ChangeSummaryImpl) primary
+ ChangeSummary summary = primary
.getDataGraph().getChangeSummary();
summary.endLogging();
Iterator i = secondary.getType().getProperties().iterator();
@@ -76,7 +77,7 @@
createObjectWithSubtree(primary, p, object);
}
}
- summary.resumeLogging();
+ ((ChangeSummaryImpl)summary).resumeLogging();
return primary;
}
@@ -103,7 +104,7 @@
Iterator refs =
eObjectToCopy.eClass().getEAllReferences()
.iterator();
while (refs.hasNext()) {
- EReference ref = (EReference) refs.next();
+ ReferenceImpl ref = (ReferenceImpl) refs.next();
List refObjects;
if (!ref.isMany()) {
refObjects =
Collections.singletonList(eObjectToCopy
Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java
(revision 379240)
+++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java
(working copy)
@@ -105,10 +105,10 @@
String createStatement = table.getCreate();
if ( createStatement == null ) {
- createCommand =
getCudGenerator().getInsertCommand(changedObject, table);
+ createCommand =
getCudGenerator().getInsertCommand(mapping, changedObject, table);
} else {
createCommand = new
InsertCommandImpl(createStatement);
- Iterator i =
getCudGenerator().getCreateParameters(changedObject, table).iterator();
+ Iterator i =
getCudGenerator().getCreateParameters(mapping, changedObject, table).iterator();
while (i.hasNext()) {
Property p = (Property)i.next();
createCommand.addParameter(p.getName(),
p.getType());
Index: src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java
(revision 379240)
+++ src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java
(working copy)
@@ -32,7 +32,6 @@
import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
import org.apache.tuscany.das.rdb.graphbuilder.impl.GraphBuilderMetadata;
import org.apache.tuscany.das.rdb.graphbuilder.impl.ResultSetProcessor;
-import org.apache.tuscany.sdo.impl.ChangeSummaryImpl;
import org.apache.tuscany.sdo.util.DataObjectUtil;
import org.apache.tuscany.sdo.util.SDOUtil;
import org.eclipse.emf.common.util.URI;
@@ -42,9 +41,11 @@
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
+import commonj.sdo.ChangeSummary;
import commonj.sdo.DataGraph;
import commonj.sdo.DataObject;
import commonj.sdo.Type;
+import commonj.sdo.helper.XMLHelper;
public class ReadCommandImpl extends CommandImpl {
@@ -109,7 +110,7 @@
getSchema(), mappingModel.getConfig(),
resultSetShape);
DataGraph g = createEDataGraph(gbmd.getSchema());
- ChangeSummaryImpl summary = (ChangeSummaryImpl)
g.getChangeSummary();
+ ChangeSummary summary = g.getChangeSummary();
ResultSetProcessor rsp = new
ResultSetProcessor(g.getRootObject(), gbmd);
rsp.processResults(getStartRow(), getEndRow());
@@ -173,13 +174,15 @@
ConfigPackageImpl.eNS_URI);
map.put(XMLResource.OPTION_EXTENDED_META_DATA, metadata);
- try {
- resource.load(stream, map);
+ try {
+ Config config = (Config)
XMLHelper.INSTANCE.load(stream, ConfigPackageImpl.eNS_URI,map).getRootObject();
+ mappingModel = new MappingWrapper(config);
+ // resource.load(stream, map);
} catch (IOException e) {
throw new RuntimeException(e);
}
- mappingModel = new MappingWrapper((Config)
resource.getContents().get(
- 0));
+// mappingModel = new MappingWrapper((Config)
resource.getContents().get(
+// 0));
if (mappingModel.getConfig().getConnectionProperties() != null)
setConnection(mappingModel.getConfig().getConnectionProperties());
Index:
src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java
(revision 379240)
+++ src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java
(working copy)
@@ -375,7 +375,7 @@
if ( name.equals (r.getName()))
return r;
}
- return null;
+ throw new RuntimeException("Could not find relationship " +
name + " in the configuration");
}
}
Index:
src/main/java/org/apache/tuscany/das/rdb/graphbuilder/schema/ESchemaMaker.java
===================================================================
---
src/main/java/org/apache/tuscany/das/rdb/graphbuilder/schema/ESchemaMaker.java
(revision 379240)
+++
src/main/java/org/apache/tuscany/das/rdb/graphbuilder/schema/ESchemaMaker.java
(working copy)
@@ -16,8 +16,6 @@
*/
package org.apache.tuscany.das.rdb.graphbuilder.schema;
-import java.io.IOException;
-import java.io.OutputStream;
import java.util.Iterator;
import org.apache.tuscany.das.rdb.config.Relationship;
@@ -33,12 +31,10 @@
import org.apache.tuscany.sdo.util.DataObjectUtil;
import org.apache.tuscany.sdo.util.SDOUtil;
import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import commonj.sdo.Type;
import commonj.sdo.helper.TypeHelper;
@@ -228,36 +224,8 @@
return EAttributeMaker.singleton();
}
- /**
- * Internal method to save a schema to a file
- *
- * @param eclass
- * The EClass to save (usually just the root EClass)
- * @param name
- * The name of the file
- * @throws IOException
- */
- private void save(ENamedElement eclass, OutputStream stream)
- throws IOException {
- XMLResourceImpl resource = new XMLResourceImpl();
- resource.getContents().add(eclass);
- resource.save(stream, null);
-
- }
-
/**
- * Used by Metadata.saveToEcore() to save the schema to a file
- *
- * @param name
- * the file name
- * @throws IOException
- */
- public void save(OutputStream stream) throws IOException {
- save(getEPackage(), stream);
- }
-
- /**
* @return the EPackage for this schema
*/
public EPackage getEPackage() {
Index: src/main/java/org/apache/tuscany/das/rdb/util/DataObjectUtil.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/util/DataObjectUtil.java
(revision 379240)
+++ src/main/java/org/apache/tuscany/das/rdb/util/DataObjectUtil.java
(working copy)
@@ -19,13 +19,11 @@
import java.util.Iterator;
import java.util.List;
-import org.eclipse.emf.ecore.EFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
import commonj.sdo.ChangeSummary;
import commonj.sdo.DataObject;
+import commonj.sdo.Property;
import commonj.sdo.ChangeSummary.Setting;
+import commonj.sdo.helper.DataFactory;
/**
*/
@@ -40,18 +38,15 @@
public static DataObject getCopy(DataObject original) {
- //Drop to "E" land and create a new instance
- EObject eOriginal = (EObject) original;
- EFactory factory =
eOriginal.eClass().getEPackage().getEFactoryInstance();
- EObject eCopy = factory.create(eOriginal.eClass());
+ DataObject copy =
DataFactory.INSTANCE.create(original.getType());
//Fill in values
- Iterator i =
eOriginal.eClass().getEAllStructuralFeatures().iterator();
+ Iterator i = original.getType().getProperties().iterator();
while (i.hasNext()) {
- EStructuralFeature feature = (EStructuralFeature)
i.next();
- eCopy.eSet(feature, eOriginal.eGet(feature));
+ Property feature = (Property) i.next();
+ copy.set(feature, original.get(feature));
}
- return (DataObject) eCopy;
+ return copy;
}
/**
