Execute updates in order

This commit is contained in:
René Pfeuffer
2019-05-14 14:45:12 +02:00
parent 4e2ac426a0
commit bafc8ea668
3 changed files with 64 additions and 2 deletions

View File

@@ -5,4 +5,6 @@ import sonia.scm.plugin.ExtensionPoint;
@ExtensionPoint
public interface UpdateStep {
void doUpdate();
String getTargetVersion();
}

View File

@@ -1,17 +1,29 @@
package sonia.scm;
import sonia.scm.migration.UpdateStep;
import sonia.scm.version.Version;
import javax.inject.Inject;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import static java.util.stream.Collectors.toList;
public class UpdateEngine {
private final Set<UpdateStep> steps;
private final List<UpdateStep> steps;
@Inject
public UpdateEngine(Set<UpdateStep> steps) {
this.steps = steps;
this.steps = sortSteps(steps);
}
private List<UpdateStep> sortSteps(Set<UpdateStep> steps) {
Comparator<UpdateStep> compareByVersion = Comparator.comparing(step -> Version.parse(step.getTargetVersion()));
return steps.stream()
.sorted(compareByVersion.reversed())
.collect(toList());
}
public void update() {

View File

@@ -0,0 +1,48 @@
package sonia.scm;
import org.junit.jupiter.api.Test;
import sonia.scm.migration.UpdateStep;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
class UpdateEngineTest {
List<String> processedUpdates = new ArrayList<>();
@Test
void shouldProcessStepsInCorrectOrder() {
LinkedHashSet<UpdateStep> updateSteps = new LinkedHashSet<>();
updateSteps.add(new FixedVersionUpdateStep("1.1.1"));
updateSteps.add(new FixedVersionUpdateStep("1.2.0"));
updateSteps.add(new FixedVersionUpdateStep("1.1.0"));
UpdateEngine updateEngine = new UpdateEngine(updateSteps);
updateEngine.update();
assertThat(processedUpdates)
.containsExactly("1.1.0", "1.1.1", "1.2.0");
}
class FixedVersionUpdateStep implements UpdateStep {
private final String version;
FixedVersionUpdateStep(String version) {
this.version = version;
}
@Override
public String getTargetVersion() {
return version;
}
@Override
public void doUpdate() {
processedUpdates.add(version);
}
}
}