View Javadoc
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       * (non-Javadoc)
91       *
92       * @see net.sf.flatpack.DataSet#getColumns()
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      * (non-Javadoc)
110      *
111      * @see net.sf.flatpack.DataSet#getColumns(java.lang.String)
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             // don't do the parse on empties
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             // don't do the parse on empties
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             // don't do the parse on empties
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             // don't do the parse on empties
292             return null;
293         }
294 
295         s = ParserUtils.replace(s, ",", "", -1).trim();
296 
297         if (FPStringUtils.isBlank(s)) {
298             // don't do the parse on empties
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         // return value as how it is in the file
326         return s;
327     }
328 
329     @Override
330     public String getRawData() {
331         return row.getRawData();
332     }
333 
334 }