| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
| SqlGenerator | 
 | 
 | 1.0;1 | 
| 1 |  package liquibase.sqlgenerator; | |
| 2 | ||
| 3 |  import liquibase.database.Database; | |
| 4 |  import liquibase.exception.ValidationErrors; | |
| 5 |  import liquibase.exception.Warnings; | |
| 6 |  import liquibase.servicelocator.PrioritizedService; | |
| 7 |  import liquibase.sql.Sql; | |
| 8 |  import liquibase.statement.SqlStatement; | |
| 9 | ||
| 10 |  /** | |
| 11 |   * SqlGenerator implementations take a database-independent SqlStatement interface and create a database-specific Sql | |
| 12 |   * object. SqlGenerators are registered with the SqlGeneratorFactory, which is used to determine the correct generator | |
| 13 |   * to use for a given statment/database combination. | |
| 14 |   * <p> | |
| 15 |   * The SqlGenerator implementations are responsible for determining whether the data contained in the SqlStatement | |
| 16 |   * method is valid using the validate method. | |
| 17 |   * <p> | |
| 18 |   * <b>Naming Conventions:</b><br> | |
| 19 |   * Default SqlGenerators for a particular SqlStatement use the same name as the SqlStatement class, replacing | |
| 20 |   * "Statement" with "Generator" (e.g.: CreateTableStatement -> CreateTableGenerator). Database-specific or alternate | |
| 21 |   * SqlGenerators append a descrition of what makes them different appended (e.g. CreateTableStatement -> | |
| 22 |   * CreateTableGeneratorOracle) | |
| 23 |   * <p> | |
| 24 |   * <b>NOTE:</b> There is only one instance of each SqlGenerator implementation created, and they must be thread safe. | |
| 25 |   * <p> | |
| 26 |   * <b>Lifecycle:</b><br> | |
| 27 |   * <ol> | |
| 28 |   * <li>Instance of SqlGenerator subclass is created when registered with SqlGeneratorFactory</li> | |
| 29 |   * <li>For each SqlStatement to execute, SqlGeneratorFactory calls supports() to determine if the given SqlGenerator | |
| 30 |   * will work for the current SqlStatement/Database combination</li> | |
| 31 |   * <li>SqlGeneratorFactory calls getPriority to determine which of all the SqlGenerators that support a given | |
| 32 |   * SqlStatement/Database combination is the best to use.</li> | |
| 33 |   * <li>Liquibase calls validate() on the best SqlGenerator to determine if the data contained in the SqlStatement is | |
| 34 |   * correct and complete for the given Database</li> | |
| 35 |   * <li>If validate returns a no-error ValidationErrors object, Liquibase will call the generateSql() method and execute | |
| 36 |   * the resuling SQL against the database.</li> | |
| 37 |   * </ol> | |
| 38 |   *  | |
| 39 |   * @param <StatementType> | |
| 40 |   *            Used to specify which type of SqlStatement this generator supports. If it supports multiple SqlStatement | |
| 41 |   *            types, pass SqlStatement. The SqlGeneratorFactory will use this paramter to augment the response from the | |
| 42 |   *            supports() method | |
| 43 |   *  | |
| 44 |   * @see SqlGeneratorFactory | |
| 45 |   * @see liquibase.statement.SqlStatement | |
| 46 |   * @see liquibase.sql.Sql | |
| 47 |   */ | |
| 48 | public interface SqlGenerator<StatementType extends SqlStatement> extends PrioritizedService { | |
| 49 | ||
| 50 | public static final int PRIORITY_DEFAULT = 1; | |
| 51 | public static final int PRIORITY_DATABASE = 5; | |
| 52 | ||
| 53 |      /** | |
| 54 |       * Of all the SqlGenerators that "support" a given SqlStatement/Database, SqlGeneratorFactory will return the one | |
| 55 |       * with the highest priority. | |
| 56 |       *  | |
| 57 |       * @return | |
| 58 |       */ | |
| 59 | public int getPriority(); | |
| 60 | ||
| 61 |      /** | |
| 62 |       * Does this generator support the given statement/database combination? Do not validate the statement with this | |
| 63 |       * method, only return if it <i>can</i> suppot it. | |
| 64 |       */ | |
| 65 | public boolean supports(StatementType statement, Database database); | |
| 66 | ||
| 67 |      /** | |
| 68 |       * Does this change require access to the database metadata? If true, the change cannot be used in an | |
| 69 |       * updateSql-style command. | |
| 70 |       */ | |
| 71 | public boolean requiresUpdatedDatabaseMetadata(Database database); | |
| 72 | ||
| 73 |      /** | |
| 74 |       * Validate the data contained in the SqlStatement. If there are no errors, return an empty ValidationErrors object, | |
| 75 |       * not a null value. Liquibase will inspect the ValidationErrors result before attempting to call generateSql. | |
| 76 |       */ | |
| 77 |      public ValidationErrors validate(StatementType statement, Database database, SqlGeneratorChain sqlGeneratorChain); | |
| 78 | ||
| 79 |      public Warnings warn(StatementType statementType, Database database, SqlGeneratorChain sqlGeneratorChain); | |
| 80 | ||
| 81 |      /** | |
| 82 |       * Generate the actual Sql for the given statement and database. | |
| 83 |       */ | |
| 84 |      public Sql[] generateSql(StatementType statement, Database database, SqlGeneratorChain sqlGeneratorChain); | |
| 85 | } |