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.GeneratorContext;
30 import com.rapiddweller.benerator.distribution.Distribution;
31 import com.rapiddweller.benerator.distribution.SequenceManager;
32 import com.rapiddweller.benerator.wrapper.NonNullGeneratorWrapper;
33 import com.rapiddweller.benerator.wrapper.ProductWrapper;
34 import com.rapiddweller.common.Period;
35 import com.rapiddweller.common.TimeUtil;
36 import com.rapiddweller.common.converter.DateString2DurationConverter;
37
38 import java.util.Date;
39 import java.util.GregorianCalendar;
40
41
42
43
44
45
46
47
48
49 public class DateGenerator extends NonNullGeneratorWrapper<Long, Date> {
50
51 private final DateString2DurationConverter dateConverter = new DateString2DurationConverter();
52
53 private long min;
54 private long max;
55 private long granularity;
56 private Distribution distribution;
57 private final boolean unique;
58
59
60
61
62
63
64 public DateGenerator() {
65 this(defaultStartDate(), currentDay(), Period.DAY.getMillis());
66 }
67
68
69
70
71
72
73
74
75 public DateGenerator(Date min, Date max, long granularity) {
76 this(min, max, granularity, SequenceManager.RANDOM_SEQUENCE);
77 }
78
79
80
81
82
83
84
85
86
87 public DateGenerator(Date min, Date max, long granularity, Distribution distribution) {
88 this(min, max, granularity, distribution, false);
89 }
90
91
92
93
94
95
96
97
98
99
100 public DateGenerator(Date min, Date max, long granularity, Distribution distribution, boolean unique) {
101 super(null);
102 this.distribution = distribution;
103 this.min = (min != null ? min.getTime() : Long.MIN_VALUE);
104 this.max = (max != null ? max.getTime() : TimeUtil.date(TimeUtil.currentYear() + 10, 11, 31).getTime());
105 this.granularity = granularity;
106 this.unique = unique;
107 setSource(distribution.createNumberGenerator(Long.class, this.min, this.max, this.granularity, this.unique));
108 }
109
110
111
112
113
114
115
116
117 public void setMin(Date min) {
118 this.min = min.getTime();
119 }
120
121
122
123
124
125
126 public void setMax(Date max) {
127 this.max = max.getTime();
128 }
129
130
131
132
133
134
135 public void setGranularity(String granularity) {
136 this.granularity = dateConverter.convert(granularity);
137 }
138
139
140
141
142
143
144 public void setDistribution(Distribution distribution) {
145 this.distribution = distribution;
146 }
147
148
149
150 @Override
151 public Class<Date> getGeneratedType() {
152 return Date.class;
153 }
154
155 @Override
156 public void init(GeneratorContext context) {
157 assertNotInitialized();
158 setSource(distribution.createNumberGenerator(Long.class, min, max, granularity, unique));
159 super.init(context);
160 }
161
162
163
164
165 @Override
166 public Date generate() {
167 assertInitialized();
168 ProductWrapper<Long> tmp = generateFromSource();
169 if (tmp == null) {
170 return null;
171 }
172 Long millis = tmp.unwrap();
173 return new Date(millis);
174 }
175
176 @Override
177 public boolean isThreadSafe() {
178 return super.isThreadSafe() && dateConverter.isThreadSafe();
179 }
180
181 @Override
182 public boolean isParallelizable() {
183 return super.isParallelizable() && dateConverter.isParallelizable();
184 }
185
186
187
188
189
190
191 private static Date defaultStartDate() {
192 return new Date(currentDay().getTime() - 80L * 365 * Period.DAY.getMillis());
193 }
194
195
196
197
198 private static Date currentDay() {
199 GregorianCalendar calendar = new GregorianCalendar();
200 calendar.set(
201 calendar.get(GregorianCalendar.YEAR),
202 calendar.get(GregorianCalendar.MONTH),
203 calendar.get(GregorianCalendar.DAY_OF_MONTH),
204 0,
205 0,
206 0);
207 calendar.set(GregorianCalendar.MILLISECOND, 0);
208 return calendar.getTime();
209 }
210
211 @Override
212 public String toString() {
213 return getClass().getSimpleName() + '[' + getSource() + ']';
214 }
215
216 }