Merge
authorlana
Tue, 20 Nov 2012 11:49:27 -0800
changeset 14520 367c55063a72
parent 14500 a3ac50817dec (current diff)
parent 14519 73d8a1fdacd6 (diff)
child 14528 bc93357f4936
Merge
--- a/jdk/make/java/java/FILES_java.gmk	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/make/java/java/FILES_java.gmk	Tue Nov 20 11:49:27 2012 -0800
@@ -206,6 +206,7 @@
             sun/util/locale/provider/BreakIteratorProviderImpl.java \
             sun/util/locale/provider/CalendarDataProviderImpl.java \
             sun/util/locale/provider/CalendarDataUtility.java \
+            sun/util/locale/provider/CalendarNameProviderImpl.java \
             sun/util/locale/provider/CollationRules.java \
             sun/util/locale/provider/CollatorProviderImpl.java \
             sun/util/locale/provider/CurrencyNameProviderImpl.java \
@@ -396,6 +397,7 @@
     java/util/prefs/Base64.java \
     java/util/prefs/XmlSupport.java \
     java/util/spi/CalendarDataProvider.java \
+    java/util/spi/CalendarNameProvider.java \
     java/util/spi/CurrencyNameProvider.java \
     java/util/spi/LocaleNameProvider.java \
     java/util/spi/LocaleServiceProvider.java \
--- a/jdk/src/macosx/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/macosx/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java	Tue Nov 20 11:49:27 2012 -0800
@@ -41,6 +41,7 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import java.util.spi.CalendarDataProvider;
+import java.util.spi.CalendarNameProvider;
 import java.util.spi.CurrencyNameProvider;
 import java.util.spi.LocaleNameProvider;
 import java.util.spi.TimeZoneNameProvider;
@@ -324,6 +325,30 @@
             }
 
             @Override
+            public int getFirstDayOfWeek(Locale locale) {
+                return getCalendarInt(locale.toLanguageTag(), CD_FIRSTDAYOFWEEK);
+            }
+
+            @Override
+            public int getMinimalDaysInFirstWeek(Locale locale) {
+                return getCalendarInt(locale.toLanguageTag(), CD_MINIMALDAYSINFIRSTWEEK);
+            }
+        };
+    }
+
+    public static CalendarNameProvider getCalendarNameProvider() {
+        return new CalendarNameProvider() {
+            @Override
+            public Locale[] getAvailableLocales() {
+                return getSupportedCalendarLocales();
+            }
+
+            @Override
+            public boolean isSupportedLocale(Locale locale) {
+                return isSupportedCalendarLocale(locale);
+            }
+
+            @Override
             public String getDisplayName(String calType, int field, int value,
                                          int style, Locale locale) {
                 return null;
@@ -334,16 +359,6 @@
                                          int field, int style, Locale locale) {
                 return null;
             }
-
-            @Override
-            public int getFirstDayOfWeek(Locale locale) {
-                return getCalendarInt(locale.toLanguageTag(), CD_FIRSTDAYOFWEEK);
-            }
-
-            @Override
-            public int getMinimalDaysInFirstWeek(Locale locale) {
-                return getCalendarInt(locale.toLanguageTag(), CD_MINIMALDAYSINFIRSTWEEK);
-            }
         };
     }
 
--- a/jdk/src/share/bin/java.c	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/bin/java.c	Tue Nov 20 11:49:27 2012 -0800
@@ -105,6 +105,7 @@
                               InvocationFunctions *ifn);
 static jstring NewPlatformString(JNIEnv *env, char *s);
 static jclass LoadMainClass(JNIEnv *env, int mode, char *name);
+static jclass GetApplicationClass(JNIEnv *env);
 
 static void TranslateApplicationArgs(int jargc, const char **jargv, int *pargc, char ***pargv);
 static jboolean AddApplicationOptions(int cpathc, const char **cpathv);
@@ -346,6 +347,7 @@
     JavaVM *vm = 0;
     JNIEnv *env = 0;
     jclass mainClass = NULL;
+    jclass appClass = NULL; // actual application class being launched
     jmethodID mainID;
     jobjectArray mainArgs;
     int ret = 0;
@@ -419,10 +421,28 @@
      *          all environments,
      *     2)   Remove the vestages of maintaining main_class through
      *          the environment (and remove these comments).
+     *
+     * This method also correctly handles launching existing JavaFX
+     * applications that may or may not have a Main-Class manifest entry.
      */
     mainClass = LoadMainClass(env, mode, what);
     CHECK_EXCEPTION_NULL_LEAVE(mainClass);
-    PostJVMInit(env, mainClass, vm);
+    /*
+     * In some cases when launching an application that needs a helper, e.g., a
+     * JavaFX application with no main method, the mainClass will not be the
+     * applications own main class but rather a helper class. To keep things
+     * consistent in the UI we need to track and report the application main class.
+     */
+    appClass = GetApplicationClass(env);
+    NULL_CHECK(appClass);
+    /*
+     * PostJVMInit uses the class name as the application name for GUI purposes,
+     * for example, on OSX this sets the application name in the menu bar for
+     * both SWT and JavaFX. So we'll pass the actual application class here
+     * instead of mainClass as that may be a launcher or helper class instead
+     * of the application class.
+     */
+    PostJVMInit(env, appClass, vm);
     /*
      * The LoadMainClass not only loads the main class, it will also ensure
      * that the main method's signature is correct, therefore further checking
@@ -1215,6 +1235,20 @@
     return (jclass)result;
 }
 
+static jclass
+GetApplicationClass(JNIEnv *env)
+{
+    jmethodID mid;
+    jobject result;
+    jclass cls = GetLauncherHelperClass(env);
+    NULL_CHECK0(cls);
+    NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
+                "getApplicationClass",
+                "()Ljava/lang/Class;"));
+
+    return (*env)->CallStaticObjectMethod(env, cls, mid);
+}
+
 /*
  * For tools, convert command line args thus:
  *   javac -cp foo:foo/"*" -J-ms32m ...
--- a/jdk/src/share/bin/wildcard.c	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/bin/wildcard.c	Tue Nov 20 11:49:27 2012 -0800
@@ -356,8 +356,13 @@
     const char *basename;
     FileList fl = FileList_new(16);
     WildcardIterator it = WildcardIterator_for(wildcard);
+
     if (it == NULL)
+    {
+        FileList_free(fl);
         return NULL;
+    }
+
     while ((basename = WildcardIterator_next(it)) != NULL)
         if (isJarFileName(basename))
             FileList_add(fl, wildcardConcat(wildcard, basename));
--- a/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java	Tue Nov 20 11:49:27 2012 -0800
@@ -560,8 +560,7 @@
                     }
                 } finally {
                     while (resources.hasMore()) {
-                        InputStream istream = (InputStream)resources.next();
-                        istream.close();
+                        resources.next().close();
                     }
                 }
 
--- a/jdk/src/share/classes/java/lang/Boolean.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/lang/Boolean.java	Tue Nov 20 11:49:27 2012 -0800
@@ -196,11 +196,24 @@
      * {@code true}; returns the integer {@code 1237} if this
      * object represents {@code false}.
      */
+    @Override
     public int hashCode() {
+        return Boolean.hashCode(value);
+    }
+
+    /**
+     * Returns a hash code for a {@code boolean} value; compatible with
+     * {@code Boolean.hashCode()}.
+     *
+     * @since 1.8
+     *
+     * @return a hash code value for a {@code boolean} value.
+     */
+    public static int hashCode(boolean value) {
         return value ? 1231 : 1237;
     }
 
-    /**
+   /**
      * Returns {@code true} if and only if the argument is not
      * {@code null} and is a {@code Boolean} object that
      * represents the same {@code boolean} value as this object.
--- a/jdk/src/share/classes/java/lang/Byte.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/lang/Byte.java	Tue Nov 20 11:49:27 2012 -0800
@@ -389,7 +389,20 @@
      *
      * @return a hash code value for this {@code Byte}
      */
+    @Override
     public int hashCode() {
+        return Byte.hashCode(value);
+    }
+
+    /**
+     * Returns a hash code for a {@code byte} value; compatible with
+     * {@code Byte.hashCode()}.
+     *
+     * @since 1.8
+     *
+     * @return a hash code value for a {@code byte} value.
+     */
+    public static int hashCode(byte value) {
         return (int)value;
     }
 
@@ -494,6 +507,14 @@
      */
     public static final int SIZE = 8;
 
+    /**
+     * The number of bytes used to represent a {@code byte} value in two's
+     * complement binary form.
+     *
+     * @since 1.8
+     */
+    public static final int BYTES = SIZE / Byte.SIZE;
+
     /** use serialVersionUID from JDK 1.1. for interoperability */
     private static final long serialVersionUID = -7183698231559129828L;
 }
--- a/jdk/src/share/classes/java/lang/Character.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/lang/Character.java	Tue Nov 20 11:49:27 2012 -0800
@@ -4588,7 +4588,20 @@
      *
      * @return a hash code value for this {@code Character}
      */
+    @Override
     public int hashCode() {
+        return Character.hashCode(value);
+    }
+
+    /**
+     * Returns a hash code for a {@code char} value; compatible with
+     * {@code Character.hashCode()}.
+     *
+     * @since 1.8
+     *
+     * @return a hash code value for a {@code char} value.
+     */
+    public static int hashCode(char value) {
         return (int)value;
     }
 
@@ -7158,6 +7171,14 @@
     public static final int SIZE = 16;
 
     /**
+     * The number of bytes used to represent a {@code char} value in unsigned
+     * binary form.
+     *
+     * @since 1.8
+     */
+    public static final int BYTES = SIZE / Byte.SIZE;
+
+    /**
      * Returns the value obtained by reversing the order of the bytes in the
      * specified <tt>char</tt> value.
      *
--- a/jdk/src/share/classes/java/lang/Double.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/lang/Double.java	Tue Nov 20 11:49:27 2012 -0800
@@ -123,6 +123,13 @@
     public static final int SIZE = 64;
 
     /**
+     * The number of bytes used to represent a {@code double} value.
+     *
+     * @since 1.8
+     */
+    public static final int BYTES = SIZE / Byte.SIZE;
+
+    /**
      * The {@code Class} instance representing the primitive type
      * {@code double}.
      *
@@ -740,7 +747,20 @@
      *
      * @return  a {@code hash code} value for this object.
      */
+    @Override
     public int hashCode() {
+        return Double.hashCode(value);
+    }
+
+    /**
+     * Returns a hash code for a {@code double} value; compatible with
+     * {@code Double.hashCode()}.
+     *
+     * @since 1.8
+     *
+     * @return a hash code value for a {@code double} value.
+     */
+    public static int hashCode(double value) {
         long bits = doubleToLongBits(value);
         return (int)(bits ^ (bits >>> 32));
     }
--- a/jdk/src/share/classes/java/lang/Float.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/lang/Float.java	Tue Nov 20 11:49:27 2012 -0800
@@ -121,6 +121,13 @@
     public static final int SIZE = 32;
 
     /**
+     * The number of bytes used to represent a {@code float} value.
+     *
+     * @since 1.8
+     */
+    public static final int BYTES = SIZE / Byte.SIZE;
+
+    /**
      * The {@code Class} instance representing the primitive type
      * {@code float}.
      *
@@ -648,7 +655,20 @@
      *
      * @return a hash code value for this object.
      */
+    @Override
     public int hashCode() {
+        return Float.hashCode(value);
+    }
+
+    /**
+     * Returns a hash code for a {@code float} value; compatible with
+     * {@code Float.hashCode()}.
+     *
+     * @since 1.8
+     *
+     * @return a hash code value for a {@code float} value.
+     */
+    public static int hashCode(float value) {
         return floatToIntBits(value);
     }
 
--- a/jdk/src/share/classes/java/lang/Integer.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/lang/Integer.java	Tue Nov 20 11:49:27 2012 -0800
@@ -918,7 +918,20 @@
      *          primitive {@code int} value represented by this
      *          {@code Integer} object.
      */
+    @Override
     public int hashCode() {
+        return Integer.hashCode(value);
+    }
+
+    /**
+     * Returns a hash code for a {@code int} value; compatible with
+     * {@code Integer.hashCode()}.
+     *
+     * @since 1.8
+     *
+     * @return a hash code value for a {@code int} value.
+     */
+    public static int hashCode(int value) {
         return value;
     }
 
@@ -1285,6 +1298,14 @@
     public static final int SIZE = 32;
 
     /**
+     * The number of bytes used to represent a {@code int} value in two's
+     * complement binary form.
+     *
+     * @since 1.8
+     */
+    public static final int BYTES = SIZE / Byte.SIZE;
+
+    /**
      * Returns an {@code int} value with at most a single one-bit, in the
      * position of the highest-order ("leftmost") one-bit in the specified
      * {@code int} value.  Returns zero if the specified value has no
--- a/jdk/src/share/classes/java/lang/Long.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/lang/Long.java	Tue Nov 20 11:49:27 2012 -0800
@@ -1021,7 +1021,20 @@
      *
      * @return  a hash code value for this object.
      */
+    @Override
     public int hashCode() {
+        return Long.hashCode(value);
+    }
+
+    /**
+     * Returns a hash code for a {@code long} value; compatible with
+     * {@code Long.hashCode()}.
+     *
+     * @since 1.8
+     *
+     * @return a hash code value for a {@code long} value.
+     */
+    public static int hashCode(long value) {
         return (int)(value ^ (value >>> 32));
     }
 
@@ -1307,6 +1320,14 @@
     public static final int SIZE = 64;
 
     /**
+     * The number of bytes used to represent a {@code long} value in two's
+     * complement binary form.
+     *
+     * @since 1.8
+     */
+    public static final int BYTES = SIZE / Byte.SIZE;
+
+    /**
      * Returns a {@code long} value with at most a single one-bit, in the
      * position of the highest-order ("leftmost") one-bit in the specified
      * {@code long} value.  Returns zero if the specified value has no
--- a/jdk/src/share/classes/java/lang/Short.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/lang/Short.java	Tue Nov 20 11:49:27 2012 -0800
@@ -394,7 +394,20 @@
      *
      * @return a hash code value for this {@code Short}
      */
+    @Override
     public int hashCode() {
+        return Short.hashCode(value);
+    }
+
+    /**
+     * Returns a hash code for a {@code short} value; compatible with
+     * {@code Short.hashCode()}.
+     *
+     * @since 1.8
+     *
+     * @return a hash code value for a {@code short} value.
+     */
+    public static int hashCode(short value) {
         return (int)value;
     }
 
@@ -458,6 +471,14 @@
     public static final int SIZE = 16;
 
     /**
+     * The number of bytes used to represent a {@code short} value in two's
+     * complement binary form.
+     *
+     * @since 1.8
+     */
+    public static final int BYTES = SIZE / Byte.SIZE;
+
+    /**
      * Returns the value obtained by reversing the order of the bytes in the
      * two's complement representation of the specified {@code short} value.
      *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/java/lang/annotation/Native.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2012, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.lang.annotation;
+
+
+/**
+ * Indicates that a field defining a constant value may be referenced
+ * from native code.
+ *
+ * The annotation may be used as a hint by tools that generate native
+ * header files to determine whether a header file is required, and
+ * if so, what declarations it should contain.
+ *
+ * @since 1.8
+ */
+@Documented
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.SOURCE)
+public @interface Native {
+}
--- a/jdk/src/share/classes/java/util/Calendar.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/util/Calendar.java	Tue Nov 20 11:49:27 2012 -0800
@@ -2699,12 +2699,9 @@
         /* try to get the Locale data from the cache */
         int[] data = cachedLocaleData.get(desiredLocale);
         if (data == null) {  /* cache miss */
-            LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(CalendarDataProvider.class, desiredLocale);
-            CalendarDataProvider provider = adapter.getCalendarDataProvider();
             data = new int[2];
-            data[0] = provider.getFirstDayOfWeek(desiredLocale);
-            data[1] = provider.getMinimalDaysInFirstWeek(desiredLocale);
-            assert data[0] != 0 && data[1] != 0;
+            data[0] = CalendarDataUtility.retrieveFirstDayOfWeek(desiredLocale);
+            data[1] = CalendarDataUtility.retrieveMinimalDaysInFirstWeek(desiredLocale);
             cachedLocaleData.putIfAbsent(desiredLocale, data);
         }
         firstDayOfWeek = data[0];
--- a/jdk/src/share/classes/java/util/logging/FileHandler.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/util/logging/FileHandler.java	Tue Nov 20 11:49:27 2012 -0800
@@ -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 <tt>Handler</tt>.
@@ -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<String, String> 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 <tt>LoggingPermission("control")</tt>.
      * @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();
 }
--- a/jdk/src/share/classes/java/util/spi/CalendarDataProvider.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/java/util/spi/CalendarDataProvider.java	Tue Nov 20 11:49:27 2012 -0800
@@ -26,125 +26,15 @@
 package java.util.spi;
 
 import java.util.Calendar;
