fix CSV parser corrupts duration if duration is last element in line
This commit is contained in:
@@ -28,147 +28,154 @@ import org.slf4j.LoggerFactory;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
public class PdbTestUtil {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(PdbTestUtil.class);
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(PdbTestUtil.class);
|
||||
|
||||
static final Map<String, Object> POISON = new HashMap<>();
|
||||
static final Map<String, Object> POISON = new HashMap<>();
|
||||
|
||||
public static final void send(final String format, final Collection<Map<String, Object>> entries)
|
||||
throws IOException, InterruptedException {
|
||||
switch (format) {
|
||||
case "csv":
|
||||
sendAsCsv(entries);
|
||||
break;
|
||||
case "json":
|
||||
sendAsJson(entries);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("unhandled format: " + format);
|
||||
}
|
||||
}
|
||||
public static final void send(final String format, final Collection<Map<String, Object>> entries)
|
||||
throws IOException, InterruptedException {
|
||||
switch (format) {
|
||||
case "csv":
|
||||
sendAsCsv(entries);
|
||||
break;
|
||||
case "json":
|
||||
sendAsJson(entries);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("unhandled format: " + format);
|
||||
}
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static final void sendAsCsv(final Map<String, Object>... entries) throws IOException, InterruptedException {
|
||||
sendAsCsv(Arrays.asList(entries));
|
||||
}
|
||||
@SafeVarargs
|
||||
public static final void sendAsCsv(final Map<String, Object>... entries) throws IOException, InterruptedException {
|
||||
sendAsCsv(Arrays.asList(entries));
|
||||
}
|
||||
|
||||
public static final void sendAsCsv(final Collection<Map<String, Object>> entries)
|
||||
throws IOException, InterruptedException {
|
||||
public static final void sendAsCsv(final Collection<Map<String, Object>> entries)
|
||||
throws IOException, InterruptedException {
|
||||
|
||||
final Set<String> keys = entries.stream().map(Map::keySet).flatMap(Set::stream).collect(Collectors.toSet());
|
||||
final Set<String> keys = entries.stream().map(Map::keySet).flatMap(Set::stream).collect(Collectors.toSet());
|
||||
|
||||
final StringBuilder csv = new StringBuilder();
|
||||
sendAsCsv(keys, entries);
|
||||
}
|
||||
|
||||
csv.append(String.join(",", keys));
|
||||
csv.append("\n");
|
||||
public static final void sendAsCsv(Collection<String> keys, final Collection<Map<String, Object>> entries)
|
||||
throws IOException, InterruptedException {
|
||||
|
||||
for (final Map<String, Object> entry : entries) {
|
||||
final List<String> line = new ArrayList<>();
|
||||
for (final String key : keys) {
|
||||
final String value = String.valueOf(entry.getOrDefault(key, ""));
|
||||
line.add(value);
|
||||
}
|
||||
csv.append(String.join(",", line));
|
||||
csv.append("\n");
|
||||
}
|
||||
System.out.println("sending: " + csv);
|
||||
send(csv.toString());
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static final void sendAsJson(final Map<String, Object>... entries) throws IOException, InterruptedException {
|
||||
final StringBuilder csv = new StringBuilder();
|
||||
|
||||
sendAsJson(Arrays.asList(entries));
|
||||
}
|
||||
csv.append(String.join(",", keys));
|
||||
csv.append("\n");
|
||||
|
||||
public static final void sendAsJson(final Collection<Map<String, Object>> entries)
|
||||
throws IOException, InterruptedException {
|
||||
final LinkedBlockingDeque<Map<String, Object>> queue = new LinkedBlockingDeque<>(entries);
|
||||
queue.put(POISON);
|
||||
sendAsJson(queue);
|
||||
}
|
||||
for (final Map<String, Object> entry : entries) {
|
||||
final List<String> line = new ArrayList<>();
|
||||
for (final String key : keys) {
|
||||
final String value = String.valueOf(entry.getOrDefault(key, ""));
|
||||
line.add(value);
|
||||
}
|
||||
csv.append(String.join(",", line));
|
||||
csv.append("\n");
|
||||
}
|
||||
System.out.println("sending: " + csv);
|
||||
send(csv.toString());
|
||||
}
|
||||
|
||||
public static final void sendAsJson(final BlockingQueue<Map<String, Object>> aEntriesSupplier) throws IOException {
|
||||
@SafeVarargs
|
||||
public static final void sendAsJson(final Map<String, Object>... entries) throws IOException, InterruptedException {
|
||||
|
||||
final ObjectMapper mapper = new ObjectMapper();
|
||||
final SocketChannel channel = connect();
|
||||
sendAsJson(Arrays.asList(entries));
|
||||
}
|
||||
|
||||
Map<String, Object> entry;
|
||||
while ((entry = aEntriesSupplier.poll()) != POISON) {
|
||||
public static final void sendAsJson(final Collection<Map<String, Object>> entries)
|
||||
throws IOException, InterruptedException {
|
||||
final LinkedBlockingDeque<Map<String, Object>> queue = new LinkedBlockingDeque<>(entries);
|
||||
queue.put(POISON);
|
||||
sendAsJson(queue);
|
||||
}
|
||||
|
||||
final StringBuilder streamData = new StringBuilder();
|
||||
streamData.append(mapper.writeValueAsString(entry));
|
||||
streamData.append("\n");
|
||||
public static final void sendAsJson(final BlockingQueue<Map<String, Object>> aEntriesSupplier) throws IOException {
|
||||
|
||||
final ByteBuffer src = ByteBuffer.wrap(streamData.toString().getBytes(StandardCharsets.UTF_8));
|
||||
channel.write(src);
|
||||
}
|
||||
final ObjectMapper mapper = new ObjectMapper();
|
||||
final SocketChannel channel = connect();
|
||||
|
||||
try {
|
||||
// ugly workaround: the channel was closed too early and not all
|
||||
// data was received
|
||||
TimeUnit.MILLISECONDS.sleep(10);
|
||||
} catch (final InterruptedException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
channel.close();
|
||||
LOGGER.trace("closed sender connection");
|
||||
}
|
||||
Map<String, Object> entry;
|
||||
while ((entry = aEntriesSupplier.poll()) != POISON) {
|
||||
|
||||
public static final void send(final String data) throws IOException {
|
||||
final StringBuilder streamData = new StringBuilder();
|
||||
streamData.append(mapper.writeValueAsString(entry));
|
||||
streamData.append("\n");
|
||||
|
||||
final SocketChannel channel = connect();
|
||||
final ByteBuffer src = ByteBuffer.wrap(streamData.toString().getBytes(StandardCharsets.UTF_8));
|
||||
channel.write(src);
|
||||
}
|
||||
|
||||
final StringBuilder streamData = new StringBuilder();
|
||||
streamData.append(data);
|
||||
try {
|
||||
// ugly workaround: the channel was closed too early and not all
|
||||
// data was received
|
||||
TimeUnit.MILLISECONDS.sleep(10);
|
||||
} catch (final InterruptedException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
channel.close();
|
||||
LOGGER.trace("closed sender connection");
|
||||
}
|
||||
|
||||
final ByteBuffer src = ByteBuffer.wrap(streamData.toString().getBytes(StandardCharsets.UTF_8));
|
||||
channel.write(src);
|
||||
public static final void send(final String data) throws IOException {
|
||||
|
||||
try {
|
||||
// ugly workaround: the channel was closed too early and not all
|
||||
// data was received
|
||||
TimeUnit.MILLISECONDS.sleep(10);
|
||||
} catch (final InterruptedException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
channel.close();
|
||||
LOGGER.trace("closed sender connection");
|
||||
}
|
||||
final SocketChannel channel = connect();
|
||||
|
||||
public static void send(final Path file) throws IOException {
|
||||
final SocketChannel outputChannel = connect();
|
||||
final StringBuilder streamData = new StringBuilder();
|
||||
streamData.append(data);
|
||||
|
||||
try (final FileChannel inputChannel = FileChannel.open(file, StandardOpenOption.READ)) {
|
||||
inputChannel.transferTo(0, Long.MAX_VALUE, outputChannel);
|
||||
}
|
||||
final ByteBuffer src = ByteBuffer.wrap(streamData.toString().getBytes(StandardCharsets.UTF_8));
|
||||
channel.write(src);
|
||||
|
||||
try {
|
||||
// ugly workaround: the channel was closed too early and not all
|
||||
// data was received
|
||||
TimeUnit.MILLISECONDS.sleep(10);
|
||||
} catch (final InterruptedException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
outputChannel.close();
|
||||
LOGGER.trace("closed sender connection");
|
||||
}
|
||||
try {
|
||||
// ugly workaround: the channel was closed too early and not all
|
||||
// data was received
|
||||
TimeUnit.MILLISECONDS.sleep(10);
|
||||
} catch (final InterruptedException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
channel.close();
|
||||
LOGGER.trace("closed sender connection");
|
||||
}
|
||||
|
||||
private static SocketChannel connect() throws IOException {
|
||||
public static void send(final Path file) throws IOException {
|
||||
final SocketChannel outputChannel = connect();
|
||||
|
||||
SocketChannel result = null;
|
||||
try (final FileChannel inputChannel = FileChannel.open(file, StandardOpenOption.READ)) {
|
||||
inputChannel.transferTo(0, Long.MAX_VALUE, outputChannel);
|
||||
}
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
result = SocketChannel.open();
|
||||
result.configureBlocking(true);
|
||||
result.connect(new InetSocketAddress("127.0.0.1", TcpIngestor.PORT));
|
||||
break;
|
||||
} catch (final ConnectException e) {
|
||||
// server socket not yet ready, it should be ready any time soon
|
||||
}
|
||||
}
|
||||
try {
|
||||
// ugly workaround: the channel was closed too early and not all
|
||||
// data was received
|
||||
TimeUnit.MILLISECONDS.sleep(10);
|
||||
} catch (final InterruptedException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
outputChannel.close();
|
||||
LOGGER.trace("closed sender connection");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
private static SocketChannel connect() throws IOException {
|
||||
|
||||
SocketChannel result = null;
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
result = SocketChannel.open();
|
||||
result.configureBlocking(true);
|
||||
result.connect(new InetSocketAddress("127.0.0.1", TcpIngestor.PORT));
|
||||
break;
|
||||
} catch (final ConnectException e) {
|
||||
// server socket not yet ready, it should be ready any time soon
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user