min = Integer.parseInt(range[0].trim()); ranges[i] = new Range(min); } else if ((range.length == 2) && (StringUtils.hasText(range[0])) && (StringUtils.hasText(range[1]))) { min = Integer.parseInt(range[0].trim()); max = Integer.parseInt(range[1].trim()); ranges[i] = new Range(min,max); } else { throw new IllegalArgumentException("Range[" + i + "]: range (" + strRanges[i] + ") is invalid");
@Test public void testFillerAtEnd() throws Exception { tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 15), new Range(16, 25), new Range(26, 27), new Range(34) }); // test another type of record line = "H2 123456 12345 12-123456"; FieldSet tokens = tokenizer.tokenize(line); assertEquals(5, tokens.getFieldCount()); assertEquals(line.substring(0, 5).trim(), tokens.readString(0)); assertEquals(line.substring(5, 15).trim(), tokens.readString(1)); assertEquals(line.substring(15, 25).trim(), tokens.readString(2)); assertEquals(line.substring(25, 27).trim(), tokens.readString(3)); }
private void setMaxValues(final Range[] ranges) { // Array of integers to track range values by index Integer[] c = new Integer[ranges.length]; for (int i=0; i<c.length; i++) { c[i] = i; } //sort array of Ranges Arrays.sort(c, new Comparator<Integer>() { @Override public int compare(Integer r1, Integer r2) { return ranges[r1].getMin()-ranges[r2].getMin(); } } ); //set max values for all unbound ranges (except last range) for (int i = 0; i < c.length - 1; i++) { if (!ranges[c[i]].hasMaxValue()) { //set max value to (min value - 1) of the next range ranges[c[i]] = new Range(ranges[c[i]].getMin(),ranges[c[i+1]].getMin() - 1); } } if (forceDisjointRanges) { verifyRanges(ranges); } }
@Test public void testLongerLinesOpenRange() throws Exception { tokenizer.setColumns(new Range[] { new Range(1, 10), new Range(11, 25), new Range(26) }); line = "H1 12345678 1234567890"; FieldSet tokens = tokenizer.tokenize(line); assertEquals(line.substring(0, 10).trim(), tokens.readString(0)); assertEquals(line.substring(10, 25).trim(), tokens.readString(1)); assertEquals(line.substring(25).trim(), tokens.readString(2)); }
@Test public void testLongerLinesNotStrict() throws Exception { tokenizer.setColumns(new Range[] { new Range(1, 10), new Range(11, 25), new Range(26,30) }); line = "H1 12345678 1234567890"; tokenizer.setStrict(false); FieldSet tokens = tokenizer.tokenize(line); assertEquals(line.substring(0, 10).trim(), tokens.readString(0)); assertEquals(line.substring(10, 25).trim(), tokens.readString(1)); assertEquals(line.substring(25, 30).trim(), tokens.readString(2)); }
@Test public void testAnotherTypeOfRecord() throws Exception { tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 15), new Range(16, 25), new Range(26, 27) }); // test another type of record line = "H2 123456 12345 12"; FieldSet tokens = tokenizer.tokenize(line); assertEquals(4, tokens.getFieldCount()); assertEquals(line.substring(0, 5).trim(), tokens.readString(0)); assertEquals(line.substring(5, 15).trim(), tokens.readString(1)); assertEquals(line.substring(15, 25).trim(), tokens.readString(2)); assertEquals(line.substring(25).trim(), tokens.readString(3)); }
@Test public void testNormalLength() throws Exception { tokenizer.setColumns(new Range[] { new Range(1, 10), new Range(11, 25), new Range(26, 30) }); // test shorter line as defined by record descriptor line = "H1 12345678 12345"; FieldSet tokens = tokenizer.tokenize(line); assertEquals(3, tokens.getFieldCount()); assertEquals(line.substring(0, 10).trim(), tokens.readString(0)); assertEquals(line.substring(10, 25).trim(), tokens.readString(1)); assertEquals(line.substring(25).trim(), tokens.readString(2)); }
@Test public void testNonAdjacentRangesUnsorted() throws Exception { tokenizer.setColumns(new Range[] { new Range(14, 28), new Range(34, 38), new Range(1, 10) }); // test normal length line = "H1 +++12345678 +++++12345"; FieldSet tokens = tokenizer.tokenize(line); assertEquals(3, tokens.getFieldCount()); assertEquals(line.substring(0, 10).trim(), tokens.readString(2)); assertEquals(line.substring(13, 28).trim(), tokens.readString(0)); assertEquals(line.substring(33, 38).trim(), tokens.readString(1)); }
@Test public void testTokenizeSmallerStringThanRanges() { tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10), new Range(11, 15) }); try { tokenizer.tokenize("12345"); fail("Expected IncorrectLineLengthException"); } catch (IncorrectLineLengthException ex) { assertEquals(15, ex.getExpectedLength()); assertEquals(5, ex.getActualLength()); assertEquals("12345", ex.getInput()); } }
@Test public void testTokenizeRegularUse() { tokenizer.setColumns(new Range[] { new Range(1, 2), new Range(3, 7), new Range(8, 12) }); // test shorter line as defined by record descriptor line = "H11234512345"; FieldSet tokens = tokenizer.tokenize(line); assertEquals(3, tokens.getFieldCount()); assertEquals("H1", tokens.readString(0)); assertEquals("12345", tokens.readString(1)); assertEquals("12345", tokens.readString(2)); }
@Test public void testLongerLines() throws Exception { tokenizer.setColumns(new Range[] { new Range(1, 10), new Range(11, 25), new Range(26, 30) }); line = "H1 12345678 1234567890"; try { tokenizer.tokenize(line); fail("Expected IncorrectLineLengthException"); } catch (IncorrectLineLengthException ex) { assertEquals(30, ex.getExpectedLength()); assertEquals(35, ex.getActualLength()); assertEquals(line, ex.getInput()); } }
@Test public void testTokenizeSmallerStringThanRangesNotStrict() { tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10) }); tokenizer.setStrict(false); FieldSet tokens = tokenizer.tokenize("12345"); assertEquals("12345", tokens.readString(0)); assertEquals("", tokens.readString(1)); }
/** * if null or empty string is tokenized, tokenizer returns empty fieldset * (with no tokens). */ @Test public void testTokenizeEmptyString() { tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10), new Range(11, 15) }); try { tokenizer.tokenize(""); fail("Expected IncorrectLineLengthException"); } catch (IncorrectLineLengthException ex) { assertEquals(15, ex.getExpectedLength()); assertEquals(0, ex.getActualLength()); assertEquals("", ex.getInput()); } }
@Test public void testCustomEncoding() { String encoding = "UTF-8"; FlatFileItemReader<Foo> reader = new FlatFileItemReaderBuilder<Foo>() .name("fooReader") .resource(getResource("1 2 3")) .encoding(encoding) .fixedLength() .columns(new Range(1, 3), new Range(4, 6), new Range(7)) .names("first", "second", "third") .targetType(Foo.class) .build(); assertEquals(encoding, ReflectionTestUtils.getField(reader, "encoding")); }
@Test public void testSimpleFixedLength() throws Exception { FlatFileItemReader<Foo> reader = new FlatFileItemReaderBuilder<Foo>() .name("fooReader") .resource(getResource("1 2 3")) .fixedLength() .columns(new Range(1, 3), new Range(4, 6), new Range(7)) .names("first", "second", "third") .targetType(Foo.class) .build(); reader.open(new ExecutionContext()); Foo item = reader.read(); assertEquals(1, item.getFirst()); assertEquals(2, item.getSecond()); assertEquals("3", item.getThird()); assertNull(reader.read()); }
@Test public void testTokenizerInvalidSetup() { tokenizer.setNames(new String[] { "a", "b" }); tokenizer.setColumns(new Range[] { new Range(1, 5) }); try { tokenizer.tokenize("12345"); fail("Exception was expected: too few names provided"); } catch (IncorrectTokenCountException e) { assertEquals(2, e.getExpectedCount()); assertEquals(1, e.getActualCount()); } }