package ameba.db.ebean.migration;
import ameba.core.Application;
import ameba.db.migration.Migration;
import ameba.db.migration.models.ScriptInfo;
import ameba.exception.AmebaException;
import com.google.common.collect.Lists;
import io.ebean.config.DbMigrationConfig;
import io.ebeaninternal.api.SpiEbeanServer;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;
import static java.time.format.DateTimeFormatter.ofPattern;
/**
* <p>EbeanMigration class.</p>
*
* @author icode
*
*/
public class EbeanMigration implements Migration {
private final ModelMigration dbMigration;
private final SpiEbeanServer server;
/**
* <p>Constructor for EbeanMigration.</p>
*
* @param application a {@link ameba.core.Application} object.
* @param server a {@link io.ebeaninternal.api.SpiEbeanServer} object.
*/
public EbeanMigration(Application application, SpiEbeanServer server) {
boolean isDev = application.getMode().isDev();
this.server = server;
String _basePath = (isDev ? "src/main/resources" : "temp") + "/" + "ameba/db/migration/" + server.getName();
DbMigrationConfig migrationConfig = server.getServerConfig().getMigrationConfig();
CharSequence ver = application.getApplicationVersion();
String version;
String verIndex = LocalDateTime.now().format(ofPattern("yyyyMMddHHmmss"));
if (ver instanceof Application.UnknownVersion) {
version = verIndex;
} else {
version = String.valueOf(ver).replace("-SNAPSHOT", "") + "_" + verIndex;
}
migrationConfig.setVersion(version);
migrationConfig.setMigrationPath(_basePath);
migrationConfig.setRunMigration(false);
dbMigration = new ModelMigration();
dbMigration.setPlatform(server.getDatabasePlatform());
dbMigration.setServer(server);
dbMigration.setPathToResources(_basePath);
}
/** {@inheritDoc} */
@Override
public boolean hasChanged() {
return !dbMigration.diff().isEmpty();
}
/** {@inheritDoc} */
@Override
public ScriptInfo generate() {
try {
dbMigration.generateMigration();
} catch (IOException e) {
throw new AmebaException(e);
}
return dbMigration.getScriptInfo();
}
/** {@inheritDoc} */
@Override
public List<ScriptInfo> allScript() {
final List<ScriptInfo> scriptInfoList = Lists.newArrayList();
server.find(ScriptInfo.class).findEach(scriptInfoList::add);
return scriptInfoList;
}
/** {@inheritDoc} */
@Override
public ScriptInfo getScript(String revision) {
return server.find(ScriptInfo.class, revision);
}
/** {@inheritDoc} */
@Override
public void persist() {
server.save(dbMigration.getScriptInfo());
}
/** {@inheritDoc} */
@Override
public void reset() {
dbMigration.rest();
}
}