/** * Returns a {@link FixedLengthTokenizer} * * @return a {@link FixedLengthTokenizer} */ public FixedLengthTokenizer build() { Assert.notNull(this.fieldSetFactory, "A FieldSetFactory is required."); Assert.notEmpty(this.names, "A list of field names is required."); Assert.notEmpty(this.ranges, "A list of column ranges is required."); FixedLengthTokenizer tokenizer = new FixedLengthTokenizer(); tokenizer.setNames(this.names.toArray(new String[this.names.size()])); tokenizer.setColumns(this.ranges.toArray(new Range[this.ranges.size()])); tokenizer.setFieldSetFactory(this.fieldSetFactory); tokenizer.setStrict(this.strict); return tokenizer; } }
/** * Set the column ranges. Used in conjunction with the * {@link RangeArrayPropertyEditor} this property can be set in the form of * a String describing the range boundaries, e.g. "1,4,7" or "1-3,4-6,7" or * "1-2,4-5,7-10". If the last range is open then the rest of the line is * read into that column (irrespective of the strict flag setting). * * @see #setStrict(boolean) * * @param ranges the column ranges expected in the input */ public void setColumns(Range... ranges) { this.ranges = Arrays.asList(ranges).toArray(new Range[ranges.length]); calculateMaxRange(ranges); }
if (lineLength < maxRange && isStrict()) { throw new IncorrectLineLengthException("Line is shorter than max range " + maxRange, maxRange, lineLength, line); if (!open && lineLength > maxRange && isStrict()) { throw new IncorrectLineLengthException("Line is longer than max range " + maxRange, maxRange, lineLength, line);
@Test public void testEmptyStringWithNoRanges() { tokenizer.setColumns(new Range[] {}); tokenizer.tokenize(""); }
@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 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()); } }
@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 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)); }
/** * Returns a {@link FixedLengthTokenizer} * * @return a {@link FixedLengthTokenizer} */ public FixedLengthTokenizer build() { Assert.notNull(this.fieldSetFactory, "A FieldSetFactory is required."); Assert.notEmpty(this.names, "A list of field names is required."); Assert.notEmpty(this.ranges, "A list of column ranges is required."); FixedLengthTokenizer tokenizer = new FixedLengthTokenizer(); tokenizer.setNames(this.names.toArray(new String[this.names.size()])); tokenizer.setColumns(this.ranges.toArray(new Range[this.ranges.size()])); tokenizer.setFieldSetFactory(this.fieldSetFactory); tokenizer.setStrict(this.strict); return tokenizer; } }
@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)); }
/** * Set the column ranges. Used in conjunction with the * {@link RangeArrayPropertyEditor} this property can be set in the form of * a String describing the range boundaries, e.g. "1,4,7" or "1-3,4-6,7" or * "1-2,4-5,7-10". If the last range is open then the rest of the line is * read into that column (irrespective of the strict flag setting). * * @see #setStrict(boolean) * * @param ranges the column ranges expected in the input */ public void setColumns(Range... ranges) { this.ranges = Arrays.asList(ranges).toArray(new Range[ranges.length]); calculateMaxRange(ranges); }
if (lineLength < maxRange && isStrict()) { throw new IncorrectLineLengthException("Line is shorter than max range " + maxRange, maxRange, lineLength, line); if (!open && lineLength > maxRange && isStrict()) { throw new IncorrectLineLengthException("Line is longer than max range " + maxRange, maxRange, lineLength, line);
@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 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)); }
@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 testTokenizeSmallerStringThanRangesWithWhitespace() { tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10) }); FieldSet tokens = tokenizer.tokenize("12345 "); assertEquals("12345", tokens.readString(0)); assertEquals("", tokens.readString(1)); }
@Test public void testTokenizeSmallerStringThanRangesWithWhitespaceOpenEnded() { tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6) }); FieldSet tokens = tokenizer.tokenize("12345 "); assertEquals("12345", tokens.readString(0)); assertEquals("", tokens.readString(1)); }
@Test public void testTokenizeNullString() { tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10), new Range(11, 15) }); try { tokenizer.tokenize(null); fail("Expected IncorrectLineLengthException"); } catch (IncorrectLineLengthException ex) { assertEquals("", ex.getInput()); } }
@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)); }