Files
SCM-Manager/scm-webapp/src/main/java/sonia/scm/update/MigrationWizardServlet.java

98 lines
3.4 KiB
Java
Raw Normal View History

2019-06-04 16:37:53 +02:00
package sonia.scm.update;
import com.github.mustachejava.DefaultMustacheFactory;
import com.github.mustachejava.Mustache;
import com.github.mustachejava.MustacheFactory;
2019-06-05 15:39:36 +02:00
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2019-06-04 16:37:53 +02:00
import sonia.scm.boot.RestartEvent;
import sonia.scm.event.ScmEventBus;
import sonia.scm.update.repository.MigrationStrategy;
import sonia.scm.update.repository.MigrationStrategyDao;
import sonia.scm.update.repository.XmlRepositoryV1UpdateStep;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
2019-06-05 15:39:36 +02:00
import java.io.PrintWriter;
2019-06-05 11:52:36 +02:00
import java.util.Collections;
2019-06-04 16:37:53 +02:00
import java.util.HashMap;
import java.util.List;
2019-06-05 15:39:36 +02:00
import java.util.Map;
2019-06-04 16:37:53 +02:00
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toList;
@Singleton
class MigrationWizardServlet extends HttpServlet {
2019-06-05 15:39:36 +02:00
private static final Logger LOG = LoggerFactory.getLogger(MigrationWizardServlet.class);
2019-06-04 16:37:53 +02:00
private final XmlRepositoryV1UpdateStep repositoryV1UpdateStep;
private final MigrationStrategyDao migrationStrategyDao;
@Inject
MigrationWizardServlet(XmlRepositoryV1UpdateStep repositoryV1UpdateStep, MigrationStrategyDao migrationStrategyDao) {
this.repositoryV1UpdateStep = repositoryV1UpdateStep;
this.migrationStrategyDao = migrationStrategyDao;
}
public boolean wizardNecessary() {
return !repositoryV1UpdateStep.missingMigrationStrategies().isEmpty();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
List<XmlRepositoryV1UpdateStep.V1Repository> missingMigrationStrategies = repositoryV1UpdateStep.missingMigrationStrategies();
HashMap<String, Object> model = new HashMap<>();
2019-06-05 11:52:36 +02:00
model.put("contextPath", req.getContextPath());
2019-06-04 16:37:53 +02:00
model.put("submitUrl", req.getRequestURI());
model.put("repositories", missingMigrationStrategies);
model.put("strategies", getMigrationStrategies());
MustacheFactory mf = new DefaultMustacheFactory();
2019-06-05 15:39:36 +02:00
Mustache template = mf.compile("templates/repository-migration.mustache");
respondWithTemplate(resp, model, template);
2019-06-04 16:37:53 +02:00
}
private List<String> getMigrationStrategies() {
return stream(MigrationStrategy.values()).map(Enum::name).collect(toList());
}
@Override
2019-06-05 15:39:36 +02:00
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
2019-06-04 16:37:53 +02:00
resp.setStatus(200);
req.getParameterMap().forEach(
(name, strategy) -> migrationStrategyDao.set(name, MigrationStrategy.valueOf(strategy[0]))
);
MustacheFactory mf = new DefaultMustacheFactory();
2019-06-05 15:39:36 +02:00
Mustache template = mf.compile("templates/repository-migration-restart.mustache");
Map<String, Object> model = Collections.singletonMap("contextPath", req.getContextPath());
respondWithTemplate(resp, model, template);
2019-06-04 16:37:53 +02:00
ScmEventBus.getInstance().post(new RestartEvent(MigrationWizardServlet.class, "wrote migration data"));
}
2019-06-05 15:39:36 +02:00
private void respondWithTemplate(HttpServletResponse resp, Map<String, Object> model, Mustache template) {
PrintWriter writer;
try {
writer = resp.getWriter();
} catch (IOException e) {
LOG.error("could not create writer for response", e);
resp.setStatus(500);
return;
}
template.execute(writer, model);
writer.flush();
resp.setStatus(200);
}
2019-06-04 16:37:53 +02:00
}