diff --git a/jdk/src/share/classes/java/net/URLConnection.java b/jdk/src/share/classes/java/net/URLConnection.java index 7f7f43d94be..5845f1d3936 100644 --- a/jdk/src/share/classes/java/net/URLConnection.java +++ b/jdk/src/share/classes/java/net/URLConnection.java @@ -285,12 +285,7 @@ public abstract class URLConnection { /** * @since JDK1.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 @@ -302,18 +297,21 @@ public abstract class URLConnection { * @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; } /** diff --git a/jdk/src/share/classes/sun/nio/fs/AbstractFileTypeDetector.java b/jdk/src/share/classes/sun/nio/fs/AbstractFileTypeDetector.java index 0e43486e215..048962cd296 100644 --- a/jdk/src/share/classes/sun/nio/fs/AbstractFileTypeDetector.java +++ b/jdk/src/share/classes/sun/nio/fs/AbstractFileTypeDetector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, 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; @@ -50,6 +52,16 @@ public final String probeContentType(Path file) throws IOException { 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); } diff --git a/jdk/test/java/nio/file/Files/probeContentType/Basic.java b/jdk/test/java/nio/file/Files/probeContentType/Basic.java index 4bd41ca41f7..184aca3facc 100644 --- a/jdk/test/java/nio/file/Files/probeContentType/Basic.java +++ b/jdk/test/java/nio/file/Files/probeContentType/Basic.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4313887 + * @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 @@ static Path createGrapeFile() throws IOException { 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 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 @@ private static int checkContentTypes(String expected, String actual) { 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 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 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 @@ -125,9 +115,12 @@ public static void main(String[] args) throws IOException { 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); }