package org.corfudb.infrastructure;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.corfudb.runtime.view.Layout;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by mwei on 6/29/16.
*/
@Accessors(chain = true)
public class TestLayoutBuilder {
List<String> sequencerServers;
List<String> layoutServers;
List<String> unresponsiveServers;
List<TestSegmentBuilder> segments;
@Getter
@Setter
long epoch = 0L;
public TestLayoutBuilder() {
sequencerServers = new ArrayList<>();
layoutServers = new ArrayList<>();
unresponsiveServers = new ArrayList<>();
segments = new ArrayList<>();
}
static String getEndpoint(int port) {
return "test:" + port;
}
public static Layout single(int port) {
return new TestLayoutBuilder()
.addLayoutServer(port)
.addSequencer(port)
.buildSegment()
.buildStripe()
.addLogUnit(port)
.addToSegment()
.addToLayout()
.build();
}
public TestLayoutBuilder addSequencer(int port) {
sequencerServers.add(getEndpoint(port));
return this;
}
public TestLayoutBuilder addLayoutServer(int port) {
layoutServers.add(getEndpoint(port));
return this;
}
public TestLayoutBuilder addUnresponsiveServer(int port) {
unresponsiveServers.add(getEndpoint(port));
return this;
}
private TestLayoutBuilder addSegment(TestSegmentBuilder builder) {
segments.add(builder);
return this;
}
public TestSegmentBuilder buildSegment() {
return new TestSegmentBuilder(this);
}
public Layout build() {
List<Layout.LayoutSegment> segmentList = segments.stream()
.map(TestSegmentBuilder::build)
.collect(Collectors.toList());
return new Layout(layoutServers,
sequencerServers,
segmentList,
unresponsiveServers,
epoch);
}
@Accessors(chain = true)
public static class TestSegmentBuilder {
TestLayoutBuilder layoutBuilder;
@Setter
Layout.ReplicationMode replicationMode = Layout.ReplicationMode.CHAIN_REPLICATION;
@Setter
long start = 0L;
@Setter
long end = -1L;
List<TestStripeBuilder> stripes;
public TestSegmentBuilder(TestLayoutBuilder layoutBuilder) {
this.layoutBuilder = layoutBuilder;
stripes = new ArrayList<>();
}
public TestStripeBuilder buildStripe() {
return new TestStripeBuilder(this);
}
private TestSegmentBuilder addStripe(TestStripeBuilder stripeBuilder) {
stripes.add(stripeBuilder);
return this;
}
public TestLayoutBuilder addToLayout() {
layoutBuilder.addSegment(this);
return layoutBuilder;
}
private Layout.LayoutSegment build() {
List<Layout.LayoutStripe> allStripes = stripes.stream()
.map(TestStripeBuilder::build)
.collect(Collectors.toList());
return new Layout.LayoutSegment(replicationMode, start, end, allStripes);
}
}
public static class TestStripeBuilder {
TestSegmentBuilder segmentBuilder;
List<String> logUnits;
public TestStripeBuilder(TestSegmentBuilder segmentBuilder) {
this.segmentBuilder = segmentBuilder;
logUnits = new ArrayList<>();
}
public TestStripeBuilder addLogUnit(int port) {
logUnits.add(getEndpoint(port));
return this;
}
public TestSegmentBuilder addToSegment() {
segmentBuilder.addStripe(this);
return segmentBuilder;
}
private Layout.LayoutStripe build() {
return new Layout.LayoutStripe(logUnits);
}
}
}