Repository: nifi Updated Branches: refs/heads/master 2dde48002 -> 3fd7d3b27
NIFI-3873: Improve Avro logical types readability Signed-off-by: Matt Burgess <mattyb...@apache.org> This closes #1788 Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/3fd7d3b2 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/3fd7d3b2 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/3fd7d3b2 Branch: refs/heads/master Commit: 3fd7d3b272fcbf4778ab8b6315113b63747697ee Parents: 2dde480 Author: Koji Kawamura <ijokaruma...@apache.org> Authored: Fri May 12 13:30:31 2017 +0900 Committer: Matt Burgess <mattyb...@apache.org> Committed: Wed May 17 13:08:00 2017 -0400 ---------------------------------------------------------------------- .../nifi-standard-content-viewer/pom.xml | 5 ++++ .../web/StandardContentViewerController.java | 25 ++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/3fd7d3b2/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/pom.xml ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/pom.xml b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/pom.xml index 7ca03c7..163a129 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/pom.xml +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/pom.xml @@ -64,6 +64,11 @@ <artifactId>avro</artifactId> </dependency> <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time</artifactId> + <scope>compile</scope> + </dependency> + <dependency> <groupId>org.xerial.snappy</groupId> <artifactId>snappy-java</artifactId> <version>1.1.2</version> http://git-wip-us.apache.org/repos/asf/nifi/blob/3fd7d3b2/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/src/main/java/org/apache/nifi/web/StandardContentViewerController.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/src/main/java/org/apache/nifi/web/StandardContentViewerController.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/src/main/java/org/apache/nifi/web/StandardContentViewerController.java index d8cb37d..cf532c3 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/src/main/java/org/apache/nifi/web/StandardContentViewerController.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-content-viewer/src/main/java/org/apache/nifi/web/StandardContentViewerController.java @@ -18,11 +18,16 @@ package org.apache.nifi.web; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.avro.Conversions; +import org.apache.avro.data.TimeConversions; import org.apache.avro.file.DataFileStream; import org.apache.avro.generic.GenericData; import org.apache.avro.generic.GenericDatumReader; import org.apache.avro.io.DatumReader; import org.apache.nifi.web.ViewableContent.DisplayMode; +import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.joda.time.LocalTime; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -103,11 +108,27 @@ public class StandardContentViewerController extends HttpServlet { } else if ("application/avro-binary".equals(contentType) || "avro/binary".equals(contentType) || "application/avro+binary".equals(contentType)) { final StringBuilder sb = new StringBuilder(); sb.append("["); - final DatumReader<GenericData.Record> datumReader = new GenericDatumReader<>(); + // Use Avro conversions to display logical type values in human readable way. + final GenericData genericData = new GenericData(){ + @Override + protected void toString(Object datum, StringBuilder buffer) { + // Since these types are not quoted and produce a malformed JSON string, quote it here. + if (datum instanceof LocalDate || datum instanceof LocalTime || datum instanceof DateTime) { + buffer.append("\"").append(datum).append("\""); + return; + } + super.toString(datum, buffer); + } + }; + genericData.addLogicalTypeConversion(new Conversions.DecimalConversion()); + genericData.addLogicalTypeConversion(new TimeConversions.DateConversion()); + genericData.addLogicalTypeConversion(new TimeConversions.TimeConversion()); + genericData.addLogicalTypeConversion(new TimeConversions.TimestampConversion()); + final DatumReader<GenericData.Record> datumReader = new GenericDatumReader<>(null, null, genericData); try (final DataFileStream<GenericData.Record> dataFileReader = new DataFileStream<>(content.getContentStream(), datumReader)) { while (dataFileReader.hasNext()) { final GenericData.Record record = dataFileReader.next(); - final String formattedRecord = record.toString(); + final String formattedRecord = genericData.toString(record); sb.append(formattedRecord); sb.append(","); // Do not format more than 10 MB of content.