// Path: cassandra-migration/src/main/java/org/cognitor/cassandra/migration/keyspace/Keyspace.java
// public class Keyspace {
//     private final String keyspaceName;
//     private boolean durableWrites;
//     private ReplicationStrategy replicationStrategy;
// 
//     /**
//      * This creates a new instance of a keyspace using the provided keyspace name. It by default
//      * uses a {@link SimpleStrategy} for replication and sets durable writes to <code>true</code>.
//      * These default values can be overwritten by the provided methods.
//      *
//      * @param keyspaceName the name of the keyspace to be used.
//      */
//     public Keyspace(String keyspaceName) {
//         this.keyspaceName = notNullOrEmpty(keyspaceName, "keyspaceName");
//         this.replicationStrategy = new SimpleStrategy();
//         this.durableWrites = true;
//     }
// 
//     public String getKeyspaceName() {
//         return keyspaceName;
//     }
// 
//     /**
//      * Sets durable writes to false and by this bypass
//      * the commit log for write operations in this keyspace.
//      * This behavior is not recommended and should not be done
//      * with SimpleStrategy replication.
//      *
//      * @return the current Keyspace instance
//      */
//     public Keyspace withoutDurableWrites() {
//         this.durableWrites = false;
//         return this;
//     }
// 
//     public Keyspace with(ReplicationStrategy replicationStrategy) {
//         this.replicationStrategy = notNull(replicationStrategy, "replicationStrategy");
//         return this;
//     }
// 
//     public boolean isDurableWrites() {
//         return durableWrites;
//     }
// 
//     public ReplicationStrategy getReplicationStrategy() {
//         return replicationStrategy;
//     }
// 
//     public String getCqlStatement() {
//         StringBuilder builder = new StringBuilder(60);
//         builder.append("CREATE KEYSPACE IF NOT EXISTS ")
//                 .append(getKeyspaceName())
//                 .append(" WITH REPLICATION = ")
//                 .append(getReplicationStrategy().createCqlStatement())
//                 .append(" AND DURABLE_WRITES = ")
//                 .append(Boolean.toString(isDurableWrites()));
//         return builder.toString();
//     }
// }
// 
// Path: cassandra-migration/src/main/java/org/cognitor/cassandra/migration/util/Ensure.java
// public static <T> T notNull(T argument, String argumentName) {
//     if (argument == null) {
//         throw new IllegalArgumentException("Argument " + argumentName + " must not be null.");
//     }
//     return argument;
// }
// 
// Path: cassandra-migration/src/main/java/org/cognitor/cassandra/migration/util/Ensure.java
// public static String notNullOrEmpty(String argument, String argumentName) {
//     if (argument == null || argument.trim().isEmpty()) {
//         throw new IllegalArgumentException("Argument " + argumentName + " must not be null or empty.");
//     }
//     return argument;
// }


import org.cognitor.cassandra.migration.keyspace.Keyspace;
import static org.cognitor.cassandra.migration.util.Ensure.notNull;
import static org.cognitor.cassandra.migration.util.Ensure.notNullOrEmpty;
package org.cognitor.cassandra.migration;



/**
 * MigrationConfiguration contains the required settings for the {@link Database} to be
 * created and for later execution. It is the central place to modify the behavior of the
 * migration execution.
 *
 * Currently, the only required parameter is the keyspace name. Alternatively the instance
 * of the keyspace can be set as well as this contains the name. Only use one or the other
 * as internally it will always result in an instance of {@link Keyspace} meaning, if you
 * set an instance of {@link Keyspace} with a non default keyspace configuration and then
 * call <code>setKeyspaceName</code> separately, your non default keyspace configuration
 * will be lost.
 */
public class MigrationConfiguration {
    public final String EMPTY_TABLE_PREFIX = "";
    private String tablePrefix = EMPTY_TABLE_PREFIX;
    private Keyspace keyspace;
    private String executionProfile;

