View Javadoc
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 }