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.

Reply via email to