    /**
     * Set the name of the keyspace to be used. This is just a shortcut for
     * <code>setKeyspace(new Keyspace(keyspaceName))</code>.
     *
     * @param keyspaceName the name of the keyspace. Must not be null or empty.
     * @return this instance of the <code>MigrationConfiguration</code>. Never null.
     */
    public MigrationConfiguration withKeyspaceName(String keyspaceName) {
// Path: cassandra-migration/src/main/java/org/cognitor/cassandra/migration/keyspace/Keyspace.java
// public class Keyspace {
//     private final String keyspaceName;
//     private boolean durableWrites;
//     private ReplicationStrategy replicationStrategy;
// 
//     /**
//      * This creates a new instance of a keyspace using the provided keyspace name. It by default
//      * uses a {@link SimpleStrategy} for replication and sets durable writes to <code>true</code>.
//      * These default values can be overwritten by the provided methods.
//      *
//      * @param keyspaceName the name of the keyspace to be used.
//      */
//     public Keyspace(String keyspaceName) {
//         this.keyspaceName = notNullOrEmpty(keyspaceName, "keyspaceName");
//         this.replicationStrategy = new SimpleStrategy();
//         this.durableWrites = true;
//     }
// 
//     public String getKeyspaceName() {
//         return keyspaceName;
//     }
// 
//     /**
//      * Sets durable writes to false and by this bypass
//      * the commit log for write operations in this keyspace.
//      * This behavior is not recommended and should not be done
//      * with SimpleStrategy replication.
//      *
//      * @return the current Keyspace instance
//      */
//     public Keyspace withoutDurableWrites() {
//         this.durableWrites = false;
//         return this;
//     }
// 
//     public Keyspace with(ReplicationStrategy replicationStrategy) {
//         this.replicationStrategy = notNull(replicationStrategy, "replicationStrategy");
//         return this;
//     }
// 
//     public boolean isDurableWrites() {
//         return durableWrites;
//     }
// 
//     public ReplicationStrategy getReplicationStrategy() {
//         return replicationStrategy;
//     }
// 
//     public String getCqlStatement() {
//         StringBuilder builder = new StringBuilder(60);
//         builder.append("CREATE KEYSPACE IF NOT EXISTS ")
//                 .append(getKeyspaceName())
//                 .append(" WITH REPLICATION = ")
//                 .append(getReplicationStrategy().createCqlStatement())
//                 .append(" AND DURABLE_WRITES = ")
//                 .append(Boolean.toString(isDurableWrites()));
//         return builder.toString();
//     }
// }
// 
// Path: cassandra-migration/src/main/java/org/cognitor/cassandra/migration/util/Ensure.java
// public static <T> T notNull(T argument, String argumentName) {
//     if (argument == null) {
//         throw new IllegalArgumentException("Argument " + argumentName + " must not be null.");
//     }
//     return argument;
// }
// 
// Path: cassandra-migration/src/main/java/org/cognitor/cassandra/migration/util/Ensure.java
// public static String notNullOrEmpty(String argument, String argumentName) {
//     if (argument == null || argument.trim().isEmpty()) {
//         throw new IllegalArgumentException("Argument " + argumentName + " must not be null or empty.");
//     }
//     return argument;
// }


// Path: cassandra-migration/src/main/java/org/cognitor/cassandra/migration/MigrationConfiguration.java
import org.cognitor.cassandra.migration.keyspace.Keyspace;
import static org.cognitor.cassandra.migration.util.Ensure.notNull;
import static org.cognitor.cassandra.migration.util.Ensure.notNullOrEmpty;

package org.cognitor.cassandra.migration;



/**
 * MigrationConfiguration contains the required settings for the {@link Database} to be
 * created and for later execution. It is the central place to modify the behavior of the
 * migration execution.
 *
 * Currently, the only required parameter is the keyspace name. Alternatively the instance
 * of the keyspace can be set as well as this contains the name. Only use one or the other
 * as internally it will always result in an instance of {@link Keyspace} meaning, if you
 * set an instance of {@link Keyspace} with a non default keyspace configuration and then
 * call <code>setKeyspaceName</code> separately, your non default keyspace configuration
 * will be lost.
 */
public class MigrationConfiguration {
    public final String EMPTY_TABLE_PREFIX = "";
    private String tablePrefix = EMPTY_TABLE_PREFIX;
    private Keyspace keyspace;
    private String executionProfile;

    /**
     * Set the name of the keyspace to be used. This is just a shortcut for
     * <code>setKeyspace(new Keyspace(keyspaceName))</code>.
     *
     * @param keyspaceName the name of the keyspace. Must not be null or empty.
     * @return this instance of the <code>MigrationConfiguration</code>. Never null.
     */
    public MigrationConfiguration withKeyspaceName(String keyspaceName) {
        this.keyspace = new Keyspace(notNullOrEmpty(keyspaceName, "keyspaceName"));