-import java.util.Map;
 import java.util.Locale;
 
 /**
- * An abstract class for service providers that provide localized {@link
- * Calendar} parameters and string representations (display names) of {@code
- * Calendar} field values.
- *
- * <p><a name="calendartypes"><b>Calendar Types</b></a>
- *
- * <p>Calendar types are used to specify calendar systems for which the {@link
- * #getDisplayName(String, int, int, int, Locale) getDisplayName} and {@link
- * #getDisplayNames(String, int, int, Locale) getDisplayNames} methods provide
- * calendar field value names. See {@link Calendar#getCalendarType()} for details.
- *
- * <p><b>Calendar Fields</b>
- *
- * <p>Calendar fields are specified with the constants defined in {@link
- * Calendar}. The following are calendar-common fields and their values to be
- * supported for each calendar system.
- *
- * <table style="border-bottom:1px solid" border="1" cellpadding="3" cellspacing="0" summary="Field values">
- *   <tr>
- *     <th>Field</th>
- *     <th>Value</th>
- *     <th>Description</th>
- *   </tr>
- *   <tr>
- *     <td valign="top">{@link Calendar#MONTH}</td>
- *     <td valign="top">{@link Calendar#JANUARY} to {@link Calendar#UNDECIMBER}</td>
- *     <td>Month numbering is 0-based (e.g., 0 - January, ..., 11 -
- *         December). Some calendar systems have 13 months. Month
- *         names need to be supported in both the formatting and
- *         stand-alone forms if required by the supported locales. If there's
- *         no distinction in the two forms, the same names should be returned
- *         in both of the forms.</td>
- *   </tr>
- *   <tr>
- *     <td valign="top">{@link Calendar#DAY_OF_WEEK}</td>
- *     <td valign="top">{@link Calendar#SUNDAY} to {@link Calendar#SATURDAY}</td>
- *     <td>Day-of-week numbering is 1-based starting from Sunday (i.e., 1 - Sunday,
- *         ..., 7 - Saturday).</td>
- *   </tr>
- *   <tr>
- *     <td valign="top">{@link Calendar#AM_PM}</td>
- *     <td valign="top">{@link Calendar#AM} to {@link Calendar#PM}</td>
- *     <td>0 - AM, 1 - PM</td>
- *   </tr>
- * </table>
- *
- * <p style="margin-top:20px">The following are calendar-specific fields and their values to be supported.
- *
- * <table style="border-bottom:1px solid" border="1" cellpadding="3" cellspacing="0" summary="Calendar type and field values">
- *   <tr>
- *     <th>Calendar Type</th>
- *     <th>Field</th>
- *     <th>Value</th>
- *     <th>Description</th>
- *   </tr>
- *   <tr>
- *     <td rowspan="2" valign="top">{@code "gregory"}</td>
- *     <td rowspan="2" valign="top">{@link Calendar#ERA}</td>
- *     <td>0</td>
- *     <td>{@link java.util.GregorianCalendar#BC} (BCE)</td>
- *   </tr>
- *   <tr>
- *     <td>1</td>
- *     <td>{@link java.util.GregorianCalendar#AD} (CE)</td>
- *   </tr>
- *   <tr>
- *     <td rowspan="2" valign="top">{@code "buddhist"}</td>
- *     <td rowspan="2" valign="top">{@link Calendar#ERA}</td>
- *     <td>0</td>
- *     <td>BC (BCE)</td>
- *   </tr>
- *   <tr>
- *     <td>1</td>
- *     <td>B.E. (Buddhist Era)</td>
- *   </tr>
- *   <tr>
- *     <td rowspan="6" valign="top">{@code "japanese"}</td>
- *     <td rowspan="5" valign="top">{@link Calendar#ERA}</td>
- *     <td>0</td>
- *     <td>Seireki (Before Meiji)</td>
- *   </tr>
- *   <tr>
- *     <td>1</td>
- *     <td>Meiji</td>
- *   </tr>
- *   <tr>
- *     <td>2</td>
- *     <td>Taisho</td>
- *   </tr>
- *   <tr>
- *     <td>3</td>
- *     <td>Showa</td>
- *   </tr>
- *   <tr>
- *     <td>4</td>
- *     <td >Heisei</td>
- *   </tr>
- *   <tr>
- *     <td>{@link Calendar#YEAR}</td>
- *     <td>1</td>
- *     <td>the first year in each era. It should be returned when a long
- *     style ({@link Calendar#LONG_FORMAT} or {@link Calendar#LONG_STANDALONE}) is
- *     specified. See also the <a href="../../text/SimpleDateFormat.html#year">
- *     Year representation in {@code SimpleDateFormat}</a>.</td>
- *   </tr>
- * </table>
- *
- * <p>Calendar field value names for {@code "gregory"} must be consistent with
- * the date-time symbols provided by {@link java.text.spi.DateFormatSymbolsProvider}.
- *
- * <p>Time zone names are supported by {@link TimeZoneNameProvider}.
+ * An abstract class for service providers that provide locale-dependent {@link
+ * Calendar} parameters.
  *
  * @author Masayoshi Okutsu
  * @since 1.8
- * @see Locale#getUnicodeLocaleType(String)
+ * @see CalendarNameProvider
  */
 public abstract class CalendarDataProvider extends LocaleServiceProvider {
 
@@ -188,112 +78,4 @@
      * @see java.util.Calendar#getMinimalDaysInFirstWeek()
      */
     public abstract int getMinimalDaysInFirstWeek(Locale locale);
-
-    /**
-     * Returns the string representation (display name) of the calendar
-     * <code>field value</code> in the given <code>style</code> and
-     * <code>locale</code>.  If no string representation is
-     * applicable, <code>null</code> is returned.
-     *
-     * <p>{@code field} is a {@code Calendar} field index, such as {@link
-     * Calendar#MONTH}. The time zone fields, {@link Calendar#ZONE_OFFSET} and
-     * {@link Calendar#DST_OFFSET}, are <em>not</em> supported by this
-     * method. {@code null} must be returned if any time zone fields are
-     * specified.
-     *
-     * <p>{@code value} is the numeric representation of the {@code field} value.
-     * For example, if {@code field} is {@link Calendar#DAY_OF_WEEK}, the valid
-     * values are {@link Calendar#SUNDAY} to {@link Calendar#SATURDAY}
-     * (inclusive).
-     *
-     * <p>{@code style} gives the style of the string representation. It is one
-     * of {@link Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}),
-     * {@link Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT}
-     * ({@link Calendar#LONG LONG}), or {@link Calendar#LONG_STANDALONE}.
-     *
-     * <p>For example, the following call will return {@code "Sunday"}.
-     * <pre>
-     * getDisplayName("gregory", Calendar.DAY_OF_WEEK, Calendar.SUNDAY,
-     *                Calendar.LONG_STANDALONE, Locale.ENGLISH);
-     * </pre>
-     *
-     * @param calendarType
-     *              the calendar type. (Any calendar type given by {@code locale}
-     *              is ignored.)
-     * @param field
-     *              the {@code Calendar} field index,
-     *              such as {@link Calendar#DAY_OF_WEEK}
-     * @param value
-     *              the value of the {@code Calendar field},
-     *              such as {@link Calendar#MONDAY}
-     * @param style
-     *              the string representation style: one of {@link
-     *              Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}),
-     *              {@link Calendar#SHORT_STANDALONE}, {@link
-     *              Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or
-     *              {@link Calendar#LONG_STANDALONE}
-     * @param locale
-     *              the desired locale
-     * @return the string representation of the {@code field value}, or {@code
-     *         null} if the string representation is not applicable or
-     *         the given calendar type is unknown
-     * @throws IllegalArgumentException
-     *         if {@code field} or {@code style} is invalid
-     * @throws NullPointerException if {@code locale} is {@code null}
-     * @see TimeZoneNameProvider
-     * @see java.util.Calendar#get(int)
-     * @see java.util.Calendar#getDisplayName(int, int, Locale)
-     */
-    public abstract String getDisplayName(String calendarType,
-                                          int field, int value,
-                                          int style, Locale locale);
-
-    /**
-     * Returns a {@code Map} containing all string representations (display
-     * names) of the {@code Calendar} {@code field} in the given {@code style}
-     * and {@code locale} and their corresponding field values.
-     *
-     * <p>{@code field} is a {@code Calendar} field index, such as {@link
-     * Calendar#MONTH}. The time zone fields, {@link Calendar#ZONE_OFFSET} and
-     * {@link Calendar#DST_OFFSET}, are <em>not</em> supported by this
-     * method. {@code null} must be returned if any time zone fields are specified.
-     *
-     * <p>{@code style} gives the style of the string representation. It must be
-     * one of {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} ({@link
-     * Calendar#SHORT SHORT}), {@link Calendar#SHORT_STANDALONE}, {@link
-     * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or {@link
-     * Calendar#LONG_STANDALONE}.
-     *
-     * <p>For example, the following call will return a {@code Map} containing
-     * {@code "January"} to {@link Calendar#JANUARY}, {@code "Jan"} to {@link
-     * Calendar#JANUARY}, {@code "February"} to {@link Calendar#FEBRUARY},
-     * {@code "Feb"} to {@link Calendar#FEBRUARY}, and so on.
-     * <pre>
-     * getDisplayNames("gregory", Calendar.MONTH, Calendar.ALL_STYLES, Locale.ENGLISH);
-     * </pre>
-     *
-     * @param calendarType
-     *              the calendar type. (Any calendar type given by {@code locale}
-     *              is ignored.)
-     * @param field
-     *              the calendar field for which the display names are returned
-     * @param style
-     *              the style applied to the display names; one of
-     *              {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT}
-     *              ({@link Calendar#SHORT SHORT}), {@link
-     *              Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT}
-     *              ({@link Calendar#LONG LONG}), or {@link
-     *              Calendar#LONG_STANDALONE}.
-     * @param locale
-     *              the desired locale
-     * @return a {@code Map} containing all display names of {@code field} in
-     *         {@code style} and {@code locale} and their {@code field} values,
-     *         or {@code null} if no display names are defined for {@code field}
-     * @throws NullPointerException
-     *         if {@code locale} is {@code null}
-     * @see Calendar#getDisplayNames(int, int, Locale)
-     */
-    public abstract Map<String, Integer> getDisplayNames(String calendarType,
-                                                         int field, int style,
-                                                         Locale locale);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/java/util/spi/CalendarNameProvider.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,264 @@
+/*
+ * Copyright (c) 2012, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.util.spi;
+
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * An abstract class for service providers that provide localized string
+ * representations (display names) of {@code Calendar} field values.
+ *
+ * <p><a name="calendartypes"><b>Calendar Types</b></a>
+ *
+ * <p>Calendar types are used to specify calendar systems for which the {@link
+ * #getDisplayName(String, int, int, int, Locale) getDisplayName} and {@link
+ * #getDisplayNames(String, int, int, Locale) getDisplayNames} methods provide
+ * calendar field value names. See {@link Calendar#getCalendarType()} for details.
+ *
+ * <p><b>Calendar Fields</b>
+ *
+ * <p>Calendar fields are specified with the constants defined in {@link
+ * Calendar}. The following are calendar-common fields and their values to be
+ * supported for each calendar system.
+ *
+ * <table style="border-bottom:1px solid" border="1" cellpadding="3" cellspacing="0" summary="Field values">
+ *   <tr>
+ *     <th>Field</th>
+ *     <th>Value</th>
+ *     <th>Description</th>
+ *   </tr>
+ *   <tr>
+ *     <td valign="top">{@link Calendar#MONTH}</td>
+ *     <td valign="top">{@link Calendar#JANUARY} to {@link Calendar#UNDECIMBER}</td>
+ *     <td>Month numbering is 0-based (e.g., 0 - January, ..., 11 -
+ *         December). Some calendar systems have 13 months. Month
+ *         names need to be supported in both the formatting and
+ *         stand-alone forms if required by the supported locales. If there's
+ *         no distinction in the two forms, the same names should be returned
+ *         in both of the forms.</td>
+ *   </tr>
+ *   <tr>
+ *     <td valign="top">{@link Calendar#DAY_OF_WEEK}</td>
+ *     <td valign="top">{@link Calendar#SUNDAY} to {@link Calendar#SATURDAY}</td>
+ *     <td>Day-of-week numbering is 1-based starting from Sunday (i.e., 1 - Sunday,
+ *         ..., 7 - Saturday).</td>
+ *   </tr>
+ *   <tr>
+ *     <td valign="top">{@link Calendar#AM_PM}</td>
+ *     <td valign="top">{@link Calendar#AM} to {@link Calendar#PM}</td>
+ *     <td>0 - AM, 1 - PM</td>
+ *   </tr>
+ * </table>
+ *
+ * <p style="margin-top:20px">The following are calendar-specific fields and their values to be supported.
+ *
+ * <table style="border-bottom:1px solid" border="1" cellpadding="3" cellspacing="0" summary="Calendar type and field values">
+ *   <tr>
+ *     <th>Calendar Type</th>
+ *     <th>Field</th>
+ *     <th>Value</th>
+ *     <th>Description</th>
+ *   </tr>
+ *   <tr>
+ *     <td rowspan="2" valign="top">{@code "gregory"}</td>
+ *     <td rowspan="2" valign="top">{@link Calendar#ERA}</td>
+ *     <td>0</td>
+ *     <td>{@link java.util.GregorianCalendar#BC} (BCE)</td>
+ *   </tr>
+ *   <tr>
+ *     <td>1</td>
+ *     <td>{@link java.util.GregorianCalendar#AD} (CE)</td>
+ *   </tr>
+ *   <tr>
+ *     <td rowspan="2" valign="top">{@code "buddhist"}</td>
+ *     <td rowspan="2" valign="top">{@link Calendar#ERA}</td>
+ *     <td>0</td>
+ *     <td>BC (BCE)</td>
+ *   </tr>
+ *   <tr>
+ *     <td>1</td>
+ *     <td>B.E. (Buddhist Era)</td>
+ *   </tr>
+ *   <tr>
+ *     <td rowspan="6" valign="top">{@code "japanese"}</td>
+ *     <td rowspan="5" valign="top">{@link Calendar#ERA}</td>
+ *     <td>0</td>
+ *     <td>Seireki (Before Meiji)</td>
+ *   </tr>
+ *   <tr>
+ *     <td>1</td>
+ *     <td>Meiji</td>
+ *   </tr>
+ *   <tr>
+ *     <td>2</td>
+ *     <td>Taisho</td>
+ *   </tr>
+ *   <tr>
+ *     <td>3</td>
+ *     <td>Showa</td>
+ *   </tr>
+ *   <tr>
+ *     <td>4</td>
+ *     <td >Heisei</td>
+ *   </tr>
+ *   <tr>
+ *     <td>{@link Calendar#YEAR}</td>
+ *     <td>1</td>
+ *     <td>the first year in each era. It should be returned when a long
+ *     style ({@link Calendar#LONG_FORMAT} or {@link Calendar#LONG_STANDALONE}) is
+ *     specified. See also the <a href="../../text/SimpleDateFormat.html#year">
+ *     Year representation in {@code SimpleDateFormat}</a>.</td>
+ *   </tr>
+ * </table>
+ *
+ * <p>Calendar field value names for {@code "gregory"} must be consistent with
+ * the date-time symbols provided by {@link java.text.spi.DateFormatSymbolsProvider}.
+ *
+ * <p>Time zone names are supported by {@link TimeZoneNameProvider}.
+ *
+ * @author Masayoshi Okutsu
+ * @since 1.8
+ * @see CalendarDataProvider
+ * @see Locale#getUnicodeLocaleType(String)
+ */
+public abstract class CalendarNameProvider extends LocaleServiceProvider {
+    /**
+     * Sole constructor. (For invocation by subclass constructors, typically
+     * implicit.)
+     */
+    protected CalendarNameProvider() {
+    }
+
+    /**
+     * Returns the string representation (display name) of the calendar
+     * <code>field value</code> in the given <code>style</code> and
+     * <code>locale</code>.  If no string representation is
+     * applicable, <code>null</code> is returned.
+     *
+     * <p>{@code field} is a {@code Calendar} field index, such as {@link
+     * Calendar#MONTH}. The time zone fields, {@link Calendar#ZONE_OFFSET} and
+     * {@link Calendar#DST_OFFSET}, are <em>not</em> supported by this
+     * method. {@code null} must be returned if any time zone fields are
+     * specified.
+     *
+     * <p>{@code value} is the numeric representation of the {@code field} value.
+     * For example, if {@code field} is {@link Calendar#DAY_OF_WEEK}, the valid
+     * values are {@link Calendar#SUNDAY} to {@link Calendar#SATURDAY}
+     * (inclusive).
+     *
+     * <p>{@code style} gives the style of the string representation. It is one
+     * of {@link Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}),
+     * {@link Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT}
+     * ({@link Calendar#LONG LONG}), or {@link Calendar#LONG_STANDALONE}.
+     *
+     * <p>For example, the following call will return {@code "Sunday"}.
+     * <pre>
+     * getDisplayName("gregory", Calendar.DAY_OF_WEEK, Calendar.SUNDAY,
+     *                Calendar.LONG_STANDALONE, Locale.ENGLISH);
+     * </pre>
+     *
+     * @param calendarType
+     *              the calendar type. (Any calendar type given by {@code locale}
+     *              is ignored.)
+     * @param field
+     *              the {@code Calendar} field index,
+     *              such as {@link Calendar#DAY_OF_WEEK}
+     * @param value
+     *              the value of the {@code Calendar field},
+     *              such as {@link Calendar#MONDAY}
+     * @param style
+     *              the string representation style: one of {@link
+     *              Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}),
+     *              {@link Calendar#SHORT_STANDALONE}, {@link
+     *              Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or
+     *              {@link Calendar#LONG_STANDALONE}
+     * @param locale
+     *              the desired locale
+     * @return the string representation of the {@code field value}, or {@code
+     *         null} if the string representation is not applicable or
+     *         the given calendar type is unknown
+     * @throws IllegalArgumentException
+     *         if {@code field} or {@code style} is invalid
+     * @throws NullPointerException if {@code locale} is {@code null}
+     * @see TimeZoneNameProvider
+     * @see java.util.Calendar#get(int)
+     * @see java.util.Calendar#getDisplayName(int, int, Locale)
+     */
+    public abstract String getDisplayName(String calendarType,
+                                          int field, int value,
+                                          int style, Locale locale);
+
+    /**
+     * Returns a {@code Map} containing all string representations (display
+     * names) of the {@code Calendar} {@code field} in the given {@code style}
+     * and {@code locale} and their corresponding field values.
+     *
+     * <p>{@code field} is a {@code Calendar} field index, such as {@link
+     * Calendar#MONTH}. The time zone fields, {@link Calendar#ZONE_OFFSET} and
+     * {@link Calendar#DST_OFFSET}, are <em>not</em> supported by this
+     * method. {@code null} must be returned if any time zone fields are specified.
+     *
+     * <p>{@code style} gives the style of the string representation. It must be
+     * one of {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} ({@link
+     * Calendar#SHORT SHORT}), {@link Calendar#SHORT_STANDALONE}, {@link
+     * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or {@link
+     * Calendar#LONG_STANDALONE}.
+     *
+     * <p>For example, the following call will return a {@code Map} containing
+     * {@code "January"} to {@link Calendar#JANUARY}, {@code "Jan"} to {@link
+     * Calendar#JANUARY}, {@code "February"} to {@link Calendar#FEBRUARY},
+     * {@code "Feb"} to {@link Calendar#FEBRUARY}, and so on.
+     * <pre>
+     * getDisplayNames("gregory", Calendar.MONTH, Calendar.ALL_STYLES, Locale.ENGLISH);
+     * </pre>
+     *
+     * @param calendarType
+     *              the calendar type. (Any calendar type given by {@code locale}
+     *              is ignored.)
+     * @param field
+     *              the calendar field for which the display names are returned
+     * @param style
+     *              the style applied to the display names; one of
+     *              {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT}
+     *              ({@link Calendar#SHORT SHORT}), {@link
+     *              Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT}
+     *              ({@link Calendar#LONG LONG}), or {@link
+     *              Calendar#LONG_STANDALONE}.
+     * @param locale
+     *              the desired locale
+     * @return a {@code Map} containing all display names of {@code field} in
+     *         {@code style} and {@code locale} and their {@code field} values,
+     *         or {@code null} if no display names are defined for {@code field}
+     * @throws NullPointerException
+     *         if {@code locale} is {@code null}
+     * @see Calendar#getDisplayNames(int, int, Locale)
+     */
+    public abstract Map<String, Integer> getDisplayNames(String calendarType,
+                                                         int field, int style,
+                                                         Locale locale);
+}
--- a/jdk/src/share/classes/javax/net/ssl/HandshakeCompletedEvent.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/HandshakeCompletedEvent.java	Tue Nov 20 11:49:27 2012 -0800
@@ -29,7 +29,6 @@
 import java.security.cert.Certificate;
 import java.security.Principal;
 import java.security.cert.X509Certificate;
-import javax.security.auth.x500.X500Principal;
 
 /**
  * This event indicates that an SSL handshake completed on a given
--- a/jdk/src/share/classes/javax/net/ssl/HostnameVerifier.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/HostnameVerifier.java	Tue Nov 20 11:49:27 2012 -0800
@@ -40,6 +40,7 @@
  * verification fail.
  *
  * @author Brad R. Wetmore
+ * @see HostnameVerifierFactory
  * @since 1.4
  */
 
--- a/jdk/src/share/classes/javax/net/ssl/HttpsURLConnection.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/HttpsURLConnection.java	Tue Nov 20 11:49:27 2012 -0800
@@ -29,7 +29,6 @@
 import java.net.HttpURLConnection;
 import java.security.Principal;
 import java.security.cert.X509Certificate;
-import javax.security.auth.x500.X500Principal;
 
 /**
  * <code>HttpsURLConnection</code> extends <code>HttpURLConnection</code>
@@ -196,6 +195,7 @@
      */
     private static class DefaultHostnameVerifier
             implements HostnameVerifier {
+        @Override
         public boolean verify(String hostname, SSLSession session) {
             return false;
         }
--- a/jdk/src/share/classes/javax/net/ssl/KeyManagerFactory.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/KeyManagerFactory.java	Tue Nov 20 11:49:27 2012 -0800
@@ -68,6 +68,7 @@
     public final static String getDefaultAlgorithm() {
         String type;
         type = AccessController.doPrivileged(new PrivilegedAction<String>() {
+            @Override
             public String run() {
                 return Security.getProperty(
                     "ssl.KeyManagerFactory.algorithm");
--- a/jdk/src/share/classes/javax/net/ssl/SSLContext.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/SSLContext.java	Tue Nov 20 11:49:27 2012 -0800
@@ -26,7 +26,6 @@
 package javax.net.ssl;
 
 import java.security.*;
-import java.util.*;
 
 import sun.security.jca.GetInstance;
 
--- a/jdk/src/share/classes/javax/net/ssl/SSLContextSpi.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/SSLContextSpi.java	Tue Nov 20 11:49:27 2012 -0800
@@ -25,7 +25,6 @@
 
 package javax.net.ssl;
 
-import java.util.*;
 import java.security.*;
 
 /**
--- a/jdk/src/share/classes/javax/net/ssl/SSLEngineResult.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/SSLEngineResult.java	Tue Nov 20 11:49:27 2012 -0800
@@ -230,6 +230,7 @@
     /**
      * Returns a String representation of this object.
      */
+    @Override
     public String toString() {
         return ("Status = " + status +
             " HandshakeStatus = " + handshakeStatus +
--- a/jdk/src/share/classes/javax/net/ssl/SSLParameters.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/SSLParameters.java	Tue Nov 20 11:49:27 2012 -0800
@@ -28,13 +28,11 @@
 import java.security.AlgorithmConstraints;
 import java.util.Map;
 import java.util.List;
-import java.util.HashSet;
 import java.util.HashMap;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
-import java.util.regex.Pattern;
 
 /**
  * Encapsulates parameters for an SSL/TLS connection. The parameters
--- a/jdk/src/share/classes/javax/net/ssl/SSLPermission.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/SSLPermission.java	Tue Nov 20 11:49:27 2012 -0800
@@ -26,11 +26,6 @@
 package javax.net.ssl;
 
 import java.security.*;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-import java.security.Permissions;
-import java.lang.SecurityManager;
 
 /**
  * This class is for various network permissions.
--- a/jdk/src/share/classes/javax/net/ssl/SSLServerSocketFactory.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/SSLServerSocketFactory.java	Tue Nov 20 11:49:27 2012 -0800
@@ -160,23 +160,27 @@
             new SocketException(reason.toString()).initCause(reason);
     }
 
+    @Override
     public ServerSocket createServerSocket() throws IOException {
         return throwException();
     }
 
 
+    @Override
     public ServerSocket createServerSocket(int port)
     throws IOException
     {
         return throwException();
     }
 
+    @Override
     public ServerSocket createServerSocket(int port, int backlog)
     throws IOException
     {
         return throwException();
     }
 
+    @Override
     public ServerSocket
     createServerSocket(int port, int backlog, InetAddress ifAddress)
     throws IOException
@@ -184,10 +188,12 @@
         return throwException();
     }
 
+    @Override
     public String [] getDefaultCipherSuites() {
         return new String[0];
     }
 
+    @Override
     public String [] getSupportedCipherSuites() {
         return new String[0];
     }
--- a/jdk/src/share/classes/javax/net/ssl/SSLSession.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/SSLSession.java	Tue Nov 20 11:49:27 2012 -0800
@@ -25,7 +25,6 @@
 
 package javax.net.ssl;
 
-import java.net.InetAddress;
 import java.security.Principal;
 
 /**
--- a/jdk/src/share/classes/javax/net/ssl/SSLSocket.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/SSLSocket.java	Tue Nov 20 11:49:27 2012 -0800
@@ -28,9 +28,6 @@
 
 import java.io.IOException;
 import java.net.*;
-import java.util.Enumeration;
-import java.util.Vector;
-
 
 /**
  * This class extends <code>Socket</code>s and provides secure
--- a/jdk/src/share/classes/javax/net/ssl/SSLSocketFactory.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/SSLSocketFactory.java	Tue Nov 20 11:49:27 2012 -0800
@@ -127,6 +127,7 @@
 
     static String getSecurityProperty(final String name) {
         return AccessController.doPrivileged(new PrivilegedAction<String>() {
+            @Override
             public String run() {
                 String s = java.security.Security.getProperty(name);
                 if (s != null) {
@@ -247,18 +248,21 @@
             new SocketException(reason.toString()).initCause(reason);
     }
 
+    @Override
     public Socket createSocket()
     throws IOException
     {
         return throwException();
     }
 
+    @Override
     public Socket createSocket(String host, int port)
     throws IOException
     {
         return throwException();
     }
 
+    @Override
     public Socket createSocket(Socket s, String host,
                                 int port, boolean autoClose)
     throws IOException
@@ -266,12 +270,14 @@
         return throwException();
     }
 
+    @Override
     public Socket createSocket(InetAddress address, int port)
     throws IOException
     {
         return throwException();
     }
 
+    @Override
     public Socket createSocket(String host, int port,
         InetAddress clientAddress, int clientPort)
     throws IOException
@@ -279,6 +285,7 @@
         return throwException();
     }
 
+    @Override
     public Socket createSocket(InetAddress address, int port,
         InetAddress clientAddress, int clientPort)
     throws IOException
@@ -286,10 +293,12 @@
         return throwException();
     }
 
+    @Override
     public String [] getDefaultCipherSuites() {
         return new String[0];
     }
 
+    @Override
     public String [] getSupportedCipherSuites() {
         return new String[0];
     }
--- a/jdk/src/share/classes/javax/net/ssl/TrustManagerFactory.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/TrustManagerFactory.java	Tue Nov 20 11:49:27 2012 -0800
@@ -65,6 +65,7 @@
     public final static String getDefaultAlgorithm() {
         String type;
         type = AccessController.doPrivileged(new PrivilegedAction<String>() {
+            @Override
             public String run() {
                 return Security.getProperty(
                     "ssl.TrustManagerFactory.algorithm");
--- a/jdk/src/share/classes/javax/net/ssl/X509KeyManager.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/javax/net/ssl/X509KeyManager.java	Tue Nov 20 11:49:27 2012 -0800
@@ -25,7 +25,6 @@
 
 package javax.net.ssl;
 
-import java.security.KeyManagementException;
 import java.security.PrivateKey;
 import java.security.Principal;
 import java.security.cert.X509Certificate;
--- a/jdk/src/share/classes/sun/launcher/LauncherHelper.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/launcher/LauncherHelper.java	Tue Nov 20 11:49:27 2012 -0800
@@ -69,7 +69,6 @@
 public enum LauncherHelper {
     INSTANCE;
     private static final String MAIN_CLASS = "Main-Class";
-
     private static StringBuilder outBuf = new StringBuilder();
 
     private static final String INDENT = "    ";
@@ -87,6 +86,9 @@
         private static final ResourceBundle RB =
                 ResourceBundle.getBundle(defaultBundleName);
     }
+    private static PrintStream ostream;
+    private static final ClassLoader scloader = ClassLoader.getSystemClassLoader();
+    private static Class<?> appClass; // application class, for GUI/reporting purposes
 
     /*
      * A method called by the launcher to print out the standard settings,
@@ -114,27 +116,27 @@
             long initialHeapSize, long maxHeapSize, long stackSize,
             boolean isServer) {
 
-        PrintStream ostream = (printToStderr) ? System.err : System.out;
+        initOutput(printToStderr);
         String opts[] = optionFlag.split(":");
         String optStr = (opts.length > 1 && opts[1] != null)
                 ? opts[1].trim()
                 : "all";
         switch (optStr) {
             case "vm":
-                printVmSettings(ostream, initialHeapSize, maxHeapSize,
-                        stackSize, isServer);
+                printVmSettings(initialHeapSize, maxHeapSize,
+                                stackSize, isServer);
                 break;
             case "properties":
-                printProperties(ostream);
+                printProperties();
                 break;
             case "locale":
-                printLocale(ostream);
+                printLocale();
                 break;
             default:
-                printVmSettings(ostream, initialHeapSize, maxHeapSize,
-                        stackSize, isServer);
-                printProperties(ostream);
-                printLocale(ostream);
+                printVmSettings(initialHeapSize, maxHeapSize, stackSize,
+                                isServer);
+                printProperties();
+                printLocale();
                 break;
         }
     }
@@ -142,7 +144,7 @@
     /*
      * prints the main vm settings subopt/section
      */
-    private static void printVmSettings(PrintStream ostream,
+    private static void printVmSettings(
             long initialHeapSize, long maxHeapSize,
             long stackSize, boolean isServer) {
 
@@ -172,14 +174,14 @@
     /*
      * prints the properties subopt/section
      */
-    private static void printProperties(PrintStream ostream) {
+    private static void printProperties() {
         Properties p = System.getProperties();
         ostream.println(PROP_SETTINGS);
         List<String> sortedPropertyKeys = new ArrayList<>();
         sortedPropertyKeys.addAll(p.stringPropertyNames());
         Collections.sort(sortedPropertyKeys);
         for (String x : sortedPropertyKeys) {
-            printPropertyValue(ostream, x, p.getProperty(x));
+            printPropertyValue(x, p.getProperty(x));
         }
         ostream.println();
     }
@@ -188,8 +190,7 @@
         return key.endsWith(".dirs") || key.endsWith(".path");
     }
 
-    private static void printPropertyValue(PrintStream ostream,
-            String key, String value) {
+    private static void printPropertyValue(String key, String value) {
         ostream.print(INDENT + key + " = ");
         if (key.equals("line.separator")) {
             for (byte b : value.getBytes()) {
@@ -229,7 +230,7 @@
     /*
      * prints the locale subopt/section
      */
-    private static void printLocale(PrintStream ostream) {
+    private static void printLocale() {
         Locale locale = Locale.getDefault();
         ostream.println(LOCALE_SETTINGS);
         ostream.println(INDENT + "default locale = " +
@@ -238,11 +239,11 @@
                 Locale.getDefault(Category.DISPLAY).getDisplayName());
         ostream.println(INDENT + "default format locale = " +
                 Locale.getDefault(Category.FORMAT).getDisplayName());
-        printLocales(ostream);
+        printLocales();
         ostream.println();
     }
 
-    private static void printLocales(PrintStream ostream) {
+    private static void printLocales() {
         Locale[] tlocales = Locale.getAvailableLocales();
         final int len = tlocales == null ? 0 : tlocales.length;
         if (len < 1 ) {
@@ -370,7 +371,7 @@
      * initHelpSystem must be called before using this method.
      */
     static void printHelpMessage(boolean printToStderr) {
-        PrintStream ostream = (printToStderr) ? System.err : System.out;
+        initOutput(printToStderr);
         outBuf = outBuf.append(getLocalizedMessage("java.launcher.opt.footer",
                 File.pathSeparator));
         ostream.println(outBuf.toString());
@@ -380,7 +381,7 @@
      * Prints the Xusage text to the desired output stream.
      */
     static void printXUsageMessage(boolean printToStderr) {
-        PrintStream ostream =  (printToStderr) ? System.err : System.out;
+        initOutput(printToStderr);
         ostream.println(getLocalizedMessage("java.launcher.X.usage",
                 File.pathSeparator));
         if (System.getProperty("os.name").contains("OS X")) {
@@ -389,36 +390,32 @@
         }
     }
 
-    static String getMainClassFromJar(PrintStream ostream, String jarname) {
-        try {
-            JarFile jarFile = null;
-            try {
-                jarFile = new JarFile(jarname);
-                Manifest manifest = jarFile.getManifest();
-                if (manifest == null) {
-                    abort(ostream, null, "java.launcher.jar.error2", jarname);
-                }
-                Attributes mainAttrs = manifest.getMainAttributes();
-                if (mainAttrs == null) {
-                    abort(ostream, null, "java.launcher.jar.error3", jarname);
-                }
-                String mainValue = mainAttrs.getValue(MAIN_CLASS);
-                if (mainValue == null) {
-                    abort(ostream, null, "java.launcher.jar.error3", jarname);
-                }
-                return mainValue.trim();
-            } finally {
-                if (jarFile != null) {
-                    jarFile.close();
-                }
+    static void initOutput(boolean printToStderr) {
+        ostream =  (printToStderr) ? System.err : System.out;
+    }
+
+    static String getMainClassFromJar(String jarname) {
+        String mainValue = null;
+        try (JarFile jarFile = new JarFile(jarname)) {
+            Manifest manifest = jarFile.getManifest();
+            if (manifest == null) {
+                abort(null, "java.launcher.jar.error2", jarname);
             }
+            Attributes mainAttrs = manifest.getMainAttributes();
+            if (mainAttrs == null) {
+                abort(null, "java.launcher.jar.error3", jarname);
+            }
+            mainValue = mainAttrs.getValue(MAIN_CLASS);
+            if (mainValue == null) {
+                abort(null, "java.launcher.jar.error3", jarname);
+            }
+            return mainValue.trim();
         } catch (IOException ioe) {
-            abort(ostream, ioe, "java.launcher.jar.error1", jarname);
+            abort(ioe, "java.launcher.jar.error1", jarname);
         }
         return null;
     }
 
-
     // From src/share/bin/java.c:
     //   enum LaunchMode { LM_UNKNOWN = 0, LM_CLASS, LM_JAR };
 
@@ -426,7 +423,7 @@
     private static final int LM_CLASS   = 1;
     private static final int LM_JAR     = 2;
 
-    static void abort(PrintStream ostream, Throwable t, String msgKey, Object... args) {
+    static void abort(Throwable t, String msgKey, Object... args) {
         if (msgKey != null) {
             ostream.println(getLocalizedMessage(msgKey, args));
         }
@@ -450,19 +447,22 @@
      *    b. is there a main
      *    c. is the main public
      *    d. is the main static
-     *    c. does the main take a String array for args
-     * 4. and off we go......
+     *    e. does the main take a String array for args
+     * 4. if no main method and if the class extends FX Application, then call
+     *    on FXHelper to determine the main class to launch
+     * 5. and off we go......
      *
-     * @param printToStderr
-     * @param isJar
-     * @param name
-     * @return
+     * @param printToStderr if set, all output will be routed to stderr
+     * @param mode LaunchMode as determined by the arguments passed on the
+     * command line
+     * @param what either the jar file to launch or the main class when using
+     * LM_CLASS mode
+     * @return the application's main class
      */
     public static Class<?> checkAndLoadMain(boolean printToStderr,
                                             int mode,
                                             String what) {
-        final PrintStream ostream = (printToStderr) ? System.err : System.out;
-        final ClassLoader ld = ClassLoader.getSystemClassLoader();
+        initOutput(printToStderr);
         // get the class name
         String cn = null;
         switch (mode) {
@@ -470,44 +470,75 @@
                 cn = what;
                 break;
             case LM_JAR:
-                cn = getMainClassFromJar(ostream, what);
+                cn = getMainClassFromJar(what);
                 break;
             default:
                 // should never happen
                 throw new InternalError("" + mode + ": Unknown launch mode");
         }
         cn = cn.replace('/', '.');
-        Class<?> c = null;
+        Class<?> mainClass = null;
         try {
-            c = ld.loadClass(cn);
-        } catch (ClassNotFoundException cnfe) {
-            abort(ostream, cnfe, "java.launcher.cls.error1", cn);
+            mainClass = scloader.loadClass(cn);
+        } catch (NoClassDefFoundError | ClassNotFoundException cnfe) {
+            abort(cnfe, "java.launcher.cls.error1", cn);
         }
-        getMainMethod(ostream, c);
-        return c;
+        // set to mainClass, FXHelper may return something else
+        appClass = mainClass;
+
+        Method m = getMainMethod(mainClass);
+        if (m != null) {
+            // this will abort if main method has the wrong signature
+            validateMainMethod(m);
+            return mainClass;
+        }
+
+        // Check if FXHelper can launch it using the FX launcher
+        Class<?> fxClass = FXHelper.getFXMainClass(mainClass);
+        if (fxClass != null) {
+            return fxClass;
+        }
+
+        // not an FX application either, abort with an error
+        abort(null, "java.launcher.cls.error4", mainClass.getName(),
+              FXHelper.JAVAFX_APPLICATION_CLASS_NAME);
+        return null; // avoid compiler error...
     }
 
-    static Method getMainMethod(PrintStream ostream, Class<?> clazz) {
-        String classname = clazz.getName();
-        Method method = null;
+    /*
+     * Accessor method called by the launcher after getting the main class via
+     * checkAndLoadMain(). The "application class" is the class that is finally
+     * executed to start the application and in this case is used to report
+     * the correct application name, typically for UI purposes.
+     */
+    public static Class<?> getApplicationClass() {
+        return appClass;
+    }
+
+    // Check for main method or return null if not found
+    static Method getMainMethod(Class<?> clazz) {
         try {
-            method = clazz.getMethod("main", String[].class);
-        } catch (NoSuchMethodException nsme) {
-            abort(ostream, null, "java.launcher.cls.error4", classname);
-        }
+            return clazz.getMethod("main", String[].class);
+        } catch (NoSuchMethodException nsme) {}
+        return null;
+    }
+
+    // Check the signature of main and abort if it's incorrect
+    static void validateMainMethod(Method mainMethod) {
         /*
          * getMethod (above) will choose the correct method, based
          * on its name and parameter type, however, we still have to
          * ensure that the method is static and returns a void.
          */
-        int mod = method.getModifiers();
+        int mod = mainMethod.getModifiers();
         if (!Modifier.isStatic(mod)) {
-            abort(ostream, null, "java.launcher.cls.error2", "static", classname);
+            abort(null, "java.launcher.cls.error2", "static",
+                  mainMethod.getDeclaringClass().getName());
         }
-        if (method.getReturnType() != java.lang.Void.TYPE) {
-            abort(ostream, null, "java.launcher.cls.error3", classname);
+        if (mainMethod.getReturnType() != java.lang.Void.TYPE) {
+            abort(null, "java.launcher.cls.error3",
+                  mainMethod.getDeclaringClass().getName());
         }
-        return method;
     }
 
     private static final String encprop = "sun.jnu.encoding";
@@ -519,7 +550,7 @@
      * previously implemented as a native method in the launcher.
      */
     static String makePlatformString(boolean printToStderr, byte[] inArray) {
-        final PrintStream ostream = (printToStderr) ? System.err : System.out;
+        initOutput(printToStderr);
         if (encoding == null) {
             encoding = System.getProperty(encprop);
             isCharsetSupported = Charset.isSupported(encoding);
@@ -530,7 +561,7 @@
                     : new String(inArray);
             return out;
         } catch (UnsupportedEncodingException uee) {
-            abort(ostream, uee, null);
+            abort(uee, null);
         }
         return null; // keep the compiler happy
     }
@@ -611,5 +642,65 @@
             return "StdArg{" + "arg=" + arg + ", needsExpansion=" + needsExpansion + '}';
         }
     }
+
+    static final class FXHelper {
+        private static final String JAVAFX_APPLICATION_CLASS_NAME =
+                "javafx.application.Application";
+        private static final String JAVAFX_LAUNCHER_CLASS_NAME =
+                "com.sun.javafx.application.LauncherImpl";
+
+        /*
+         * FX application launcher and launch method, so we can launch
+         * applications with no main method.
+         */
+        private static Class<?> fxLauncherClass    = null;
+        private static Method   fxLauncherMethod   = null;
+
+        /*
+         * We can assume that the class does NOT have a main method or it would
+         * have been handled already. We do, however, need to check if the class
+         * extends Application and the launcher is available and abort with an
+         * error if it's not.
+         */
+        private static Class<?> getFXMainClass(Class<?> mainClass) {
+            // Check if mainClass extends Application
+            if (!doesExtendFXApplication(mainClass)) {
+                return null;
+            }
+
+            // Check for the FX launcher classes
+            try {
+                fxLauncherClass = scloader.loadClass(JAVAFX_LAUNCHER_CLASS_NAME);
+                fxLauncherMethod = fxLauncherClass.getMethod("launchApplication",
+                        Class.class, String[].class);
+            } catch (ClassNotFoundException | NoSuchMethodException ex) {
+                abort(ex, "java.launcher.cls.error5", ex);
+            }
+
+            // That's all, return this class so we can launch later
+            return FXHelper.class;
+        }
+
+        /*
+         * Check if the given class is a JavaFX Application class. This is done
+         * in a way that does not cause the Application class to load or throw
+         * ClassNotFoundException if the JavaFX runtime is not available.
+         */
+        private static boolean doesExtendFXApplication(Class<?> mainClass) {
+            for (Class<?> sc = mainClass.getSuperclass(); sc != null;
+                    sc = sc.getSuperclass()) {
+                if (sc.getName().equals(JAVAFX_APPLICATION_CLASS_NAME)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        // preloader ?
+        public static void main(String... args) throws Exception {
+            // launch appClass via fxLauncherMethod
+            fxLauncherMethod.invoke(null, new Object[] {appClass, args});
+        }
+    }
 }
 
--- a/jdk/src/share/classes/sun/launcher/resources/launcher.properties	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher.properties	Tue Nov 20 11:49:27 2012 -0800
@@ -131,7 +131,10 @@
 \   public static void main(String[] args)
 java.launcher.cls.error4=\
     Error: Main method not found in class {0}, please define the main method as:\n\
-\   public static void main(String[] args)
+\   public static void main(String[] args)\n\
+    or a JavaFX application class must extend {1}
+java.launcher.cls.error5=\
+    Error: JavaFX runtime components are missing, and are required to run this application
 java.launcher.jar.error1=\
     Error: An unexpected error occurred while trying to open file {0}
 java.launcher.jar.error2=manifest not found in {0}
--- a/jdk/src/share/classes/sun/security/krb5/Config.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/security/krb5/Config.java	Tue Nov 20 11:49:27 2012 -0800
@@ -1123,7 +1123,7 @@
      */
     private String getKDCFromDNS(String realm) throws KrbException {
         // use DNS to locate KDC
-        String kdcs = null;
+        String kdcs = "";
         String[] srvs = null;
         // locate DNS SRV record using UDP
         if (DEBUG) {
@@ -1133,7 +1133,7 @@
         if (srvs == null) {
             // locate DNS SRV record using TCP
             if (DEBUG) {
-                System.out.println("getKDCFromDNS using UDP");
+                System.out.println("getKDCFromDNS using TCP");
             }
             srvs = KrbServiceLocator.getKerberosService(realm, "_tcp");
         }
@@ -1142,14 +1142,15 @@
             throw new KrbException(Krb5.KRB_ERR_GENERIC,
                 "Unable to locate KDC for realm " + realm);
         }
+        if (srvs.length == 0) {
+            return null;
+        }
         for (int i = 0; i < srvs.length; i++) {
-            String value = srvs[i];
-            for (int j = 0; j < srvs[i].length(); j++) {
-                // filter the KDC name
-                if (value.charAt(j) == ':') {
-                    kdcs = (value.substring(0, j)).trim();
-                }
-            }
+            kdcs += srvs[i].trim() + " ";
+        }
+        kdcs = kdcs.trim();
+        if (kdcs.equals("")) {
+            return null;
         }
         return kdcs;
     }
--- a/jdk/src/share/classes/sun/tools/jar/Main.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/tools/jar/Main.java	Tue Nov 20 11:49:27 2012 -0800
@@ -839,8 +839,8 @@
 
     void replaceFSC(String files[]) {
         if (files != null) {
-            for (String file : files) {
-                file = file.replace(File.separatorChar, '/');
+            for (int i = 0; i < files.length; i++) {
+                files[i] = files[i].replace(File.separatorChar, '/');
             }
         }
     }
--- a/jdk/src/share/classes/sun/util/locale/provider/AuxLocaleProviderAdapter.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/util/locale/provider/AuxLocaleProviderAdapter.java	Tue Nov 20 11:49:27 2012 -0800
@@ -38,6 +38,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.spi.CalendarDataProvider;
+import java.util.spi.CalendarNameProvider;
 import java.util.spi.CurrencyNameProvider;
 import java.util.spi.LocaleNameProvider;
 import java.util.spi.LocaleServiceProvider;
@@ -135,6 +136,10 @@
         return getLocaleServiceProvider(CalendarDataProvider.class);
     }
 
+    @Override
+    public CalendarNameProvider getCalendarNameProvider() {
+        return getLocaleServiceProvider(CalendarNameProvider.class);
+    }
 
     @Override
     public LocaleResources getLocaleResources(Locale locale) {
--- a/jdk/src/share/classes/sun/util/locale/provider/CalendarDataProviderImpl.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/util/locale/provider/CalendarDataProviderImpl.java	Tue Nov 20 11:49:27 2012 -0800
@@ -24,10 +24,9 @@
  */
 package sun.util.locale.provider;
 
+import java.util.Calendar;
 import static java.util.Calendar.*;
-import java.util.HashMap;
 import java.util.Locale;
-import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.spi.CalendarDataProvider;
@@ -59,115 +58,11 @@
     }
 
     @Override
-    public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) {
-        String name = null;
-        String key = getKey(calendarType, field, style);
-        if (key != null) {
-            ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale);
-            if (rb.containsKey(key)) {
-                String[] strings = rb.getStringArray(key);
-                if (strings.length > 0) {
-                    if (field == DAY_OF_WEEK || field == YEAR) {
-                        --value;
-                    }
-                    name = strings[value];
-                    // If name is empty in standalone, try its `format' style.
-                    if (name.length() == 0
-                            && (style == SHORT_STANDALONE || style == LONG_STANDALONE)) {
-                        name = getDisplayName(calendarType, field, value,
-                                              style == SHORT_STANDALONE ? SHORT_FORMAT : LONG_FORMAT,
-                                              locale);
-                    }
-                }
-            }
-        }
-        return name;
-    }
-
-    @Override
-    public Map<String, Integer> getDisplayNames(String calendarType, int field, int style, Locale locale) {
-        Map<String, Integer> names;
-        if (style == ALL_STYLES) {
-            names = getDisplayNamesImpl(calendarType, field, SHORT_FORMAT, locale);
-            if (field != AM_PM) {
-                for (int st : new int[] { SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE }) {
-                    names.putAll(getDisplayNamesImpl(calendarType, field, st, locale));
-                }
-            }
-        } else {
-            // specific style
-            names = getDisplayNamesImpl(calendarType, field, style, locale);
-        }
-        return names.isEmpty() ? null : names;
-    }
-
-    private Map<String, Integer> getDisplayNamesImpl(String calendarType, int field,
-                                                     int style, Locale locale) {
-        String key = getKey(calendarType, field, style);
-        Map<String, Integer> map = new HashMap<>();
-        if (key != null) {
-            ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale);
-            if (rb.containsKey(key)) {
-                String[] strings = rb.getStringArray(key);
-                if (field == YEAR) {
-                    if (strings.length > 0) {
-                        map.put(strings[0], 1);
-                    }
-                } else {
-                    int base = (field == DAY_OF_WEEK) ? 1 : 0;
-                    for (int i = 0; i < strings.length; i++) {
-                        String name = strings[i];
-                        // Ignore any empty string (some standalone month names
-                        // are not defined)
-                        if (name.length() == 0) {
-                            continue;
-                        }
-                        map.put(name, base + i);
-                    }
-                }
-            }
-        }
-        return map;
-    }
-
-    @Override
     public Locale[] getAvailableLocales() {
         return LocaleProviderAdapter.toLocaleArray(langtags);
     }
 
     @Override
-    public boolean isSupportedLocale(Locale locale) {
-        if (Locale.ROOT.equals(locale)) {
-            return true;
-        }
-        String calendarType = null;
-        if (locale.hasExtensions()) {
-            calendarType = locale.getUnicodeLocaleType("ca");
-            locale = locale.stripExtensions();
-        }
-
-        if (calendarType != null) {
-            switch (calendarType) {
-            case "buddhist":
-            case "japanese":
-            case "gregory":
-                break;
-            default:
-                // Unknown calendar type
-                return false;
-            }
-        }
-        if (langtags.contains(locale.toLanguageTag())) {
-            return true;
-        }
-        if (type == LocaleProviderAdapter.Type.JRE) {
-            String oldname = locale.toString().replace('_', '-');
-            return langtags.contains(oldname);
-        }
-        return false;
-    }
-
-    @Override
     public Set<String> getAvailableLanguageTags() {
         return langtags;
     }
@@ -178,49 +73,6 @@
             String firstday = rb.getString(key);
             return Integer.parseInt(firstday);
         }
-        // Note that the base bundle of CLDR doesn't have the Calendar week parameters.
         return 0;
     }
-
-    private String getKey(String type, int field, int style) {
-        boolean standalone = (style & 0x8000) != 0;
-        style &= ~0x8000;
-
-        if ("gregory".equals(type)) {
-            type = null;
-        }
-
-        StringBuilder key = new StringBuilder();
-        switch (field) {
-        case ERA:
-            if (type != null) {
-                key.append(type).append('.');
-            }
-            if (style == SHORT) {
-                key.append("short.");
-            }
-            key.append("Eras");
-            break;
-
-        case YEAR:
-            key.append(type).append(".FirstYear");
-            break;
-
-        case MONTH:
-            if (standalone) {
-                key.append("standalone.");
-            }
-            key.append(style == SHORT ? "MonthAbbreviations" : "MonthNames");
-            break;
-
-        case DAY_OF_WEEK:
-            key.append(style == SHORT ? "DayAbbreviations" : "DayNames");
-            break;
-
-        case AM_PM:
-            key.append("AmPmMarkers");
-            break;
-        }
-        return key.length() > 0 ? key.toString() : null;
-    }
 }
--- a/jdk/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java	Tue Nov 20 11:49:27 2012 -0800
@@ -25,9 +25,12 @@
 
 package sun.util.locale.provider;
 
+import java.util.Calendar;
+import static java.util.Calendar.*;
 import java.util.Locale;
 import java.util.Map;
 import java.util.spi.CalendarDataProvider;
+import java.util.spi.CalendarNameProvider;
 
 /**
  * {@code CalendarDataUtility} is a utility class for calling the
@@ -44,16 +47,32 @@
     private CalendarDataUtility() {
     }
 
+    public static int retrieveFirstDayOfWeek(Locale locale) {
+        LocaleServiceProviderPool pool =
+                LocaleServiceProviderPool.getPool(CalendarDataProvider.class);
+        Integer value = pool.getLocalizedObject(CalendarWeekParameterGetter.INSTANCE,
+                                                locale, FIRST_DAY_OF_WEEK);
+        return (value != null && (value >= SUNDAY && value <= SATURDAY)) ? value : SUNDAY;
+    }
+
+    public static int retrieveMinimalDaysInFirstWeek(Locale locale) {
+        LocaleServiceProviderPool pool =
+                LocaleServiceProviderPool.getPool(CalendarDataProvider.class);
+        Integer value = pool.getLocalizedObject(CalendarWeekParameterGetter.INSTANCE,
+                                                locale, MINIMAL_DAYS_IN_FIRST_WEEK);
+        return (value != null && (value >= 1 && value <= 7)) ? value : 1;
+    }
+
     public static String retrieveFieldValueName(String id, int field, int value, int style, Locale locale) {
         LocaleServiceProviderPool pool =
-                LocaleServiceProviderPool.getPool(CalendarDataProvider.class);
+                LocaleServiceProviderPool.getPool(CalendarNameProvider.class);
         return pool.getLocalizedObject(CalendarFieldValueNameGetter.INSTANCE, locale, id,
                                        field, value, style);
     }
 
     public static Map<String, Integer> retrieveFieldValueNames(String id, int field, int style, Locale locale) {
         LocaleServiceProviderPool pool =
-            LocaleServiceProviderPool.getPool(CalendarDataProvider.class);
+            LocaleServiceProviderPool.getPool(CalendarNameProvider.class);
         return pool.getLocalizedObject(CalendarFieldValueNamesMapGetter.INSTANCE, locale, id, field, style);
     }
 
@@ -62,13 +81,13 @@
      * implementation.
      */
     private static class CalendarFieldValueNameGetter
-        implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarDataProvider,
+        implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarNameProvider,
                                                                    String> {
         private static final CalendarFieldValueNameGetter INSTANCE =
             new CalendarFieldValueNameGetter();
 
         @Override
-        public String getObject(CalendarDataProvider calendarDataProvider,
+        public String getObject(CalendarNameProvider calendarNameProvider,
                                 Locale locale,
                                 String requestID, // calendarType
                                 Object... params) {
@@ -76,7 +95,7 @@
             int field = (int) params[0];
             int value = (int) params[1];
             int style = (int) params[2];
-            return calendarDataProvider.getDisplayName(requestID, field, value, style, locale);
+            return calendarNameProvider.getDisplayName(requestID, field, value, style, locale);
         }
     }
 
@@ -85,20 +104,47 @@
      * implementation.
      */
     private static class CalendarFieldValueNamesMapGetter
-        implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarDataProvider,
+        implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarNameProvider,
                                                                    Map<String, Integer>> {
         private static final CalendarFieldValueNamesMapGetter INSTANCE =
             new CalendarFieldValueNamesMapGetter();
 
         @Override
-        public Map<String, Integer> getObject(CalendarDataProvider calendarDataProvider,
+        public Map<String, Integer> getObject(CalendarNameProvider calendarNameProvider,
                                               Locale locale,
                                               String requestID, // calendarType
                                               Object... params) {
             assert params.length == 2;
             int field = (int) params[0];
             int style = (int) params[1];
-            return calendarDataProvider.getDisplayNames(requestID, field, style, locale);
+            return calendarNameProvider.getDisplayNames(requestID, field, style, locale);
+        }
+    }
+
+     private static class CalendarWeekParameterGetter
+        implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarDataProvider,
+                                                                   Integer> {
+        private static final CalendarWeekParameterGetter INSTANCE =
+            new CalendarWeekParameterGetter();
+
+        @Override
+        public Integer getObject(CalendarDataProvider calendarDataProvider,
+                                 Locale locale,
+                                 String requestID,    // resource key
+                                 Object... params) {
+            assert params.length == 0;
+            int value;
+            switch (requestID) {
+            case FIRST_DAY_OF_WEEK:
+                value = calendarDataProvider.getFirstDayOfWeek(locale);
+                break;
+            case MINIMAL_DAYS_IN_FIRST_WEEK:
+                value = calendarDataProvider.getMinimalDaysInFirstWeek(locale);
+                break;
+            default:
+                throw new InternalError("invalid requestID: " + requestID);
+            }
+            return (value != 0) ? value : null;
         }
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,234 @@
+/*
+ * Copyright (c) 2012, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package sun.util.locale.provider;
+
+import static java.util.Calendar.*;
+import java.util.Comparator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.spi.CalendarNameProvider;
+
+/**
+ * Concrete implementation of the  {@link java.util.spi.CalendarDataProvider
+ * CalendarDataProvider} class for the JRE LocaleProviderAdapter.
+ *
+ * @author Masayoshi Okutsu
+ * @author Naoto Sato
+ */
+public class CalendarNameProviderImpl extends CalendarNameProvider implements AvailableLanguageTags {
+    private final LocaleProviderAdapter.Type type;
+    private final Set<String> langtags;
+
+    public CalendarNameProviderImpl(LocaleProviderAdapter.Type type, Set<String> langtags) {
+        this.type = type;
+        this.langtags = langtags;
+    }
+
+    @Override
+    public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) {
+        String name = null;
+        String key = getKey(calendarType, field, style);
+        if (key != null) {
+            ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale);
+            if (rb.containsKey(key)) {
+                String[] strings = rb.getStringArray(key);
+                if (strings.length > 0) {
+                    if (field == DAY_OF_WEEK || field == YEAR) {
+                        --value;
+                    }
+                    name = strings[value];
+                    // If name is empty in standalone, try its `format' style.
+                    if (name.length() == 0
+                            && (style == SHORT_STANDALONE || style == LONG_STANDALONE)) {
+                        name = getDisplayName(calendarType, field, value,
+                                              style == SHORT_STANDALONE ? SHORT_FORMAT : LONG_FORMAT,
+                                              locale);
+                    }
+                }
+            }
+        }
+        return name;
+    }
+
+    @Override
+    public Map<String, Integer> getDisplayNames(String calendarType, int field, int style, Locale locale) {
+        Map<String, Integer> names;
+        if (style == ALL_STYLES) {
+            names = getDisplayNamesImpl(calendarType, field, SHORT_FORMAT, locale);
+            if (field != AM_PM) {
+                for (int st : new int[] { SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE }) {
+                    names.putAll(getDisplayNamesImpl(calendarType, field, st, locale));
+                }
+            }
+        } else {
+            // specific style
+            names = getDisplayNamesImpl(calendarType, field, style, locale);
+        }
+        return names.isEmpty() ? null : names;
+    }
+
+    private Map<String, Integer> getDisplayNamesImpl(String calendarType, int field,
+                                                     int style, Locale locale) {
+        String key = getKey(calendarType, field, style);
+        Map<String, Integer> map = new TreeMap<>(LengthBasedComparator.INSTANCE);
+        if (key != null) {
+            ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale);
+            if (rb.containsKey(key)) {
+                String[] strings = rb.getStringArray(key);
+                if (field == YEAR) {
+                    if (strings.length > 0) {
+                        map.put(strings[0], 1);
+                    }
+                } else {
+                    int base = (field == DAY_OF_WEEK) ? 1 : 0;
+                    for (int i = 0; i < strings.length; i++) {
+                        String name = strings[i];
+                        // Ignore any empty string (some standalone month names
+                        // are not defined)
+                        if (name.length() == 0) {
+                            continue;
+                        }
+                        map.put(name, base + i);
+                    }
+                }
+            }
+        }
+        return map;
+    }
+
+    /**
+     * Comparator implementation for TreeMap which iterates keys from longest
+     * to shortest.
+     */
+    private static class LengthBasedComparator implements Comparator<String> {
+        private static final LengthBasedComparator INSTANCE = new LengthBasedComparator();
+
+        private LengthBasedComparator() {
+        }
+
+        @Override
+        public int compare(String o1, String o2) {
+            int n = o2.length() - o1.length();
+            return (n == 0) ? o1.compareTo(o2) : n;
+        }
+    }
+
+    @Override
+    public Locale[] getAvailableLocales() {
+        return LocaleProviderAdapter.toLocaleArray(langtags);
+    }
+
+    @Override
+    public boolean isSupportedLocale(Locale locale) {
+        if (Locale.ROOT.equals(locale)) {
+            return true;
+        }
+        String calendarType = null;
+        if (locale.hasExtensions()) {
+            calendarType = locale.getUnicodeLocaleType("ca");
+            locale = locale.stripExtensions();
+        }
+
+        if (calendarType != null) {
+            switch (calendarType) {
+            case "buddhist":
+            case "japanese":
+            case "gregory":
+                break;
+            default:
+                // Unknown calendar type
+                return false;
+            }
+        }
+        if (langtags.contains(locale.toLanguageTag())) {
+            return true;
+        }
+        if (type == LocaleProviderAdapter.Type.JRE) {
+            String oldname = locale.toString().replace('_', '-');
+            return langtags.contains(oldname);
+        }
+        return false;
+    }
+
+    @Override
+    public Set<String> getAvailableLanguageTags() {
+        return langtags;
+    }
+
+    private int getIntData(String key, Locale locale) {
+        ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getCalendarData(locale);
+        if (rb.containsKey(key)) {
+            String firstday = rb.getString(key);
+            return Integer.parseInt(firstday);
+        }
+        // Note that the base bundle of CLDR doesn't have the Calendar week parameters.
+        return 0;
+    }
+
+    private String getKey(String type, int field, int style) {
+        boolean standalone = (style & 0x8000) != 0;
+        style &= ~0x8000;
+
+        if ("gregory".equals(type)) {
+            type = null;
+        }
+
+        StringBuilder key = new StringBuilder();
+        switch (field) {
+        case ERA:
+            if (type != null) {
+                key.append(type).append('.');
+            }
+            if (style == SHORT) {
+                key.append("short.");
+            }
+            key.append("Eras");
+            break;
+
+        case YEAR:
+            key.append(type).append(".FirstYear");
+            break;
+
+        case MONTH:
+            if (standalone) {
+                key.append("standalone.");
+            }
+            key.append(style == SHORT ? "MonthAbbreviations" : "MonthNames");
+            break;
+
+        case DAY_OF_WEEK:
+            key.append(style == SHORT ? "DayAbbreviations" : "DayNames");
+            break;
+
+        case AM_PM:
+            key.append("AmPmMarkers");
+            break;
+        }
+        return key.length() > 0 ? key.toString() : null;
+    }
+}
--- a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java	Tue Nov 20 11:49:27 2012 -0800
@@ -41,6 +41,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.spi.CalendarDataProvider;
+import java.util.spi.CalendarNameProvider;
 import java.util.spi.CurrencyNameProvider;
 import java.util.spi.LocaleNameProvider;
 import java.util.spi.LocaleServiceProvider;
@@ -101,6 +102,8 @@
             return (P) getTimeZoneNameProvider();
         case "CalendarDataProvider":
             return (P) getCalendarDataProvider();
+        case "CalendarNameProvider":
+            return (P) getCalendarNameProvider();
         default:
             throw new InternalError("should not come down here");
         }
@@ -117,6 +120,7 @@
     private volatile LocaleNameProvider localeNameProvider = null;
     private volatile TimeZoneNameProvider timeZoneNameProvider = null;
     private volatile CalendarDataProvider calendarDataProvider = null;
+    private volatile CalendarNameProvider calendarNameProvider = null;
 
     /*
      * Getter methods for java.text.spi.* providers
@@ -252,11 +256,9 @@
     @Override
     public CalendarDataProvider getCalendarDataProvider() {
         if (calendarDataProvider == null) {
-            Set<String> set = new HashSet<>();
-            set.addAll(getLanguageTagSet("FormatData"));
-            set.addAll(getLanguageTagSet("CalendarData"));
-            CalendarDataProvider provider = new CalendarDataProviderImpl(getAdapterType(),
-                                                                         set);
+            CalendarDataProvider provider;
+            provider = new CalendarDataProviderImpl(getAdapterType(),
+                                                    getLanguageTagSet("CalendarData"));
             synchronized (this) {
                 if (calendarDataProvider == null) {
                     calendarDataProvider = provider;
@@ -267,6 +269,21 @@
     }
 
     @Override
+    public CalendarNameProvider getCalendarNameProvider() {
+        if (calendarNameProvider == null) {
+            CalendarNameProvider provider;
+            provider = new CalendarNameProviderImpl(getAdapterType(),
+                                                    getLanguageTagSet("FormatData"));
+            synchronized (this) {
+                if (calendarNameProvider == null) {
+                    calendarNameProvider = provider;
+                }
+            }
+        }
+        return calendarNameProvider;
+    }
+
+    @Override
     public LocaleResources getLocaleResources(Locale locale) {
         LocaleResources lr = localeResourcesMap.get(locale);
         if (lr == null) {
--- a/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java	Tue Nov 20 11:49:27 2012 -0800
@@ -38,6 +38,7 @@
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.spi.CalendarDataProvider;
+import java.util.spi.CalendarNameProvider;
 import java.util.spi.CurrencyNameProvider;
 import java.util.spi.LocaleNameProvider;
 import java.util.spi.LocaleServiceProvider;
@@ -387,6 +388,14 @@
      */
     public abstract CalendarDataProvider getCalendarDataProvider();
 
+    /**
+     * Returns a CalendarNameProvider for this LocaleProviderAdapter, or null if no
+     * CalendarNameProvider is available.
+     *
+     * @return a CalendarNameProvider
+     */
+    public abstract CalendarNameProvider getCalendarNameProvider();
+
     public abstract LocaleResources getLocaleResources(Locale locale);
 
     public abstract LocaleData getLocaleData();
--- a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java	Tue Nov 20 11:49:27 2012 -0800
@@ -28,11 +28,29 @@
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
-import java.text.*;
-import java.text.spi.*;
-import java.util.*;
-import java.util.concurrent.*;
-import java.util.spi.*;
+import java.text.BreakIterator;
+import java.text.Collator;
+import java.text.DateFormat;
+import java.text.DateFormatSymbols;
+import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
+import java.text.spi.BreakIteratorProvider;
+import java.text.spi.CollatorProvider;
+import java.text.spi.DateFormatProvider;
+import java.text.spi.DateFormatSymbolsProvider;
+import java.text.spi.DecimalFormatSymbolsProvider;
+import java.text.spi.NumberFormatProvider;
+import java.util.Locale;
+import java.util.Map;
+import java.util.ServiceLoader;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.spi.CalendarDataProvider;
+import java.util.spi.CalendarNameProvider;
+import java.util.spi.CurrencyNameProvider;
+import java.util.spi.LocaleNameProvider;
+import java.util.spi.LocaleServiceProvider;
+import java.util.spi.TimeZoneNameProvider;
 
 /**
  * LocaleProviderAdapter implementation for the installed SPI implementations.
@@ -73,7 +91,7 @@
                                       IllegalAccessException e) {
                                 LocaleServiceProviderPool.config(SPILocaleProviderAdapter.class, e.toString());
                                 return null;
-                    }
+                            }
                         }
 
                         ((Delegate)delegate).addImpl(provider);
@@ -94,7 +112,7 @@
     interface Delegate<P extends LocaleServiceProvider> {
         public void addImpl(P impl);
         public P getImpl(Locale locale);
-}
+    }
 
     /*
      * Obtain the real SPI implementation, using locale fallback
@@ -119,7 +137,7 @@
         @Override
         public void addImpl(BreakIteratorProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
@@ -174,7 +192,7 @@
         @Override
         public void addImpl(CollatorProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
@@ -208,7 +226,7 @@
         @Override
         public void addImpl(DateFormatProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
@@ -256,7 +274,7 @@
         @Override
         public void addImpl(DateFormatSymbolsProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
@@ -290,7 +308,7 @@
         @Override
         public void addImpl(DecimalFormatSymbolsProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
@@ -324,7 +342,7 @@
         @Override
         public void addImpl(NumberFormatProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
@@ -379,7 +397,7 @@
         @Override
         public void addImpl(CalendarDataProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
@@ -411,12 +429,39 @@
             assert cdp != null;
             return cdp.getMinimalDaysInFirstWeek(locale);
         }
+    }
+
+    static class CalendarNameProviderDelegate extends CalendarNameProvider
+                                       implements Delegate<CalendarNameProvider> {
+        private ConcurrentMap<Locale, CalendarNameProvider> map = new ConcurrentHashMap<>();
+
+        @Override
+        public void addImpl(CalendarNameProvider impl) {
+            for (Locale l : impl.getAvailableLocales()) {
+                map.putIfAbsent(l, impl);
+            }
+        }
+
+        @Override
+        public CalendarNameProvider getImpl(Locale locale) {
+            return SPILocaleProviderAdapter.getImpl(map, locale);
+        }
+
+        @Override
+        public Locale[] getAvailableLocales() {
+            return map.keySet().toArray(new Locale[0]);
+        }
+
+        @Override
+        public boolean isSupportedLocale(Locale locale) {
+            return map.containsKey(locale);
+        }
 
         @Override
         public String getDisplayName(String calendarType,
                                               int field, int value,
                                               int style, Locale locale) {
-            CalendarDataProvider cdp = getImpl(locale);
+            CalendarNameProvider cdp = getImpl(locale);
             assert cdp != null;
             return cdp.getDisplayName(calendarType, field, value, style, locale);
         }
@@ -425,7 +470,7 @@
         public Map<String, Integer> getDisplayNames(String calendarType,
                                                              int field, int style,
                                                              Locale locale) {
-            CalendarDataProvider cdp = getImpl(locale);
+            CalendarNameProvider cdp = getImpl(locale);
             assert cdp != null;
             return cdp.getDisplayNames(calendarType, field, style, locale);
         }
@@ -438,7 +483,7 @@
         @Override
         public void addImpl(CurrencyNameProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
@@ -479,7 +524,7 @@
         @Override
         public void addImpl(LocaleNameProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
@@ -534,7 +579,7 @@
         @Override
         public void addImpl(TimeZoneNameProvider impl) {
             for (Locale l : impl.getAvailableLocales()) {
-                map.put(l, impl);
+                map.putIfAbsent(l, impl);
             }
         }
 
--- a/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c	Tue Nov 20 11:49:27 2012 -0800
@@ -571,7 +571,7 @@
  */
 void inquireCred(JNIEnv *env, jobject jobj, gss_cred_id_t pCred,
                  jint type, void *result) {
-  OM_uint32 minor, major=GSS_C_QOP_DEFAULT;
+  OM_uint32 minor, major=0;
   OM_uint32 routineErr;
   gss_cred_id_t credHdl;
 
--- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_mutex.c	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_mutex.c	Tue Nov 20 11:49:27 2012 -0800
@@ -112,22 +112,34 @@
     ckpInitArgs->UnlockMutex = NULL_PTR;
 #else
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
     ckpInitArgs->CreateMutex = (jMutexHandler != NULL) ? &callJCreateMutex : NULL_PTR;
 
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
     ckpInitArgs->DestroyMutex = (jMutexHandler != NULL) ? &callJDestroyMutex : NULL_PTR;
 
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
     ckpInitArgs->LockMutex = (jMutexHandler != NULL) ? &callJLockMutex : NULL_PTR;
 
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
     ckpInitArgs->UnlockMutex = (jMutexHandler != NULL) ? &callJUnlockMutex : NULL_PTR;
 
@@ -151,13 +163,19 @@
 
     /* convert and set the flags field */
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "flags", "J");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jFlags = (*env)->GetLongField(env, jInitArgs, fieldID);
     ckpInitArgs->flags = jLongToCKULong(jFlags);
 
     /* pReserved should be NULL_PTR in this version */
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "pReserved", "Ljava/lang/Object;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jReserved = (*env)->GetObjectField(env, jInitArgs, fieldID);
 
     /* we try to convert the reserved parameter also */
--- a/jdk/src/solaris/bin/java_md_solinux.c	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/solaris/bin/java_md_solinux.c	Tue Nov 20 11:49:27 2012 -0800
@@ -478,9 +478,11 @@
         JLI_TraceLauncher("mustsetenv: %s\n", mustsetenv ? "TRUE" : "FALSE");
 
         if (mustsetenv == JNI_FALSE) {
+            JLI_MemFree(newargv);
             return;
         }
 #else
+        JLI_MemFree(newargv);
         return;
 #endif /* SETENV_REQUIRED */
       } else {  /* do the same speculatively or exit */
--- a/jdk/src/solaris/native/java/lang/java_props_macosx.c	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/solaris/native/java/lang/java_props_macosx.c	Tue Nov 20 11:49:27 2012 -0800
@@ -145,27 +145,22 @@
     return pref = HToolkit;
 }
 
-void setUnknownOSAndVersion(java_props_t *sprops) {
-    sprops->os_name = strdup("Unknown");
-    sprops->os_version = strdup("Unknown");
-}
+void setOSNameAndVersion(java_props_t *sprops) {
+    /* Don't rely on JRSCopyOSName because there's no guarantee the value will
+     * remain the same, or even if the JRS functions will continue to be part of
+     * Mac OS X.  So hardcode os_name, and fill in os_version if we can.
+     */
+    sprops->os_name = strdup("Mac OS X");
 
-void setOSNameAndVersion(java_props_t *sprops) {
     void *jrsFwk = getJRSFramework();
-    if (jrsFwk == NULL) {
-        setUnknownOSAndVersion(sprops);
-        return;
+    if (jrsFwk != NULL) {
+        char *(*copyOSVersion)() = dlsym(jrsFwk, "JRSCopyOSVersion");
+        if (copyOSVersion != NULL) {
+            sprops->os_version = copyOSVersion();
+            return;
+        }
     }
-
-    char *(*copyOSName)() = dlsym(jrsFwk, "JRSCopyOSName");
-    char *(*copyOSVersion)() = dlsym(jrsFwk, "JRSCopyOSVersion");
-    if (copyOSName == NULL || copyOSVersion == NULL) {
-        setUnknownOSAndVersion(sprops);
-        return;
-    }
-
-    sprops->os_name = copyOSName();
-    sprops->os_version = copyOSVersion();
+    sprops->os_version = strdup("Unknown");
 }
 
 
--- a/jdk/src/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/src/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java	Tue Nov 20 11:49:27 2012 -0800
@@ -25,7 +25,12 @@
 package sun.util.locale.provider;
 
 import java.lang.ref.SoftReference;
-import java.text.*;
+import java.text.DateFormat;
+import java.text.DateFormatSymbols;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
 import java.text.spi.DateFormatProvider;
 import java.text.spi.DateFormatSymbolsProvider;
 import java.text.spi.DecimalFormatSymbolsProvider;
@@ -34,12 +39,13 @@
 import java.util.HashSet;
 import java.util.Locale;
 import java.util.Map;
+import java.util.ResourceBundle.Control;
 import java.util.Set;
-import java.util.ResourceBundle.Control;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import java.util.spi.CalendarDataProvider;
+import java.util.spi.CalendarNameProvider;
 
 /**
  * LocaleProviderdapter implementation for the Windows locale data.
@@ -88,7 +94,7 @@
 
     private static final Set<Locale> supportedLocaleSet;
     static {
-        Set<Locale> tmpSet = new HashSet<Locale>();
+        Set<Locale> tmpSet = new HashSet<>();
         if (initialize()) {
             // Assuming the default locales do not include any extensions, so
             // no stripping is needed here.
@@ -258,7 +264,7 @@
 
                 if (ref == null || (patterns = ref.get()) == null) {
                     String langtag = locale.toLanguageTag();
-                    patterns = new AtomicReferenceArray<String>(NF_MAX+1);
+                    patterns = new AtomicReferenceArray<>(NF_MAX+1);
                     for (int i = 0; i <= NF_MAX; i++) {
                         patterns.compareAndSet(i, null, getNumberPattern(i, langtag));
                     }
@@ -330,18 +336,6 @@
             }
 
             @Override
-            public String getDisplayName(String calType, int field, int value,
-                                         int style, Locale locale) {
-                return null;
-            }
-
-            @Override
-            public Map<String, Integer> getDisplayNames(String calType,
-                                         int field, int style, Locale locale) {
-                return null;
-            }
-
-            @Override
             public int getFirstDayOfWeek(Locale locale) {
                 int first = getCalendarDataValue(
                                  removeExtensions(locale).toLanguageTag(),
@@ -360,6 +354,32 @@
         };
     }
 
+    public static CalendarNameProvider getCalendarNameProvider() {
+        return new CalendarNameProvider() {
+            @Override
+            public Locale[] getAvailableLocales() {
+                return getSupportedCalendarLocales();
+            }
+
+            @Override
+            public boolean isSupportedLocale(Locale locale) {
+                return isSupportedCalendarLocale(locale);
+            }
+
+            @Override
+            public String getDisplayName(String calType, int field, int value,
+                                         int style, Locale locale) {
+                return null;
+            }
+
+            @Override
+            public Map<String, Integer> getDisplayNames(String calType,
+                                         int field, int style, Locale locale) {
+                return null;
+            }
+        };
+    }
+
     private static String convertDateTimePattern(String winPattern) {
         String ret = winPattern.replaceAll("dddd", "EEEE");
         ret = ret.replaceAll("ddd", "EEE");
--- a/jdk/test/ProblemList.txt	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/ProblemList.txt	Tue Nov 20 11:49:27 2012 -0800
@@ -148,9 +148,6 @@
 # 6959636
 javax/management/loading/LibraryLoader/LibraryLoaderTest.java	windows-all
 
-# 7144846
-javax/management/remote/mandatory/connection/ReconnectTest.java	generic-all
-
 # 7120365
 javax/management/remote/mandatory/notif/DiffHBTest.java 	generic-all
 
@@ -376,6 +373,9 @@
 # Filed 6772009
 java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java generic-all
 
+# 8003596
+java/util/logging/CheckLockLocationTest.java			windows-all
+
 # 7041639, Solaris DSA keypair generation bug
 java/util/TimeZone/TimeZoneDatePermissionCheck.sh               solaris-all
 
--- a/jdk/test/TEST.ROOT	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/TEST.ROOT	Tue Nov 20 11:49:27 2012 -0800
@@ -9,4 +9,4 @@
 othervm.dirs=java/awt java/beans java/rmi javax/accessibility javax/imageio javax/sound javax/print javax/management com/sun/awt sun/awt sun/java2d sun/pisces sun/rmi
 
 # Tests that cannot run concurrently
-exclusiveAccess.dirs=java/rmi/Naming sun/management/jmxremote sun/tools/jstatd
+exclusiveAccess.dirs=java/rmi/Naming java/util/prefs sun/management/jmxremote sun/tools/jstatd sun/security/mscapi
--- a/jdk/test/java/lang/HashCode.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/java/lang/HashCode.java	Tue Nov 20 11:49:27 2012 -0800
@@ -23,18 +23,20 @@
 
 /*
  * @test
- * @bug 4245470
+ * @bug 4245470 7088913
  * @summary Test the primitive wrappers hashCode()
  */
 
+import java.util.Objects;
 import java.util.Random;
 
 public class HashCode {
 
     final Random rnd = new Random();
 
-    void test(String args[]) throws Exception {
-        int[] ints = {
+    void testOrdinals(String args[]) throws Exception {
+        long[] longs = {
+            Long.MIN_VALUE,
             Integer.MIN_VALUE,
             Short.MIN_VALUE,
             Character.MIN_VALUE,
@@ -44,20 +46,73 @@
             Character.MAX_VALUE,
             Short.MAX_VALUE,
             Integer.MAX_VALUE,
+            Long.MAX_VALUE,
             rnd.nextInt(),
         };
 
-        for (int x : ints) {
+        for (long x : longs) {
             check(    new Long(x).hashCode() == (int)((long)x ^ (long)x>>>32));
             check(Long.valueOf(x).hashCode() == (int)((long)x ^ (long)x>>>32));
-            check(    new Integer(x).hashCode() == x);
-            check(Integer.valueOf(x).hashCode() == x);
+            check(  (new Long(x)).hashCode() == Long.hashCode(x));
+            check(    new Integer((int)x).hashCode() == (int) x);
+            check(Integer.valueOf((int)x).hashCode() == (int) x);
+            check(  (new Integer((int)x)).hashCode() == Integer.hashCode((int)x));
             check(    new Short((short)x).hashCode() == (short) x);
             check(Short.valueOf((short)x).hashCode() == (short) x);
+            check(         (new Short((short)x)).hashCode() == Short.hashCode((short)x));
             check(    new Character((char) x).hashCode() == (char) x);
             check(Character.valueOf((char) x).hashCode() == (char) x);
+            check(         (new Character((char)x)).hashCode() == Character.hashCode((char)x));
             check(    new Byte((byte) x).hashCode() == (byte) x);
             check(Byte.valueOf((byte) x).hashCode() == (byte) x);
+            check(         (new Byte((byte)x)).hashCode() == Byte.hashCode((byte)x));
+        }
+    }
+
+    void testBoolean() {
+        check( Boolean.FALSE.hashCode() == 1237);
+        check( Boolean.TRUE.hashCode() == 1231);
+        check( Boolean.valueOf(false).hashCode() == 1237);
+        check( Boolean.valueOf(true).hashCode() == 1231);
+        check( (new Boolean(false)).hashCode() == 1237);
+        check( (new Boolean(true)).hashCode() == 1231);
+        check( Boolean.hashCode(false) == 1237);
+        check( Boolean.hashCode(true) == 1231);
+    }
+
+    void testFloat() {
+        float[] floats = {
+            Float.NaN,
+            Float.NEGATIVE_INFINITY,
+               -1f,
+               0f,
+               1f,
+               Float.POSITIVE_INFINITY
+        };
+
+        for(float f : floats) {
+            check( Float.hashCode(f) == Float.floatToIntBits(f));
+            check( Float.valueOf(f).hashCode() == Float.floatToIntBits(f));
+            check( (new Float(f)).hashCode() == Float.floatToIntBits(f));
+        }
+    }
+
+    void testDouble() {
+        double[] doubles = {
+            Double.NaN,
+            Double.NEGATIVE_INFINITY,
+               -1f,
+               0f,
+               1f,
+               Double.POSITIVE_INFINITY
+        };
+
+        for(double d : doubles) {
+            long bits = Double.doubleToLongBits(d);
+            int bitsHash = (int)(bits^(bits>>>32));
+            check( Double.hashCode(d) == bitsHash);
+            check( Double.valueOf(d).hashCode() == bitsHash);
+            check( (new Double(d)).hashCode() == bitsHash);
         }
     }
 
@@ -69,12 +124,16 @@
     void unexpected(Throwable t) {failed++; t.printStackTrace();}
     void check(boolean cond) {if (cond) pass(); else fail();}
     void equal(Object x, Object y) {
-        if (x == null ? y == null : x.equals(y)) pass();
+        if (Objects.equals(x,y)) pass();
         else fail(x + " not equal to " + y);}
     public static void main(String[] args) throws Throwable {
         new HashCode().instanceMain(args);}
     public void instanceMain(String[] args) throws Throwable {
-        try {test(args);} catch (Throwable t) {unexpected(t);}
+        try { testOrdinals(args);
+              testBoolean();
+                testFloat();
+                testDouble();
+        } catch (Throwable t) {unexpected(t);}
         System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
         if (failed > 0) throw new AssertionError("Some tests failed");}
 }
--- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java	Tue Nov 20 11:49:27 2012 -0800
@@ -36,6 +36,12 @@
     // number of concurrent completion handlers
     static final int CONCURRENCY_COUNT = 256;
 
+    // set to true if an I/O operation fails
+    static volatile boolean failed;
+
+    // set to true when the test is done
+    static volatile boolean finished;
+
     public static void main(String[] args) throws Exception {
         // all accepted connections are added to a queue
         final ArrayBlockingQueue<AsynchronousSocketChannel> queue =
@@ -51,6 +57,10 @@
                 listener.accept((Void)null, this);
             }
             public void failed(Throwable exc, Void att) {
+                if (!finished) {
+                    failed = true;
+                    System.err.println("accept failed: " + exc);
+                }
             }
         });
         System.out.println("Listener created.");
@@ -94,6 +104,9 @@
                         }
                     }
                     public void failed(Throwable exc, AsynchronousSocketChannel ch) {
+                        failed = true;
+                        System.err.println("read failed: " + exc);
+                        completed(0, ch);
                     }
                 });
         }
@@ -104,6 +117,7 @@
         while (remaining > 0) {
             AsynchronousSocketChannel ch = queue.take();
             ch.write(ByteBuffer.wrap("welcome".getBytes())).get();
+            ch.shutdownOutput();
             ch.close();
             remaining--;
         }
@@ -111,6 +125,11 @@
         // wait for all threads to reach the barrier
         System.out.println("Waiting for all threads to reach barrier");
         barrier.await();
+
+        // finish up
+        finished = true;
         listener.close();
+        if (failed)
+            throw new RuntimeException("I/O operation failed, see log for details");
     }
 }
--- a/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.java	Tue Nov 20 11:49:27 2012 -0800
@@ -36,17 +36,11 @@
  *
  * Test strategy:
  * com.bar.CalendarDataProviderImpl supports only ja_JP_kids locale. It returns
- * month names only in full-width digits, followed by "gatsu" in Hiragana if
- * it's a long style, and also returns unusual week parameter values, WEDNESDAY
- * - first day of week, 7 - minimal days in the first week.  The standalone
- * styles are used because DateFormatSymbols has precedence for the format
- * styles.
+ * unusual week parameter values, WEDNESDAY - first day of week, 7 - minimal
+ * days in the first week.
  *
  * A Calendar instance created with ja_JP_kids should use the week parameters
- * provided by com.bar.CalendarDataProviderImpl. Calendar.getDisplayName(s)
- * should be called with kids to get the month names provided by
- * com.bar.CalendarDataProviderImpl. Other display names should be the same as
- * what a Calendar constructed with ja_JP returns.
+ * provided by com.bar.CalendarDataProviderImpl.
  */
 public class CalendarDataProviderTest {
 
@@ -62,45 +56,6 @@
         // check the week parameters
         checkResult("firstDayOfWeek", kcal.getFirstDayOfWeek(), WEDNESDAY);
         checkResult("minimalDaysInFirstWeek", kcal.getMinimalDaysInFirstWeek(), 7);
-
-        // check month names and week day names
-        Map<String, Integer> mapAllStyles = new HashMap<>();
-        for (int style : new int[] { SHORT_STANDALONE, LONG_STANDALONE }) {
-            // Check month names provided by com.bar.CalendarDataProviderImpl
-            Map<String, Integer> map = new HashMap<>();
-            for (int month = JANUARY; month <= DECEMBER; month++) {
-                kcal.set(DAY_OF_MONTH, 1);
-                kcal.set(MONTH, month);
-                kcal.set(HOUR_OF_DAY, 12); // avoid any standard-daylight transitions...
-                kcal.getTimeInMillis();
-                String name = kcal.getDisplayName(MONTH, style, kids);
-                checkResult("Month name",
-                            name,
-                            CalendarDataProviderImpl.toMonthName(kcal.get(MONTH) + 1, style));
-
-                // Builds the map with name to its integer value.
-                map.put(name, kcal.get(MONTH));
-            }
-            checkResult((style == SHORT_STANDALONE ? "Short" : "Long") + " month names map",
-                        kcal.getDisplayNames(MONTH, style, kids), map);
-            mapAllStyles.putAll(map);
-            if (style == LONG_STANDALONE) {
-                checkResult("Short and long month names map",
-                            kcal.getDisplayNames(MONTH, ALL_STYLES, kids), mapAllStyles);
-            }
-
-            // Check week names: kcal and jcal should return the same names and maps.
-            for (int dow = SUNDAY; dow <= SATURDAY; dow++) {
-                kcal.set(DAY_OF_WEEK, dow);
-                jcal.setTimeInMillis(kcal.getTimeInMillis());
-                String name = kcal.getDisplayName(DAY_OF_WEEK, style, kids);
-                checkResult("Day of week name", name,
-                                                jcal.getDisplayName(DAY_OF_WEEK, style, Locale.JAPAN));
-            }
-            checkResult("Short day of week names", kcal.getDisplayNames(DAY_OF_WEEK, style, kids),
-                                                   jcal.getDisplayNames(DAY_OF_WEEK, style, Locale.JAPAN));
-        }
-
     }
 
     private <T> void checkResult(String msg, T got, T expected) {
--- a/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.sh	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/java/util/PluggableLocale/CalendarDataProviderTest.sh	Tue Nov 20 11:49:27 2012 -0800
@@ -23,6 +23,6 @@
 #!/bin/sh
 #
 # @test
-# @bug 7058206
+# @bug 7058207 8000986
 # @summary CalendarDataProvider tests
 # @run shell ExecTest.sh bar CalendarDataProviderTest true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2012, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ *
+ */
+
+import java.text.*;
+import java.util.*;
+import static java.util.Calendar.*;
+import sun.util.locale.provider.*;
+import sun.util.resources.*;
+import com.bar.CalendarNameProviderImpl;
+
+/**
+ * Test case for CalendarNameProvider.
+ *
+ * Test strategy:
+ * com.bar.CalendarNameProviderImpl supports only ja_JP_kids locale. It returns
+ * month names only in full-width digits, followed by "gatsu" in Hiragana if
+ * it's a long style. The standalone styles are used because DateFormatSymbols
+ * has precedence for the format styles.
+ *
+ * Calendar.getDisplayName(s) should be called with kids to get the month
+ * names provided by com.bar.CalendarNameProviderImpl. Other display names
+ * should be the same as what a Calendar constructed with ja_JP returns.
+ */
+public class CalendarNameProviderTest {
+
+    public static void main(String[] s) {
+        new CalendarNameProviderTest().test();
+    }
+
+    void test() {
+        Locale kids = new Locale("ja", "JP", "kids"); // test provider's supported locale
+        Calendar kcal = Calendar.getInstance(kids);
+        Calendar jcal = Calendar.getInstance(Locale.JAPAN);
+
+        // check month names and week day names
+        Map<String, Integer> mapAllStyles = new HashMap<>();
+        for (int style : new int[] { SHORT_STANDALONE, LONG_STANDALONE }) {
+            // Check month names provided by com.bar.CalendarNameProviderImpl
+            Map<String, Integer> map = new HashMap<>();
+            for (int month = JANUARY; month <= DECEMBER; month++) {
+                kcal.set(DAY_OF_MONTH, 1);
+                kcal.set(MONTH, month);
+                kcal.set(HOUR_OF_DAY, 12); // avoid any standard-daylight transitions...
+                kcal.getTimeInMillis();
+                String name = kcal.getDisplayName(MONTH, style, kids);
+                checkResult("Month name",
+                            name,
+                            CalendarNameProviderImpl.toMonthName(kcal.get(MONTH) + 1, style));
+
+                // Builds the map with name to its integer value.
+                map.put(name, kcal.get(MONTH));
+            }
+            checkResult((style == SHORT_STANDALONE ? "Short" : "Long") + " month names map",
+                        kcal.getDisplayNames(MONTH, style, kids), map);
+            mapAllStyles.putAll(map);
+            if (style == LONG_STANDALONE) {
+                checkResult("Short and long month names map",
+                            kcal.getDisplayNames(MONTH, ALL_STYLES, kids), mapAllStyles);
+            }
+
+            // Check week names: kcal and jcal should return the same names and maps.
+            for (int dow = SUNDAY; dow <= SATURDAY; dow++) {
+                kcal.set(DAY_OF_WEEK, dow);
+                jcal.setTimeInMillis(kcal.getTimeInMillis());
+                String name = kcal.getDisplayName(DAY_OF_WEEK, style, kids);
+                checkResult("Day of week name", name,
+                                                jcal.getDisplayName(DAY_OF_WEEK, style, Locale.JAPAN));
+            }
+            checkResult("Short day of week names", kcal.getDisplayNames(DAY_OF_WEEK, style, kids),
+                                                   jcal.getDisplayNames(DAY_OF_WEEK, style, Locale.JAPAN));
+        }
+
+    }
+
+    private <T> void checkResult(String msg, T got, T expected) {
+        if (!expected.equals(got)) {
+            String s = String.format("%s: got='%s', expected='%s'", msg, got, expected);
+            throw new RuntimeException(s);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/PluggableLocale/CalendarNameProviderTest.sh	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,27 @@
+# 
+# Copyright (c) 2012, 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
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# @test
+# @bug 8000986
+# @summary CalendarNameProvider tests
+# @run shell ExecTest.sh bar CalendarNameProviderTest true
--- a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh	Tue Nov 20 11:49:27 2012 -0800
@@ -23,6 +23,6 @@
 #!/bin/sh
 #
 # @test
-# @bug 4052440 8000997
+# @bug 4052440 7199750 8000997
 # @summary CurrencyNameProvider tests
 # @run shell ExecTest.sh bar CurrencyNameProviderTest true
--- a/jdk/test/java/util/PluggableLocale/GenericTest.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/java/util/PluggableLocale/GenericTest.java	Tue Nov 20 11:49:27 2012 -0800
@@ -42,6 +42,7 @@
     com.bar.LocaleNameProviderImpl localeNP = new com.bar.LocaleNameProviderImpl();
     com.bar.TimeZoneNameProviderImpl tzNP = new com.bar.TimeZoneNameProviderImpl();
     com.bar.CalendarDataProviderImpl calDataP = new com.bar.CalendarDataProviderImpl();
+    com.bar.CalendarNameProviderImpl calNameP = new com.bar.CalendarNameProviderImpl();
 
     public static void main(String[] s) {
         new GenericTest();
@@ -73,6 +74,7 @@
         expected.addAll(Arrays.asList(localeNP.getAvailableLocales()));
         expected.addAll(Arrays.asList(tzNP.getAvailableLocales()));
         expected.addAll(Arrays.asList(calDataP.getAvailableLocales()));
+        expected.addAll(Arrays.asList(calNameP.getAvailableLocales()));
         if (!result.equals(expected)) {
             throw new RuntimeException("Locale.getAvailableLocales() does not return the union of locales: diff="
                                        + getDiff(result, expected));
Binary file jdk/test/java/util/PluggableLocale/barprovider.jar has changed
Binary file jdk/test/java/util/PluggableLocale/fooprovider.jar has changed
--- a/jdk/test/java/util/PluggableLocale/providersrc/CalendarDataProviderImpl.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/java/util/PluggableLocale/providersrc/CalendarDataProviderImpl.java	Tue Nov 20 11:49:27 2012 -0800
@@ -48,65 +48,7 @@
     }
 
     @Override
-    public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) {
-        if (calendarType == null || locale == null) {
-            throw new NullPointerException();
-        }
-        if (!Utils.supportsLocale(Arrays.asList(avail), locale)) {
-            throw new IllegalArgumentException("locale is not one of available locales: "+ locale);
-        }
-        if (field != MONTH) {
-            return null;
-        }
-        return toMonthName(value + 1, style);
-    }
-
-    @Override
-    public Map<String, Integer> getDisplayNames(String calendarType, int field, int style, Locale locale) {
-        if (calendarType == null || locale == null) {
-            throw new NullPointerException();
-        }
-        if (!Utils.supportsLocale(Arrays.asList(avail), locale)) {
-            throw new IllegalArgumentException("locale is not one of available locales: " + locale);
-        }
-        if (field != MONTH) {
-            return null;
-        }
-        Map<String, Integer> map = new HashMap<>();
-        if (style == LONG_STANDALONE) {
-            style = LONG;
-        } else if (style == SHORT_STANDALONE) {
-            style = SHORT;
-        }
-        for (int month = JANUARY; month <= DECEMBER; month++) {
-            if (style == ALL_STYLES || style == LONG) {
-                map.put(toMonthName(month + 1, LONG), month);
-            }
-            if (style == ALL_STYLES || style == SHORT) {
-                map.put(toMonthName(month + 1, SHORT), month);
-            }
-        }
-        return map;
-    }
-
-    @Override
     public Locale[] getAvailableLocales() {
         return avail.clone();
     }
-
-    // month is 1-based.
-    public static String toMonthName(int month, int style) {
-        StringBuilder sb = new StringBuilder();
-        if (month >= 10) {
-            sb.append((char)(FULLWIDTH_ZERO + 1));
-            sb.appendCodePoint((char)(FULLWIDTH_ZERO + (month % 10)));
-        } else {
-            sb.appendCodePoint((char)(FULLWIDTH_ZERO + month));
-        }
-        if (style == SHORT || style == SHORT_STANDALONE) {
-            return sb.toString(); // full-width digit(s)
-        }
-        sb.append("\u304c\u3064"); // + "gatsu" in Hiragana
-        return sb.toString();
-    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/PluggableLocale/providersrc/CalendarNameProviderImpl.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2012, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.bar;
+
+import com.foobar.Utils;
+import java.util.Arrays;
+import static java.util.Calendar.*;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.spi.CalendarNameProvider;
+
+public class CalendarNameProviderImpl extends CalendarNameProvider {
+    static final char FULLWIDTH_ZERO = '\uff10';
+    static final Locale[] avail = {
+        new Locale("ja", "JP", "kids"),
+    };
+
+    @Override
+    public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) {
+        if (calendarType == null || locale == null) {
+            throw new NullPointerException();
+        }
+        if (!Utils.supportsLocale(Arrays.asList(avail), locale)) {
+            throw new IllegalArgumentException("locale is not one of available locales: "+ locale);
+        }
+        if (field != MONTH) {
+            return null;
+        }
+        return toMonthName(value + 1, style);
+    }
+
+    @Override
+    public Map<String, Integer> getDisplayNames(String calendarType, int field, int style, Locale locale) {
+        if (calendarType == null || locale == null) {
+            throw new NullPointerException();
+        }
+        if (!Utils.supportsLocale(Arrays.asList(avail), locale)) {
+            throw new IllegalArgumentException("locale is not one of available locales: " + locale);
+        }
+        if (field != MONTH) {
+            return null;
+        }
+        Map<String, Integer> map = new HashMap<>();
+        if (style == LONG_STANDALONE) {
+            style = LONG;
+        } else if (style == SHORT_STANDALONE) {
+            style = SHORT;
+        }
+        for (int month = JANUARY; month <= DECEMBER; month++) {
+            if (style == ALL_STYLES || style == LONG) {
+                map.put(toMonthName(month + 1, LONG), month);
+            }
+            if (style == ALL_STYLES || style == SHORT) {
+                map.put(toMonthName(month + 1, SHORT), month);
+            }
+        }
+        return map;
+    }
+
+    @Override
+    public Locale[] getAvailableLocales() {
+        return avail.clone();
+    }
+
+    // month is 1-based.
+    public static String toMonthName(int month, int style) {
+        StringBuilder sb = new StringBuilder();
+        if (month >= 10) {
+            sb.append((char)(FULLWIDTH_ZERO + 1));
+            sb.appendCodePoint((char)(FULLWIDTH_ZERO + (month % 10)));
+        } else {
+            sb.appendCodePoint((char)(FULLWIDTH_ZERO + month));
+        }
+        if (style == SHORT || style == SHORT_STANDALONE) {
+            return sb.toString(); // full-width digit(s)
+        }
+        sb.append("\u304c\u3064"); // + "gatsu" in Hiragana
+        return sb.toString();
+    }
+}
--- a/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java	Tue Nov 20 11:49:27 2012 -0800
@@ -32,7 +32,8 @@
 import com.foobar.Utils;
 
 public class CurrencyNameProviderImpl2 extends CurrencyNameProvider {
-    static Locale[] avail = {new Locale("ja", "JP", "tokyo")};
+    static Locale[] avail = {new Locale("ja", "JP", "tokyo"),
+                             new Locale("ja", "JP", "osaka"), };
     public Locale[] getAvailableLocales() {
         return avail;
     }
@@ -43,8 +44,12 @@
             throw new IllegalArgumentException("locale is not supported: "+locale);
         }
 
-        if (c.equals("JPY") && Utils.supportsLocale(avail[0], locale)) {
-            return "JPY-tokyo";
+        if (c.equals("JPY")) {
+            if (Utils.supportsLocale(avail[0], locale)) {
+                return "JPY-tokyo";
+            } else if (Utils.supportsLocale(avail[1], locale)) {
+                return "JPY-osaka";
+            }
         }
         return null;
     }
@@ -55,8 +60,12 @@
             throw new IllegalArgumentException("locale is not supported: "+locale);
         }
 
-        if (c.equals("JPY") && Utils.supportsLocale(avail[0], locale)) {
-            return "JPY-tokyo";
+        if (c.equals("JPY")) {
+            if (Utils.supportsLocale(avail[0], locale)) {
+                return "JPY-tokyo";
+            } else if (Utils.supportsLocale(avail[1], locale)) {
+                return "JPY-osaka";
+            }
         }
         return null;
     }
--- a/jdk/test/java/util/PluggableLocale/providersrc/Makefile	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/java/util/PluggableLocale/providersrc/Makefile	Tue Nov 20 11:49:27 2012 -0800
@@ -20,7 +20,8 @@
 	java.util.spi.CurrencyNameProvider \
 	java.util.spi.TimeZoneNameProvider \
 	java.util.spi.LocaleNameProvider \
-	java.util.spi.CalendarDataProvider
+	java.util.spi.CalendarDataProvider \
+	java.util.spi.CalendarNameProvider
 
 FOOFILES_JAVA = \
     BreakIteratorProviderImpl.java \
@@ -39,6 +40,7 @@
     TimeZoneNameProviderImpl.java \
     LocaleNameProviderImpl.java \
     CalendarDataProviderImpl.java \
+    CalendarNameProviderImpl.java \
     Utils.java
 
 BARFILES_PROPERTIES = \
@@ -68,3 +70,8 @@
 	cp $(BARFILES_PROPERTIES) $(BARDIR)/com/bar
 	rm -f $(DESTDIR)/barprovider.jar
 	$(BINDIR)/jar  cvf $(DESTDIR)/barprovider.jar -C $(BARDIR) .
+
+clean:
+	rm -rf $(BARDIR) $(FOODIR)
+
+.PHONY: all clean
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CalendarNameProvider	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,7 @@
+#
+#
+#
+# fully-qualified name of the java.util.spi.CalendarNameProvider
+# implementation class
+#
+com.bar.CalendarNameProviderImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/CheckLockLocationTest.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2012, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug     6244047
+ * @author Jim Gish
+ * @summary throw more precise IOException when pattern specifies invalid directory
+ *
+ * @run  main/othervm CheckLockLocationTest
+ */
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.AccessDeniedException;
+import java.nio.file.FileSystemException;
+import java.nio.file.NoSuchFileException;
+import java.util.logging.FileHandler;
+public class CheckLockLocationTest {
+
+    private static final String NON_WRITABLE_DIR = "non-writable-dir";
+    private static final String NOT_A_DIR = "not-a-dir";
+    private static final String WRITABLE_DIR = "writable-dir";
+    private static final String NON_EXISTENT_DIR = "non-existent-dir";
+
+    public static void main(String... args) throws IOException {
+        // we'll base all file creation attempts on the system temp directory,
+        // %t and also try specifying non-existent directories and plain files
+        // that should be directories, and non-writable directories,
+        // to exercise all code paths of checking the lock location
+        File writableDir = setup();
+        // we now have three files/directories to work with:
+        //    writableDir
+        //    notAdir
+        //    nonWritableDir
+        //    nonExistentDir (which doesn't exist)
+        runTests(writableDir);
+    }
+
+    /**
+     * @param writableDir in which log and lock file are created
+     * @throws SecurityException
+     * @throws RuntimeException
+     * @throws IOException
+     */
+    private static void runTests(File writableDir) throws SecurityException,
+            RuntimeException, IOException {
+        // Test 1: make sure we can create FileHandler in writable directory
+        try {
+            new FileHandler("%t/" + WRITABLE_DIR + "/log.log");
+        } catch (IOException ex) {
+            throw new RuntimeException("Test failed: should have been able"
+                    + " to create FileHandler for " + "%t/" + WRITABLE_DIR
+                    + "/log.log in writable directory.", ex);
+        } finally {
+            // the above test leaves files in the directory.  Get rid of the
+            // files created and the directory
+            delete(writableDir);
+        }
+
+        // Test 2: creating FileHandler in non-writable directory should fail
+        try {
+            new FileHandler("%t/" + NON_WRITABLE_DIR + "/log.log");
+            throw new RuntimeException("Test failed: should not have been able"
+                    + " to create FileHandler for " + "%t/" + NON_WRITABLE_DIR
+                    + "/log.log in non-writable directory.");
+        } catch (IOException ex) {
+            // check for the right exception
+            if (!(ex instanceof AccessDeniedException)) {
+                throw new RuntimeException("Test failed: Expected exception was not an AccessDeniedException", ex);
+            }
+        }
+
+        // Test 3: creating FileHandler in non-directory should fail
+        try {
+            new FileHandler("%t/" + NOT_A_DIR + "/log.log");
+            throw new RuntimeException("Test failed: should not have been able"
+                    + " to create FileHandler for " + "%t/" + NOT_A_DIR
+                    + "/log.log in non-directory.");
+        } catch (IOException ex) {
+            // check for the right exception
+            if (!(ex instanceof FileSystemException && ex.getMessage().contains("Not a directory"))) {
+                throw new RuntimeException("Test failed: Expected exception was not a FileSystemException", ex);
+            }
+        }
+
+        // Test 4: make sure we can't create a FileHandler in a non-existent dir
+        try {
+            new FileHandler("%t/" + NON_EXISTENT_DIR + "/log.log");
+            throw new RuntimeException("Test failed: should not have been able"
+                    + " to create FileHandler for " + "%t/" + NON_EXISTENT_DIR
+                    + "/log.log in a non-existent directory.");
+        } catch (IOException ex) {
+            // check for the right exception
+            if (!(ex instanceof NoSuchFileException)) {
+                throw new RuntimeException("Test failed: Expected exception was not a NoSuchFileException", ex);
+            }
+        }
+    }
+
+    /**
+     * Setup all the files and directories needed for the tests
+     *
+     * @return writable directory created that needs to be deleted when done
+     * @throws RuntimeException
+     */
+    private static File setup() throws RuntimeException {
+        // First do some setup in the temporary directory (using same logic as
+        // FileHandler for %t pattern)
+        String tmpDir = System.getProperty("java.io.tmpdir"); // i.e. %t
+        if (tmpDir == null) {
+            tmpDir = System.getProperty("user.home");
+        }
+        File tmpOrHomeDir = new File(tmpDir);
+        // Create a writable directory here (%t/writable-dir)
+        File writableDir = new File(tmpOrHomeDir, WRITABLE_DIR);
+        if (!createFile(writableDir, true)) {
+            throw new RuntimeException("Test setup failed: unable to create"
+                    + " writable working directory "
+                    + writableDir.getAbsolutePath() );
+        }
+        // writableDirectory and its contents will be deleted after the test
+        // that uses it
+
+        // Create a plain file which we will attempt to use as a directory
+        // (%t/not-a-dir)
+        File notAdir = new File(tmpOrHomeDir, NOT_A_DIR);
+        if (!createFile(notAdir, false)) {
+            throw new RuntimeException("Test setup failed: unable to a plain"
+                    + " working file " + notAdir.getAbsolutePath() );
+        }
+        notAdir.deleteOnExit();
+
+        // Create a non-writable directory (%t/non-writable-dir)
+        File nonWritableDir = new File(tmpOrHomeDir, NON_WRITABLE_DIR);
+        if (!createFile(nonWritableDir, true)) {
+            throw new RuntimeException("Test setup failed: unable to create"
+                    + " a non-"
+                    + "writable working directory "
+                    + nonWritableDir.getAbsolutePath() );
+        }
+        nonWritableDir.deleteOnExit();
+
+        // make it non-writable
+        if (!nonWritableDir.setWritable(false)) {
+            throw new RuntimeException("Test setup failed: unable to make"
+                    + " working directory " + nonWritableDir.getAbsolutePath()
+                    + " non-writable.");
+        }
+
+        // make sure non-existent directory really doesn't exist
+        File nonExistentDir = new File(tmpOrHomeDir, NON_EXISTENT_DIR);
+        if (nonExistentDir.exists()) {
+            nonExistentDir.delete();
+        }
+        return writableDir;
+    }
+
+    /**
+     * @param newFile
+     * @return true if file already exists or creation succeeded
+     */
+    private static boolean createFile(File newFile, boolean makeDirectory) {
+        if (newFile.exists()) {
+            return true;
+        }
+        if (makeDirectory) {
+            return newFile.mkdir();
+        } else {
+            try {
+                return newFile.createNewFile();
+            } catch (IOException ioex) {
+                ioex.printStackTrace();
+                return false;
+            }
+        }
+    }
+
+    /*
+     * Recursively delete all files starting at specified file
+     */
+    private static void delete(File f) throws IOException {
+        if (f != null && f.isDirectory()) {
+            for (File c : f.listFiles())
+                delete(c);
+        }
+        if (!f.delete())
+            throw new FileNotFoundException("Failed to delete file: " + f);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/config/DNS.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2012, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+// See dns.sh.
+import sun.security.krb5.Config;
+
+public class DNS {
+    public static void main(String[] args) throws Exception {
+        System.setProperty("java.security.krb5.conf",
+                System.getProperty("test.src", ".") +"/nothing.conf");
+        Config config = Config.getInstance();
+        String kdcs = config.getKDCList("X");
+        if (!kdcs.equals("a.com.:88 b.com.:99") &&
+                !kdcs.equals("a.com. b.com.:99")) {
+            throw new Exception("Strange KDC: [" + kdcs + "]");
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/config/NamingManager.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2012, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javax.naming.spi;
+
+import com.sun.jndi.dns.DnsContext;
+import java.util.Hashtable;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttribute;
+import javax.naming.directory.BasicAttributes;
+
+/**
+ * A fake javax.naming.spi.NamingManager. It allows reading a DNS
+ * record without contacting a real server.
+ *
+ * See DNS.java and dns.sh.
+ */
+public class NamingManager {
+    NamingManager() {}
+    public static Context getURLContext(
+            String scheme, Hashtable<?,?> environment)
+            throws NamingException {
+        return new DnsContext("", null, new Hashtable<String,String>()) {
+            public Attributes getAttributes(String name, String[] attrIds)
+                    throws NamingException {
+                return new BasicAttributes() {
+                    public Attribute get(String attrID) {
+                        BasicAttribute ba  = new BasicAttribute(attrID);
+                        ba.add("1 1 99 b.com.");
+                        ba.add("0 0 88 a.com.");    // 2nd has higher priority
+                        return ba;
+                    }
+                };
+            }
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/config/dns.sh	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2012, 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
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# @test
+# @bug 8002344
+# @summary Krb5LoginModule config class does not return proper KDC list from DNS
+#
+
+if [ "${TESTJAVA}" = "" ] ; then
+  JAVAC_CMD=`which javac`
+  TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+if [ "${TESTSRC}" = "" ] ; then
+   TESTSRC="."
+fi
+
+$TESTJAVA/bin/javac -d . \
+        ${TESTSRC}/NamingManager.java ${TESTSRC}/DNS.java
+$TESTJAVA/bin/java -Xbootclasspath/p:. DNS
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jar/JarBackSlash.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2012 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Portions Copyright (c) 2012 IBM Corporation
+ */
+
+/*
+ * @test
+ * @bug 7201156
+ * @summary jar tool fails to convert file separation characters for list and extract
+ * @author Sean Chou
+ */
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+
+import sun.tools.jar.Main;
+
+public class JarBackSlash {
+
+    // used construct an entry JarBackSlash/dir/file.txt
+    private static String JARBACKSLASH = "JarBackSlash";
+    private static String DIR = "dir";
+    private static String FILENAME = "file.txt";
+
+    private static File createJarFile() throws IOException {
+        File jarFile = File.createTempFile("JarBackSlashTest", ".jar");
+        jarFile.deleteOnExit();
+
+        try (JarOutputStream output = new JarOutputStream(new FileOutputStream(jarFile))) {
+            JarEntry entry = new JarEntry(JARBACKSLASH + "/" + DIR + "/" + FILENAME);
+            output.putNextEntry(entry);
+        }
+
+        return jarFile;
+    }
+
+    private static void testJarList(String jarFile) throws IOException {
+        List<String> argList = new ArrayList<String>();
+        argList.add("-tvf");
+        argList.add(jarFile);
+        argList.add(JARBACKSLASH + File.separatorChar + DIR + File.separatorChar + FILENAME);
+
+        String jarArgs[] = new String[argList.size()];
+        jarArgs = argList.toArray(jarArgs);
+
+        PipedOutputStream pipedOutput = new PipedOutputStream();
+        PipedInputStream pipedInput = new PipedInputStream(pipedOutput);
+        PrintStream out = new PrintStream(pipedOutput);
+
+        Main jarTool = new Main(out, System.err, "jar");
+        if (!jarTool.run(jarArgs)) {
+            fail("Could not list jar file.");
+        }
+
+        out.flush();
+        check(pipedInput.available() > 0);
+    }
+
+
+    private static void testJarExtract(String jarFile) throws IOException {
+        List<String> argList = new ArrayList<String>();
+        argList.add("-xvf");
+        argList.add(jarFile);
+        argList.add(JARBACKSLASH + File.separatorChar + DIR + File.separatorChar + FILENAME);
+
+        String jarArgs[] = new String[argList.size()];
+        jarArgs = argList.toArray(jarArgs);
+
+        PipedOutputStream pipedOutput = new PipedOutputStream();
+        PipedInputStream pipedInput = new PipedInputStream(pipedOutput);
+        PrintStream out = new PrintStream(pipedOutput);
+
+        Main jarTool = new Main(out, System.err, "jar");
+        if (!jarTool.run(jarArgs)) {
+            fail("Could not list jar file.");
+        }
+
+        out.flush();
+        check(pipedInput.available() > 0);
+    }
+
+    public static void realMain(String[] args) throws Throwable {
+        File tmpJarFile = createJarFile();
+        String tmpJarFilePath = tmpJarFile.getAbsolutePath();
+
+        testJarList(tmpJarFilePath);
+        testJarExtract(tmpJarFilePath);
+    }
+
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.println("\nPassed = " + passed + " failed = " + failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/FXLauncherTest.java	Tue Nov 20 11:49:27 2012 -0800
@@ -0,0 +1,307 @@
+/*
+ * Copyright (c) 2012, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8001533
+ * @summary Test launching FX application with java -jar
+ * Test uses main method and blank main method, a jfx app class and an incorrest
+ * jfx app class, a main-class for the manifest, a bogus one and none.
+ * All should execute except the incorrect fx app class entries.
+ * @run main FXLauncherTest
+ */
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class FXLauncherTest extends TestHelper {
+    private static final String FX_MARKER_CLASS = "javafx.application.Application";
+    private static void line() {
+        System.out.println("_____________________________________________");
+    }
+    private static File MainJavaFile = null;
+    private static final File FXtestJar =  new File("fxtest.jar");
+    private static final File ManifestFile = new File("manifest.txt");
+    private static final File ScratchDir = new File(".");
+
+    /* standard main class can be used as java main for fx app class */
+    static final String StdMainClass = "helloworld.HelloWorld";
+    static int testcount = 0;
+
+    /* a main method and a blank. */
+    static final String[] MAIN_METHODS = {
+        "public static void main(String[] args) { launch(args); }",
+        " "
+    };
+
+    // Array of parameters to pass to fx application.
+    static final String[] APP_PARMS = { "one", "two" };
+
+    // Create fx java file for test application
+    static void createJavaFile(String mainmethod) {
+        try {
+            String mainClass = "HelloWorld";
+            List<String> contents = new ArrayList<>();
+            contents.add("package helloworld;");
+            contents.add("import javafx.application.Application;");
+            contents.add("import javafx.event.ActionEvent;");
+            contents.add("import javafx.event.EventHandler;");
+            contents.add("import javafx.scene.Scene;");
+            contents.add("import javafx.scene.control.Button;");
+            contents.add("import javafx.scene.layout.StackPane;");
+            contents.add("import javafx.stage.Stage;");
+            contents.add("public class HelloWorld extends Application {");
+            contents.add(mainmethod);
+            contents.add("@Override");
+            contents.add("public void start(Stage primaryStage) {");
+            contents.add("    primaryStage.setTitle(\"Hello World!\");");
+            contents.add("    Button btn = new Button();");
+            contents.add("    btn.setText(\"Say 'Hello World'\");");
+            contents.add("    btn.setOnAction(new EventHandler<ActionEvent>() {");
+            contents.add("        @Override");
+            contents.add("        public void handle(ActionEvent event) {");
+            contents.add("            System.out.println(\"Hello World!\");");
+            contents.add("        }");
+            contents.add("    });");
+            contents.add("    StackPane root = new StackPane();");
+            contents.add("    root.getChildren().add(btn);");
+            contents.add("    primaryStage.setScene(new Scene(root, 300, 250));");
+            contents.add("//    primaryStage.show(); no GUI for auto tests. ");
+            contents.add("    System.out.println(\"HelloWorld.primaryStage.show();\");");
+            contents.add("    System.out.println(\"Parameters:\");" );
+            contents.add("    for(String p : getParameters().getUnnamed())");
+            contents.add("        System.out.println(\"parameter: \" + p );" );
+            contents.add("    System.exit(0);");
+            contents.add("}");
+            contents.add("}");
+
+            // Create and compile java source.
+            MainJavaFile = new File(mainClass + JAVA_FILE_EXT);
+            createFile(MainJavaFile, contents);
+            compile("-d", ".", mainClass + JAVA_FILE_EXT);
+        } catch (java.io.IOException ioe) {
+            ioe.printStackTrace();
+            throw new RuntimeException("Failed creating HelloWorld.");
+        }
+    }
+
+    /*
+     * Create class to extend fx java file for test application
+     * TODO: make test to create java file and this extension of the java file
+     *      and jar them together an run app via this java class.
+     */
+    static void createExtJavaFile(String mainmethod) {
+        try {
+            String mainClass = "ExtHello";
+            List<String> contents = new ArrayList<>();
+            contents.add("package helloworld;");
+            contents.add("public class ExtHello extends HelloWorld {");
+            contents.add(mainmethod);
+            contents.add("}");
+            // Create and compile java source.
+            MainJavaFile = new File(mainClass + JAVA_FILE_EXT);
+            createFile(MainJavaFile, contents);
+            compile("-cp", ".", "-d", ".", mainClass + JAVA_FILE_EXT);
+        } catch (java.io.IOException ioe) {
+            ioe.printStackTrace();
+            throw new RuntimeException("Failed creating HelloWorld.");
+        }
+    }
+
+    // Create manifest for test fx application
+    static List<String> createManifestContents(String mainclassentry) {
+        List<String> mcontents = new ArrayList<>();
+        mcontents.add("Manifest-Version: 1.0");
+        mcontents.add("Created-By: FXLauncherTest");
+        mcontents.add("Main-Class: " + mainclassentry);
+        return mcontents;
+    }
+
+    // Method to marshal createJar to TestHelper.createJar()
+    static void createJar(File theJar, File manifestFile) {
+        createJar("cvmf", manifestFile.getName(),
+                  theJar.getAbsolutePath(), "helloworld");
+    }
+
+    static void saveFile(String tname, int testcount, File srcFile) {
+        File newFile = new File(tname + "-" + testcount + "-" + srcFile.getName());
+        System.out.println("renaming " + srcFile.getName() +
+                           " to " + newFile.getName());
+        srcFile.renameTo(newFile);
+    }
+
+    static void cleanupFiles() throws IOException {
+        for(File f : ScratchDir.listFiles()) {
+            recursiveDelete(f);
+        }
+    }
+
+    static void checkStatus(TestResult tr, String testName, int testCount,
+                            String mainclass) throws Exception {
+        if (tr.testStatus) {
+            System.out.println("PASS: " + testName + ":" + testCount +
+                               " : test with " + mainclass);
+            cleanupFiles();
+        } else {
+            saveFile(testName, testcount, FXtestJar);
+            System.out.println("FAIL: " + testName + ":" + testCount +
+                               " : test with " + mainclass);
+            cleanupFiles();
+            System.err.println(tr);
+            throw new Exception("Failed: " + testName + ":" + testCount);
+        }
+    }
+
+    /*
+     * Set Main-Class and iterate main_methods.
+     * Try launching with both -jar and -cp methods.
+     * All cases should run.
+     */
+    @Test
+    static void testBasicFXApp() throws Exception {
+        testBasicFXApp(true);
+        testBasicFXApp(false);
+    }
+
+    static void testBasicFXApp(boolean useCP) throws Exception {
+        String testname = "testBasicFXApp";
+        for (String mm : MAIN_METHODS) {
+            testcount++;
+            line();
+            System.out.println("test# " + testcount +
+                "-  Main method: " + mm +
+                 ";  MF main class: " + StdMainClass);
+            createJavaFile(mm);
+            createFile(ManifestFile, createManifestContents(StdMainClass));
+            createJar(FXtestJar, ManifestFile);
+            String sTestJar = FXtestJar.getAbsolutePath();
+            TestResult tr;
+            if (useCP) {
+                tr = doExec(javaCmd, "-cp", sTestJar, StdMainClass, APP_PARMS[0], APP_PARMS[1]);
+                testname = testname.concat("_useCP");
+            } else {
+                tr = doExec(javaCmd, "-jar", sTestJar, APP_PARMS[0], APP_PARMS[1]);
+            }
+            tr.checkPositive();
+            if (tr.testStatus && tr.contains("HelloWorld.primaryStage.show()")) {
+                for (String p : APP_PARMS) {
+                    if (!tr.contains(p)) {
+                        System.err.println("ERROR: Did not find "
+                                + p + " in output!");
+                    }
+                }
+            }
+            checkStatus(tr, testname, testcount, StdMainClass);
+        }
+    }
+
+    /*
+     * Set Main-Class and iterate main methods.
+     * Main class extends another class that extends Application.
+     * Try launching with both -jar and -cp methods.
+     * All cases should run.
+     */
+    @Test
+    static void testExtendFXApp() throws Exception {
+        testExtendFXApp(true);
+        testExtendFXApp(false);
+    }
+
+    static void testExtendFXApp(boolean useCP) throws Exception {
+        String testname = "testExtendFXApp";
+        for (String mm : MAIN_METHODS) {
+            testcount++;
+            line();
+            System.out.println("test# " + testcount +
+                "-  Main method: " + mm + ";  MF main class: " + StdMainClass);
+            createJavaFile(mm);
+            createExtJavaFile(mm);
+            createFile(ManifestFile, createManifestContents(StdMainClass));
+            createJar(FXtestJar, ManifestFile);
+            String sTestJar = FXtestJar.getAbsolutePath();
+            TestResult tr;
+            if (useCP) {
+                tr = doExec(javaCmd, "-cp", sTestJar, StdMainClass, APP_PARMS[0], APP_PARMS[1]);
+                testname = testname.concat("_useCP");
+            } else {
+                tr = doExec(javaCmd, "-jar", sTestJar, APP_PARMS[0], APP_PARMS[1]);
+            }
+            tr.checkPositive();
+            if (tr.testStatus && tr.contains("HelloWorld.primaryStage.show()")) {
+                for (String p : APP_PARMS) {
+                    if (!tr.contains(p)) {
+                        System.err.println("ERROR: Did not find "
+                                + p + " in output!");
+                    }
+                }
+            }
+            checkStatus(tr, testname, testcount, StdMainClass);
+        }
+    }
+
+    /*
+     * test to ensure that we don't load any extraneous fx jars when
+     * launching a standard java application
+     */
+    @Test
+    static void testExtraneousJars()throws Exception {
+        String testname = "testExtraneousJars";
+        testcount++;
+        line();
+        System.out.println("test# " + testcount);
+        TestResult tr = doExec(javacCmd, "-J-verbose:class", "-version");
+        if (!tr.notContains("jfxrt.jar")) {
+            System.out.println("testing for extraneous jfxrt jar");
+            System.out.println(tr);
+            throw new Exception("jfxrt.jar is being loaded by javac!!!");
+        }
+        checkStatus(tr, testname, testcount, StdMainClass);
+    }
+
+    public static void main(String... args) throws Exception {
+        //check if fx is part of jdk
+        Class<?> fxClass = null;
+        try {
+            fxClass = Class.forName(FX_MARKER_CLASS);
+        } catch (ClassNotFoundException ex) {
+            // do nothing
+        }
+        if (fxClass != null) {
+            FXLauncherTest fxt = new FXLauncherTest();
+            fxt.run(args);
+            if (testExitValue > 0) {
+                System.out.println("Total of " + testExitValue
+                        + " failed. Test cases covered: "
+                        + FXLauncherTest.testcount);
+                System.exit(1);
+            } else {
+                System.out.println("All tests pass. Test cases covered: "
+                        + FXLauncherTest.testcount);
+            }
+        } else {
+            System.err.println("Warning: JavaFX components missing or not supported");
+            System.err.println("         test passes vacuosly.");
+         }
+    }
+}
--- a/jdk/test/tools/launcher/TestHelper.java	Tue Nov 20 11:47:52 2012 -0800
+++ b/jdk/test/tools/launcher/TestHelper.java	Tue Nov 20 11:49:27 2012 -0800
@@ -559,6 +559,16 @@
             return false;
         }
 
+        boolean notContains(String str) {
+             for (String x : testOutput) {
+                if (x.contains(str)) {
+                    appendError("string <" + str + "> found");
+                    return false;
+                }
+            }
+            return true;
+        }
+
         boolean matches(String stringToMatch) {
           for (String x : testOutput) {
                 if (x.matches(stringToMatch)) {