8146215: (fs) java/nio/file/Files/probeContentType/Basic.java failed frequently on Solaris-sparc with Unexpected type: text/plain
authorbpb
Mon, 08 Aug 2016 13:57:51 -0700
changeset 40207 cdd28dfda879
parent 40206 8870e08b50bc
child 40208 4554a9ae19ef
8146215: (fs) java/nio/file/Files/probeContentType/Basic.java failed frequently on Solaris-sparc with Unexpected type: text/plain Summary: Append a FileTypeDetector using java.net.FileNameMap as a fallback on all platforms Reviewed-by: alanb, rriggs, naoto
jdk/src/java.base/share/classes/java/net/URLConnection.java
jdk/src/java.base/share/classes/sun/nio/fs/AbstractFileTypeDetector.java
jdk/test/java/nio/file/Files/probeContentType/Basic.java
--- a/jdk/src/java.base/share/classes/java/net/URLConnection.java	Mon Aug 08 11:04:57 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/net/URLConnection.java	Mon Aug 08 13:57:51 2016 -0700
@@ -291,12 +291,7 @@
    /**
     * @since   1.1
     */
-    private static FileNameMap fileNameMap;
-
-    /**
-     * @since 1.2.2
-     */
-    private static boolean fileNameMapLoaded = false;
+    private static volatile FileNameMap fileNameMap;
 
     /**
      * Loads filename map (a mimetable) from a data file. It will
@@ -308,18 +303,21 @@
      * @since 1.2
      * @see #setFileNameMap(java.net.FileNameMap)
      */
-    public static synchronized FileNameMap getFileNameMap() {
-        if ((fileNameMap == null) && !fileNameMapLoaded) {
-            fileNameMap = sun.net.www.MimeTable.loadTable();
-            fileNameMapLoaded = true;
+    public static FileNameMap getFileNameMap() {
+        FileNameMap map = fileNameMap;
+
+        if (map == null) {
+            fileNameMap = map = new FileNameMap() {
+                private FileNameMap internalMap =
+                    sun.net.www.MimeTable.loadTable();
+
+                public String getContentTypeFor(String fileName) {
+                    return internalMap.getContentTypeFor(fileName);
+                }
+            };
         }
 
-        return new FileNameMap() {
-            private FileNameMap map = fileNameMap;
-            public String getContentTypeFor(String fileName) {
-                return map.getContentTypeFor(fileName);
-            }
-        };
+        return map;
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/nio/fs/AbstractFileTypeDetector.java	Mon Aug 08 11:04:57 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/fs/AbstractFileTypeDetector.java	Mon Aug 08 13:57:51 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,8 @@
 
 package sun.nio.fs;
 
+import java.net.FileNameMap;
+import java.net.URLConnection;
 import java.nio.file.Path;
 import java.nio.file.spi.FileTypeDetector;
 import java.util.Locale;
@@ -71,6 +73,16 @@
         if (file == null)
             throw new NullPointerException("'file' is null");
         String result = implProbeContentType(file);
+
+        // Fall back to content types property.
+        if (result == null) {
+            Path fileName = file.getFileName();
+            if (fileName != null) {
+                FileNameMap fileNameMap = URLConnection.getFileNameMap();
+                result = fileNameMap.getContentTypeFor(fileName.toString());
+            }
+        }
+
         return (result == null) ? null : parse(result);
     }
 
--- a/jdk/test/java/nio/file/Files/probeContentType/Basic.java	Mon Aug 08 11:04:57 2016 -0700
+++ b/jdk/test/java/nio/file/Files/probeContentType/Basic.java	Mon Aug 08 13:57:51 2016 -0700
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 4313887 8129632 8129633 8162624
+ * @bug 4313887 8129632 8129633 8162624 8146215
  * @summary Unit test for probeContentType method
  * @library ../..
  * @build Basic SimpleFileTypeDetector
@@ -38,7 +38,6 @@
  * set of file extension to content type mappings.
  */
 public class Basic {
-
     private static final boolean IS_UNIX =
         ! System.getProperty("os.name").startsWith("Windows");
 
@@ -55,6 +54,23 @@
         return Files.createTempFile("red", ".grape");
     }
 
+    private static void checkMimeTypesFile(Path mimeTypes) {
+        if (!Files.exists(mimeTypes)) {
+            System.out.println(mimeTypes + " does not exist");
+        } else if (!Files.isReadable(mimeTypes)) {
+            System.out.println(mimeTypes + " is not readable");
+        } else {
+            System.out.println(mimeTypes + " contents:");
+            try (Stream<String> lines = Files.lines(mimeTypes)) {
+                lines.forEach(System.out::println);
+                System.out.println("");
+            } catch (IOException ioe) {
+                System.err.printf("Problem reading %s: %s%n",
+                                  mimeTypes, ioe.getMessage());
+            }
+        }
+    }
+
     private static int checkContentTypes(String expected, String actual) {
         assert expected != null;
         assert actual != null;
@@ -63,36 +79,10 @@
             if (IS_UNIX) {
                 Path userMimeTypes =
                     Paths.get(System.getProperty("user.home"), ".mime.types");
-                if (!Files.exists(userMimeTypes)) {
-                    System.out.println(userMimeTypes + " does not exist");
-                } else if (!Files.isReadable(userMimeTypes)) {
-                    System.out.println(userMimeTypes + " is not readable");
-                } else {
-                    System.out.println(userMimeTypes + " contents:");
-                    try (Stream<String> lines = Files.lines(userMimeTypes)) {
-                        lines.forEach(System.out::println);
-                        System.out.println("");
-                    } catch (IOException ioe) {
-                        System.err.println("Problem reading "
-                                           + userMimeTypes);
-                    }
-                }
+                checkMimeTypesFile(userMimeTypes);
 
                 Path etcMimeTypes = Paths.get("/etc/mime.types");
-                if (!Files.exists(etcMimeTypes)) {
-                    System.out.println(etcMimeTypes + " does not exist");
-                } else if (!Files.isReadable(etcMimeTypes)) {
-                    System.out.println(etcMimeTypes + " is not readable");
-                } else {
-                    System.out.println(etcMimeTypes + " contents:");
-                    try (Stream<String> lines = Files.lines(etcMimeTypes)) {
-                        lines.forEach(System.out::println);
-                        System.out.println("");
-                    } catch (IOException ioe) {
-                        System.err.println("Problem reading "
-                                           + etcMimeTypes);
-                    }
-                }
+                checkMimeTypesFile(etcMimeTypes);
             }
 
             System.err.println("Expected \"" + expected
@@ -108,8 +98,8 @@
     static int checkOSXContentTypes(String[] extensions, String[] expectedTypes)
         throws IOException {
         if (extensions.length != expectedTypes.length) {
-            throw new IllegalArgumentException
-                ("Parameter array lengths differ");
+            System.err.println("Parameter array lengths differ");
+            return 1;
         }
 
         int failures = 0;
@@ -157,9 +147,12 @@
         file = createGrapeFile();
         try {
             String type = Files.probeContentType(file);
-            if (type == null)
-                throw new RuntimeException("Custom file type detector not installed?");
-            failures += checkContentTypes("grape/unknown", type);
+            if (type == null) {
+                System.err.println("Custom file type detector not installed?");
+                failures++;
+            } else {
+                failures += checkContentTypes("grape/unknown", type);
+            }
         } finally {
             Files.delete(file);
         }