/** * Read elements from a {@link Source.Reader} until n elements are read. * * <p>There must be at least n elements remaining in the reader, except for the case when n is * {@code Integer.MAX_VALUE}, which means "read all remaining elements". */ private static <T> List<T> readNItemsFromReader(Source.Reader<T> reader, int n, boolean started) throws IOException { List<T> res = new ArrayList<>(); for (int i = 0; i < n; i++) { boolean shouldStart = (i == 0 && !started); boolean more = shouldStart ? reader.start() : reader.advance(); if (n != Integer.MAX_VALUE) { assertTrue(more); } if (!more) { break; } res.add(reader.getCurrent()); } return res; }
private <T> List<T> readEverythingFromReader(Reader<T> reader) throws IOException { List<T> results = new ArrayList<>(); for (boolean available = reader.start(); available; available = reader.advance()) { T train = reader.getCurrent(); results.add(train); } return results; }
@Test public void testReadXMLInvalidRecordClassWithCustomEventHandler() throws IOException { File file = tempFolder.newFile("trainXMLSmall"); Files.write(file.toPath(), trainXML.getBytes(StandardCharsets.UTF_8)); ValidationEventHandler validationEventHandler = event -> { throw new RuntimeException("MyCustomValidationEventHandler failure mesage"); }; BoundedSource<WrongTrainType> source = XmlIO.<WrongTrainType>read() .from(file.toPath().toString()) .withRootElement("trains") .withRecordElement("train") .withRecordClass(WrongTrainType.class) .withValidationEventHandler(validationEventHandler) .createSource(); exception.expect(RuntimeException.class); // JAXB internationalizes the error message. So this is all we can match for. exception.expectMessage("MyCustomValidationEventHandler failure mesage"); try (Reader<WrongTrainType> reader = source.createReader(null)) { List<WrongTrainType> results = new ArrayList<>(); for (boolean available = reader.start(); available; available = reader.advance()) { WrongTrainType train = reader.getCurrent(); results.add(train); } } }
private boolean tryProduceNext() { try (Closeable ignored = MetricsEnvironment.scopedMetricsContainer(metricsContainer)) { if (closed) { return FAILED_TO_OBTAIN_NEXT; } else { checkState(next == null, "unexpected non-null value for next"); if (seekNext()) { next = WindowedValue.timestampedValueInGlobalWindow( reader.getCurrent(), reader.getCurrentTimestamp()); return SUCCESSFULLY_OBTAINED_NEXT; } else { close(); return FAILED_TO_OBTAIN_NEXT; } } } catch (final Exception e) { throw new RuntimeException("Failed to read data.", e); } }
@Override public Message read() { Message message = null; try { if (available) { T data = reader.getCurrent(); org.joda.time.Instant timestamp = reader.getCurrentTimestamp(); message = new DefaultMessage( WindowedValue.timestampedValueInGlobalWindow(data, timestamp), timestamp.getMillis()); } available = reader.advance(); } catch (Exception e) { close(); throw new RuntimeException(e); } return message; }