1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package com.rapiddweller.benerator.dataset;
28
29 import com.rapiddweller.benerator.GeneratorContext;
30 import com.rapiddweller.benerator.InvalidGeneratorSetupException;
31 import com.rapiddweller.benerator.WeightedGenerator;
32 import com.rapiddweller.benerator.util.RandomUtil;
33 import com.rapiddweller.benerator.wrapper.GeneratorProxy;
34 import com.rapiddweller.benerator.wrapper.ProductWrapper;
35
36 import java.util.HashSet;
37 import java.util.Set;
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 public abstract class AbstractDatasetGenerator<E> extends GeneratorProxy<E> implements DatasetBasedGenerator<E> {
56
57
58
59
60 protected final Set<String> supportedDatasets;
61
62
63
64 protected final boolean fallback;
65
66
67
68 protected String nesting;
69
70
71
72 protected String datasetName;
73
74
75
76 protected double totalWeight;
77
78
79
80
81
82
83
84
85
86
87
88 public AbstractDatasetGenerator(Class<E> generatedType, String nesting, String datasetName, boolean fallback) {
89 super(generatedType);
90 this.nesting = nesting;
91 this.datasetName = datasetName;
92 this.fallback = fallback;
93 this.supportedDatasets = new HashSet<>();
94 this.supportedDatasets.add(datasetName);
95 this.totalWeight = 0;
96 }
97
98
99
100
101
102
103
104 public boolean supportsDataset(String datasetName) {
105 return supportedDatasets.contains(datasetName);
106 }
107
108
109
110 @Override
111 public String getNesting() {
112 return nesting;
113 }
114
115
116
117
118
119
120 public void setNesting(String nesting) {
121 this.nesting = nesting;
122 }
123
124 @Override
125 public String getDataset() {
126 return datasetName;
127 }
128
129
130
131
132
133
134 public void setDataset(String datasetName) {
135 this.datasetName = datasetName;
136 this.supportedDatasets.clear();
137 this.supportedDatasets.add(datasetName);
138 }
139
140
141
142
143
144
145 public double getWeight() {
146 return totalWeight;
147 }
148
149 @Override
150 public synchronized void init(GeneratorContext context) {
151 Dataset dataset = DatasetUtil.getDataset(nesting, datasetName);
152 setSource(createDatasetGenerator(dataset, true, fallback));
153 super.init(context);
154 }
155
156 @Override
157 public E generateForDataset(String requestedDataset) {
158 DatasetBasedGenerator<E> sourceGen = getSource();
159 if (sourceGen instanceof CompositeDatasetGenerator) {
160 return sourceGen.generateForDataset(requestedDataset);
161 } else {
162 ProductWrapper<E> wrapper = sourceGen.generate(getResultWrapper());
163 return (wrapper != null ? wrapper.unwrap() : null);
164 }
165 }
166
167
168
169
170
171
172 public String randomDataset() {
173 if (getSource() instanceof CompositeDatasetGenerator) {
174 Dataset dataset = DatasetUtil.getDataset(nesting, datasetName);
175 return RandomUtil.randomElement(dataset.getSubSets()).getName();
176 } else {
177 return datasetName;
178 }
179 }
180
181
182
183
184
185
186
187
188
189
190
191
192 protected WeightedDatasetGenerator<E> createDatasetGenerator(Dataset dataset, boolean required, boolean fallback) {
193 WeightedDatasetGenerator<E> generator = null;
194 if (!isAtomic(dataset)) {
195 generator = createCompositeDatasetGenerator(dataset, fallback);
196 }
197 if (isAtomic(dataset) || (generator == null && required)) {
198 generator = createAtomicDatasetGenerator(dataset, required);
199 }
200 if (generator != null) {
201 supportedDatasets.add(dataset.getName());
202 }
203 return generator;
204 }
205
206
207
208
209
210
211
212 protected boolean isAtomic(Dataset dataset) {
213 return dataset.isAtomic();
214 }
215
216
217
218
219
220
221
222
223 protected CompositeDatasetGenerator<E> createCompositeDatasetGenerator(Dataset dataset, boolean fallback) {
224 CompositeDatasetGenerator<E> generator = new CompositeDatasetGenerator<>(nesting, dataset.getName(), fallback);
225 for (Dataset subSet : dataset.getSubSets()) {
226 WeightedDatasetGenerator<E> subGenerator = createDatasetGenerator(subSet, false, fallback);
227 if (subGenerator != null) {
228 generator.addSubDataset(subGenerator, subGenerator.getWeight());
229 }
230 }
231 if (generator.getSource().getSources().size() > 0) {
232 return generator;
233 } else {
234 return null;
235 }
236 }
237
238
239
240
241
242
243
244
245 protected AtomicDatasetGenerator<E> createAtomicDatasetGenerator(Dataset dataset, boolean required) {
246 WeightedGenerator<E> generator = createGeneratorForAtomicDataset(dataset);
247 if (generator != null) {
248 totalWeight += generator.getWeight();
249 return new AtomicDatasetGenerator<>(generator, nesting, dataset.getName());
250 }
251 if (required) {
252 throw new InvalidGeneratorSetupException("Unable to create generator for atomic dataset: " + dataset.getName());
253 } else {
254 return null;
255 }
256 }
257
258
259
260
261
262
263
264 protected abstract WeightedGenerator<E> createGeneratorForAtomicDataset(Dataset dataset);
265
266 @Override
267 public DatasetBasedGenerator<E> getSource() {
268 return (DatasetBasedGenerator<E>) super.getSource();
269 }
270
271
272
273
274 @Override
275 public String toString() {
276 return getClass().getSimpleName() + '[' + nesting + ':' + datasetName + ']';
277 }
278
279 }