public Collection<T> parseAll(String string, boolean isOnline) { Collection<T> elements = new ArrayList<T>(); try { DataEntity entity = AnnotationUtils.findAnnotation(persistentClass, DataEntity.class); String[] joinSplit = {string}; if (isOnline) { joinSplit = StringUtil.joinSplit(string, entity.regex()); } for (String record : joinSplit) { elements.add(parse(persistentClass.newInstance(), record, isOnline)); } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return elements; }
@SuppressWarnings({"unchecked", "rawtypes"}) public T parse(T instance, String string, boolean isOnline) { try { DataEntity entity = AnnotationUtils.findAnnotation(persistentClass, DataEntity.class); Field[] fields = persistentClass.getDeclaredFields(); String record = string; if (isOnline && !entity.regex().equals(DataEntity.NESTED)) { record = StringUtil.substringAfterFirstOccurrence(string, entity.regex()); } for (Field field : fields) { DataField dataField = field.getAnnotation(DataField.class); if (dataField != null) { int start = 0; int end = 0; Object value = null; if (field.getType().getSuperclass() == Enum.class) { start = isOnline ? dataField.startRangeOnline() : dataField.startRangeBatch(); end = start + (isOnline ? dataField.lengthOnline() : dataField.lenghtBatch()); Method method = field.getType().getMethod("decode", String.class); if (end <= record.length()) { String tmpVal = record.substring(start, end); value = method.invoke(null, new Object[] {tmpVal}); } } else if (isComplexType(field.getType())) { start = isOnline ? dataField.startRangeOnline() : dataField.startRangeBatch(); end = start + (isOnline ? dataField.lengthOnline() : dataField.lenghtBatch()); if (end <= record.length()) { String substring; try { if (!dataField.isAggregate()) { substring = record.substring(start, end); } else { substring = record; } } catch (StringIndexOutOfBoundsException e) { logger.debug( "StringIndexOutOfBoundsException: field=[{}] string=[{}]", field.getName(), record); throw e; } if (substring.trim().length() != 0) { Class<?> type = field.getType(); DomainStringParser domainStringParser = new DomainStringParser(type); value = domainStringParser.parse(substring, isOnline); } } } else { start = isOnline ? dataField.startRangeOnline() : dataField.startRangeBatch(); end = start + (isOnline ? dataField.lengthOnline() : dataField.lenghtBatch()); if (end <= record.length()) { String substring = record.substring(start, end).trim(); if (field.getType().equals(Calendar.class)) { value = parseLegacyDate(substring); } else { value = substring; } } } setField(instance, field, value); } } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return instance; }