Coverage Report - liquibase.change.Change
 
Classes in this File Line Coverage Branch Coverage Complexity
Change
N/A
N/A
1
 
 1  
 package liquibase.change;
 2  
 
 3  
 import java.util.Set;
 4  
 
 5  
 import liquibase.changelog.ChangeSet;
 6  
 import liquibase.database.Database;
 7  
 import liquibase.database.structure.DatabaseObject;
 8  
 import liquibase.exception.RollbackImpossibleException;
 9  
 import liquibase.exception.SetupException;
 10  
 import liquibase.exception.UnsupportedChangeException;
 11  
 import liquibase.exception.ValidationErrors;
 12  
 import liquibase.exception.Warnings;
 13  
 import liquibase.resource.ResourceAccessor;
 14  
 import liquibase.statement.SqlStatement;
 15  
 
 16  
 /**
 17  
  * Interface all changes (refactorings) implement.
 18  
  * <p/>
 19  
  * <b>How changes are constructed and run when reading changelogs:</b>
 20  
  * <ol>
 21  
  * <li>As the changelog handler gets to each element inside a changeSet, it passes the tag name to
 22  
  * liquibase.change.ChangeFactory which looks through all the registered changes until it finds one with matching
 23  
  * specified tag name</li>
 24  
  * <li>The ChangeFactory then constructs a new instance of the change</li>
 25  
  * <li>For each attribute in the XML node, reflection is used to call a corresponding set* method on the change class</li>
 26  
  * <li>The correct generateStatements(*) method is called for the current database</li>
 27  
  * </ol>
 28  
  * <p/>
 29  
  * <b>To implement a new change:</b>
 30  
  * <ol>
 31  
  * <li>Create a new class that implements Change (normally extend AbstractChange)</li>
 32  
  * <li>Implement the abstract generateStatements(*) methods which return the correct SQL calls for each database</li>
 33  
  * <li>Implement the createMessage() method to create a descriptive message for logs and dialogs
 34  
  * <li>Implement the createNode() method to generate an XML element based on the values in this change</li>
 35  
  * <li>Add the new class to the liquibase.change.ChangeFactory</li>
 36  
  * </ol>
 37  
  * <p>
 38  
  * <b>Implementing automatic rollback support</b><br>
 39  
  * <br>
 40  
  * The easiest way to allow automatic rollback support is by overriding the createInverses() method. If there are no
 41  
  * corresponding inverse changes, you can override the generateRollbackStatements(*) and canRollBack() methods.
 42  
  * <p/>
 43  
  * <b>Notes for generated SQL:</b><br>
 44  
  * Because migration and rollback scripts can be generated for execution at a different time, or against a different
 45  
  * database, changes you implement cannot directly reference data in the database. For example, you cannot implement a
 46  
  * change that selects all rows from a database and modifies them based on the primary keys you find because when the
 47  
  * SQL is actually run, those rows may not longer exist and/or new rows may have been added.
 48  
  * <p/>
 49  
  * We chose the name "change" over "refactoring" because changes will sometimes change functionality whereas true
 50  
  * refactoring will not.
 51  
  * 
 52  
  * @see ChangeFactory
 53  
  * @see Database
 54  
  */
 55  
 public interface Change {
 56  
 
 57  
     public ChangeMetaData getChangeMetaData();
 58  
 
 59  
     public ChangeSet getChangeSet();
 60  
 
 61  
     public void setChangeSet(ChangeSet changeSet);
 62  
 
 63  
     /**
 64  
      * Sets the fileOpener that should be used for any file loading and resource finding for files that are provided by
 65  
      * the user.
 66  
      */
 67  
     public void setResourceAccessor(ResourceAccessor resourceAccessor);
 68  
 
 69  
     /**
 70  
      * This method will be called after the no arg constructor and all of the properties have been set to allow the task
 71  
      * to do any heavy tasks or more importantly generate any exceptions to report to the user about the settings
 72  
      * provided.
 73  
      */
 74  
     public void init() throws SetupException;
 75  
 
 76  
     boolean supports(Database database);
 77  
 
 78  
     public Warnings warn(Database database);
 79  
 
 80  
     public ValidationErrors validate(Database database);
 81  
 
 82  
     public Set<DatabaseObject> getAffectedDatabaseObjects(Database database);
 83  
 
 84  
     /**
 85  
      * Calculates the checksum (currently MD5 hash) for the current configuration of this change.
 86  
      */
 87  
     public CheckSum generateCheckSum();
 88  
 
 89  
     /**
 90  
      * @return Confirmation message to be displayed after the change is executed
 91  
      */
 92  
     public String getConfirmationMessage();
 93  
 
 94  
     /**
 95  
      * Generates the SQL statements required to run the change
 96  
      * 
 97  
      * @param database
 98  
      *            databasethe target {@link liquibase.database.Database} associated to this change's statements
 99  
      * @return an array of {@link String}s with the statements
 100  
      */
 101  
     public SqlStatement[] generateStatements(Database database);
 102  
 
 103  
     /**
 104  
      * Can this change be rolled back
 105  
      * 
 106  
      * @return <i>true</i> if rollback is supported, <i>false</i> otherwise
 107  
      * @param database
 108  
      */
 109  
     public boolean supportsRollback(Database database);
 110  
 
 111  
     /**
 112  
      * Generates the SQL statements required to roll back the change
 113  
      * 
 114  
      * @param database
 115  
      *            database databasethe target {@link Database} associated to this change's rollback statements
 116  
      * @return an array of {@link String}s with the rollback statements
 117  
      * @throws UnsupportedChangeException
 118  
      *             if this change is not supported by the {@link Database} passed as argument
 119  
      * @throws RollbackImpossibleException
 120  
      *             if rollback is not supported for this change
 121  
      */
 122  
     public SqlStatement[] generateRollbackStatements(Database database) throws UnsupportedChangeException,
 123  
             RollbackImpossibleException;
 124  
 
 125  
     /**
 126  
      * Does this change require access to the database metadata? If true, the change cannot be used in an
 127  
      * updateSql-style command.
 128  
      */
 129  
     public boolean requiresUpdatedDatabaseMetadata(Database database);
 130  
 }