--- old/src/share/classes/java/util/logging/FileHandler.java 2012-11-14 16:53:58.330576797 -0500
+++ new/src/share/classes/java/util/logging/FileHandler.java 2012-11-14 16:53:58.186579715 -0500
@@ -25,10 +25,19 @@
package java.util.logging;
-import java.io.*;
+import static java.nio.file.StandardOpenOption.CREATE_NEW;
+import static java.nio.file.StandardOpenOption.WRITE;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
-import java.security.*;
+import java.nio.file.FileAlreadyExistsException;
+import java.nio.file.Paths;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
/**
* Simple file logging Handler.
@@ -137,14 +146,16 @@
private int count;
private String pattern;
private String lockFileName;
- private FileOutputStream lockStream;
+ private FileChannel lockFileChannel;
private File files[];
private static final int MAX_LOCKS = 100;
private static java.util.HashMap locks = new java.util.HashMap<>();
- // A metered stream is a subclass of OutputStream that
- // (a) forwards all its output to a target stream
- // (b) keeps track of how many bytes have been written
+ /**
+ * A metered stream is a subclass of OutputStream that
+ * (a) forwards all its output to a target stream
+ * (b) keeps track of how many bytes have been written
+ */
private class MeteredStream extends OutputStream {
OutputStream out;
int written;
@@ -189,9 +200,10 @@
setOutputStream(meter);
}
- // Private method to configure a FileHandler from LogManager
- // properties and/or default values as specified in the class
- // javadoc.
+ /**
+ * Configure a FileHandler from LogManager properties and/or default values
+ * as specified in the class javadoc.
+ */
private void configure() {
LogManager manager = LogManager.getLogManager();
@@ -287,7 +299,8 @@
* the caller does not have LoggingPermission("control").
* @exception IllegalArgumentException if pattern is an empty string
*/
- public FileHandler(String pattern, boolean append) throws IOException, SecurityException {
+ public FileHandler(String pattern, boolean append) throws IOException,
+ SecurityException {
if (pattern.length() < 1 ) {
throw new IllegalArgumentException();
}
@@ -376,8 +389,10 @@
openFiles();
}
- // Private method to open the set of output files, based on the
- // configured instance variables.
+ /**
+ * Open the set of output files, based on the configured
+ * instance variables.
+ */
private void openFiles() throws IOException {
LogManager manager = LogManager.getLogManager();
manager.checkPermission();
@@ -413,18 +428,18 @@
// object. Try again.
continue;
}
- FileChannel fc;
+
try {
- lockStream = new FileOutputStream(lockFileName);
- fc = lockStream.getChannel();
- } catch (IOException ix) {
- // We got an IOException while trying to open the file.
- // Try the next file.
+ lockFileChannel = FileChannel.open(Paths.get(lockFileName),
+ CREATE_NEW, WRITE);
+ } catch (FileAlreadyExistsException ix) {
+ // try the next lock file name in the sequence
continue;
}
+
boolean available;
try {
- available = fc.tryLock() != null;
+ available = lockFileChannel.tryLock() != null;
// We got the lock OK.
} catch (IOException ix) {
// We got an IOException while trying to get the lock.
@@ -440,7 +455,7 @@
}
// We failed to get the lock. Try next file.
- fc.close();
+ lockFileChannel.close();
}
}
@@ -472,8 +487,17 @@
setErrorManager(new ErrorManager());
}
- // Generate a filename from a pattern.
- private File generate(String pattern, int generation, int unique) throws IOException {
+ /**
+ * Generate a file based on a user-supplied pattern, generation number,
+ * and an integer uniqueness suffix
+ * @param pattern the pattern for naming the output file
+ * @param generation the generation number to distinguish rotated logs
+ * @param unique a unique number to resolve conflicts
+ * @return the generated File
+ * @throws IOException
+ */
+ private File generate(String pattern, int generation, int unique)
+ throws IOException {
File file = null;
String word = "";
int ix = 0;
@@ -548,7 +572,9 @@
return file;
}
- // Rotate the set of output files
+ /**
+ * Rotate the set of output files
+ */
private synchronized void rotate() {
Level oldLevel = getLevel();
setLevel(Level.OFF);
@@ -615,9 +641,8 @@
return;
}
try {
- // Closing the lock file's FileOutputStream will close
- // the underlying channel and free any locks.
- lockStream.close();
+ // Close the lock file channel (which also will free any locks)
+ lockFileChannel.close();
} catch (Exception ex) {
// Problems closing the stream. Punt.
}
@@ -626,7 +651,7 @@
}
new File(lockFileName).delete();
lockFileName = null;
- lockStream = null;
+ lockFileChannel = null;
}
private static class InitializationErrorManager extends ErrorManager {
@@ -636,6 +661,8 @@
}
}
- // Private native method to check if we are in a set UID program.
+ /**
+ * check if we are in a set UID program.
+ */
private static native boolean isSetUID();
}