Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 14 additions & 16 deletions jdk/src/share/classes/java/net/URLConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
}

/**
Expand Down
14 changes: 13 additions & 1 deletion jdk/src/share/classes/sun/nio/fs/AbstractFileTypeDetector.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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;
Expand All @@ -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);
}

Expand Down
59 changes: 26 additions & 33 deletions jdk/test/java/nio/file/Files/probeContentType/Basic.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
*/

/* @test
* @bug 4313887
* @bug 4313887 8129632 8129633 8162624 8146215
* @summary Unit test for probeContentType method
* @library ../..
* @build Basic SimpleFileTypeDetector
Expand All @@ -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");

Expand All @@ -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<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;
Expand All @@ -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<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
Expand Down Expand Up @@ -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);
}
Expand Down