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.primitive.datetime;
28
29 import com.rapiddweller.benerator.Generator;
30 import com.rapiddweller.benerator.GeneratorContext;
31 import com.rapiddweller.benerator.NonNullGenerator;
32 import com.rapiddweller.benerator.distribution.Distribution;
33 import com.rapiddweller.benerator.distribution.SequenceManager;
34 import com.rapiddweller.benerator.util.WrapperProvider;
35 import com.rapiddweller.benerator.wrapper.CompositeGenerator;
36 import com.rapiddweller.benerator.wrapper.ProductWrapper;
37 import com.rapiddweller.common.TimeUtil;
38 import com.rapiddweller.model.data.Uniqueness;
39
40 import java.sql.Time;
41 import java.util.Calendar;
42 import java.util.Date;
43
44
45
46
47
48
49
50
51 public class DateTimeGenerator extends CompositeGenerator<Date> implements NonNullGenerator<Date> {
52
53 private DayGenerator dateGenerator;
54 private Generator<Long> timeOffsetGenerator;
55
56
57
58
59 Date minDate;
60
61
62
63 Date maxDate;
64
65
66
67 String dateGranularity;
68
69
70
71 Distribution dateDistribution;
72
73
74
75
76 long minTime;
77
78
79
80 long maxTime;
81
82
83
84 long timeGranularity;
85
86
87
88 Distribution timeDistribution;
89 private final WrapperProvider<Long> timeWrapperProvider = new WrapperProvider<>();
90
91
92
93
94 public DateTimeGenerator() {
95 this(
96 TimeUtil.add(TimeUtil.today(), Calendar.YEAR, -1),
97 TimeUtil.today(),
98 TimeUtil.time(9, 0),
99 TimeUtil.time(17, 0));
100 }
101
102
103
104
105
106
107
108
109
110 public DateTimeGenerator(Date minDate, Date maxDate, Time minTime, Time maxTime) {
111 super(Date.class);
112 setMinDate(minDate);
113 setMaxDate(maxDate);
114 setMinTime(minTime);
115 setMaxTime(maxTime);
116 setDateDistribution(SequenceManager.RANDOM_SEQUENCE);
117 setTimeDistribution(SequenceManager.RANDOM_SEQUENCE);
118 setDateGranularity("00-00-01");
119 setTimeGranularity(TimeUtil.time(0, 1));
120 }
121
122
123
124
125
126
127
128
129 public void setMinDate(Date minDate) {
130 this.minDate = minDate;
131 }
132
133
134
135
136
137
138 public void setMaxDate(Date maxDate) {
139 this.maxDate = maxDate;
140 }
141
142
143
144
145
146
147 public void setDateGranularity(String dateGranularity) {
148 this.dateGranularity = dateGranularity;
149 }
150
151
152
153
154
155
156 public void setDateDistribution(Distribution distribution) {
157 this.dateDistribution = distribution;
158 }
159
160
161
162
163
164
165 public void setMinTime(Time minTime) {
166 this.minTime = TimeUtil.millisSinceOwnEpoch(minTime);
167 }
168
169
170
171
172
173
174 public void setMaxTime(Time maxTime) {
175 this.maxTime = TimeUtil.millisSinceOwnEpoch(maxTime);
176 }
177
178
179
180
181
182
183 public void setTimeGranularity(Time timeGranularity) {
184 this.timeGranularity = TimeUtil.millisSinceOwnEpoch(timeGranularity);
185 }
186
187
188
189
190
191
192 public void setTimeDistribution(Distribution distribution) {
193 this.timeDistribution = distribution;
194 }
195
196
197
198 @Override
199 public void init(GeneratorContext context) {
200 assertNotInitialized();
201 this.dateGenerator = registerComponent(
202 new DayGenerator(minDate, maxDate, dateDistribution, false));
203 dateGenerator.setGranularity(dateGranularity);
204 this.dateGenerator.init(context);
205 this.timeOffsetGenerator = registerComponent(context.getGeneratorFactory().createNumberGenerator(
206 Long.class, minTime, true, maxTime, true, timeGranularity, timeDistribution, Uniqueness.NONE));
207 this.timeOffsetGenerator.init(context);
208 super.init(context);
209 }
210
211 @Override
212 public ProductWrapper<Date> generate(ProductWrapper<Date> wrapper) {
213 Date result = generate();
214 return (result != null ? wrapper.wrap(result) : null);
215 }
216
217 @Override
218 public Date generate() {
219 assertInitialized();
220 Date dateGeneration = dateGenerator.generate();
221 if (dateGeneration == null) {
222 return null;
223 }
224 ProductWrapper<Long> timeWrapper = timeOffsetGenerator.generate(timeWrapperProvider.get());
225 if (timeWrapper == null) {
226 return null;
227 }
228 long timeOffsetGeneration = timeWrapper.unwrap();
229 return new Date(dateGeneration.getTime() + timeOffsetGeneration);
230 }
231
232 }