Repository: incubator-nifi
Updated Branches:
  refs/heads/develop efc862eac -> e2227cdaf


NIFI-644:
- Using mime.type attribute when known. If not specified or is octet-stream 
continue using content detection (tika).

Project: http://git-wip-us.apache.org/repos/asf/incubator-nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-nifi/commit/be50793d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-nifi/tree/be50793d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-nifi/diff/be50793d

Branch: refs/heads/develop
Commit: be50793decde1279f78e68548f5807a4cc646780
Parents: 07628f7
Author: Matt Gilman <[email protected]>
Authored: Thu Jun 4 12:53:42 2015 -0400
Committer: Matt Gilman <[email protected]>
Committed: Thu Jun 4 12:53:42 2015 -0400

----------------------------------------------------------------------
 .../apache/nifi/web/api/ProvenanceResource.java |   4 +-
 .../nifi/web/ContentViewerController.java       | 210 ++++++++++---------
 2 files changed, 111 insertions(+), 103 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/be50793d/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProvenanceResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProvenanceResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProvenanceResource.java
index afa404d..a2e7ef3 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProvenanceResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProvenanceResource.java
@@ -276,7 +276,7 @@ public class ProvenanceResource extends ApplicationResource 
{
      */
     @GET
     @Consumes(MediaType.WILDCARD)
-    @Produces(MediaType.APPLICATION_OCTET_STREAM)
+    @Produces(MediaType.WILDCARD)
     @Path("/events/{id}/content/input")
     @PreAuthorize("hasRole('ROLE_PROVENANCE')")
     @ApiOperation(
@@ -375,7 +375,7 @@ public class ProvenanceResource extends ApplicationResource 
{
      */
     @GET
     @Consumes(MediaType.WILDCARD)
-    @Produces(MediaType.APPLICATION_OCTET_STREAM)
+    @Produces(MediaType.WILDCARD)
     @Path("/events/{id}/content/output")
     @PreAuthorize("hasRole('ROLE_PROVENANCE')")
     @ApiOperation(

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/be50793d/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/src/main/java/org/apache/nifi/web/ContentViewerController.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/src/main/java/org/apache/nifi/web/ContentViewerController.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/src/main/java/org/apache/nifi/web/ContentViewerController.java
index 304f85e..984b8a9 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/src/main/java/org/apache/nifi/web/ContentViewerController.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/src/main/java/org/apache/nifi/web/ContentViewerController.java
@@ -132,130 +132,138 @@ public class ContentViewerController extends 
HttpServlet {
         }
 
         // buffer the content to support reseting in case we need to detect 
the content type or char encoding
-        final BufferedInputStream bis = new 
BufferedInputStream(downloadableContent.getContent());
+        try (final BufferedInputStream bis = new 
BufferedInputStream(downloadableContent.getContent());) {
+            final String mimeType;
 
-        // detect the content type
-        final DefaultDetector detector = new DefaultDetector();
+            // when standalone and we don't know the type is null as we were 
able to directly access the content bypassing the rest endpoint,
+            // when clustered and we don't know the type set to octet stream 
since the content was retrieved from the node's rest endpoint
+            if (downloadableContent.getType() == null || 
downloadableContent.getType().equals(MediaType.OCTET_STREAM.toString())) {
+                // attempt to detect the content stream if we don't know what 
it is ()
+                final DefaultDetector detector = new DefaultDetector();
 
-        // create the stream for tika to process, buffered to support reseting
-        final TikaInputStream tikaStream = TikaInputStream.get(bis);
+                // create the stream for tika to process, buffered to support 
reseting
+                final TikaInputStream tikaStream = TikaInputStream.get(bis);
 
-        // provide a hint based on the filename
-        final Metadata metadata = new Metadata();
-        metadata.set(Metadata.RESOURCE_NAME_KEY, 
downloadableContent.getFilename());
+                // provide a hint based on the filename
+                final Metadata metadata = new Metadata();
+                metadata.set(Metadata.RESOURCE_NAME_KEY, 
downloadableContent.getFilename());
 
-        // Get mime type
-        final MediaType mediatype = detector.detect(tikaStream, metadata);
-        final String mimeType = mediatype.toString();
+                // Get mime type
+                final MediaType mediatype = detector.detect(tikaStream, 
metadata);
+                mimeType = mediatype.toString();
+            } else {
+                mimeType = downloadableContent.getType();
+            }
 
-        // add attributes needed for the header
-        request.setAttribute("filename", downloadableContent.getFilename());
-        request.setAttribute("contentType", mimeType);
+            // add attributes needed for the header
+            request.setAttribute("filename", 
downloadableContent.getFilename());
+            request.setAttribute("contentType", mimeType);
 
-        // generate the header
-        
request.getRequestDispatcher("/WEB-INF/jsp/header.jsp").include(request, 
response);
+            // generate the header
+            
request.getRequestDispatcher("/WEB-INF/jsp/header.jsp").include(request, 
response);
 
-        // remove the attributes needed for the header
-        request.removeAttribute("filename");
-        request.removeAttribute("contentType");
+            // remove the attributes needed for the header
+            request.removeAttribute("filename");
+            request.removeAttribute("contentType");
 
-        // generate the markup for the content based on the display mode
-        if (DisplayMode.Hex.equals(displayMode)) {
-            final byte[] buffer = new byte[BUFFER_LENGTH];
-            final int read = StreamUtils.fillBuffer(bis, buffer, false);
+            // generate the markup for the content based on the display mode
+            if (DisplayMode.Hex.equals(displayMode)) {
+                final byte[] buffer = new byte[BUFFER_LENGTH];
+                final int read = StreamUtils.fillBuffer(bis, buffer, false);
 
-            // trim the byte array if necessary
-            byte[] bytes = buffer;
-            if (read != buffer.length) {
-                bytes = new byte[read];
-                System.arraycopy(buffer, 0, bytes, 0, read);
-            }
-
-            // convert bytes into the base 64 bytes
-            final String base64 = Base64.encodeBase64String(bytes);
+                // trim the byte array if necessary
+                byte[] bytes = buffer;
+                if (read != buffer.length) {
+                    bytes = new byte[read];
+                    System.arraycopy(buffer, 0, bytes, 0, read);
+                }
 
-            // defer to the jsp
-            request.setAttribute("content", base64);
-            
request.getRequestDispatcher("/WEB-INF/jsp/hexview.jsp").include(request, 
response);
-        } else {
-            // lookup a viewer for the content
-            final String contentViewerUri = 
servletContext.getInitParameter(mimeType);
+                // convert bytes into the base 64 bytes
+                final String base64 = Base64.encodeBase64String(bytes);
 
-            // handle no viewer for content type
-            if (contentViewerUri == null) {
-                
request.getRequestDispatcher("/WEB-INF/jsp/no-viewer.jsp").include(request, 
response);
+                // defer to the jsp
+                request.setAttribute("content", base64);
+                
request.getRequestDispatcher("/WEB-INF/jsp/hexview.jsp").include(request, 
response);
             } else {
-                // create a request attribute for accessing the content
-                
request.setAttribute(ViewableContent.CONTENT_REQUEST_ATTRIBUTE, new 
ViewableContent() {
-                    @Override
-                    public InputStream getContentStream() {
-                        return bis;
-                    }
+                // lookup a viewer for the content
+                final String contentViewerUri = 
servletContext.getInitParameter(mimeType);
+
+                // handle no viewer for content type
+                if (contentViewerUri == null) {
+                    
request.getRequestDispatcher("/WEB-INF/jsp/no-viewer.jsp").include(request, 
response);
+                } else {
+                    // create a request attribute for accessing the content
+                    
request.setAttribute(ViewableContent.CONTENT_REQUEST_ATTRIBUTE, new 
ViewableContent() {
+                        @Override
+                        public InputStream getContentStream() {
+                            return bis;
+                        }
 
-                    @Override
-                    public String getContent() throws IOException {
-                        // detect the charset
-                        final CharsetDetector detector = new CharsetDetector();
-                        detector.setText(bis);
-                        detector.enableInputFilter(true);
-                        final CharsetMatch match = detector.detect();
-
-                        // ensure we were able to detect the charset
-                        if (match == null) {
-                            throw new IOException("Unable to detect character 
encoding.");
+                        @Override
+                        public String getContent() throws IOException {
+                            // detect the charset
+                            final CharsetDetector detector = new 
CharsetDetector();
+                            detector.setText(bis);
+                            detector.enableInputFilter(true);
+                            final CharsetMatch match = detector.detect();
+
+                            // ensure we were able to detect the charset
+                            if (match == null) {
+                                throw new IOException("Unable to detect 
character encoding.");
+                            }
+
+                            // convert the stream using the detected charset
+                            return IOUtils.toString(bis, match.getName());
                         }
 
-                        // convert the stream using the detected charset
-                        return IOUtils.toString(bis, match.getName());
-                    }
+                        @Override
+                        public ViewableContent.DisplayMode getDisplayMode() {
+                            return displayMode;
+                        }
 
-                    @Override
-                    public ViewableContent.DisplayMode getDisplayMode() {
-                        return displayMode;
-                    }
+                        @Override
+                        public String getFileName() {
+                            return downloadableContent.getFilename();
+                        }
 
-                    @Override
-                    public String getFileName() {
-                        return downloadableContent.getFilename();
-                    }
+                        @Override
+                        public String getContentType() {
+                            return mimeType;
+                        }
+                    });
+
+                    try {
+                        // generate the content
+                        final ServletContext viewerContext = 
servletContext.getContext(contentViewerUri);
+                        
viewerContext.getRequestDispatcher("/view-content").include(request, response);
+                    } catch (final Exception e) {
+                        String message = e.getMessage() != null ? 
e.getMessage() : e.toString();
+                        message = "Unable to generate view of data: " + 
message;
+
+                        // log the error
+                        logger.error(message);
+                        if (logger.isDebugEnabled()) {
+                            logger.error(StringUtils.EMPTY, e);
+                        }
 
-                    @Override
-                    public String getContentType() {
-                        return mimeType;
-                    }
-                });
-
-                try {
-                    // generate the content
-                    final ServletContext viewerContext = 
servletContext.getContext(contentViewerUri);
-                    
viewerContext.getRequestDispatcher("/view-content").include(request, response);
-                } catch (final Exception e) {
-                    String message = e.getMessage() != null ? e.getMessage() : 
e.toString();
-                    message = "Unable to generate view of data: " + message;
-
-                    // log the error
-                    logger.error(message);
-                    if (logger.isDebugEnabled()) {
-                        logger.error(StringUtils.EMPTY, e);
-                    }
+                        // populate the request attributes
+                        request.setAttribute("title", "Error");
+                        request.setAttribute("messages", message);
 
-                    // populate the request attributes
-                    request.setAttribute("title", "Error");
-                    request.setAttribute("messages", message);
+                        // forward to the error page
+                        final ServletContext viewerContext = 
servletContext.getContext("/nifi");
+                        
viewerContext.getRequestDispatcher("/message").forward(request, response);
+                        return;
+                    }
 
-                    // forward to the error page
-                    final ServletContext viewerContext = 
servletContext.getContext("/nifi");
-                    
viewerContext.getRequestDispatcher("/message").forward(request, response);
-                    return;
+                    // remove the request attribute
+                    
request.removeAttribute(ViewableContent.CONTENT_REQUEST_ATTRIBUTE);
                 }
-
-                // remove the request attribute
-                
request.removeAttribute(ViewableContent.CONTENT_REQUEST_ATTRIBUTE);
             }
-        }
 
-        // generate footer
-        
request.getRequestDispatcher("/WEB-INF/jsp/footer.jsp").include(request, 
response);
+            // generate footer
+            
request.getRequestDispatcher("/WEB-INF/jsp/footer.jsp").include(request, 
response);
+        }
     }
 
     /**

Reply via email to