1 package io.guixer.tools;
2
3 import static com.google.common.base.Preconditions.checkNotNull;
4 import static com.google.common.collect.Lists.newArrayList;
5 import static com.google.common.collect.Maps.newHashMap;
6 import static com.google.common.collect.Sets.newHashSet;
7
8 import java.util.List;
9 import java.util.Map;
10 import java.util.Set;
11
12 import javax.annotation.Nullable;
13
14 import org.apache.commons.lang3.tuple.Pair;
15
16 import com.google.common.collect.ImmutableList;
17 import com.google.common.collect.ImmutableMap;
18 import com.google.common.collect.Maps;
19
20 import io.guixer.lang.GuixerScenario;
21 import io.guixer.lang.Step;
22
23 public class ScenarioBuilder {
24
25 public static final class Scenario implements GuixerScenario {
26
27 @Nullable
28 private final String name;
29
30 private final ImmutableMap<String, String> environmentVariables;
31
32 private final Map<String, String> attributes;
33
34 private final ImmutableList<Pair<String, GuixerConsumer>> consumers;
35
36 private Scenario(
37 @Nullable final String name,
38 final ImmutableMap<String, String> environmentVariables,
39 final Map<String, String> attributes,
40 final ImmutableList<Pair<String, GuixerConsumer>> consumers
41 ) {
42 this.name = name;
43 this.environmentVariables = checkNotNull(environmentVariables, "environmentVariables");
44 this.attributes = checkNotNull(attributes, "attributes");
45 this.consumers = checkNotNull(consumers, "consumers");
46 }
47
48 @Nullable
49 public String getName() {
50
51 return name;
52 }
53
54 @Override
55 public ImmutableMap<String, String> getEnvironmentVariables() {
56
57 return environmentVariables;
58 }
59
60 @Override
61 public Step[] getSteps() {
62
63 final Step[] steps = new Step[consumers.size()];
64
65 for (int i = 0; i < steps.length; ++i) {
66
67 final Pair<String, GuixerConsumer> consumer = consumers.get(i);
68
69 steps[i] = new InlineStep(consumer.getLeft(), consumer.getRight());
70 }
71
72 return steps;
73 }
74
75 @Override
76 public Map<String, String> getAttributes() {
77
78 return attributes;
79 }
80 }
81
82 @Nullable
83 private String scenarioName;
84
85 private final Map<String, String> environmentVariables = newHashMap();
86
87 private final Map<String, String> attributes = newHashMap();
88
89 private final List<Pair<String, GuixerConsumer>> consumers = newArrayList();
90
91 private final Set<String> consumerNames = newHashSet();
92
93 public ScenarioBuilder name(
94 @Nullable final String scenarioName
95 ) {
96
97 this.scenarioName = scenarioName;
98
99 return this;
100 }
101
102 public ScenarioBuilder environmentVariable(
103 final String name,
104 final String value
105 ) {
106
107 checkNotNull(name, "name");
108 checkNotNull(value, "value");
109
110 environmentVariables.put(name, value);
111
112 return this;
113 }
114
115 public ScenarioBuilder attribute(
116 final String name,
117 final String value
118 ) {
119
120 checkNotNull(name, "name");
121 checkNotNull(value, "value");
122
123 attributes.put(name, value);
124
125 return this;
126 }
127
128 public ScenarioBuilder tag(
129 final String name,
130 final String value
131 ) {
132
133 checkNotNull(name, "name");
134
135 attributes.put(name, null);
136
137 return this;
138 }
139
140 public ScenarioBuilder steps(
141 final String name,
142 final GuixerConsumer consumer
143 ) {
144
145 checkNotNull(name, "name");
146 checkNotNull(consumer, "consumer");
147
148 if (consumerNames.contains(name)) {
149
150 throw new IllegalArgumentException("Duplicate name: " + name);
151 }
152
153 consumers.add(Pair.of(name, consumer));
154
155 return this;
156 }
157
158 public Scenario build() {
159
160 return new Scenario(
161 scenarioName,
162 ImmutableMap.copyOf(environmentVariables),
163 Maps.newHashMap(attributes),
164 ImmutableList.copyOf(consumers)
165 );
166 }
167 }