This patch addresses some DAS code "TODO" statements. Except for the first two, these are mostly no-ops.
1) Refactor ApplyChangesCommand to be part of a single Command heirarchy
2) Removed the instanceof hack in ChangeOperation.java
3) Removed TODO from SDODataTypes -- No longer relevant
4) Removed TODO from CompoundKeyTests -- Statement no longer correct
3) Removed TODO from SDODataTypes -- No longer relevant
4) Removed TODO from CompoundKeyTests -- Statement no longer correct
5) Removed old, dead, commented code from the TopDown test class.
6) Removed TODO in InsertList.java -- Verified that the null check is OK here and added a comment
7) Removed TODO statement from CommandGroupImpl -- Nothing to do here, and no longer relevant
7) Removed TODO statement from CommandGroupImpl -- Nothing to do here, and no longer relevant
Index: src/test/java/org/apache/tuscany/das/rdb/test/CUDGeneration.java =================================================================== --- src/test/java/org/apache/tuscany/das/rdb/test/CUDGeneration.java (revision 392391) +++ src/test/java/org/apache/tuscany/das/rdb/test/CUDGeneration.java (working copy) @@ -114,9 +114,8 @@ DataObject order = (DataObject) customer.get("orders[1]"); order.setString("PRODUCT", "Kitchen Sink 001"); - ApplyChangesCommand apply = Command.FACTORY.createApplyChangesCommand(); - apply.setConnection(getConnection()); - apply.setMapping(getConfig("1xM_mapping_no_cud.xml")); + ApplyChangesCommand apply = Command.FACTORY.createApplyChangesCommand(getConfig("1xM_mapping_no_cud.xml")); + apply.setConnection(getConnection()); // Flush changes apply.execute(root); Index: src/test/java/org/apache/tuscany/das/rdb/test/CompoundKeyTests.java =================================================================== --- src/test/java/org/apache/tuscany/das/rdb/test/CompoundKeyTests.java (revision 392391) +++ src/test/java/org/apache/tuscany/das/rdb/test/CompoundKeyTests.java (working copy) @@ -92,9 +92,7 @@ Key pk = new Key("ANORDER.ID"); read.addPrimaryKey(pk); - - - //TODO - When this is omitted, we fail with NPE. Need a better error message + Key detailsPk = new Key(new String[] { "ORDERDETAILS.ORDERID", "ORDERDETAILS.PRODUCTID" }); read.addPrimaryKey(detailsPk); Index: src/test/java/org/apache/tuscany/das/rdb/test/TopDown.java =================================================================== --- src/test/java/org/apache/tuscany/das/rdb/test/TopDown.java (revision 392391) +++ src/test/java/org/apache/tuscany/das/rdb/test/TopDown.java (working copy) @@ -73,67 +73,13 @@ AnOrder order = (AnOrder) customer.getOrders().get(0); order.setProduct("Kitchen Sink 001"); - ApplyChangesCommand apply = Command.FACTORY.createApplyChangesCommand(); - apply.setConnection(getConnection()); - apply.setMapping(getConfig("1xM_mapping_no_cud.xml")); + ApplyChangesCommand apply = Command.FACTORY.createApplyChangesCommand(getConfig("1xM_mapping_no_cud.xml")); + apply.setConnection(getConnection()); // Flush changes apply.execute((DataObject) root); - /* - * JDBCDAS das = JDBCDAS.FACTORY.create(); // Build the select command - * CrudCommand select = CrudCommand.FACTORY.create( "select CUSTOMER.ID, - * CUSTOMER.LASTNAME, CUSTOMER.ADDRESS, ANORDER.ID, ANORDER.PRODUCT, - * ANORDER.QUANTITY, ANORDER.CUSTOMER_ID from CUSTOMER left outer join - * ANORDER on ANORDER.CUSTOMER_ID=CUSTOMER.ID where CUSTOMER.ID = :ID" , - * getMappingModel_1xM_uni_as_stream() , getGraphType()); // - * Parameterize the command select.setConnection(getConnection()); - * select.setParameter("ID", new Integer(1)); // Get the graph - * DataObject root = das.getRootDataObject(select); // Modify a customer - * DataObject customer = (DataObject) root.getList("CUSTOMER").get(0); - * customer.set("LASTNAME", "Pavick"); // Modify the first order - * DataObject order = (DataObject)customer.getList("orders").get(0); - * order.setString("PRODUCT", "Kitchen Sink 001"); // Build command for - * flush ApplyChangesCommand command = - * ApplyChangesCommand.FACTORY.create(getMappingModel_1xM_uni_as_stream()); - * command.setConnection(getConnection()); // Flush changes - * das.applyChanges(root, command); - */ } - /* - * //User provides the model and uses generated classes public void - * testUserProvidedModelStatic() throws SQLException, IOException { - * - * JDBCDAS das = JDBCDAS.FACTORY.create(); - * - * //Build the select command CrudCommand select = - * CrudCommand.FACTORY.create( "select CUSTOMER.ID, CUSTOMER.LASTNAME, - * CUSTOMER.ADDRESS, ANORDER.ID, ANORDER.PRODUCT, ANORDER.QUANTITY, - * ANORDER.CUSTOMER_ID from CUSTOMER left outer join ANORDER on - * ANORDER.CUSTOMER_ID=CUSTOMER.ID where CUSTOMER.ID = :ID" , - * getMappingModel_1xM_uni_as_stream() , getGraphType()); - * - * //Parameterize the command select.setConnection(getConnection()); - * select.setParameter("ID", new Integer(1)); - * - * //Get the graph DataObject root = das.getRootDataObject(getGraphType(), - * select); - * - * //Modify a customer DataGraphRoot dgRoot = (DataGraphRoot) root; // TODO - * Need to cast to Static customer and use "setLastName()" - * - * Customer customer = (Customer) dgRoot.getCustomers().get(0); - * customer.setLastName("Pavick"); - * - * //Modify the first order AnOrder order = customer.getOrders(); - * order.setProduct("Kitchen Sink 001"); - * - * //Build command for flush ApplyChangesCommand command = - * ApplyChangesCommand.FACTORY.create(getMappingModel_1xM_uni_as_stream()); - * command.setConnection(getConnection()); - * - * //Flush changes das.applyChanges(root, command); } - */ } \ No newline at end of file Index: src/main/java/org/apache/tuscany/das/rdb/SDODataTypes.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/SDODataTypes.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/SDODataTypes.java (working copy) @@ -22,10 +22,6 @@ /** * Defines SDO data types. This is used primalirly to type stored procedure OUT parameters. * - * TODO - This maybe be obviated by the move to SDO2. We also need to settle the question - * of whether config information is in terms of database or data object types - * - * */public class SDODataTypes { static TypeHelper helper = TypeHelper.INSTANCE; 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 392391) +++ src/main/java/org/apache/tuscany/das/rdb/generator/impl/CudGenerator.java (working copy) @@ -22,7 +22,7 @@ import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper; import org.apache.tuscany.das.rdb.impl.DeleteCommandImpl; import org.apache.tuscany.das.rdb.impl.InsertCommandImpl; -import org.apache.tuscany.das.rdb.impl.WriteCommandImpl; +import org.apache.tuscany.das.rdb.impl.UpdateCommandImpl; import commonj.sdo.DataObject; @@ -51,7 +51,7 @@ return insertGenerator.getInsertCommand(mapping, changedObject, table); } - public WriteCommandImpl getUpdateCommand(MappingWrapper mapping, + public UpdateCommandImpl getUpdateCommand(MappingWrapper mapping, DataObject changedObject, Table table) { return updateGenerator.getUpdateCommand(mapping, changedObject, table); } 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 392391) +++ src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java (working copy) @@ -31,7 +31,6 @@ import org.apache.tuscany.das.rdb.impl.OptimisticWriteCommandImpl; import org.apache.tuscany.das.rdb.impl.ParameterImpl; 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 commonj.sdo.ChangeSummary; @@ -49,7 +48,7 @@ super(); } - public WriteCommandImpl getUpdateCommand(MappingWrapper mapping, DataObject changedObject, Table table) { + public UpdateCommandImpl getUpdateCommand(MappingWrapper mapping, DataObject changedObject, Table table) { ArrayList parameters = new ArrayList(); Type type = changedObject.getType(); TableWrapper t = new TableWrapper(table); @@ -101,7 +100,7 @@ } - WriteCommandImpl updateCommand; + UpdateCommandImpl updateCommand; if ( t.getCollisionColumn() != null ) updateCommand = new OptimisticWriteCommandImpl(statement.toString()); else Index: src/main/java/org/apache/tuscany/das/rdb/CommandFactory.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/CommandFactory.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/CommandFactory.java (working copy) @@ -57,8 +57,7 @@ * Creates an [EMAIL PROTECTED] instance with the provided configuration * @param mappingModel The provided configuration as a stream over an xml file * @return Returns an ApplyChangesCOmmand in stance - * @throws IOException - * TODO - Either remove this throws clause or add it to createCommand + * @throws IOException */ public ApplyChangesCommand createApplyChangesCommand( InputStream mappingModel) throws IOException; Index: src/main/java/org/apache/tuscany/das/rdb/ResultSetShape.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/ResultSetShape.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/ResultSetShape.java (working copy) @@ -19,7 +19,6 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; -import org.apache.tuscany.das.rdb.graphbuilder.impl.DefaultConverter; import org.apache.tuscany.das.rdb.graphbuilder.schema.ResultSetTypeMap; import commonj.sdo.Type; @@ -32,33 +31,24 @@ * <p> * There may also be a performance boost when using this interface. * - * TODO - This is very preliminary. We need to go over this again and consider making is as close as possible to - * to the infromation returned from ResultSetMetadata. For example, we may want to use JDBC types - * here rather than SDODataTypes. Also, ResultSetMetadata doe not provide converters, so, maybe this - * interface should also not. * - * */ public class ResultSetShape { private final String[] columns; private final String[] tables; - private final Type[] types; - //TODO - Are converters really needed here? - private Converter[] converters; + private final Type[] types; public ResultSetShape(String[] t, String[] c, Type[] dataTypes) { this.columns = c; this.tables = t; - this.types = dataTypes; - this.converters = new DefaultConverter[c.length]; + this.types = dataTypes; } public ResultSetShape(ResultSetMetaData metadata) throws SQLException { columns = new String[metadata.getColumnCount()]; tables = new String[metadata.getColumnCount()]; - types = new Type[metadata.getColumnCount()]; - converters = new DefaultConverter[metadata.getColumnCount()]; + types = new Type[metadata.getColumnCount()]; ResultSetTypeMap typeMap = ResultSetTypeMap.instance; for (int i = 1; i <= metadata.getColumnCount(); i++) { @@ -84,21 +74,7 @@ return types[i-1]; } - public void setConverter(int i, Converter converter) { - this.converters[i] = converter; - } - public Converter getConverter(int i) { - return this.converters[i-1]; - } - - public void setConverterFactory(Converter converter) { - for ( int i=0; i < getColumnCount(); i++ ) { - this.converters[i] = converter; - } - - } - public String toString() { StringBuffer result = new StringBuffer(); result.append(" column/table/type: "); @@ -110,9 +86,7 @@ if ( types[i] == null ) result.append("null"); else - result.append(types[i].getName()); - result.append('\t'); - result.append(converters[i]); + result.append(types[i].getName()); result.append('\n'); } Index: src/main/java/org/apache/tuscany/das/rdb/ApplyChangesCommand.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/ApplyChangesCommand.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/ApplyChangesCommand.java (working copy) @@ -80,11 +80,6 @@ public void execute(DataObject root); /** - * TODO - Need to remove this. COnfig now set via factory method - */ - public void setMapping(InputStream mappingModel) throws IOException; - - /** * Provides the java.sql.Connection to be used for this executing this * command. * Index: src/main/java/org/apache/tuscany/das/rdb/impl/ApplyChangesCommandImpl.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/ApplyChangesCommandImpl.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/ApplyChangesCommandImpl.java (working copy) @@ -23,11 +23,12 @@ import org.apache.tuscany.das.rdb.ApplyChangesCommand; import org.apache.tuscany.das.rdb.Command; -import org.apache.tuscany.das.rdb.Key; import org.apache.tuscany.das.rdb.config.Config; +import org.apache.tuscany.das.rdb.config.ConfigFactory; import org.apache.tuscany.das.rdb.config.ConnectionProperties; -import org.apache.tuscany.das.rdb.config.impl.ConfigPackageImpl; +import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper; import org.apache.tuscany.das.rdb.util.DebugUtil; +import org.apache.tuscany.sdo.util.SDOUtil; import commonj.sdo.DataObject; import commonj.sdo.Type; @@ -37,10 +38,8 @@ /** * */ -public class ApplyChangesCommandImpl implements ApplyChangesCommand { +public class ApplyChangesCommandImpl extends BaseCommandImpl implements ApplyChangesCommand { - private ConnectionImpl dasConnection; - private static final boolean debug = false; private ChangeSummarizer summarizer = new ChangeSummarizer(); @@ -50,33 +49,27 @@ } // IOException is recoverable, needs to be thrown - public ApplyChangesCommandImpl(InputStream mappingModel) throws IOException { - setMapping(mappingModel); + public ApplyChangesCommandImpl(InputStream stream) throws IOException { + SDOUtil.registerStaticTypes(ConfigFactory.class); + XMLHelper helper = XMLHelper.INSTANCE; + XMLDocument doc = helper.load(stream); + Config mapping = (Config) doc.getRootObject(); + + this.configWrapper = new MappingWrapper(mapping); + + if (mapping.getConnectionProperties() != null) + setConnection(mapping.getConnectionProperties()); + } public ApplyChangesCommandImpl(Config mappingModel){ - summarizer.setMapping(mappingModel); -//TODO - Really need to refactor the Command framework. ReadCommand and ApplychangesCommand should -// be using the same approach to set connection and should probably share the same initialization. -// if (mappingModel.getConnectionProperties() != null) -// setConnection(mappingModel.getConnectionProperties()); + this.configWrapper = new MappingWrapper(mappingModel); } - public void setConnection(Connection connection) { - setConnection(new ConnectionImpl(connection)); - } + public void setConnection(ConnectionImpl connection) { + summarizer.setConnection(connection); + } - public void setConnection(Connection connection, boolean manageTransaction) { - ConnectionImpl c = new ConnectionImpl(connection); - c.setManageTransactions(manageTransaction); - setConnection(c); - } - - public void setConnection(ConnectionImpl connection) { - dasConnection = connection; - summarizer.setConnection(connection); - } - public void setConnection(ConnectionProperties c) { try { Connection connection = null; @@ -93,31 +86,28 @@ } public void addCreateCommand(Type type, Command cmd) { - summarizer.addCreateCommand(type, cmd); - ((CommandImpl) cmd).setConnection(dasConnection); + summarizer.addCreateCommand(type, cmd); } - public void addUpdateCommand(Type type, Command cmd) { - // DebugUtil.debugln(getClass(), debug, "Adding update command for type - // " + type.getName()); - summarizer.addUpdateCommand(type, cmd); - ((CommandImpl) cmd).setConnection(dasConnection); + public void addUpdateCommand(Type type, Command cmd) { + summarizer.addUpdateCommand(type, cmd); } public void addDeleteCommand(Type type, Command cmd) { - summarizer.addDeleteCommand(type, cmd); - ((CommandImpl) cmd).setConnection(dasConnection); + summarizer.addDeleteCommand(type, cmd); } public void execute(DataObject root) { DebugUtil.debugln(getClass(), debug, "Executing ApplyChangesCmd"); - if (dasConnection == null) + if (summarizer.getConnection() == null) throw new RuntimeException("A connection must be provided"); if (!root.equals(root.getDataGraph().getRootObject())) throw new RuntimeException("'root' argument must be the root of the datagraph"); + summarizer.setMapping(configWrapper); + Changes changes = summarizer.loadChanges(root); boolean success = false; @@ -126,51 +116,10 @@ success = true; } finally { if (success) - dasConnection.cleanUp(); + summarizer.getConnection().cleanUp(); else - dasConnection.errorCleanUp(); + summarizer.getConnection().errorCleanUp(); } } - public void setMapping(InputStream stream) throws IOException { - XMLHelper helper = XMLHelper.INSTANCE; - - ConfigPackageImpl impl = ConfigPackageImpl.eINSTANCE; - XMLDocument doc = helper.load(stream); - Config mapping = (Config) doc.getRootObject(); - - summarizer.setMapping(mapping); - if (mapping.getConnectionProperties() != null) - setConnection(mapping.getConnectionProperties()); - - } - - public void addRelationship(String parent, String child) { - summarizer.addRelationship(parent, child); - } - - public void addPrimaryKey(String columnName) { - summarizer.addPrimaryKey(columnName); - } - - public void addCollisionColumn(String columnName) { - summarizer.addCollisionColumn(columnName); - } - - public void addRelationship(Key parentKey, Key childKey) { - throw new RuntimeException("Not Implemented"); - } - - public void addPrimaryKey(Key key) { - summarizer.addPrimarykey(key); - } - - public void addGeneratedPrimaryKey(String columnName) { - summarizer.addGeneratedPrimaryKey(columnName); - } - - public void addConverter(String name, String converterName) { - summarizer.addConverter(name, converterName); - } - } Index: src/main/java/org/apache/tuscany/das/rdb/impl/UpdateOperation.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/UpdateOperation.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/UpdateOperation.java (working copy) @@ -22,7 +22,7 @@ public class UpdateOperation extends ChangeOperation { - public UpdateOperation(WriteCommandImpl command, DataObject changedObject, String id) { + public UpdateOperation(UpdateCommandImpl command, DataObject changedObject, String id) { super(command, changedObject); this.propagatedID = id; } Index: src/main/java/org/apache/tuscany/das/rdb/impl/Changes.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/Changes.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/Changes.java (working copy) @@ -30,8 +30,7 @@ private UpdateList updates = new UpdateList(); private DeleteList deletes = new DeleteList(); -// private static final boolean debug = false; - + public void addInsert(ChangeOperation c) { inserts.add(c); } Index: src/main/java/org/apache/tuscany/das/rdb/impl/CommandGroupImpl.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/CommandGroupImpl.java (revision 392876) +++ src/main/java/org/apache/tuscany/das/rdb/impl/CommandGroupImpl.java (working copy) @@ -43,11 +43,6 @@ * ApplyChangesCommand. This factory is initialized with a configuration that * defines the commands it produces. * - * <p> - * TODO - This is still underdevelopment and is likely to replace CommandFactory - * as the preferred mechanism to set commands at runtime. - * - * */ public class CommandGroupImpl implements CommandGroup { Index: src/main/java/org/apache/tuscany/das/rdb/impl/DeleteOperation.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/DeleteOperation.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/DeleteOperation.java (working copy) @@ -29,7 +29,7 @@ * Objects deleted from the graph have lost their "settings" and must * be restored */ - public DeleteOperation(WriteCommandImpl command, DataObject changedObject) { + public DeleteOperation(DeleteCommandImpl command, DataObject changedObject) { super(command); this.dObject = new DatabaseObject(command.getMappingModel(),DataObjectUtil.getRestoredCopy(changedObject)); Index: src/main/java/org/apache/tuscany/das/rdb/impl/CreateOperation.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/CreateOperation.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/CreateOperation.java (working copy) @@ -21,7 +21,7 @@ public class CreateOperation extends ChangeOperation { - public CreateOperation(WriteCommandImpl command, DataObject changedObject, String ID) { + public CreateOperation(InsertCommandImpl command, DataObject changedObject, String ID) { super(command, changedObject); this.propagatedID = ID; } Index: src/main/java/org/apache/tuscany/das/rdb/impl/CommandImpl.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/CommandImpl.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/CommandImpl.java (working copy) @@ -19,27 +19,22 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; -import java.sql.Connection; import java.util.List; import org.apache.tuscany.das.rdb.Command; -import org.apache.tuscany.das.rdb.Key; import org.apache.tuscany.das.rdb.Parameter; import org.apache.tuscany.das.rdb.ResultSetShape; -import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper; import commonj.sdo.DataObject; import commonj.sdo.Type; import commonj.sdo.helper.XSDHelper; -public abstract class CommandImpl implements Command { +public abstract class CommandImpl extends BaseCommandImpl implements Command { protected Statement statement; protected Parameters parameters = new Parameters(); - protected MappingWrapper mappingModel = new MappingWrapper(); - protected static final boolean debug = false; protected ResultSetShape resultSetShape; @@ -128,16 +123,6 @@ return parameters.parameterWithIndex(index).getValue(); } - public void setConnection(Connection connection) { - setConnection(new ConnectionImpl(connection)); - } - - public void setConnection(Connection connection, boolean manageTransaction) { - ConnectionImpl c = new ConnectionImpl(connection); - c.setManageTransactions(manageTransaction); - setConnection(c); - } - public void setConnection(ConnectionImpl connection) { statement.setConnection(connection); } @@ -146,29 +131,12 @@ return statement.getConnection(); } - public void addRelationship(String parentName, String childName) { - mappingModel.addRelationship(parentName, childName); - } - public void addRelationship(Key parentKey, Key childKey) { - mappingModel.addRelationship(parentKey, childKey); - } - public void addPrimaryKey(String pk) { - mappingModel.addPrimaryKey(pk); - } - - public void addPrimaryKey(Key pk) { - mappingModel.addPrimaryKey(pk); - } - public void setResultSetShape(ResultSetShape shape) { this.resultSetShape = shape; } - public void addConverter(String name, String converter) { - mappingModel.addConverter(name, converter); - } public void close() { statement.close(); Index: src/main/java/org/apache/tuscany/das/rdb/impl/InsertList.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/InsertList.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/InsertList.java (working copy) @@ -41,6 +41,8 @@ public void add(ChangeOperation op) { DebugUtil.debugln(getClass(), debug, "Adding insert operation "); + // If nothing has been added yet, or this is no ordering, simply + // add the operation to the list if ((order.size() == 0) || (op.getTableName() == null)) { insertOperations.add(op); } else { @@ -62,7 +64,7 @@ String name = (String) i.next(); DebugUtil.debugln(getClass(), debug, "Adding operations for table " + name); - // TODO - KJW added null check ... Brent to verify. + // A null here means a table is in the config but hasn't been changed here if (opsByTableName.get(name) != null) insertOperations.addAll((Collection) opsByTableName .get(name)); Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeSummarizer.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeSummarizer.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeSummarizer.java (working copy) @@ -24,7 +24,6 @@ import org.apache.tuscany.das.rdb.Command; import org.apache.tuscany.das.rdb.Key; import org.apache.tuscany.das.rdb.config.Column; -import org.apache.tuscany.das.rdb.config.Config; 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; @@ -186,16 +185,19 @@ public void addCreateCommand(Type type, Command cmd) { ChangeFactory cf = getRegistry().getFactory(type); cf.setCreateCommand((InsertCommandImpl) cmd); + ((CommandImpl) cmd).setConnection(connection); } public void addUpdateCommand(Type type, Command cmd) { ChangeFactory cf = getRegistry().getFactory(type); - cf.setUpdateCommand((WriteCommandImpl) cmd); + cf.setUpdateCommand((UpdateCommandImpl) cmd); + ((CommandImpl) cmd).setConnection(connection); } public void addDeleteCommand(Type type, Command cmd) { ChangeFactory cf = getRegistry().getFactory(type); - cf.setDeleteCommand((WriteCommandImpl) cmd); + cf.setDeleteCommand((DeleteCommandImpl) cmd); + ((CommandImpl) cmd).setConnection(connection); } @@ -210,8 +212,12 @@ this.connection = connection; } - public void setMapping(Config map) { - this.mapping = new MappingWrapper(map); + public void setMapping(MappingWrapper map) { + this.mapping = map; + + if ( mapping.getConfig() == null ) + return; + Iterator i = mapping.getConfig().getTable().iterator(); while (i.hasNext()) { Table t = (Table) i.next(); @@ -254,6 +260,10 @@ mapping.addConverter(name, converterName); } + public ConnectionImpl getConnection() { + return this.connection; + } + } Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeOperation.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeOperation.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeOperation.java (working copy) @@ -34,15 +34,23 @@ private static final boolean debug = false; protected String propagatedID = null; + + private boolean isInsert = false; - public ChangeOperation(WriteCommandImpl command) { + public ChangeOperation(DeleteCommandImpl command) { writeCommand = command; } - public ChangeOperation(WriteCommandImpl command, DataObject changedObject) { + public ChangeOperation(InsertCommandImpl command, DataObject changedObject) { writeCommand = command; dObject = new DatabaseObject(command.getMappingModel(), changedObject); + this.isInsert = true; } + + public ChangeOperation(UpdateCommandImpl command, DataObject changedObject) { + writeCommand = command; + dObject = new DatabaseObject(command.getMappingModel(), changedObject); + } public void execute() { DebugUtil.debugln(getClass(), debug, "Executing change operation"); @@ -55,8 +63,8 @@ } writeCommand.execute(); - //TODO - Added this instanceof hack. Brent to verify - if (( propagatedID != null ) && (writeCommand instanceof InsertCommandImpl)){ + + if ( isInsert && ( propagatedID != null )) { DebugUtil.debugln(getClass(), debug, "Propagating key " + propagatedID); int id = writeCommand.getGeneratedKey(); dObject.setPropagatedID(propagatedID, id); Index: src/main/java/org/apache/tuscany/das/rdb/impl/WriteCommandImpl.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/WriteCommandImpl.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/WriteCommandImpl.java (working copy) @@ -56,7 +56,7 @@ } public Config getMappingModel() { - return this.mappingModel.getConfig(); + return configWrapper.getConfig(); } Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java (working copy) @@ -35,9 +35,9 @@ private InsertCommandImpl createCommand; - private WriteCommandImpl updateCommand; + private UpdateCommandImpl updateCommand; - private WriteCommandImpl deleteCommand; + private DeleteCommandImpl deleteCommand; private static final boolean debug = false; @@ -61,12 +61,12 @@ createCommand = cmd; } - public void setUpdateCommand(WriteCommandImpl cmd) { + public void setUpdateCommand(UpdateCommandImpl cmd) { DebugUtil.debugln(getClass(), debug, "Setting Update Command to " + cmd); updateCommand = cmd; } - public void setDeleteCommand(WriteCommandImpl cmd) { + public void setDeleteCommand(DeleteCommandImpl cmd) { deleteCommand = cmd; } @@ -115,12 +115,12 @@ } } createCommand.setConnection(connection); - createCommand.mappingModel = mapping; + createCommand.configWrapper = mapping; } return createCommand; } - private WriteCommandImpl getDeleteCommand(DataObject changedObject) { + private DeleteCommandImpl getDeleteCommand(DataObject changedObject) { if ( deleteCommand == null ) { Table table = mapping.getTable(changedObject.getType().getName()); @@ -141,7 +141,7 @@ return deleteCommand; } - private WriteCommandImpl getUpdateCommand(DataObject changedObject) { + private UpdateCommandImpl getUpdateCommand(DataObject changedObject) { if ( updateCommand == null ) { Table table = mapping.getTableByPropertyName(changedObject.getType().getName()); @@ -162,7 +162,7 @@ } updateCommand.setConnection(connection); - updateCommand.mappingModel = mapping; + updateCommand.configWrapper = mapping; } DebugUtil.debugln(getClass(), debug, "Returning updateCommand: " + updateCommand); return updateCommand; Index: src/main/java/org/apache/tuscany/das/rdb/impl/OptimisticWriteCommandImpl.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/OptimisticWriteCommandImpl.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/OptimisticWriteCommandImpl.java (working copy) @@ -18,7 +18,7 @@ import java.sql.SQLException; -public class OptimisticWriteCommandImpl extends WriteCommandImpl { +public class OptimisticWriteCommandImpl extends UpdateCommandImpl { public OptimisticWriteCommandImpl(String sqlString) { super(sqlString); Index: src/main/java/org/apache/tuscany/das/rdb/impl/BaseCommandImpl.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/BaseCommandImpl.java (revision 0) +++ src/main/java/org/apache/tuscany/das/rdb/impl/BaseCommandImpl.java (revision 0) @@ -0,0 +1,54 @@ +package org.apache.tuscany.das.rdb.impl; + +import java.sql.Connection; + +import org.apache.tuscany.das.rdb.Key; +import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper; + +public abstract class BaseCommandImpl { + + protected MappingWrapper configWrapper = new MappingWrapper(); + + public void setConnection(Connection connection) { + setConnection(new ConnectionImpl(connection)); + } + + public void setConnection(Connection connection, boolean manageTransaction) { + ConnectionImpl c = new ConnectionImpl(connection); + c.setManageTransactions(manageTransaction); + setConnection(c); + } + + public abstract void setConnection(ConnectionImpl c); + + public void addRelationship(String parentName, String childName) { + configWrapper.addRelationship(parentName, childName); + } + + public void addRelationship(Key parentKey, Key childKey) { + configWrapper.addRelationship(parentKey, childKey); + } + + public void addPrimaryKey(String pk) { + configWrapper.addPrimaryKey(pk); + } + + public void addPrimaryKey(Key pk) { + configWrapper.addPrimaryKey(pk); + } + + public void addConverter(String name, String converter) { + configWrapper.addConverter(name, converter); + } + + public void addCollisionColumn(String columnName) { + configWrapper.addCollisionColumn(columnName); + } + + public void addGeneratedPrimaryKey(String columnName) { + configWrapper.addGeneratedPrimaryKey(columnName); + } + + + +} Index: src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java (revision 392391) +++ src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java (working copy) @@ -102,7 +102,7 @@ GraphBuilderMetadata gbmd = new GraphBuilderMetadata(results, - getSchema(), mappingModel.getConfig(), resultSetShape); + getSchema(), configWrapper.getConfig(), resultSetShape); DataGraph g = createEDataGraph(gbmd.getSchema()); ChangeSummary summary = g.getChangeSummary(); @@ -154,7 +154,7 @@ } private void setMappingModel(Config mapping) { - mappingModel = new MappingWrapper(mapping); + configWrapper = new MappingWrapper(mapping); } public void setMappingModel(InputStream stream) { @@ -166,14 +166,14 @@ try { Config config = (Config) helper.load(stream).getRootObject(); - mappingModel = new MappingWrapper(config); + configWrapper = new MappingWrapper(config); } catch (IOException e) { throw new RuntimeException(e); } - if (mappingModel.getConfig().getConnectionProperties() != null) - setConnection(mappingModel.getConfig().getConnectionProperties()); + if (configWrapper.getConfig().getConnectionProperties() != null) + setConnection(configWrapper.getConfig().getConnectionProperties()); }