Coverage Report - org.codehaus.mojo.sql.SqlExecMojo
 
Classes in this File Line Coverage Branch Coverage Complexity
SqlExecMojo
0%
0/386
0%
0/172
3.032
SqlExecMojo$1
N/A
N/A
3.032
SqlExecMojo$Transaction
0%
0/27
0%
0/12
3.032
 
 1  
 package org.codehaus.mojo.sql;
 2  
 
 3  
 /*
 4  
  * Licensed to the Apache Software Foundation (ASF) under one
 5  
  * or more contributor license agreements.  See the NOTICE file
 6  
  * distributed with this work for additional information
 7  
  * regarding copyright ownership.  The ASF licenses this file
 8  
  * to you under the Apache License, Version 2.0 (the
 9  
  * "License"); you may not use this file except in compliance
 10  
  * with the License.  You may obtain a copy of the License at
 11  
  *
 12  
  *   http://www.apache.org/licenses/LICENSE-2.0
 13  
  *
 14  
  * Unless required by applicable law or agreed to in writing,
 15  
  * software distributed under the License is distributed on an
 16  
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 17  
  * KIND, either express or implied.  See the License for the
 18  
  * specific language governing permissions and limitations
 19  
  * under the License.
 20  
  */
 21  
 
 22  
 import java.io.BufferedOutputStream;
 23  
 import java.io.BufferedReader;
 24  
 import java.io.File;
 25  
 import java.io.FileInputStream;
 26  
 import java.io.FileOutputStream;
 27  
 import java.io.FileReader;
 28  
 import java.io.IOException;
 29  
 import java.io.InputStream;
 30  
 import java.io.InputStreamReader;
 31  
 import java.io.OutputStream;
 32  
 import java.io.PrintStream;
 33  
 import java.io.Reader;
 34  
 import java.io.StringReader;
 35  
 import java.sql.Connection;
 36  
 import java.sql.Driver;
 37  
 import java.sql.ResultSet;
 38  
 import java.sql.ResultSetMetaData;
 39  
 import java.sql.SQLException;
 40  
 import java.sql.SQLWarning;
 41  
 import java.sql.Statement;
 42  
 import java.util.Collections;
 43  
 import java.util.Enumeration;
 44  
 import java.util.Properties;
 45  
 import java.util.StringTokenizer;
 46  
 import java.util.Vector;
 47  
 
 48  
 import org.apache.commons.io.IOUtils;
 49  
 import org.apache.commons.lang.StringEscapeUtils;
 50  
 import org.apache.maven.execution.MavenSession;
 51  
 import org.apache.maven.plugin.AbstractMojo;
 52  
 import org.apache.maven.plugin.MojoExecutionException;
 53  
 import org.apache.maven.project.MavenProject;
 54  
 import org.apache.maven.settings.Server;
 55  
 import org.apache.maven.settings.Settings;
 56  
 import org.apache.maven.shared.filtering.MavenFileFilter;
 57  
 import org.apache.maven.shared.filtering.MavenFileFilterRequest;
 58  
 import org.apache.maven.shared.filtering.MavenFilteringException;
 59  
 import org.codehaus.plexus.util.FileUtils;
 60  
 import org.codehaus.plexus.util.IOUtil;
 61  
 import org.codehaus.plexus.util.StringUtils;
 62  
 import org.springframework.core.io.DefaultResourceLoader;
 63  
 import org.springframework.core.io.Resource;
 64  
 import org.springframework.core.io.ResourceLoader;
 65  
 
 66  
 /**
 67  
  * Executes SQL against a database.
 68  
  * 
 69  
  * @goal execute
 70  
  */
 71  0
 public class SqlExecMojo extends AbstractMojo {
 72  
 
 73  
         /**
 74  
          * Call {@link #setOnError(String)} with this value to abort SQL command
 75  
          * execution if an error is found.
 76  
          */
 77  
         public static final String ON_ERROR_ABORT = "abort";
 78  
 
 79  
         /**
 80  
          * Call {@link #setOnError(String)} with this value to continue SQL command
 81  
          * execution until all commands have been attempted, then abort the build if
 82  
          * an SQL error occurred in any of the commands.
 83  
          */
 84  
         public static final String ON_ERROR_ABORT_AFTER = "abortAfter";
 85  
 
 86  
         /**
 87  
          * Call {@link #setOnError(String)} with this value to continue SQL command
 88  
          * execution if an error is found.
 89  
          */
 90  
         public static final String ON_ERROR_CONTINUE = "continue";
 91  
 
 92  
         /**
 93  
          * Call {@link #setOrderFile(String)} with this value to sort in ascendant
 94  
          * order the sql files.
 95  
          */
 96  
         public static final String FILE_SORTING_ASC = "ascending";
 97  
 
 98  
         /**
 99  
          * Call {@link #setOrderFile(String)} with this value to sort in descendant
 100  
          * order the sql files.
 101  
          */
 102  
         public static final String FILE_SORTING_DSC = "descending";
 103  
 
 104  
         // ////////////////////////// User Info ///////////////////////////////////
 105  
 
 106  
         /**
 107  
          * Database username. If not given, it will be looked up through
 108  
          * <code>settings.xml</code>'s server with <code>${settingsKey}</code> as
 109  
          * key.
 110  
          * 
 111  
          * @since 1.0
 112  
          * @parameter expression="${username}"
 113  
          */
 114  
         private String username;
 115  
 
 116  
         /**
 117  
          * Database password. If not given, it will be looked up through
 118  
          * <code>settings.xml</code>'s server with <code>${settingsKey}</code> as
 119  
          * key.
 120  
          * 
 121  
          * @since 1.0
 122  
          * @parameter expression="${password}"
 123  
          */
 124  
         private String password;
 125  
 
 126  
         /**
 127  
          * Ignore the password and use anonymous access. This may be useful for
 128  
          * databases like MySQL which do not allow empty password parameters in the
 129  
          * connection initialization.
 130  
          * 
 131  
          * @since 1.4
 132  
          * @parameter default-value="false"
 133  
          */
 134  
         private boolean enableAnonymousPassword;
 135  
 
 136  
         /**
 137  
          * Additional key=value pairs separated by comma to be passed into JDBC
 138  
          * driver.
 139  
          * 
 140  
          * @since 1.0
 141  
          * @parameter expression="${driverProperties}" default-value = ""
 142  
          */
 143  
         private String driverProperties;
 144  
 
 145  
         /**
 146  
          * @parameter expression="${settings}"
 147  
          * @required
 148  
          * @since 1.0
 149  
          * @readonly
 150  
          */
 151  
         private Settings settings;
 152  
 
 153  
         /**
 154  
          * Server's <code>id</code> in <code>settings.xml</code> to look up username
 155  
          * and password. Defaults to <code>${url}</code> if not given.
 156  
          * 
 157  
          * @since 1.0
 158  
          * @parameter expression="${settingsKey}"
 159  
          */
 160  
         private String settingsKey;
 161  
 
 162  
         /**
 163  
          * Skip execution when there is an error obtaining a connection. This is a
 164  
          * special case to support databases, such as embedded Derby, that can
 165  
          * shutdown the database via the URL (i.e. <code>shutdown=true</code>).
 166  
          * 
 167  
          * @since 1.1
 168  
          * @parameter expression="${skipOnConnectionError}" default-value="false"
 169  
          */
 170  
         private boolean skipOnConnectionError;
 171  
 
 172  
         /**
 173  
          * Setting this parameter to <code>true</code> will force the execution of
 174  
          * this mojo, even if it would get skipped usually.
 175  
          * 
 176  
          * @parameter expression="${forceOpenJpaExecution}" default-value=false
 177  
          * @required
 178  
          */
 179  
         private boolean forceMojoExecution;
 180  
 
 181  
         /**
 182  
          * The Maven Project Object
 183  
          * 
 184  
          * @parameter default-value="${project}"
 185  
          * @required
 186  
          * @readonly
 187  
          */
 188  
         protected MavenProject project;
 189  
 
 190  
         /**
 191  
          * @parameter default-value="${session}"
 192  
          * @required
 193  
          * @readonly
 194  
          */
 195  
         private MavenSession mavenSession;
 196  
 
 197  
         // ////////////////////////////// Source info /////////////////////////////
 198  
 
 199  
         /**
 200  
          * SQL input commands separated by <code>${delimiter}</code>.
 201  
          * 
 202  
          * @since 1.0
 203  
          * @parameter expression="${sqlCommand}" default-value=""
 204  
          */
 205  0
         private String sqlCommand = "";
 206  
 
 207  
         /**
 208  
          * List of files containing SQL statements to load.
 209  
          * 
 210  
          * @since 1.0
 211  
          * @parameter
 212  
          */
 213  
         private File[] srcFiles;
 214  
 
 215  
         /**
 216  
          * List of resources containing SQL statements
 217  
          * 
 218  
          * @since 1.5
 219  
          * @parameter
 220  
          */
 221  
         private String[] resourceLocations;
 222  
 
 223  
         /**
 224  
          * File(s) containing SQL statements to load.
 225  
          * 
 226  
          * @since 1.0
 227  
          * @parameter
 228  
          */
 229  
         private Fileset fileset;
 230  
 
 231  
         /**
 232  
          * When <code>true</code>, skip the execution.
 233  
          * 
 234  
          * @since 1.0
 235  
          * @parameter default-value="false"
 236  
          */
 237  
         private boolean skip;
 238  
 
 239  
         // //////////////////////////////// Database info /////////////////////////
 240  
         /**
 241  
          * Database URL.
 242  
          * 
 243  
          * @parameter expression="${url}"
 244  
          * @required
 245  
          * @since 1.0-beta-1
 246  
          */
 247  
         private String url;
 248  
 
 249  
         /**
 250  
          * Database driver classname.
 251  
          * 
 252  
          * @since 1.0
 253  
          * @parameter expression="${driver}"
 254  
          * @required
 255  
          */
 256  
         private String driver;
 257  
 
 258  
         // //////////////////////////// Operation Configuration ////////////////////
 259  
         /**
 260  
          * Set to <code>true</code> to execute none-transactional SQL.
 261  
          * 
 262  
          * @since 1.0
 263  
          * @parameter expression="${autocommit}" default-value="false"
 264  
          */
 265  
         private boolean autocommit;
 266  
 
 267  
         /**
 268  
          * Action to perform if an error is found. Possible values are
 269  
          * <code>abort</code> and <code>continue</code>.
 270  
          * 
 271  
          * @since 1.0
 272  
          * @parameter expression="${onError}" default-value="abort"
 273  
          */
 274  0
         private String onError = ON_ERROR_ABORT;
 275  
 
 276  
         // //////////////////////////// Parser Configuration ////////////////////
 277  
 
 278  
         /**
 279  
          * Set the delimiter that separates SQL statements.
 280  
          * 
 281  
          * @since 1.0
 282  
          * @parameter expression="${delimiter}" default-value=";"
 283  
          */
 284  0
         private String delimiter = ";";
 285  
 
 286  
         /**
 287  
          * <p>
 288  
          * The delimiter type takes two values - "normal" and "row". Normal means
 289  
          * that any occurrence of the delimiter terminate the SQL command whereas
 290  
          * with row, only a line containing just the delimiter is recognized as the
 291  
          * end of the command.
 292  
          * </p>
 293  
          * <p>
 294  
          * For example, set this to "go" and delimiterType to "row" for Sybase ASE
 295  
          * or MS SQL Server.
 296  
          * </p>
 297  
          * 
 298  
          * @since 1.2
 299  
          * @parameter expression="${delimiterType}" default-value="normal"
 300  
          */
 301  0
         private String delimiterType = DelimiterType.NORMAL;
 302  
 
 303  
         /**
 304  
          * Set the order in which the SQL files will be executed. Possible values
 305  
          * are <code>ascending</code> and <code>descending</code>. Any other value
 306  
          * means that no sorting will be performed.
 307  
          * 
 308  
          * @since 1.1
 309  
          * @parameter expression="${orderFile}"
 310  
          */
 311  0
         private String orderFile = null;
 312  
 
 313  
         /**
 314  
          * When <code>true</code>, the whole SQL content in <code>sqlCommand</code>,
 315  
          * <code>srcFiles</code> and <code>fileset</code> are sent directly to JDBC
 316  
          * in one SQL statement. This option is for executing database stored
 317  
          * procedures/functions.
 318  
          * 
 319  
          * @deprecated used <i>delimiterType<i> instead.
 320  
          * @since 1.1
 321  
          * @parameter expression="${enableBlockMode}"
 322  
          */
 323  
 
 324  0
         private boolean enableBlockMode = false;
 325  
 
 326  
         /**
 327  
          * Keep the format of an SQL block.
 328  
          * 
 329  
          * @since 1.1
 330  
          * @parameter expression="${keepFormat}" default-value="false"
 331  
          */
 332  0
         private boolean keepFormat = false;
 333  
 
 334  
         // /////////////////////////////////////////////////////////////////////////////////////
 335  
         /**
 336  
          * Print SQL results.
 337  
          * 
 338  
          * @parameter
 339  
          * @since 1.3
 340  
          */
 341  0
         private boolean printResultSet = false;
 342  
 
 343  
         /**
 344  
          * Print header columns.
 345  
          */
 346  0
         private boolean showheaders = true;
 347  
 
 348  
         /**
 349  
          * Dump the SQL exection's output to a file. Default is stdout.
 350  
          * 
 351  
          * @parameter
 352  
          * @since 1.3
 353  
          */
 354  
         private File outputFile;
 355  
 
 356  
         /**
 357  
          * @parameter default-value=","
 358  
          * @since 1.4
 359  
          */
 360  
         private String outputDelimiter;
 361  
 
 362  
         /**
 363  
          * Encoding to use when reading SQL statements from a file.
 364  
          * 
 365  
          * @parameter expression="${encoding}" default-value=
 366  
          *            "${project.build.sourceEncoding}"
 367  
          * @since 1.1
 368  
          */
 369  0
         private String encoding = "";
 370  
 
 371  
         /**
 372  
          * Append to an existing file or overwrite it?
 373  
          */
 374  0
         private boolean append = false;
 375  
 
 376  
         /**
 377  
          * Argument to Statement.setEscapeProcessing If you want the driver to use
 378  
          * regular SQL syntax then set this to false.
 379  
          * 
 380  
          * @since 1.4
 381  
          * @parameter expression="${escapeProcessing}" default-value="true"
 382  
          */
 383  0
         private boolean escapeProcessing = true;
 384  
 
 385  
         // //////////////////////////////// Internal
 386  
         // properties//////////////////////
 387  
 
 388  
         /**
 389  
          * number of successful executed statements
 390  
          */
 391  0
         private int successfulStatements = 0;
 392  
 
 393  
         /**
 394  
          * number of total executed statements
 395  
          */
 396  0
         private int totalStatements = 0;
 397  
 
 398  
         /**
 399  
          * Database connection
 400  
          */
 401  0
         private Connection conn = null;
 402  
 
 403  
         /**
 404  
          * SQL statement
 405  
          */
 406  0
         private Statement statement = null;
 407  
 
 408  
         /**
 409  
          * SQL transactions to perform
 410  
          */
 411  0
         private Vector<Transaction> transactions = new Vector<Transaction>();
 412  
 
 413  
         /**
 414  
          * @component role="org.apache.maven.shared.filtering.MavenFileFilter"
 415  
          * @since 1.4
 416  
          */
 417  
         private MavenFileFilter fileFilter;
 418  
 
 419  
         /**
 420  
          * Set to true if you want to filter the srcFiles using system-, user- and
 421  
          * project properties
 422  
          * 
 423  
          * @parameter
 424  
          * @since 1.4
 425  
          */
 426  
         private boolean enableFiltering;
 427  
 
 428  
         /**
 429  
          * Interpolator especially for braceless expressions
 430  
          */
 431  
         // private Interpolator interpolator = new
 432  
         // RegexBasedInterpolator("\\$([^\\s;)]+?)", "(?=[\\s;)])");
 433  
 
 434  
         /**
 435  
          * Add a SQL transaction to execute
 436  
          * 
 437  
          * @return a new SqlExecMojo.Transaction
 438  
          */
 439  
         public Transaction createTransaction() {
 440  0
                 Transaction t = new Transaction();
 441  0
                 transactions.addElement(t);
 442  0
                 return t;
 443  
         }
 444  
 
 445  
         /**
 446  
          * Set an inline SQL command to execute. NB: Properties are not expanded in
 447  
          * this text.
 448  
          * 
 449  
          * @param sql
 450  
          *            the sql statement to add
 451  
          */
 452  
         public void addText(String sql) {
 453  0
                 this.sqlCommand += sql;
 454  0
         }
 455  
 
 456  
         /**
 457  
          * Set the file encoding to use on the SQL files read in
 458  
          * 
 459  
          * @param encoding
 460  
          *            the encoding to use on the files
 461  
          */
 462  
         public void setEncoding(String encoding) {
 463  0
                 this.encoding = encoding;
 464  0
         }
 465  
 
 466  
         /**
 467  
          * Set the delimiter that separates SQL statements. Defaults to
 468  
          * &quot;;&quot;;
 469  
          * 
 470  
          * @param delimiter
 471  
          *            the new delimiter
 472  
          */
 473  
         public void setDelimiter(String delimiter) {
 474  0
                 this.delimiter = delimiter;
 475  0
         }
 476  
 
 477  
         /**
 478  
          * Set the delimiter type: "normal" or "row" (default "normal").
 479  
          * 
 480  
          * @param delimiterType
 481  
          *            the new delimiterType
 482  
          */
 483  
         public void setDelimiterType(String delimiterType) {
 484  0
                 this.delimiterType = delimiterType;
 485  0
         }
 486  
 
 487  
         /**
 488  
          * Print result sets from the statements; optional, default false
 489  
          * 
 490  
          * @param print
 491  
          *            <code>true</code> to print the resultset, otherwise
 492  
          *            <code>false</code>
 493  
          * @deprecated typo, use setPrintResultSet()
 494  
          */
 495  
         public void setPrintResutlSet(boolean print) {
 496  0
                 setPrintResultSet(print);
 497  0
         }
 498  
 
 499  
         /**
 500  
          * Print result sets from the statements; optional, default false
 501  
          * 
 502  
          * @param print
 503  
          *            <code>true</code> to print the resultset, otherwise
 504  
          *            <code>false</code>
 505  
          */
 506  
         public void setPrintResultSet(boolean print) {
 507  0
                 this.printResultSet = print;
 508  0
         }
 509  
 
 510  
         /**
 511  
          * Print headers for result sets from the statements; optional, default
 512  
          * true.
 513  
          * 
 514  
          * @param showheaders
 515  
          *            <code>true</code> to show the headers, otherwise
 516  
          *            <code>false</code>
 517  
          */
 518  
         public void setShowheaders(boolean showheaders) {
 519  0
                 this.showheaders = showheaders;
 520  0
         }
 521  
 
 522  
         /**
 523  
          * Set the output file;
 524  
          * 
 525  
          * @param output
 526  
          *            the output file
 527  
          */
 528  
         public void setOutputFile(File output) {
 529  0
                 this.outputFile = output;
 530  0
         }
 531  
 
 532  
         /**
 533  
          * whether output should be appended to or overwrite an existing file.
 534  
          * Defaults to false.
 535  
          * 
 536  
          * @param append
 537  
          *            <code>true</code> to append, otherwise <code>false</code> to
 538  
          *            overwrite
 539  
          */
 540  
         public void setAppend(boolean append) {
 541  0
                 this.append = append;
 542  0
         }
 543  
 
 544  
         /**
 545  
          * whether or not format should be preserved. Defaults to false.
 546  
          * 
 547  
          * @param keepformat
 548  
          *            The keepformat to set
 549  
          */
 550  
         public void setKeepFormat(boolean keepformat) {
 551  0
                 this.keepFormat = keepformat;
 552  0
         }
 553  
 
 554  
         /**
 555  
          * Set escape processing for statements.
 556  
          * 
 557  
          * @param enable
 558  
          *            <code>true</code> to escape, otherwiser <code>false</code>
 559  
          */
 560  
         public void setEscapeProcessing(boolean enable) {
 561  0
                 escapeProcessing = enable;
 562  0
         }
 563  
 
 564  
         /**
 565  
          * <p>
 566  
          * Determine if the mojo execution should get skipped.
 567  
          * </p>
 568  
          * This is the case if:
 569  
          * <ul>
 570  
          * <li>{@link #skip} is <code>true</code></li>
 571  
          * <li>if the mojo gets executed on a project with packaging type 'pom' and
 572  
          * {@link #forceMojoExecution} is <code>false</code></li>
 573  
          * </ul>
 574  
          * 
 575  
          * @return <code>true</code> if the mojo execution should be skipped.
 576  
          */
 577  
         protected boolean skipMojo() {
 578  0
                 if (skip) {
 579  0
                         getLog().info("Skip sql execution");
 580  0
                         return true;
 581  
                 }
 582  
 
 583  0
                 if (!forceMojoExecution && project != null && "pom".equals(project.getPackaging())) {
 584  0
                         getLog().info("Skipping sql execution for project with packaging type 'pom'");
 585  0
                         return true;
 586  
                 }
 587  
 
 588  0
                 return false;
 589  
         }
 590  
 
 591  
         /**
 592  
          * Load the sql file and then execute it
 593  
          * 
 594  
          * @throws MojoExecutionException
 595  
          */
 596  
         public void execute() throws MojoExecutionException {
 597  
 
 598  0
                 if (skipMojo()) {
 599  0
                         return;
 600  
                 }
 601  
 
 602  0
                 successfulStatements = 0;
 603  
 
 604  0
                 totalStatements = 0;
 605  
 
 606  0
                 loadUserInfoFromSettings();
 607  
 
 608  0
                 addCommandToTransactions();
 609  
 
 610  0
                 addFilesToTransactions();
 611  
 
 612  0
                 addFileSetToTransactions();
 613  
 
 614  0
                 addResourcesToTransactions();
 615  
 
 616  0
                 sortTransactions();
 617  
 
 618  
                 try {
 619  0
                         conn = getConnection();
 620  0
                 } catch (SQLException e) {
 621  0
                         if (!this.skipOnConnectionError) {
 622  0
                                 throw new MojoExecutionException(e.getMessage(), e);
 623  
                         } else {
 624  
                                 // error on get connection and user asked to skip the rest
 625  0
                                 return;
 626  
                         }
 627  0
                 }
 628  
 
 629  
                 try {
 630  0
                         statement = conn.createStatement();
 631  0
                         statement.setEscapeProcessing(escapeProcessing);
 632  
 
 633  0
                         PrintStream out = System.out;
 634  
                         try {
 635  0
                                 if (outputFile != null) {
 636  0
                                         getLog().debug("Opening PrintStream to output file " + outputFile);
 637  0
                                         out = new PrintStream(new BufferedOutputStream(new FileOutputStream(outputFile.getAbsolutePath(),
 638  
                                                         append)));
 639  
                                 }
 640  
 
 641  
                                 // Process all transactions
 642  0
                                 for (Enumeration<Transaction> e = transactions.elements(); e.hasMoreElements();) {
 643  0
                                         Transaction t = e.nextElement();
 644  
 
 645  0
                                         t.runTransaction(out);
 646  
 
 647  0
                                         if (!autocommit) {
 648  0
                                                 getLog().debug("Committing transaction");
 649  0
                                                 conn.commit();
 650  
                                         }
 651  0
                                 }
 652  
                         } finally {
 653  0
                                 if (out != null && out != System.out) {
 654  0
                                         out.close();
 655  
                                 }
 656  
                         }
 657  0
                 } catch (IOException e) {
 658  0
                         throw new MojoExecutionException(e.getMessage(), e);
 659  0
                 } catch (SQLException e) {
 660  0
                         if (!autocommit && conn != null && ON_ERROR_ABORT.equalsIgnoreCase(getOnError())) {
 661  
                                 try {
 662  0
                                         conn.rollback();
 663  0
                                 } catch (SQLException ex) {
 664  
                                         // ignore
 665  0
                                 }
 666  
                         }
 667  0
                         throw new MojoExecutionException(e.getMessage(), e);
 668  
                 } finally {
 669  0
                         try {
 670  0
                                 if (statement != null) {
 671  0
                                         statement.close();
 672  
                                 }
 673  0
                                 if (conn != null) {
 674  0
                                         conn.close();
 675  
                                 }
 676  0
                         } catch (SQLException ex) {
 677  
                                 // ignore
 678  0
                         }
 679  0
                 }
 680  
 
 681  0
                 getLog().info(
 682  
                                 getSuccessfulStatements() + " of " + getTotalStatements() + " SQL statements executed successfully");
 683  
 
 684  0
                 if (ON_ERROR_ABORT_AFTER.equalsIgnoreCase(getOnError()) && totalStatements != successfulStatements) {
 685  0
                         throw new MojoExecutionException("Some SQL statements failed to execute");
 686  
                 }
 687  
 
 688  0
         }
 689  
 
 690  
         /**
 691  
          * Add sql command to transactions list.
 692  
          * 
 693  
          */
 694  
         private void addCommandToTransactions() {
 695  0
                 createTransaction().addText(sqlCommand.trim());
 696  0
         }
 697  
 
 698  
         /**
 699  
          * Add user sql fileset to transation list
 700  
          * 
 701  
          */
 702  
         private void addFileSetToTransactions() {
 703  
                 String[] includedFiles;
 704  0
                 if (fileset != null) {
 705  0
                         fileset.scan();
 706  0
                         includedFiles = fileset.getIncludedFiles();
 707  
                 } else {
 708  0
                         includedFiles = new String[0];
 709  
                 }
 710  
 
 711  0
                 for (int j = 0; j < includedFiles.length; j++) {
 712  0
                         createTransaction().setSrc(new File(fileset.getBasedir(), includedFiles[j]));
 713  
                 }
 714  0
         }
 715  
 
 716  
         protected Resource[] getResources(String[] locations) throws MojoExecutionException {
 717  0
                 ResourceLoader loader = new DefaultResourceLoader();
 718  0
                 Resource[] resources = new Resource[locations.length];
 719  0
                 for (int i = 0; i < locations.length; i++) {
 720  0
                         String location = locations[i];
 721  0
                         Resource resource = loader.getResource(location);
 722  0
                         if (!resource.exists()) {
 723  0
                                 throw new MojoExecutionException("Resource " + location + " was not found");
 724  
                         }
 725  0
                         resources[i] = resource;
 726  
                 }
 727  0
                 return resources;
 728  
         }
 729  
 
 730  
         protected void copy(Resource resource, File file) throws IOException {
 731  0
                 InputStream in = resource.getInputStream();
 732  0
                 OutputStream out = new FileOutputStream(file);
 733  0
                 IOUtils.copyLarge(in, out);
 734  0
         }
 735  
 
 736  
         /**
 737  
          * Add user input of srcFiles to transaction list.
 738  
          * 
 739  
          * @throws MojoExecutionException
 740  
          */
 741  
         private void addResourcesToTransactions() throws MojoExecutionException {
 742  0
                 String[] locations = getResourceLocations();
 743  0
                 Resource[] resources = getResources(locations);
 744  
 
 745  0
                 MavenFileFilterRequest request = new MavenFileFilterRequest();
 746  0
                 request.setEncoding(encoding);
 747  0
                 request.setMavenSession(mavenSession);
 748  0
                 request.setMavenProject(project);
 749  0
                 request.setFiltering(enableFiltering);
 750  0
                 for (int i = 0; i < resources.length; i++) {
 751  0
                         Resource resource = resources[i];
 752  0
                         String filename = resource.getFilename();
 753  0
                         String basename = FileUtils.basename(filename);
 754  0
                         String extension = FileUtils.extension(filename);
 755  0
                         File sourceFile = FileUtils.createTempFile(basename, extension, null);
 756  
 
 757  
                         try {
 758  0
                                 copy(resource, sourceFile);
 759  0
                         } catch (IOException e) {
 760  0
                                 throw new MojoExecutionException("Error copying resource " + resource + "to a temp file", e);
 761  0
                         }
 762  
 
 763  0
                         File targetFile = FileUtils.createTempFile(basename, extension, null);
 764  0
                         if (!getLog().isDebugEnabled()) {
 765  0
                                 targetFile.deleteOnExit();
 766  0
                                 sourceFile.deleteOnExit();
 767  
                         }
 768  
 
 769  0
                         request.setFrom(sourceFile);
 770  0
                         request.setTo(targetFile);
 771  
 
 772  
                         try {
 773  0
                                 fileFilter.copyFile(request);
 774  0
                         } catch (MavenFilteringException e) {
 775  0
                                 throw new MojoExecutionException(e.getMessage());
 776  0
                         }
 777  
 
 778  0
                         createTransaction().setSrc(targetFile);
 779  
                 }
 780  0
         }
 781  
 
 782  
         /**
 783  
          * Add user input of srcFiles to transaction list.
 784  
          * 
 785  
          * @throws MojoExecutionException
 786  
          */
 787  
         private void addFilesToTransactions() throws MojoExecutionException {
 788  0
                 File[] files = getSrcFiles();
 789  
 
 790  0
                 MavenFileFilterRequest request = new MavenFileFilterRequest();
 791  0
                 request.setEncoding(encoding);
 792  0
                 request.setMavenSession(mavenSession);
 793  0
                 request.setMavenProject(project);
 794  0
                 request.setFiltering(enableFiltering);
 795  0
                 for (int i = 0; files != null && i < files.length; ++i) {
 796  0
                         if (files[i] != null && !files[i].exists()) {
 797  0
                                 throw new MojoExecutionException(files[i].getPath() + " not found.");
 798  
                         }
 799  
 
 800  0
                         File sourceFile = files[i];
 801  0
                         String basename = FileUtils.basename(sourceFile.getName());
 802  0
                         String extension = FileUtils.extension(sourceFile.getName());
 803  0
                         File targetFile = FileUtils.createTempFile(basename, extension, null);
 804  0
                         if (!getLog().isDebugEnabled()) {
 805  0
                                 targetFile.deleteOnExit();
 806  
                         }
 807  
 
 808  0
                         request.setFrom(sourceFile);
 809  0
                         request.setTo(targetFile);
 810  
 
 811  
                         try {
 812  0
                                 fileFilter.copyFile(request);
 813  0
                         } catch (MavenFilteringException e) {
 814  0
                                 throw new MojoExecutionException(e.getMessage());
 815  0
                         }
 816  
 
 817  0
                         createTransaction().setSrc(targetFile);
 818  
                 }
 819  0
         }
 820  
 
 821  
         /**
 822  
          * Sort the transaction list.
 823  
          */
 824  
         private void sortTransactions() {
 825  0
                 if (FILE_SORTING_ASC.equalsIgnoreCase(this.orderFile)) {
 826  0
                         Collections.sort(transactions);
 827  0
                 } else if (FILE_SORTING_DSC.equalsIgnoreCase(this.orderFile)) {
 828  0
                         Collections.sort(transactions, Collections.reverseOrder());
 829  
                 }
 830  0
         }
 831  
 
 832  
         /**
 833  
          * Load username password from settings if user has not set them in JVM
 834  
          * properties
 835  
          * 
 836  
          * @throws MojoExecutionException
 837  
          */
 838  
         private void loadUserInfoFromSettings() throws MojoExecutionException {
 839  0
                 if (this.settingsKey == null) {
 840  0
                         this.settingsKey = getUrl();
 841  
                 }
 842  
 
 843  0
                 if ((getUsername() == null || getPassword() == null) && (settings != null)) {
 844  0
                         Server server = this.settings.getServer(this.settingsKey);
 845  
 
 846  0
                         if (server != null) {
 847  0
                                 if (getUsername() == null) {
 848  0
                                         setUsername(server.getUsername());
 849  
                                 }
 850  
 
 851  0
                                 if (getPassword() == null) {
 852  0
                                         setPassword(server.getPassword());
 853  
                                 }
 854  
                         }
 855  
                 }
 856  
 
 857  0
                 if (getUsername() == null) {
 858  
                         // allow emtpy username
 859  0
                         setUsername("");
 860  
                 }
 861  
 
 862  0
                 if (getPassword() == null) {
 863  
                         // allow emtpy password
 864  0
                         setPassword("");
 865  
                 }
 866  0
         }
 867  
 
 868  
         /**
 869  
          * Creates a new Connection as using the driver, url, userid and password
 870  
          * specified.
 871  
          * 
 872  
          * The calling method is responsible for closing the connection.
 873  
          * 
 874  
          * @return Connection the newly created connection.
 875  
          * @throws MojoExecutionException
 876  
          *             if the UserId/Password/Url is not set or there is no suitable
 877  
          *             driver or the driver fails to load.
 878  
          * @throws SQLException
 879  
          *             if there is problem getting connection with valid url
 880  
          * 
 881  
          */
 882  
         private Connection getConnection() throws MojoExecutionException, SQLException {
 883  0
                 getLog().debug("connecting to " + getUrl());
 884  0
                 Properties info = new Properties();
 885  0
                 info.put("user", getUsername());
 886  
 
 887  0
                 if (!enableAnonymousPassword) {
 888  0
                         info.put("password", getPassword());
 889  
                 }
 890  
 
 891  0
                 info.putAll(this.getDriverProperties());
 892  
 
 893  0
                 Driver driverInstance = null;
 894  
 
 895  
                 try {
 896  0
                         Class<?> dc = Class.forName(getDriver());
 897  0
                         driverInstance = (Driver) dc.newInstance();
 898  0
                 } catch (ClassNotFoundException e) {
 899  0
                         throw new MojoExecutionException("Driver class not found: " + getDriver(), e);
 900  0
                 } catch (Exception e) {
 901  0
                         throw new MojoExecutionException("Failure loading driver: " + getDriver(), e);
 902  0
                 }
 903  
 
 904  0
                 Connection conn = driverInstance.connect(getUrl(), info);
 905  
 
 906  0
                 if (conn == null) {
 907  
                         // Driver doesn't understand the URL
 908  0
                         throw new SQLException("No suitable Driver for " + getUrl());
 909  
                 }
 910  
 
 911  0
                 conn.setAutoCommit(autocommit);
 912  0
                 return conn;
 913  
         }
 914  
 
 915  
         /**
 916  
          * parse driverProperties into Properties set
 917  
          * 
 918  
          * @return the driver properties
 919  
          * @throws MojoExecutionException
 920  
          */
 921  
         protected Properties getDriverProperties() throws MojoExecutionException {
 922  0
                 Properties properties = new Properties();
 923  
 
 924  0
                 if (!StringUtils.isEmpty(this.driverProperties)) {
 925  0
                         String[] tokens = StringUtils.split(this.driverProperties, ",");
 926  0
                         for (int i = 0; i < tokens.length; ++i) {
 927  0
                                 String[] keyValueTokens = StringUtils.split(tokens[i].trim(), "=");
 928  0
                                 if (keyValueTokens.length != 2) {
 929  0
                                         throw new MojoExecutionException("Invalid JDBC Driver properties: " + this.driverProperties);
 930  
                                 }
 931  
 
 932  0
                                 properties.setProperty(keyValueTokens[0], keyValueTokens[1]);
 933  
 
 934  
                         }
 935  
                 }
 936  
 
 937  0
                 return properties;
 938  
         }
 939  
 
 940  
         /**
 941  
          * read in lines and execute them
 942  
          * 
 943  
          * @param reader
 944  
          *            the reader
 945  
          * @param out
 946  
          *            the outputstream
 947  
          * @throws SQLException
 948  
          * @throws IOException
 949  
          */
 950  
         private void runStatements(Reader reader, PrintStream out) throws SQLException, IOException {
 951  
                 String line;
 952  
 
 953  0
                 if (enableBlockMode) {
 954  
                         // no need to parse the content, ship it directly to jdbc in one sql
 955  
                         // statement
 956  0
                         line = IOUtil.toString(reader);
 957  0
                         execSQL(line, out);
 958  0
                         return;
 959  
                 }
 960  
 
 961  0
                 StringBuffer sql = new StringBuffer();
 962  
 
 963  0
                 BufferedReader in = new BufferedReader(reader);
 964  
 
 965  0
                 while ((line = in.readLine()) != null) {
 966  0
                         if (!keepFormat) {
 967  0
                                 line = line.trim();
 968  
                         }
 969  
 
 970  0
                         if (!keepFormat) {
 971  0
                                 if (line.startsWith("//")) {
 972  0
                                         continue;
 973  
                                 }
 974  0
                                 if (line.startsWith("--")) {
 975  0
                                         continue;
 976  
                                 }
 977  0
                                 StringTokenizer st = new StringTokenizer(line);
 978  0
                                 if (st.hasMoreTokens()) {
 979  0
                                         String token = st.nextToken();
 980  0
                                         if ("REM".equalsIgnoreCase(token)) {
 981  0
                                                 continue;
 982  
                                         }
 983  
                                 }
 984  
                         }
 985  
 
 986  0
                         if (!keepFormat) {
 987  0
                                 sql.append(" ").append(line);
 988  
                         } else {
 989  0
                                 sql.append("\n").append(line);
 990  
                         }
 991  
 
 992  
                         // SQL defines "--" as a comment to EOL
 993  
                         // and in Oracle it may contain a hint
 994  
                         // so we cannot just remove it, instead we must end it
 995  0
                         if (!keepFormat) {
 996  0
                                 if (SqlSplitter.containsSqlEnd(line, delimiter) == SqlSplitter.NO_END) {
 997  0
                                         sql.append("\n");
 998  
                                 }
 999  
                         }
 1000  
 
 1001  0
                         if ((delimiterType.equals(DelimiterType.NORMAL) && SqlSplitter.containsSqlEnd(line, delimiter) > 0)
 1002  
                                         || (delimiterType.equals(DelimiterType.ROW) && line.trim().equals(delimiter))) {
 1003  0
                                 execSQL(sql.substring(0, sql.length() - delimiter.length()), out);
 1004  0
                                 sql.setLength(0); // clean buffer
 1005  
                         }
 1006  
                 }
 1007  
 
 1008  
                 // Catch any statements not followed by ;
 1009  0
                 if (!sql.toString().equals("")) {
 1010  0
                         execSQL(sql.toString(), out);
 1011  
                 }
 1012  0
         }
 1013  
 
 1014  
         /**
 1015  
          * Exec the sql statement.
 1016  
          * 
 1017  
          * @param sql
 1018  
          *            query to execute
 1019  
          * @param out
 1020  
          *            the outputstream
 1021  
          */
 1022  
         private void execSQL(String sql, PrintStream out) throws SQLException {
 1023  
                 // Check and ignore empty statements
 1024  0
                 if ("".equals(sql.trim())) {
 1025  0
                         return;
 1026  
                 }
 1027  
 
 1028  0
                 ResultSet resultSet = null;
 1029  
                 try {
 1030  0
                         totalStatements++;
 1031  0
                         getLog().debug("SQL: " + sql);
 1032  
 
 1033  
                         boolean ret;
 1034  0
                         int updateCountTotal = 0;
 1035  
 
 1036  0
                         ret = statement.execute(sql);
 1037  
                         do {
 1038  0
                                 if (!ret) {
 1039  0
                                         int updateCount = statement.getUpdateCount();
 1040  0
                                         if (updateCount != -1) {
 1041  0
                                                 updateCountTotal += updateCount;
 1042  
                                         }
 1043  0
                                 } else {
 1044  0
                                         resultSet = statement.getResultSet();
 1045  0
                                         if (printResultSet) {
 1046  0
                                                 printResultSet(resultSet, out);
 1047  
                                         }
 1048  
                                 }
 1049  0
                                 ret = statement.getMoreResults();
 1050  0
                         } while (ret);
 1051  
 
 1052  0
                         getLog().debug(updateCountTotal + " rows affected");
 1053  
 
 1054  0
                         if (printResultSet) {
 1055  0
                                 StringBuffer line = new StringBuffer();
 1056  0
                                 line.append(updateCountTotal).append(" rows affected");
 1057  0
                                 out.println(line);
 1058  
                         }
 1059  
 
 1060  0
                         SQLWarning warning = conn.getWarnings();
 1061  0
                         while (warning != null) {
 1062  0
                                 getLog().debug(warning + " sql warning");
 1063  0
                                 warning = warning.getNextWarning();
 1064  
                         }
 1065  0
                         conn.clearWarnings();
 1066  0
                         successfulStatements++;
 1067  0
                 } catch (SQLException e) {
 1068  0
                         getLog().error("Failed to execute: " + sql);
 1069  0
                         if (ON_ERROR_ABORT.equalsIgnoreCase(getOnError())) {
 1070  0
                                 throw e;
 1071  
                         }
 1072  0
                         getLog().error(e.toString());
 1073  
                 } finally {
 1074  0
                         if (resultSet != null) {
 1075  0
                                 resultSet.close();
 1076  
                         }
 1077  
                 }
 1078  0
         }
 1079  
 
 1080  
         /**
 1081  
          * print any results in the result set.
 1082  
          * 
 1083  
          * @param rs
 1084  
          *            the resultset to print information about
 1085  
          * @param out
 1086  
          *            the place to print results
 1087  
          * @throws SQLException
 1088  
          *             on SQL problems.
 1089  
          */
 1090  
         private void printResultSet(ResultSet rs, PrintStream out) throws SQLException {
 1091  0
                 if (rs != null) {
 1092  0
                         getLog().debug("Processing new result set.");
 1093  0
                         ResultSetMetaData md = rs.getMetaData();
 1094  0
                         int columnCount = md.getColumnCount();
 1095  0
                         StringBuffer line = new StringBuffer();
 1096  0
                         if (showheaders) {
 1097  0
                                 boolean first = true;
 1098  0
                                 for (int col = 1; col <= columnCount; col++) {
 1099  0
                                         String columnValue = md.getColumnName(col);
 1100  
 
 1101  0
                                         if (columnValue != null) {
 1102  0
                                                 columnValue = columnValue.trim();
 1103  
 
 1104  0
                                                 if (",".equals(outputDelimiter)) {
 1105  0
                                                         columnValue = StringEscapeUtils.escapeCsv(columnValue);
 1106  
                                                 }
 1107  
                                         }
 1108  
 
 1109  0
                                         if (first) {
 1110  0
                                                 first = false;
 1111  
                                         } else {
 1112  0
                                                 line.append(outputDelimiter);
 1113  
                                         }
 1114  0
                                         line.append(columnValue);
 1115  
                                 }
 1116  0
                                 out.println(line);
 1117  0
                                 line = new StringBuffer();
 1118  
                         }
 1119  0
                         while (rs.next()) {
 1120  0
                                 boolean first = true;
 1121  0
                                 for (int col = 1; col <= columnCount; col++) {
 1122  0
                                         String columnValue = rs.getString(col);
 1123  0
                                         if (columnValue != null) {
 1124  0
                                                 columnValue = columnValue.trim();
 1125  
 
 1126  0
                                                 if (",".equals(outputDelimiter)) {
 1127  0
                                                         columnValue = StringEscapeUtils.escapeCsv(columnValue);
 1128  
                                                 }
 1129  
                                         }
 1130  
 
 1131  0
                                         if (first) {
 1132  0
                                                 first = false;
 1133  
                                         } else {
 1134  0
                                                 line.append(outputDelimiter);
 1135  
                                         }
 1136  0
                                         line.append(columnValue);
 1137  
                                 }
 1138  0
                                 out.println(line);
 1139  0
                                 line = new StringBuffer();
 1140  0
                         }
 1141  
                 }
 1142  0
                 out.println();
 1143  0
         }
 1144  
 
 1145  
         /**
 1146  
          * Contains the definition of a new transaction element. Transactions allow
 1147  
          * several files or blocks of statements to be executed using the same JDBC
 1148  
          * connection and commit operation in between.
 1149  
          */
 1150  0
         private class Transaction implements Comparable<Transaction> {
 1151  0
                 private File tSrcFile = null;
 1152  
 
 1153  0
                 private String tSqlCommand = "";
 1154  
 
 1155  
                 /**
 1156  
          *
 1157  
          */
 1158  
                 public void setSrc(File src) {
 1159  0
                         this.tSrcFile = src;
 1160  0
                 }
 1161  
 
 1162  
                 /**
 1163  
          *
 1164  
          */
 1165  
                 public void addText(String sql) {
 1166  0
                         this.tSqlCommand += sql;
 1167  0
                 }
 1168  
 
 1169  
                 /**
 1170  
          *
 1171  
          */
 1172  
                 private void runTransaction(PrintStream out) throws IOException, SQLException {
 1173  0
                         if (tSqlCommand.length() != 0) {
 1174  0
                                 getLog().info("Executing commands");
 1175  
 
 1176  0
                                 runStatements(new StringReader(tSqlCommand), out);
 1177  
                         }
 1178  
 
 1179  0
                         if (tSrcFile != null) {
 1180  0
                                 getLog().info("Executing file: " + tSrcFile.getAbsolutePath());
 1181  
 
 1182  0
                                 Reader reader = null;
 1183  
 
 1184  0
                                 if (StringUtils.isEmpty(encoding)) {
 1185  0
                                         reader = new FileReader(tSrcFile);
 1186  
                                 } else {
 1187  0
                                         reader = new InputStreamReader(new FileInputStream(tSrcFile), encoding);
 1188  
                                 }
 1189  
 
 1190  
                                 try {
 1191  0
                                         runStatements(reader, out);
 1192  
                                 } finally {
 1193  0
                                         reader.close();
 1194  0
                                 }
 1195  
                         }
 1196  0
                 }
 1197  
 
 1198  
                 public int compareTo(Transaction transaction) {
 1199  
 
 1200  0
                         if (transaction.tSrcFile == null) {
 1201  0
                                 if (this.tSrcFile == null) {
 1202  0
                                         return 0;
 1203  
                                 } else {
 1204  0
                                         return Integer.MAX_VALUE;
 1205  
                                 }
 1206  
                         } else {
 1207  0
                                 if (this.tSrcFile == null) {
 1208  0
                                         return Integer.MIN_VALUE;
 1209  
                                 } else {
 1210  0
                                         return this.tSrcFile.compareTo(transaction.tSrcFile);
 1211  
                                 }
 1212  
                         }
 1213  
                 }
 1214  
         }
 1215  
 
 1216  
         //
 1217  
         // helper accessors for unit test purposes
 1218  
         //
 1219  
 
 1220  
         public String getUsername() {
 1221  0
                 return this.username;
 1222  
         }
 1223  
 
 1224  
         public void setUsername(String username) {
 1225  0
                 this.username = username;
 1226  0
         }
 1227  
 
 1228  
         public String getPassword() {
 1229  0
                 return this.password;
 1230  
         }
 1231  
 
 1232  
         public void setPassword(String password) {
 1233  0
                 this.password = password;
 1234  0
         }
 1235  
 
 1236  
         public String getUrl() {
 1237  0
                 return this.url;
 1238  
         }
 1239  
 
 1240  
         public void setUrl(String url) {
 1241  0
                 this.url = url;
 1242  0
         }
 1243  
 
 1244  
         public String getDriver() {
 1245  0
                 return this.driver;
 1246  
         }
 1247  
 
 1248  
         public void setDriver(String driver) {
 1249  0
                 this.driver = driver;
 1250  0
         }
 1251  
 
 1252  
         void setAutocommit(boolean autocommit) {
 1253  0
                 this.autocommit = autocommit;
 1254  0
         }
 1255  
 
 1256  
         void setFileset(Fileset fileset) {
 1257  0
                 this.fileset = fileset;
 1258  0
         }
 1259  
 
 1260  
         public File[] getSrcFiles() {
 1261  0
                 return this.srcFiles;
 1262  
         }
 1263  
 
 1264  
         public void setSrcFiles(File[] files) {
 1265  0
                 this.srcFiles = files;
 1266  0
         }
 1267  
 
 1268  
         public String getOrderFile() {
 1269  0
                 return this.orderFile;
 1270  
         }
 1271  
 
 1272  
         public void setOrderFile(String orderFile) {
 1273  0
                 if (FILE_SORTING_ASC.equalsIgnoreCase(orderFile)) {
 1274  0
                         this.orderFile = FILE_SORTING_ASC;
 1275  0
                 } else if (FILE_SORTING_DSC.equalsIgnoreCase(orderFile)) {
 1276  0
                         this.orderFile = FILE_SORTING_DSC;
 1277  
                 } else {
 1278  0
                         throw new IllegalArgumentException(orderFile + " is not a valid value for orderFile, only '"
 1279  
                                         + FILE_SORTING_ASC + "' or '" + FILE_SORTING_DSC + "'.");
 1280  
                 }
 1281  0
         }
 1282  
 
 1283  
         /**
 1284  
          * @deprecated use {@link #getSuccessfulStatements()}
 1285  
          */
 1286  
         int getGoodSqls() {
 1287  0
                 return this.getSuccessfulStatements();
 1288  
         }
 1289  
 
 1290  
         /**
 1291  
          * Number of SQL statements executed so far that caused errors.
 1292  
          * 
 1293  
          * @return the number
 1294  
          */
 1295  
         public int getSuccessfulStatements() {
 1296  0
                 return successfulStatements;
 1297  
         }
 1298  
 
 1299  
         /**
 1300  
          * Number of SQL statements executed so far, including the ones that caused
 1301  
          * errors.
 1302  
          * 
 1303  
          * @return the number
 1304  
          */
 1305  
         public int getTotalStatements() {
 1306  0
                 return totalStatements;
 1307  
         }
 1308  
 
 1309  
         public String getOnError() {
 1310  0
                 return this.onError;
 1311  
         }
 1312  
 
 1313  
         public void setOnError(String action) {
 1314  0
                 if (ON_ERROR_ABORT.equalsIgnoreCase(action)) {
 1315  0
                         this.onError = ON_ERROR_ABORT;
 1316  0
                 } else if (ON_ERROR_CONTINUE.equalsIgnoreCase(action)) {
 1317  0
                         this.onError = ON_ERROR_CONTINUE;
 1318  0
                 } else if (ON_ERROR_ABORT_AFTER.equalsIgnoreCase(action)) {
 1319  0
                         this.onError = ON_ERROR_ABORT_AFTER;
 1320  
                 } else {
 1321  0
                         throw new IllegalArgumentException(action + " is not a valid value for onError, only '" + ON_ERROR_ABORT
 1322  
                                         + "', '" + ON_ERROR_ABORT_AFTER + "', or '" + ON_ERROR_CONTINUE + "'.");
 1323  
                 }
 1324  0
         }
 1325  
 
 1326  
         void setSettings(Settings settings) {
 1327  0
                 this.settings = settings;
 1328  0
         }
 1329  
 
 1330  
         void setSettingsKey(String key) {
 1331  0
                 this.settingsKey = key;
 1332  0
         }
 1333  
 
 1334  
         void setSkip(boolean skip) {
 1335  0
                 this.skip = skip;
 1336  0
         }
 1337  
 
 1338  
         public void setDriverProperties(String driverProperties) {
 1339  0
                 this.driverProperties = driverProperties;
 1340  0
         }
 1341  
 
 1342  
         public boolean isEnableBlockMode() {
 1343  0
                 return enableBlockMode;
 1344  
         }
 1345  
 
 1346  
         public void setEnableBlockMode(boolean enableBlockMode) {
 1347  0
                 this.enableBlockMode = enableBlockMode;
 1348  0
         }
 1349  
 
 1350  
         public String getSqlCommand() {
 1351  0
                 return sqlCommand;
 1352  
         }
 1353  
 
 1354  
         public void setSqlCommand(String sqlCommand) {
 1355  0
                 this.sqlCommand = sqlCommand;
 1356  0
         }
 1357  
 
 1358  
         public Vector<Transaction> getTransactions() {
 1359  0
                 return transactions;
 1360  
         }
 1361  
 
 1362  
         public void setTransactions(Vector<Transaction> transactions) {
 1363  0
                 this.transactions = transactions;
 1364  0
         }
 1365  
 
 1366  
         public void setFileFilter(MavenFileFilter filter) {
 1367  0
                 this.fileFilter = filter;
 1368  0
         }
 1369  
 
 1370  
         public String[] getResourceLocations() {
 1371  0
                 return resourceLocations;
 1372  
         }
 1373  
 
 1374  
         public void setResourceLocations(String[] resourceLocations) {
 1375  0
                 this.resourceLocations = resourceLocations;
 1376  0
         }
 1377  
 }