/** * Configure the default record mapper. * * @return the default implementation of record mapper * @throws BatchConfigurationException if the target type class is not found */ private RecordMapper configureDefaultRecordMapper() throws BatchConfigurationException { RecordMapper recordMapper; String recordClassName = configurationProperties.getProperty(BatchConstants.INPUT_RECORD_CLASS); if (recordClassName == null || recordClassName.length() == 0) { try { Class recordProcessorClass = Class.forName(recordProcessor.getClass().getName()); Method[] declaredMethods = recordProcessorClass.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { if (declaredMethod.getName().equals("processRecord")) { recordClassName = declaredMethod.getParameterTypes()[0].getName(); break; } } } catch (ClassNotFoundException e) { String error = "Configuration failed : unable to get record class name from registered record processor implementation."; logger.severe(error); throw new BatchConfigurationException(error, e); } } String[] headers; String headersProperty = configurationProperties.getProperty(BatchConstants.INPUT_RECORD_HEADERS); if (headersProperty == null) { // if no headers specified, use field names declared in the header record String headerRecord = recordReader.getHeaderRecord(); Record record = recordParser.parseRecord( headerRecord, 0); // use the record parser to parse the header record using the right delimiter List<Field> fields = record.getFields(); headers = new String[fields.size()]; for (int i = 0; i < fields.size(); i++) { headers[i] = fields.get(i).getContent(); } } else { // headers specified, split the comma separated list headers = headersProperty.split(","); } try { recordMapper = new DefaultRecordMapperImpl(recordClassName, headers, typeConverters); } catch (ClassNotFoundException e) { String error = "Configuration failed : Class " + recordClassName + " not found."; logger.severe(error); throw new BatchConfigurationException(error, e); } return recordMapper; }
/** * Configure CB4J record parser. * * @throws BatchConfigurationException thrown if record parser is not correctly configured */ private void configureRecordParser() throws BatchConfigurationException { // read record type property and set default value if invalid input String recordTypeProperty = configurationProperties.getProperty(BatchConstants.INPUT_RECORD_TYPE); String recordType; if (recordTypeProperty == null || recordTypeProperty.length() == 0) { recordType = BatchConstants.DEFAULT_RECORD_TYPE; logger.info( "Record type property not specified, records will be considered as delimiter-separated values"); } else if (!RecordType.DSV.toString().equalsIgnoreCase(recordTypeProperty) && !RecordType.FLR.toString().equalsIgnoreCase(recordTypeProperty)) { recordType = BatchConstants.DEFAULT_RECORD_TYPE; logger.warning( "Record type property '" + recordTypeProperty + "' is invalid, records will be considered as delimiter-separated values"); } else { recordType = recordTypeProperty; } // fixed length record configuration if (RecordType.FLR.toString().equalsIgnoreCase(recordType)) { String fieldsLengthProperties = configurationProperties.getProperty(BatchConstants.INPUT_FIELD_LENGTHS); if (fieldsLengthProperties == null || fieldsLengthProperties.length() == 0) { String error = "Configuration failed : when using fixed length records, fields length values property '" + BatchConstants.INPUT_FIELD_LENGTHS + "' is mandatory but was not specified."; logger.severe(error); throw new BatchConfigurationException(error); } else { // parse fields length property and extract numeric values StringTokenizer stringTokenizer = new StringTokenizer(fieldsLengthProperties, ","); int[] fieldsLength = new int[stringTokenizer.countTokens()]; int index = 0; while (stringTokenizer.hasMoreTokens()) { String length = stringTokenizer.nextToken(); try { fieldsLength[index] = Integer.parseInt(length); index++; } catch (NumberFormatException e) { String error = "Configuration failed : field length '" + length + "' in property " + BatchConstants.INPUT_FIELD_LENGTHS + "=" + fieldsLengthProperties + " is not numeric."; logger.severe(error); throw new BatchConfigurationException(error); } } recordParser = new FlrRecordParserImpl(fieldsLength); } } else { // delimited values configuration String recordSizeProperty = configurationProperties.getProperty(BatchConstants.INPUT_RECORD_SIZE); try { String fieldsDelimiter = configurationProperties.getProperty(BatchConstants.INPUT_FIELD_DELIMITER); if (fieldsDelimiter == null || fieldsDelimiter.length() == 0) { fieldsDelimiter = BatchConstants.DEFAULT_FIELD_DELIMITER; logger.info("No field delimiter specified, using default : '" + fieldsDelimiter + "'"); } String trimWhitespacesProperty = configurationProperties.getProperty(BatchConstants.INPUT_FIELD_TRIM); boolean trimWhitespaces; if (trimWhitespacesProperty != null) { trimWhitespaces = Boolean.valueOf(trimWhitespacesProperty); } else { trimWhitespaces = BatchConstants.DEFAULT_FIELD_TRIM; logger.info("Trim whitespaces property not specified, default to " + trimWhitespaces); } String dataQualifierCharacterProperty = configurationProperties.getProperty(BatchConstants.INPUT_FIELD_QUALIFIER_CHAR); String dataQualifierCharacter = BatchConstants.DEFAULT_FIELD_QUALIFIER_CHAR; if (dataQualifierCharacterProperty != null && dataQualifierCharacterProperty.length() > 0) { dataQualifierCharacter = dataQualifierCharacterProperty; } else { logger.info( "Data qualifier character not specified, default to " + dataQualifierCharacter); } recordParser = new DsvRecordParserImpl(fieldsDelimiter, trimWhitespaces, dataQualifierCharacter); if (recordSizeProperty == null || recordSizeProperty.length() == 0) { logger.info( "Record size property not specified, it will be calculated from the header record"); String headerRecord = recordReader.getHeaderRecord(); Record record = recordParser.parseRecord( headerRecord, 0); // use the record parser to parse the header record using the right delimiter recordSizeProperty = String.valueOf(record.getFields().size()); } int recordSize = Integer.parseInt(recordSizeProperty); recordParser = new DsvRecordParserImpl( recordSize, fieldsDelimiter, trimWhitespaces, dataQualifierCharacter); logger.info("Record size : " + recordSize); logger.info("Fields delimiter : '" + fieldsDelimiter + "'"); logger.info("Data qualifier character : '" + dataQualifierCharacter + "'"); } catch (NumberFormatException e) { String error = "Record size property is not recognized as a number : " + recordSizeProperty; logger.severe(error); throw new BatchConfigurationException(error); } } }