1 package net.sf.flatpack;
2
3 import java.math.BigDecimal;
4 import java.text.ParseException;
5 import java.text.SimpleDateFormat;
6 import java.time.LocalDate;
7 import java.time.format.DateTimeFormatter;
8 import java.util.Date;
9 import java.util.Iterator;
10 import java.util.List;
11 import java.util.Locale;
12 import java.util.Properties;
13 import java.util.function.DoubleSupplier;
14 import java.util.function.IntSupplier;
15 import java.util.function.LongSupplier;
16 import java.util.function.Supplier;
17
18 import net.sf.flatpack.structure.ColumnMetaData;
19 import net.sf.flatpack.structure.Row;
20 import net.sf.flatpack.util.FPConstants;
21 import net.sf.flatpack.util.FPStringUtils;
22 import net.sf.flatpack.util.ParserUtils;
23 import net.sf.flatpack.xml.MetaData;
24
25 public class RowRecord implements Record {
26 private final Row row;
27 private final boolean columnCaseSensitive;
28 private final MetaData metaData;
29 private Properties pzConvertProps = null;
30 private final boolean strictNumericParse;
31 private final boolean upperCase;
32 private final boolean lowerCase;
33 private final boolean nullEmptyString;
34 private String[] columns = null;
35
36 public RowRecord(final Row row, final MetaData metaData, final boolean columnCaseSensitive, final Properties pzConvertProps,
37 final boolean strictNumericParse, final boolean upperCase, final boolean lowerCase, final boolean nullEmptyString) {
38 super();
39 this.row = row;
40 this.metaData = metaData;
41 this.columnCaseSensitive = columnCaseSensitive;
42 this.pzConvertProps = pzConvertProps;
43 this.strictNumericParse = strictNumericParse;
44 this.upperCase = upperCase;
45 this.lowerCase = lowerCase;
46 this.nullEmptyString = nullEmptyString;
47 }
48
49 @Override
50 public String getRecordID() {
51 String rowID = row.getMdkey();
52 if (rowID == null) {
53 rowID = FPConstants.DETAIL_ID;
54 }
55 return rowID;
56 }
57
58 @Override
59 public boolean isRecordID(final String recordID) {
60 final String rowID = getRecordID();
61
62 return rowID.equals(recordID);
63 }
64
65 @Override
66 public int getRowNo() {
67 return row.getRowNumber();
68 }
69
70 @Override
71 public boolean isRowEmpty() {
72 return row.isEmpty();
73 }
74
75 @Override
76 public boolean contains(final String column) {
77 final Iterator<ColumnMetaData> cmds = ParserUtils.getColumnMetaData(row.getMdkey(), metaData).iterator();
78 while (cmds.hasNext()) {
79 final ColumnMetaData cmd = cmds.next();
80 if (cmd.getColName().equalsIgnoreCase(column)) {
81 return true;
82 }
83 }
84
85 return false;
86
87 }
88
89
90
91
92
93
94 @Override
95 public String[] getColumns() {
96 if (metaData != null && columns == null) {
97 final List<ColumnMetaData> cmds = metaData.getColumnsNames();
98
99 columns = new String[cmds.size()];
100 for (int i = 0; i < cmds.size(); i++) {
101 columns[i] = cmds.get(i).getColName();
102 }
103 }
104
105 return columns;
106 }
107
108
109
110
111
112
113 @Override
114 public String[] getColumns(final String recordID) {
115 String[] array = null;
116
117 if (metaData != null) {
118 final List cmds = ParserUtils.getColumnMetaData(recordID, metaData);
119 array = new String[cmds.size()];
120 for (int i = 0; i < cmds.size(); i++) {
121 final ColumnMetaData column = (ColumnMetaData) cmds.get(i);
122 array[i] = column.getColName();
123 }
124 }
125
126 return array;
127 }
128
129 @Override
130 public Date getDate(final String column, final SimpleDateFormat sdf, final Supplier<Date> defaultSupplier) throws ParseException {
131 final Date d = getDate(column, sdf);
132 if (d == null) {
133 return defaultSupplier.get();
134 }
135 return d;
136 }
137
138 @Override
139 public Date getDate(final String column, final Supplier<Date> defaultSupplier) throws ParseException {
140 final Date d = getDate(column);
141 if (d == null) {
142 return defaultSupplier.get();
143 }
144 return d;
145 }
146
147 @Override
148 public Date getDate(final String column) throws ParseException {
149 return getDate(column, new SimpleDateFormat("yyyyMMdd"));
150 }
151
152 @Override
153 public Date getDate(final String column, final SimpleDateFormat sdf) throws ParseException {
154 final String s = getStringValue(column);
155 if (FPStringUtils.isBlank(s)) {
156
157 return null;
158 }
159 return sdf.parse(s);
160 }
161
162 @Override
163 public LocalDate getLocalDate(final String column, final String dateFormat, final Supplier<LocalDate> defaultSupplier) throws ParseException {
164 final LocalDate d = getLocalDate(column, dateFormat);
165 if (d == null) {
166 return defaultSupplier.get();
167 }
168 return d;
169 }
170
171 @Override
172 public LocalDate getLocalDate(final String column, final Supplier<LocalDate> defaultSupplier) throws ParseException {
173 final LocalDate d = getLocalDate(column);
174 if (d == null) {
175 return defaultSupplier.get();
176 }
177 return d;
178 }
179
180 @Override
181 public LocalDate getLocalDate(final String column) throws ParseException {
182 return getLocalDate(column, "yyyy-MM-dd");
183 }
184
185 @Override
186 public LocalDate getLocalDate(final String column, DateTimeFormatter formatter) throws ParseException {
187 final String s = getStringValue(column);
188 if (FPStringUtils.isBlank(s)) {
189
190 return null;
191 }
192 return LocalDate.parse(s, formatter);
193 }
194
195 @Override
196 public LocalDate getLocalDate(final String column, final String dateFormat) throws ParseException {
197 final String s = getStringValue(column);
198 if (FPStringUtils.isBlank(s)) {
199
200 return null;
201 }
202 return LocalDate.parse(s, DateTimeFormatter.ofPattern(dateFormat));
203 }
204
205 @Override
206 public double getDouble(final String column, final DoubleSupplier defaultSupplier) {
207 final String s = getStringValue(column);
208 if (FPStringUtils.isBlank(s)) {
209 return defaultSupplier.getAsDouble();
210 }
211 return getDouble(column);
212 }
213
214 @Override
215 public double getDouble(final String column) {
216 final StringBuilder newString = new StringBuilder();
217 final String s = getStringValue(column);
218
219 if (!strictNumericParse) {
220 newString.append(ParserUtils.stripNonDoubleChars(s));
221 } else {
222 newString.append(s);
223 }
224
225 return Double.parseDouble(newString.toString());
226 }
227
228 @Override
229 public int getInt(final String column, final IntSupplier defaultSupplier) {
230 final String s = getStringValue(column);
231 if (FPStringUtils.isBlank(s)) {
232 return defaultSupplier.getAsInt();
233 }
234 return getInt(column);
235 }
236
237 @Override
238 public int getInt(final String column) {
239 final String s = getStringValue(column);
240
241 if (!strictNumericParse) {
242 return Integer.parseInt(ParserUtils.stripNonLongChars(s));
243 }
244
245 return Integer.parseInt(s);
246 }
247
248 @Override
249 public long getLong(final String column, final LongSupplier defaultSupplier) {
250 final String s = getStringValue(column);
251 if (FPStringUtils.isBlank(s)) {
252 return defaultSupplier.getAsLong();
253 }
254 return getLong(column);
255 }
256
257 @Override
258 public long getLong(final String column) {
259 final String s = getStringValue(column);
260
261 if (!strictNumericParse) {
262 return Long.parseLong(ParserUtils.stripNonLongChars(s));
263 }
264
265 return Long.parseLong(s);
266 }
267
268 private String getStringValue(final String column) {
269 return row.getValue(ParserUtils.getColumnIndex(row.getMdkey(), metaData, column, columnCaseSensitive));
270 }
271
272 @Override
273 public Object getObject(final String column, final Class<?> classToConvertTo) {
274 final String s = getStringValue(column);
275 return ParserUtils.runPzConverter(pzConvertProps, s, classToConvertTo);
276 }
277
278 @Override
279 public BigDecimal getBigDecimal(final String column, final Supplier<BigDecimal> defaultSupplier) {
280 final BigDecimal bd = getBigDecimal(column);
281 if (bd == null) {
282 return defaultSupplier.get();
283 }
284 return bd;
285 }
286
287 @Override
288 public BigDecimal getBigDecimal(final String column) {
289 String s = getStringValue(column);
290 if (FPStringUtils.isBlank(s)) {
291
292 return null;
293 }
294
295 s = ParserUtils.replace(s, ",", "", -1).trim();
296
297 if (FPStringUtils.isBlank(s)) {
298
299 return null;
300 }
301 return new BigDecimal(s);
302 }
303
304 @Override
305 public String getString(final String column, final Supplier<String> defaultSupplier) {
306 final String s = getString(column);
307 if (FPStringUtils.isBlank(s)) {
308 return defaultSupplier.get();
309 }
310 return s;
311 }
312
313 @Override
314 public String getString(final String column) {
315 String s = getStringValue(column);
316
317 if (nullEmptyString && FPStringUtils.isBlank(s)) {
318 s = null;
319 } else if (upperCase) {
320 s = s.toUpperCase(Locale.getDefault());
321 } else if (lowerCase) {
322 s = s.toLowerCase(Locale.getDefault());
323 }
324
325
326 return s;
327 }
328
329 @Override
330 public String getRawData() {
331 return row.getRawData();
332 }
333
334 }