package ameba.db.migration.flyway;
import ameba.db.migration.Migration;
import ameba.db.migration.models.ScriptInfo;
import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
import org.flywaydb.core.api.FlywayException;
import org.flywaydb.core.api.MigrationType;
import org.flywaydb.core.api.MigrationVersion;
import org.flywaydb.core.api.resolver.MigrationResolver;
import org.flywaydb.core.api.resolver.ResolvedMigration;
import org.flywaydb.core.internal.resolver.ResolvedMigrationImpl;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.Collection;
import java.util.List;
/**
* <p>DatabaseMigrationResolver class.</p>
*
* @author icode
*
*/
public class DatabaseMigrationResolver implements MigrationResolver {
private Migration migration;
/**
* <p>Constructor for DatabaseMigrationResolver.</p>
*
* @param migration a {@link ameba.db.migration.Migration} object.
*/
public DatabaseMigrationResolver(Migration migration) {
this.migration = migration;
}
static int calculateChecksum(String str) {
Hasher hasher = Hashing.murmur3_32().newHasher();
BufferedReader bufferedReader = new BufferedReader(new StringReader(str));
try {
String line;
while ((line = bufferedReader.readLine()) != null) {
hasher.putString(line.trim(), Charsets.UTF_8);
}
} catch (IOException e) {
String message = "Unable to calculate checksum";
throw new FlywayException(message, e);
}
return hasher.hash().asInt();
}
/**
* {@inheritDoc}
*/
@Override
public Collection<ResolvedMigration> resolveMigrations() {
List<ResolvedMigration> resolvedMigrations = Lists.newArrayList();
ScriptInfo info = migration.generate();
if (info != null) {
ResolvedMigrationImpl migration = new ResolvedMigrationImpl();
migration.setVersion(MigrationVersion.fromVersion(info.getRevision()));
migration.setDescription(info.getDescription());
migration.setScript(info.getRevision() + "__" + toUnderScore(info.getDescription()) + ".sql");
migration.setChecksum(calculateChecksum("-- " + info.getRevision() + "\r\n" + info.getApplyDdl()));
migration.setType(MigrationType.SQL);
migration.setExecutor(new SqlMigrationExecutor(info));
resolvedMigrations.add(migration);
}
return resolvedMigrations;
}
private String toUnderScore(String name) {
return name.replace(' ', '_');
}
}