Author: tomdz Date: Fri Aug 19 04:58:04 2005 New Revision: 233467 URL: http://svn.apache.org/viewcvs?rev=233467&view=rev Log: Added failOnError attribute to the database-modifying commands
Fixed ConcurrentModificationException bug when inserting a incomplete data xml file Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommand.java db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropDatabaseCommand.java db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteDataToSpecifiedDatabaseCommand.java db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java?rev=233467&r1=233466&r2=233467&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java Fri Aug 19 04:58:04 2005 @@ -243,8 +243,9 @@ } if (_processedIdentities.containsKey(table.getName())) { - Identity identity = buildIdentityFromPKs(table, bean); - HashSet identitiesForTable = (HashSet)_processedIdentities.get(table.getName()); + Identity identity = buildIdentityFromPKs(table, bean); + HashSet identitiesForTable = (HashSet)_processedIdentities.get(table.getName()); + ArrayList finishedObjs = new ArrayList(); identitiesForTable.add(identity); for (Iterator waitingObjIt = _waitingObjects.iterator(); waitingObjIt.hasNext();) @@ -259,13 +260,20 @@ // prior to that we also update the fk fields in case one of the pk // columns of the target object is auto-incremented by the database updateFKColumns(waitingObj.getObject(), bean, fkIdentity.getForeignKeyName()); - addBean(waitingObj.getObject()); - if (_log.isDebugEnabled()) - { - Table waitingObjTable = ((SqlDynaClass)waitingObj.getObject().getDynaClass()).getTable(); + // we defer handling of the finished objects to avoid concurrent modification exceptions + finishedObjs.add(waitingObj.getObject()); + } + } + for (Iterator finishedObjIt = finishedObjs.iterator(); finishedObjIt.hasNext();) + { + DynaBean finishedObj = (DynaBean)finishedObjIt.next(); + + addBean(finishedObj); + if (_log.isDebugEnabled()) + { + Table waitingObjTable = ((SqlDynaClass)finishedObj.getDynaClass()).getTable(); - _log.debug("Inserted deferred bean "+buildIdentityFromPKs(waitingObjTable, waitingObj.getObject())); - } + _log.debug("Inserted deferred bean "+buildIdentityFromPKs(waitingObjTable, finishedObj)); } } } Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java?rev=233467&r1=233466&r2=233467&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/CreateDatabaseCommand.java Fri Aug 19 04:58:04 2005 @@ -57,7 +57,14 @@ } catch (Exception ex) { - throw new BuildException(ex); + if (isFailOnError()) + { + throw new BuildException(ex); + } + else + { + task.log(ex.getLocalizedMessage(), Project.MSG_ERR); + } } } } Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommand.java URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommand.java?rev=233467&r1=233466&r2=233467&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommand.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DatabaseCommand.java Fri Aug 19 04:58:04 2005 @@ -15,8 +15,8 @@ private String _databaseType; /** The data source to use for accessing the database */ private BasicDataSource _dataSource; - /** Whether to alter or re-set the database if it already exists */ - private boolean _alterDb = true; + /** Whether to stop execution upon an error */ + private boolean _failOnError = true; /** * Returns the database type. @@ -59,23 +59,24 @@ } /** - * Determines whether to alter the database if it already exists, or re-set it. - * - * @return <code>true</code> if to alter the database + * Determines whether the command execution will be stopped upon an error. + * Default value is <code>true</code>. + * + * @return <code>true</code> if the execution stops in case of an error */ - protected boolean isAlterDatabase() + public boolean isFailOnError() { - return _alterDb; + return _failOnError; } /** - * Specifies whether to alter the database if it already exists, or re-set it. - * - * @param alterTheDb <code>true</code> if to alter the database + * Specifies whether the command execution will be stopped upon an error. + * + * @param failOnError <code>true</code> if the execution stops in case of an error */ - public void setAlterDatabase(boolean alterTheDb) + public void setFailOnError(boolean failOnError) { - _alterDb = alterTheDb; + _failOnError = failOnError; } /** Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropDatabaseCommand.java URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropDatabaseCommand.java?rev=233467&r1=233466&r2=233467&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropDatabaseCommand.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/DropDatabaseCommand.java Fri Aug 19 04:58:04 2005 @@ -57,7 +57,14 @@ } catch (Exception ex) { - throw new BuildException(ex); + if (isFailOnError()) + { + throw new BuildException(ex); + } + else + { + task.log(ex.getLocalizedMessage(), Project.MSG_ERR); + } } } } Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteDataToSpecifiedDatabaseCommand.java URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteDataToSpecifiedDatabaseCommand.java?rev=233467&r1=233466&r2=233467&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteDataToSpecifiedDatabaseCommand.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteDataToSpecifiedDatabaseCommand.java Fri Aug 19 04:58:04 2005 @@ -19,9 +19,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Iterator; - import org.apache.ddlutils.Platform; -import org.apache.ddlutils.PlatformFactory; import org.apache.ddlutils.io.DataReader; import org.apache.ddlutils.io.DataToDatabaseSink; import org.apache.ddlutils.model.Database; @@ -73,7 +71,7 @@ try { - Platform platform = PlatformFactory.createNewPlatformInstance(getDatabaseType()); + Platform platform = getPlatform(); DataToDatabaseSink sink = new DataToDatabaseSink(platform, model); DataReader reader = new DataReader(); Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java?rev=233467&r1=233466&r2=233467&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaSqlToFileCommand.java Fri Aug 19 04:58:04 2005 @@ -35,6 +35,8 @@ { /** The file to output the DTD to */ private File _outputFile; + /** Whether to alter or re-set the database if it already exists */ + private boolean _alterDb = true; /** * Sets the file to output the sql to. @@ -46,6 +48,26 @@ _outputFile = outputFile; } + /** + * Determines whether to alter the database if it already exists, or re-set it. + * + * @return <code>true</code> if to alter the database + */ + protected boolean isAlterDatabase() + { + return _alterDb; + } + + /** + * Specifies whether to alter the database if it already exists, or re-set it. + * + * @param alterTheDb <code>true</code> if to alter the database + */ + public void setAlterDatabase(boolean alterTheDb) + { + _alterDb = alterTheDb; + } + /* (non-Javadoc) * @see org.apache.ddlutils.task.Command#execute(org.apache.tools.ant.Task, org.apache.ddlutils.model.Database) */ @@ -89,7 +111,14 @@ } catch (Exception ex) { - throw new BuildException(ex); + if (isFailOnError()) + { + throw new BuildException(ex); + } + else + { + task.log(ex.getLocalizedMessage(), Project.MSG_ERR); + } } finally { @@ -104,5 +133,4 @@ } } } - } Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java?rev=233467&r1=233466&r2=233467&view=diff ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/task/WriteSchemaToDatabaseCommand.java Fri Aug 19 04:58:04 2005 @@ -27,6 +27,29 @@ */ public class WriteSchemaToDatabaseCommand extends DatabaseCommand { + /** Whether to alter or re-set the database if it already exists */ + private boolean _alterDb = true; + + /** + * Determines whether to alter the database if it already exists, or re-set it. + * + * @return <code>true</code> if to alter the database + */ + protected boolean isAlterDatabase() + { + return _alterDb; + } + + /** + * Specifies whether to alter the database if it already exists, or re-set it. + * + * @param alterTheDb <code>true</code> if to alter the database + */ + public void setAlterDatabase(boolean alterTheDb) + { + _alterDb = alterTheDb; + } + /* (non-Javadoc) * @see org.apache.ddlutils.task.Command#execute(org.apache.tools.ant.Task, org.apache.ddlutils.model.Database) */ @@ -54,7 +77,14 @@ } catch (Exception ex) { - throw new BuildException(ex); + if (isFailOnError()) + { + throw new BuildException(ex); + } + else + { + task.log(ex.getLocalizedMessage(), Project.MSG_ERR); + } } } }