changeset 1693:15ba41d0ff2e

Add remaining security patches. 2009-11-09 Andrew John Hughes <ahughes@redhat.com> * Makefile.am: Add remaining security patches. * NEWS: Updated with security patches. * patches/security/icedtea-6631533.patch, * patches/security/icedtea-6632445.patch, * patches/security/icedtea-6636650.patch, * patches/security/icedtea-6657026.patch, * patches/security/icedtea-6657138.patch, * patches/security/icedtea-6664512.patch, * patches/security/icedtea-6822057.patch, * patches/security/icedtea-6824265.patch, * patches/security/icedtea-6861062.patch, * patches/security/icedtea-6872358.patch: New security patches.
author Andrew John Hughes <ahughes@redhat.com>
date Mon, 09 Nov 2009 17:42:27 +0000
parents 2c854193cc9d
children a2d5ec5e9724
files ChangeLog Makefile.am NEWS patches/security/icedtea-6631533.patch patches/security/icedtea-6632445.patch patches/security/icedtea-6636650.patch patches/security/icedtea-6657026.patch patches/security/icedtea-6657138.patch patches/security/icedtea-6664512.patch patches/security/icedtea-6822057.patch patches/security/icedtea-6824265.patch patches/security/icedtea-6861062.patch patches/security/icedtea-6872358.patch
diffstat 13 files changed, 4729 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Nov 03 17:50:20 2009 +0100
+++ b/ChangeLog	Mon Nov 09 17:42:27 2009 +0000
@@ -1,4 +1,22 @@
+2009-11-09  Andrew John Hughes  <ahughes@redhat.com>
+
+	* Makefile.am:
+	Add remaining security patches.
+	* NEWS: Updated with security patches.
+	* patches/security/icedtea-6631533.patch,
+	* patches/security/icedtea-6632445.patch,
+	* patches/security/icedtea-6636650.patch,
+	* patches/security/icedtea-6657026.patch,
+	* patches/security/icedtea-6657138.patch,
+	* patches/security/icedtea-6664512.patch,
+	* patches/security/icedtea-6822057.patch,
+	* patches/security/icedtea-6824265.patch,
+	* patches/security/icedtea-6861062.patch,
+	* patches/security/icedtea-6872358.patch:
+	New security patches.
+
 2009-11-03 Martin Matejovic <mmatejov@redhat.com>
+	
 	* patches/security/icedtea-6862968.patch
 	* patches/security/icedtea-6863503.patch
 	* patches/security/icedtea-6864911.patch
--- a/Makefile.am	Tue Nov 03 17:50:20 2009 +0100
+++ b/Makefile.am	Mon Nov 09 17:42:27 2009 +0000
@@ -631,6 +631,17 @@
 	patches/security/icedtea-6864911.patch \
 	patches/security/icedtea-6872357.patch \
 	patches/security/icedtea-6874643.patch \
+	patches/security/icedtea-6874643.patch \
+	patches/security/icedtea-6631533.patch \
+	patches/security/icedtea-6632445.patch \
+	patches/security/icedtea-6636650.patch \
+	patches/security/icedtea-6657026.patch \
+	patches/security/icedtea-6657138.patch \
+	patches/security/icedtea-6664512.patch \
+	patches/security/icedtea-6822057.patch \
+	patches/security/icedtea-6824265.patch \
+	patches/security/icedtea-6861062.patch \
+	patches/security/icedtea-6872358.patch \
 	patches/icedtea-jar-misc.patch
 
 if WITH_ALT_HSBUILD
--- a/NEWS	Tue Nov 03 17:50:20 2009 +0100
+++ b/NEWS	Mon Nov 09 17:42:27 2009 +0000
@@ -1,3 +1,21 @@
+New in release 1.6.2 (2009-11-09)
+- Latest security updates:
+  - (CVE-2009-3728) ICC_Profile file existence detection information leak (6631533)
+  - (CVE-2009-3885) BMP parsing DoS with UNC ICC links (6632445)
+  - (CVE-2009-3881) resurrected classloaders can still have children (6636650) 
+  - (CVE-2009-3882) Numerous static security flaws in Swing (findbugs) (6657026)
+  - (CVE-2009-3883) Mutable statics in Windows PL&F (findbugs) (6657138)
+  - (CVE-2009-3880) UI logging information leakage (6664512)
+  - (CVE-2009-3879) GraphicsConfiguration information leak (6822057)
+  - (CVE-2009-3884) zoneinfo file existence information leak (6824265)
+  - (CVE-2009-2409) deprecate MD2 in SSL cert validation (Kaminsky) (6861062)
+  - (CVE-2009-3873) JPEG Image Writer quantization problem (6862968)
+  - (CVE-2009-3875) MessageDigest.isEqual introduces timing attack vulnerabilities (6863503)
+  - (CVE-2009-3876, CVE-2009-3877) OpenJDK ASN.1/DER input stream parser denial of service (6864911)
+  - (CVE-2009-3869) JRE AWT setDifflCM stack overflow (6872357)
+  - (CVE-2009-3874) ImageI/O JPEG heap overflow (6874643
+  - (CVE-2009-3871) JRE AWT setBytePixels heap overflow (6872358)
+
 New in release 1.6.1:
 - Fix tarball error in 1.6
 - Improve jar performance,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6631533.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,184 @@
+--- old/src/share/classes/java/awt/color/ICC_Profile.java	2009-07-29 13:31:14.948600000 +0400
++++ openjdk/jdk/src/share/classes/java/awt/color/ICC_Profile.java	2009-07-29 13:31:14.153000000 +0400
+@@ -944,15 +944,15 @@
+      * and it does not permit read access to the given file.
+      */
+     public static ICC_Profile getInstance(String fileName) throws IOException {
+-    ICC_Profile thisProfile;
+-    FileInputStream fis;
++        ICC_Profile thisProfile;
++        FileInputStream fis = null;
+ 
+-        SecurityManager security = System.getSecurityManager();
+-        if (security != null) {
+-            security.checkRead(fileName);
+-        }
+ 
+-        if ((fis = openProfile(fileName)) == null) {
++        File f = getProfileFile(fileName);
++        if (f != null) {
++            fis = new FileInputStream(f);
++        }
++        if (fis == null) {
+             throw new IOException("Cannot open file " + fileName);
+         }
+ 
+@@ -1064,13 +1064,24 @@
+ 
+ 
+     void activateDeferredProfile() {
+-    byte profileData[];
+-    FileInputStream fis;
+-    String fileName = deferralInfo.filename;
++        byte profileData[];
++        FileInputStream fis;
++        final String fileName = deferralInfo.filename;
+ 
+         profileActivator = null;
+         deferralInfo = null;
+-        if ((fis = openProfile(fileName)) == null) {
++        PrivilegedAction<FileInputStream> pa = new PrivilegedAction<FileInputStream>() {
++            public FileInputStream run() {
++                File f = getStandardProfileFile(fileName);
++                if (f != null) {
++                    try {
++                        return new FileInputStream(f);
++                    } catch (FileNotFoundException e) {}
++                }
++                return null;
++            }
++        };
++        if ((fis = AccessController.doPrivileged(pa)) == null) {
+             throw new IllegalArgumentException("Cannot open file " + fileName);
+         }
+         try {
+@@ -1765,66 +1776,88 @@
+      * available, such as a profile for sRGB.  Built-in profiles use .pf as
+      * the file name extension for profiles, e.g. sRGB.pf.
+      */
+-    private static FileInputStream openProfile(final String fileName) {
+-        return (FileInputStream)java.security.AccessController.doPrivileged(
+-            new java.security.PrivilegedAction() {
+-            public Object run() {
+-                return privilegedOpenProfile(fileName);
+-            }
+-        });
+-    }
+-
+-    /*
+-     * this version is called from doPrivileged in privilegedOpenProfile.
+-     * the whole method is privileged!
+-     */
+-    private static FileInputStream privilegedOpenProfile(String fileName) {
+-        FileInputStream fis = null;
++    private static File getProfileFile(String fileName) {
+         String path, dir, fullPath;
+ 
+         File f = new File(fileName); /* try absolute file name */
+-
++        if (f.isAbsolute()) {
++            /* Rest of code has little sense for an absolute pathname,
++               so return here. */
++            return f.isFile() ? f : null;
++        }
+         if ((!f.isFile()) &&
+                 ((path = System.getProperty("java.iccprofile.path")) != null)){
+                                     /* try relative to java.iccprofile.path */
+-                StringTokenizer st =
+-                    new StringTokenizer(path, File.pathSeparator);
+-                while (st.hasMoreTokens() && (!f.isFile())) {
+-                    dir = st.nextToken();
+-                        fullPath = dir + File.separatorChar + fileName;
+-                    f = new File(fullPath);
++            StringTokenizer st =
++                new StringTokenizer(path, File.pathSeparator);
++            while (st.hasMoreTokens() && ((f == null) || (!f.isFile()))) {
++                dir = st.nextToken();
++                fullPath = dir + File.separatorChar + fileName;
++                f = new File(fullPath);
++                if (!isChildOf(f, dir)) {
++                    f = null;
+                 }
+             }
++        }
+ 
+-        if ((!f.isFile()) &&
++        if (((f == null) || (!f.isFile())) &&
+                 ((path = System.getProperty("java.class.path")) != null)) {
+                                     /* try relative to java.class.path */
+-                StringTokenizer st =
+-                    new StringTokenizer(path, File.pathSeparator);
+-                while (st.hasMoreTokens() && (!f.isFile())) {
+-                    dir = st.nextToken();
+-                        fullPath = dir + File.separatorChar + fileName;
+-                    f = new File(fullPath);
+-                }
+-            }
+-
+-        if (!f.isFile()) { /* try the directory of built-in profiles */
+-                dir = System.getProperty("java.home") +
+-                    File.separatorChar + "lib" + File.separatorChar + "cmm";
++            StringTokenizer st =
++                new StringTokenizer(path, File.pathSeparator);
++            while (st.hasMoreTokens() && ((f == null) || (!f.isFile()))) {
++                dir = st.nextToken();
+                 fullPath = dir + File.separatorChar + fileName;
+                 f = new File(fullPath);
++                if (!isChildOf(f, dir)) {
++                    f = null;
++                }
+             }
++        }
++        if ((f == null) || (!f.isFile())) {
++            /* try the directory of built-in profiles */
++            f = getStandardProfileFile(fileName);
++        }
++        if (f != null && f.isFile()) {
++            return f;
++        }
++        return null;
++    }
+ 
+-        if (f.isFile()) {
+-            try {
+-                fis = new FileInputStream(f);
+-            } catch (FileNotFoundException e) {
++    /**
++     * Returns a file object corresponding to a built-in profile
++     * specified by fileName.
++     * If there is no built-in profile with such name, then the method
++     * returns null.
++     */
++    private static File getStandardProfileFile(String fileName) {
++        String dir = System.getProperty("java.home") +
++            File.separatorChar + "lib" + File.separatorChar + "cmm";
++        String fullPath = dir + File.separatorChar + fileName;
++        File f = new File(fullPath);
++        return (f.isFile() && isChildOf(f, dir)) ? f : null;
++    }
++
++    /**
++     * Checks whether given file resides inside give directory.
++     */
++    private static boolean isChildOf(File f, String dirName) {
++        try {
++            File dir = new File(dirName);
++            String canonicalDirName = dir.getCanonicalPath();
++            if (!canonicalDirName.endsWith(File.separator)) {
++                canonicalDirName += File.separator;
+             }
++            String canonicalFileName = f.getCanonicalPath();
++            return canonicalFileName.startsWith(canonicalDirName);
++        } catch (IOException e) {
++            /* we do not expect the IOException here, because invocation
++             * of this function is always preceeded by isFile() call.
++             */
++            return false;
+         }
+-        return fis;
+     }
+ 
+-
+     /*
+      * Serialization support.
+      *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6632445.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,103 @@
+--- old/src/share/classes/com/sun/imageio/plugins/bmp/BMPImageReader.java	2009-07-28 17:06:52.144000000 +0400
++++ openjdk/jdk/src/share/classes/com/sun/imageio/plugins/bmp/BMPImageReader.java	2009-07-28 17:06:51.488000000 +0400
+@@ -62,6 +62,8 @@
+ 
+ import java.io.*;
+ import java.nio.*;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.ArrayList;
+ import java.util.Iterator;
+ import java.util.StringTokenizer;
+@@ -502,12 +504,18 @@
+             iis.reset();
+ 
+             try {
+-                if (metadata.colorSpace == PROFILE_LINKED)
++                if (metadata.colorSpace == PROFILE_LINKED &&
++                    isLinkedProfileAllowed() &&
++                    !isUncOrDevicePath(profile))
++                {
++                    String path = new String(profile, "windows-1252");
++
+                     colorSpace =
+-                        new ICC_ColorSpace(ICC_Profile.getInstance(new String(profile)));
+-                else
++                        new ICC_ColorSpace(ICC_Profile.getInstance(path));
++                } else {
+                     colorSpace =
+                         new ICC_ColorSpace(ICC_Profile.getInstance(profile));
++                }
+             } catch (Exception e) {
+                 colorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+             }
+@@ -1745,4 +1753,69 @@
+         public void sequenceStarted(ImageReader src, int minIndex) {}
+         public void readAborted(ImageReader src) {}
+     }
++
++    private static Boolean isLinkedProfileDisabled = null;
++
++    private static boolean isLinkedProfileAllowed() {
++        if (isLinkedProfileDisabled == null) {
++            PrivilegedAction<Boolean> a = new PrivilegedAction<Boolean>() {
++                public Boolean run() {
++                    return Boolean.getBoolean("sun.imageio.plugins.bmp.disableLinkedProfiles");
++                }
++            };
++            isLinkedProfileDisabled = AccessController.doPrivileged(a);
++        }
++        return !isLinkedProfileDisabled;
++    }
++
++    private static Boolean isWindowsPlatform = null;
++
++    /**
++     * Verifies whether the byte array contans a unc path.
++     * Non-UNC path examples:
++     *  c:\path\to\file  - simple notation
++     *  \\?\c:\path\to\file - long notation
++     *
++     * UNC path examples:
++     *  \\server\share - a UNC path in simple notation
++     *  \\?\UNC\server\share - a UNC path in long notation
++     *  \\.\some\device - a path to device.
++     */
++    private static boolean isUncOrDevicePath(byte[] p) {
++        if (isWindowsPlatform == null) {
++            PrivilegedAction<Boolean> a = new PrivilegedAction<Boolean>() {
++                public Boolean run() {
++                    String osname = System.getProperty("os.name");
++                    return (osname != null &&
++                            osname.toLowerCase().startsWith("win"));
++                }
++            };
++            isWindowsPlatform = AccessController.doPrivileged(a);
++        }
++
++        if (!isWindowsPlatform) {
++            /* no need for the check on platforms except windows */
++            return false;
++        }
++
++        /* normalize prefix of the path */
++        if (p[0] == '/') p[0] = '\\';
++        if (p[1] == '/') p[1] = '\\';
++        if (p[3] == '/') p[3] = '\\';
++
++
++        if ((p[0] == '\\') && (p[1] == '\\')) {
++            if ((p[2] == '?') && (p[3] == '\\')) {
++                // long path: whether unc or local
++                return ((p[4] == 'U' || p[4] == 'u') &&
++                        (p[5] == 'N' || p[5] == 'n') &&
++                        (p[6] == 'C' || p[6] == 'c'));
++            } else {
++                // device path or short unc notation
++                return true;
++            }
++        } else {
++            return false;
++        }
++    }
+ }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6636650.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,139 @@
+--- old/src/share/classes/java/lang/ClassLoader.java	Fri Jul 31 15:59:47 2009
++++ openjdk/jdk/src/share/classes/java/lang/ClassLoader.java	Fri Jul 31 15:59:46 2009
+@@ -147,11 +147,6 @@
+         registerNatives();
+     }
+ 
+-    // If initialization succeed this is set to true and security checks will
+-    // succeed.  Otherwise the object is not initialized and the object is
+-    // useless.
+-    private boolean initialized = false;
+-
+     // The parent class loader for delegation
+     private ClassLoader parent;
+ 
+@@ -177,6 +172,18 @@
+     // to its corresponding Package object.
+     private HashMap packages = new HashMap();
+ 
++    private static Void checkCreateClassLoader() {
++        SecurityManager security = System.getSecurityManager();
++        if (security != null) {
++            security.checkCreateClassLoader();
++        }
++        return null;
++    }
++
++    private ClassLoader(Void unused, ClassLoader parent) {
++        this.parent = parent;
++    }
++
+     /**
+      * Creates a new class loader using the specified parent class loader for
+      * delegation.
+@@ -197,12 +204,7 @@
+      * @since  1.2
+      */
+     protected ClassLoader(ClassLoader parent) {
+-	SecurityManager security = System.getSecurityManager();
+-	if (security != null) {
+-	    security.checkCreateClassLoader();
+-	}
+-	this.parent = parent;
+-	initialized = true;
++        this(checkCreateClassLoader(), parent);
+     }
+ 
+     /**
+@@ -221,15 +223,9 @@
+      *          of a new class loader.
+      */
+     protected ClassLoader() {
+-	SecurityManager security = System.getSecurityManager();
+-	if (security != null) {
+-	    security.checkCreateClassLoader();
+-	}
+-	this.parent = getSystemClassLoader();
+-	initialized = true;
++        this(checkCreateClassLoader(), getSystemClassLoader());
+     }
+ 
+-
+     // -- Class --
+ 
+     /**
+@@ -611,7 +607,6 @@
+ 					 ProtectionDomain protectionDomain)
+ 	throws ClassFormatError
+     {
+-	check();
+ 	protectionDomain = preDefineClass(name, protectionDomain);
+ 
+ 	Class c = null;
+@@ -693,8 +688,6 @@
+ 					 ProtectionDomain protectionDomain)
+ 	throws ClassFormatError
+     {
+-	check();
+-
+ 	int len = b.remaining();
+ 
+ 	// Use byte[] if not a direct ByteBufer:
+@@ -842,7 +835,6 @@
+      * @see  #defineClass(String, byte[], int, int)
+      */
+     protected final void resolveClass(Class<?> c) {
+-	check();
+ 	resolveClass0(c);
+     }
+ 
+@@ -873,7 +865,6 @@
+     protected final Class<?> findSystemClass(String name)
+ 	throws ClassNotFoundException
+     {
+-	check();
+ 	ClassLoader system = getSystemClassLoader();
+ 	if (system == null) {
+ 	    if (!checkName(name))
+@@ -886,7 +877,6 @@
+     private Class findBootstrapClass0(String name)
+ 	throws ClassNotFoundException
+     {
+-	check();
+ 	if (!checkName(name))
+ 	    throw new ClassNotFoundException(name);
+ 	return findBootstrapClass(name);
+@@ -895,13 +885,6 @@
+     private native Class findBootstrapClass(String name)
+ 	throws ClassNotFoundException;
+ 
+-    // Check to make sure the class loader has been initialized.
+-    private void check() {
+-	if (!initialized) {
+-	    throw new SecurityException("ClassLoader object not initialized");
+-	}
+-    }
+-
+     /**
+      * Returns the class with the given <a href="#name">binary name</a> if this
+      * loader has been recorded by the Java virtual machine as an initiating
+@@ -917,7 +900,6 @@
+      * @since  1.1
+      */
+     protected final Class<?> findLoadedClass(String name) {
+-	check();
+ 	if (!checkName(name))
+ 	    return null;
+ 	return findLoadedClass0(name);
+@@ -938,11 +920,9 @@
+      * @since  1.1
+      */
+     protected final void setSigners(Class<?> c, Object[] signers) {
+-        check();
+ 	c.setSigners(signers);
+     }
+ 
+-
+     // -- Resource --
+ 
+     /**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6657026.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,1609 @@
+--- old/src/share/classes/javax/swing/ToolTipManager.java	2009-08-11 12:05:32.501050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/ToolTipManager.java	2009-08-11 12:05:31.670050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -27,10 +27,7 @@
+ package javax.swing;
+ 
+ import java.awt.event.*;
+-import java.applet.*;
+ import java.awt.*;
+-import java.io.Serializable;
+-import sun.swing.UIAction;
+ 
+ /**
+  * Manages all the <code>ToolTips</code> in the system.
+@@ -60,7 +57,7 @@
+     JComponent insideComponent;
+     MouseEvent mouseEvent;
+     boolean showImmediately;
+-    final static ToolTipManager sharedInstance = new ToolTipManager();
++    private static final Object TOOL_TIP_MANAGER_KEY = new Object();
+     transient Popup tipWindow;
+     /** The Window tip is being displayed in. This will be non-null if
+      * the Window tip is in differs from that of insideComponent's Window.
+@@ -345,7 +342,13 @@
+      * @return a shared <code>ToolTipManager</code> object
+      */
+     public static ToolTipManager sharedInstance() {
+-        return sharedInstance;
++        Object value = SwingUtilities.appContextGet(TOOL_TIP_MANAGER_KEY);
++        if (value instanceof ToolTipManager) {
++            return (ToolTipManager) value;
++        }
++        ToolTipManager manager = new ToolTipManager();
++        SwingUtilities.appContextPut(TOOL_TIP_MANAGER_KEY, manager);
++        return manager;
+     }
+ 
+     // add keylistener here to trigger tip for access
+--- old/src/share/classes/javax/swing/UIManager.java	2009-08-11 12:05:43.423050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/UIManager.java	2009-08-11 12:05:42.671050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -194,6 +194,8 @@
+         Vector auxLookAndFeels = null;
+         SwingPropertyChangeSupport changeSupport;
+ 
++        LookAndFeelInfo[] installedLAFs;
++
+         UIDefaults getLookAndFeelDefaults() { return tables[0]; }
+         void setLookAndFeelDefaults(UIDefaults x) { tables[0] = x; }
+ 
+@@ -224,18 +226,6 @@
+      */
+     private static final Object classLock = new Object();
+ 
+-
+-    /* Cache the last referenced LAFState to improve performance
+-     * when accessing it.  The cache is based on last thread rather
+-     * than last AppContext because of the cost of looking up the
+-     * AppContext each time.  Since most Swing UI work is on the
+-     * EventDispatchThread, this hits often enough to justify the
+-     * overhead.  (4193032)
+-     */
+-    private static Thread currentLAFStateThread = null;
+-    private static LAFState currentLAFState = null;
+-
+-
+     /**
+      * Return the <code>LAFState</code> object, lazily create one if necessary.
+      * All access to the <code>LAFState</code> fields is done via this method,
+@@ -245,13 +235,6 @@
+      * </pre>
+      */
+     private static LAFState getLAFState() {
+-        // First check whether we're running on the same thread as
+-        // the last request.
+-        Thread thisThread = Thread.currentThread();
+-        if (thisThread == currentLAFStateThread) {
+-            return currentLAFState;
+-        }
+-
+         LAFState rv = (LAFState)SwingUtilities.appContextGet(
+                 SwingUtilities2.LAF_STATE_KEY);
+         if (rv == null) {
+@@ -265,10 +248,6 @@
+                 }
+             }
+         }
+-
+-        currentLAFStateThread = thisThread;
+-        currentLAFState = rv;
+-
+         return rv;
+     }
+ 
+@@ -427,7 +406,10 @@
+      */
+     public static LookAndFeelInfo[] getInstalledLookAndFeels() {
+         maybeInitialize();
+-        LookAndFeelInfo[] ilafs = installedLAFs;
++        LookAndFeelInfo[] ilafs = getLAFState().installedLAFs;
++        if (ilafs == null) {
++            ilafs = installedLAFs;
++        }
+         LookAndFeelInfo[] rv = new LookAndFeelInfo[ilafs.length];
+         System.arraycopy(ilafs, 0, rv, 0, ilafs.length);
+         return rv;
+@@ -449,9 +431,10 @@
+     public static void setInstalledLookAndFeels(LookAndFeelInfo[] infos)
+         throws SecurityException
+     {
++        maybeInitialize();
+         LookAndFeelInfo[] newInfos = new LookAndFeelInfo[infos.length];
+         System.arraycopy(infos, 0, newInfos, 0, infos.length);
+-        installedLAFs = newInfos;
++        getLAFState().installedLAFs = newInfos;
+     }
+ 
+ 
+@@ -1304,10 +1287,11 @@
+             }
+         }
+ 
+-        installedLAFs = new LookAndFeelInfo[ilafs.size()];
++        LookAndFeelInfo[] installedLAFs = new LookAndFeelInfo[ilafs.size()];
+         for(int i = 0; i < ilafs.size(); i++) {
+             installedLAFs[i] = (LookAndFeelInfo)(ilafs.elementAt(i));
+         }
++        getLAFState().installedLAFs = installedLAFs;
+     }
+ 
+ 
+-
+--- old/src/share/classes/javax/swing/plaf/metal/MetalBorders.java	2009-08-11 12:05:53.917050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalBorders.java	2009-08-11 12:05:53.184050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1998-2009 Sun Microsystems, Inc.  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
+@@ -33,14 +33,11 @@
+ 
+ import java.awt.Component;
+ import java.awt.Insets;
+-import java.awt.Dimension;
+-import java.awt.Rectangle;
+ import java.awt.Color;
+ import java.awt.Dialog;
+ import java.awt.Frame;
+ import java.awt.Graphics;
+ import java.awt.Window;
+-import java.io.Serializable;
+ 
+ import sun.swing.StringUIClientPropertyKey;
+ 
+@@ -62,8 +59,6 @@
+ 
+     public static class Flush3DBorder extends AbstractBorder implements UIResource{
+ 
+-        private static final Insets insets = new Insets(2, 2, 2, 2);
+-
+         public void paintBorder(Component c, Graphics g, int x, int y,
+                           int w, int h) {
+             if (c.isEnabled()) {
+@@ -73,13 +68,13 @@
+             }
+         }
+         public Insets getBorderInsets(Component c)       {
+-            return insets;
++            return new Insets(2, 2, 2, 2);
+         }
+         public Insets getBorderInsets(Component c, Insets newInsets) {
+-            newInsets.top = insets.top;
+-            newInsets.left = insets.left;
+-            newInsets.bottom = insets.bottom;
+-            newInsets.right = insets.right;
++            newInsets.top = 2;
++            newInsets.left = 2;
++            newInsets.bottom = 2;
++            newInsets.right = 2;
+             return newInsets;
+         }
+     }
+@@ -190,21 +185,19 @@
+         }
+ 
+         public Insets getBorderInsets( Component c ) {
+-            return borderInsets;
++            return new Insets(3, 3, 3, 3);
+         }
+         public Insets getBorderInsets(Component c, Insets newInsets) {
+-            newInsets.top = borderInsets.top;
+-            newInsets.left = borderInsets.left;
+-            newInsets.bottom = borderInsets.bottom;
+-            newInsets.right = borderInsets.right;
++            newInsets.top = 3;
++            newInsets.left = 3;
++            newInsets.bottom = 3;
++            newInsets.right = 3;
+             return newInsets;
+         }
+     }
+ 
+     public static class InternalFrameBorder extends AbstractBorder implements UIResource {
+ 
+-        private static final Insets insets = new Insets(5, 5, 5, 5);
+-
+         private static final int corner = 14;
+ 
+         public void paintBorder(Component c, Graphics g, int x, int y,
+@@ -256,13 +249,13 @@
+           }
+ 
+           public Insets getBorderInsets(Component c)       {
+-              return insets;
++              return new Insets(5, 5, 5, 5);
+           }
+           public Insets getBorderInsets(Component c, Insets newInsets) {
+-              newInsets.top = insets.top;
+-              newInsets.left = insets.left;
+-              newInsets.bottom = insets.bottom;
+-              newInsets.right = insets.right;
++              newInsets.top = 5;
++              newInsets.left = 5;
++              newInsets.bottom = 5;
++              newInsets.right = 5;
+               return newInsets;
+           }
+     }
+@@ -273,8 +266,6 @@
+      */
+     static class FrameBorder extends AbstractBorder implements UIResource {
+ 
+-        private static final Insets insets = new Insets(5, 5, 5, 5);
+-
+         private static final int corner = 14;
+ 
+         public void paintBorder(Component c, Graphics g, int x, int y,
+@@ -326,15 +317,15 @@
+         }
+ 
+         public Insets getBorderInsets(Component c)       {
+-            return insets;
++            return new Insets(5, 5, 5, 5);
+         }
+ 
+         public Insets getBorderInsets(Component c, Insets newInsets)
+         {
+-            newInsets.top = insets.top;
+-            newInsets.left = insets.left;
+-            newInsets.bottom = insets.bottom;
+-            newInsets.right = insets.right;
++            newInsets.top = 5;
++            newInsets.left = 5;
++            newInsets.bottom = 5;
++            newInsets.right = 5;
+             return newInsets;
+         }
+     }
+@@ -345,7 +336,6 @@
+      */
+     static class DialogBorder extends AbstractBorder implements UIResource
+     {
+-        private static final Insets insets = new Insets(5, 5, 5, 5);
+         private static final int corner = 14;
+ 
+         protected Color getActiveBackground()
+@@ -427,15 +417,15 @@
+         }
+ 
+         public Insets getBorderInsets(Component c)       {
+-            return insets;
++            return new Insets(5, 5, 5, 5);
+         }
+ 
+         public Insets getBorderInsets(Component c, Insets newInsets)
+         {
+-            newInsets.top = insets.top;
+-            newInsets.left = insets.left;
+-            newInsets.bottom = insets.bottom;
+-            newInsets.right = insets.right;
++            newInsets.top = 5;
++            newInsets.left = 5;
++            newInsets.bottom = 5;
++            newInsets.right = 5;
+             return newInsets;
+         }
+     }
+@@ -482,7 +472,6 @@
+      * @since 1.3
+      */
+     public static class PaletteBorder extends AbstractBorder implements UIResource {
+-        private static final Insets insets = new Insets(1, 1, 1, 1);
+         int titleHeight = 0;
+ 
+         public void paintBorder( Component c, Graphics g, int x, int y, int w, int h ) {
+@@ -499,20 +488,19 @@
+         }
+ 
+         public Insets getBorderInsets(Component c)       {
+-            return insets;
++            return new Insets(1, 1, 1, 1);
+         }
+ 
+         public Insets getBorderInsets(Component c, Insets newInsets) {
+-            newInsets.top = insets.top;
+-            newInsets.left = insets.left;
+-            newInsets.bottom = insets.bottom;
+-            newInsets.right = insets.right;
++            newInsets.top = 1;
++            newInsets.left = 1;
++            newInsets.bottom = 1;
++            newInsets.right = 1;
+             return newInsets;
+         }
+     }
+ 
+     public static class OptionDialogBorder extends AbstractBorder implements UIResource {
+-        private static final Insets insets = new Insets(3, 3, 3, 3);
+         int titleHeight = 0;
+ 
+         public void paintBorder( Component c, Graphics g, int x, int y, int w, int h ) {
+@@ -568,14 +556,14 @@
+         }
+ 
+         public Insets getBorderInsets(Component c)       {
+-            return insets;
++            return new Insets(3, 3, 3, 3);
+         }
+ 
+         public Insets getBorderInsets(Component c, Insets newInsets) {
+-            newInsets.top = insets.top;
+-            newInsets.left = insets.left;
+-            newInsets.bottom = insets.bottom;
+-            newInsets.right = insets.right;
++            newInsets.top = 3;
++            newInsets.left = 3;
++            newInsets.bottom = 3;
++            newInsets.right = 3;
+             return newInsets;
+         }
+     }
+@@ -615,10 +603,10 @@
+                 newInsets.set(0, 0, 2, 0);
+             }
+             else {
+-                newInsets.top = borderInsets.top;
+-                newInsets.left = borderInsets.left;
+-                newInsets.bottom = borderInsets.bottom;
+-                newInsets.right = borderInsets.right;
++                newInsets.top = 1;
++                newInsets.left = 0;
++                newInsets.bottom = 1;
++                newInsets.right = 0;
+             }
+             return newInsets;
+         }
+@@ -663,14 +651,14 @@
+         }
+ 
+         public Insets getBorderInsets( Component c ) {
+-            return borderInsets;
++            return new Insets(2, 2, 2, 2);
+         }
+ 
+         public Insets getBorderInsets(Component c, Insets newInsets) {
+-            newInsets.top = borderInsets.top;
+-            newInsets.left = borderInsets.left;
+-            newInsets.bottom = borderInsets.bottom;
+-            newInsets.right = borderInsets.right;
++            newInsets.top = 2;
++            newInsets.left = 2;
++            newInsets.bottom = 2;
++            newInsets.right = 2;
+             return newInsets;
+         }
+     }
+@@ -694,14 +682,14 @@
+         }
+ 
+         public Insets getBorderInsets( Component c ) {
+-             return borderInsets;
++             return new Insets(3, 1, 2, 1);
+         }
+ 
+         public Insets getBorderInsets(Component c, Insets newInsets) {
+-            newInsets.top = borderInsets.top;
+-            newInsets.left = borderInsets.left;
+-            newInsets.bottom = borderInsets.bottom;
+-            newInsets.right = borderInsets.right;
++            newInsets.top = 3;
++            newInsets.left = 1;
++            newInsets.bottom = 2;
++            newInsets.right = 1;
+             return newInsets;
+         }
+     }
+@@ -911,8 +899,6 @@
+ 
+     public static class ScrollPaneBorder extends AbstractBorder implements UIResource {
+ 
+-       private static final Insets insets = new Insets(1, 1, 2, 2);
+-
+         public void paintBorder(Component c, Graphics g, int x, int y,
+                           int w, int h) {
+ 
+@@ -946,7 +932,7 @@
+         }
+ 
+         public Insets getBorderInsets(Component c)       {
+-            return insets;
++            return new Insets(1, 1, 2, 2);
+         }
+     }
+ 
+
+--- old/src/share/classes/javax/swing/plaf/metal/MetalBumps.java	2009-08-11 12:06:04.423050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalBumps.java	2009-08-11 12:06:03.678050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1998-2009 Sun Microsystems, Inc.  All Rights Reserved.
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+  *
+  * This code is free software; you can redistribute it and/or modify it
+@@ -25,11 +25,22 @@
+ 
+ package javax.swing.plaf.metal;
+ 
+-import java.awt.*;
+-import java.awt.image.*;
+-import javax.swing.*;
+-import java.io.*;
+-import java.util.*;
++import sun.awt.AppContext;
++
++import java.awt.Color;
++import java.awt.Component;
++import java.awt.Dimension;
++import java.awt.Graphics;
++import java.awt.Graphics2D;
++import java.awt.GraphicsConfiguration;
++import java.awt.Image;
++import java.awt.Transparency;
++import java.awt.image.BufferedImage;
++import java.awt.image.DataBuffer;
++import java.awt.image.IndexColorModel;
++import java.util.ArrayList;
++import java.util.List;
++import javax.swing.Icon;
+ 
+ /**
+  * Implements the bumps used throughout the Metal Look and Feel.
+@@ -49,19 +60,9 @@
+     protected Color shadowColor;
+     protected Color backColor;
+ 
+-    protected static Vector buffers = new Vector();
++    private static final Object METAL_BUMPS = new Object();
+     protected BumpBuffer buffer;
+ 
+-    public MetalBumps( Dimension bumpArea ) {
+-        this( bumpArea.width, bumpArea.height );
+-    }
+-
+-    public MetalBumps( int width, int height ) {
+-        this(width, height, MetalLookAndFeel.getPrimaryControlHighlight(),
+-             MetalLookAndFeel.getPrimaryControlDarkShadow(),
+-             MetalLookAndFeel.getPrimaryControlShadow());
+-    }
+-
+     /**
+      * Creates MetalBumps of the specified size with the specified colors.
+      * If <code>newBackColor</code> is null, the background will be
+@@ -73,29 +74,22 @@
+         setBumpColors( newTopColor, newShadowColor, newBackColor );
+     }
+ 
+-    private BumpBuffer getBuffer(GraphicsConfiguration gc, Color aTopColor,
+-                                 Color aShadowColor, Color aBackColor) {
+-        if (buffer != null && buffer.hasSameConfiguration(
+-                              gc, aTopColor, aShadowColor, aBackColor)) {
+-            return buffer;
+-        }
+-        BumpBuffer result = null;
+-
+-        Enumeration elements = buffers.elements();
+-
+-        while ( elements.hasMoreElements() ) {
+-            BumpBuffer aBuffer = (BumpBuffer)elements.nextElement();
+-            if ( aBuffer.hasSameConfiguration(gc, aTopColor, aShadowColor,
+-                                              aBackColor)) {
+-                result = aBuffer;
+-                break;
++    private static BumpBuffer createBuffer(GraphicsConfiguration gc,
++                                           Color topColor, Color shadowColor, Color backColor) {
++        AppContext context = AppContext.getAppContext();
++        List<BumpBuffer> buffers = (List<BumpBuffer>) context.get(METAL_BUMPS);
++        if (buffers == null) {
++            buffers = new ArrayList<BumpBuffer>();
++            context.put(METAL_BUMPS, buffers);
++        }
++        for (BumpBuffer buffer : buffers) {
++            if (buffer.hasSameConfiguration(gc, topColor, shadowColor, backColor)) {
++                return buffer;
+             }
+         }
+-        if (result == null) {
+-            result = new BumpBuffer(gc, topColor, shadowColor, backColor);
+-            buffers.addElement(result);
+-        }
+-        return result;
++        BumpBuffer buffer = new BumpBuffer(gc, topColor, shadowColor, backColor);
++        buffers.add(buffer);
++        return buffer;
+     }
+ 
+     public void setBumpArea( Dimension bumpArea ) {
+@@ -123,10 +117,12 @@
+                                      (GraphicsConfiguration)((Graphics2D)g).
+                                      getDeviceConfiguration() : null;
+ 
+-        buffer = getBuffer(gc, topColor, shadowColor, backColor);
++        if ((buffer == null) || !buffer.hasSameConfiguration(gc, topColor, shadowColor, backColor)) {
++            buffer = createBuffer(gc, topColor, shadowColor, backColor);
++        }
+ 
+-        int bufferWidth = buffer.getImageSize().width;
+-        int bufferHeight = buffer.getImageSize().height;
++        int bufferWidth = BumpBuffer.IMAGE_SIZE;
++        int bufferHeight = BumpBuffer.IMAGE_SIZE;
+         int iconWidth = getIconWidth();
+         int iconHeight = getIconHeight();
+         int x2 = x + iconWidth;
+@@ -159,7 +155,6 @@
+ class BumpBuffer {
+ 
+     static final int IMAGE_SIZE = 64;
+-    static Dimension imageSize = new Dimension( IMAGE_SIZE, IMAGE_SIZE );
+ 
+     transient Image image;
+     Color topColor;
+@@ -201,10 +196,6 @@
+         return image;
+     }
+ 
+-    public Dimension getImageSize() {
+-        return imageSize;
+-    }
+-
+     /**
+      * Paints the bumps into the current image.
+      */
+
+--- old/src/share/classes/javax/swing/plaf/metal/MetalInternalFrameUI.java	2009-08-11 12:06:14.763050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalInternalFrameUI.java	2009-08-11 12:06:14.053050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1998-2009 Sun Microsystems, Inc.  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
+@@ -31,10 +31,8 @@
+ import javax.swing.event.*;
+ import javax.swing.border.*;
+ import javax.swing.plaf.basic.*;
+-import java.util.EventListener;
+ import java.beans.PropertyChangeListener;
+ import java.beans.PropertyChangeEvent;
+-import java.beans.PropertyVetoException;
+ import javax.swing.plaf.*;
+ 
+ /**
+@@ -51,7 +49,7 @@
+   private static final Border handyEmptyBorder = new EmptyBorder(0,0,0,0);
+ 
+   protected static String IS_PALETTE   = "JInternalFrame.isPalette";
+-
++  private static String IS_PALETTE_KEY = "JInternalFrame.isPalette";
+   private static String FRAME_TYPE     = "JInternalFrame.frameType";
+   private static String NORMAL_FRAME   = "normal";
+   private static String PALETTE_FRAME  = "palette";
+@@ -68,7 +66,7 @@
+   public void installUI(JComponent c) {
+     super.installUI(c);
+ 
+-    Object paletteProp = c.getClientProperty( IS_PALETTE );
++    Object paletteProp = c.getClientProperty(IS_PALETTE_KEY);
+     if ( paletteProp != null ) {
+         setPalette( ((Boolean)paletteProp).booleanValue() );
+     }
+@@ -187,7 +185,7 @@
+                   ui.setFrameType( (String) e.getNewValue() );
+               }
+           }
+-          else if ( name.equals( IS_PALETTE ) )
++          else if ( name.equals(IS_PALETTE_KEY) )
+           {
+               if ( e.getNewValue() != null )
+               {
+
+--- old/src/share/classes/javax/swing/plaf/metal/MetalSliderUI.java	2009-08-11 12:06:25.043050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalSliderUI.java	2009-08-11 12:06:24.344050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1998-2005 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1998-2009 Sun Microsystems, Inc.  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
+@@ -27,23 +27,12 @@
+ 
+ import javax.swing.plaf.basic.BasicSliderUI;
+ 
+-import java.awt.Component;
+-import java.awt.Container;
+ import java.awt.Graphics;
+ import java.awt.Dimension;
+ import java.awt.Rectangle;
+-import java.awt.Point;
+-import java.awt.Insets;
+ import java.awt.Color;
+-import java.io.Serializable;
+-import java.awt.IllegalComponentStateException;
+-import java.awt.Polygon;
+ import java.beans.*;
+-
+-import javax.swing.border.AbstractBorder;
+-
+ import javax.swing.*;
+-import javax.swing.event.*;
+ import javax.swing.plaf.*;
+ 
+ /**
+@@ -64,12 +53,13 @@
+ 
+     protected final int TICK_BUFFER = 4;
+     protected boolean filledSlider = false;
+-    // NOTE: these next three variables are currently unused.
++    // NOTE: these next five variables are currently unused.
+     protected static Color thumbColor;
+     protected static Color highlightColor;
+     protected static Color darkShadowColor;
+     protected static int trackWidth;
+     protected static int tickLength;
++    private int safeLength;
+ 
+    /**
+     * A default horizontal thumb <code>Icon</code>. This field might not be
+@@ -117,7 +107,7 @@
+ 
+     public void installUI( JComponent c ) {
+         trackWidth = ((Integer)UIManager.get( "Slider.trackWidth" )).intValue();
+-        tickLength = ((Integer)UIManager.get( "Slider.majorTickLength" )).intValue();
++        tickLength = safeLength = ((Integer)UIManager.get( "Slider.majorTickLength" )).intValue();
+         horizThumbIcon = SAFE_HORIZ_THUMB_ICON =
+                 UIManager.getIcon( "Slider.horizontalThumbIcon" );
+         vertThumbIcon = SAFE_VERT_THUMB_ICON =
+@@ -465,8 +455,8 @@
+      * determine the tick area rectangle.
+      */
+     public int getTickLength() {
+-        return slider.getOrientation() == JSlider.HORIZONTAL ? tickLength + TICK_BUFFER + 1 :
+-        tickLength + TICK_BUFFER + 3;
++        return slider.getOrientation() == JSlider.HORIZONTAL ? safeLength + TICK_BUFFER + 1 :
++        safeLength + TICK_BUFFER + 3;
+     }
+ 
+     /**
+@@ -511,22 +501,22 @@
+ 
+     protected void paintMinorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x ) {
+         g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
+-        g.drawLine( x, TICK_BUFFER, x, TICK_BUFFER + (tickLength / 2) );
++        g.drawLine( x, TICK_BUFFER, x, TICK_BUFFER + (safeLength / 2) );
+     }
+ 
+     protected void paintMajorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x ) {
+         g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
+-        g.drawLine( x, TICK_BUFFER , x, TICK_BUFFER + (tickLength - 1) );
++        g.drawLine( x, TICK_BUFFER , x, TICK_BUFFER + (safeLength - 1) );
+     }
+ 
+     protected void paintMinorTickForVertSlider( Graphics g, Rectangle tickBounds, int y ) {
+         g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
+ 
+         if (MetalUtils.isLeftToRight(slider)) {
+-            g.drawLine( TICK_BUFFER, y, TICK_BUFFER + (tickLength / 2), y );
++            g.drawLine( TICK_BUFFER, y, TICK_BUFFER + (safeLength / 2), y );
+         }
+         else {
+-            g.drawLine( 0, y, tickLength/2, y );
++            g.drawLine( 0, y, safeLength/2, y );
+         }
+     }
+ 
+@@ -534,10 +524,10 @@
+         g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
+ 
+         if (MetalUtils.isLeftToRight(slider)) {
+-            g.drawLine( TICK_BUFFER, y, TICK_BUFFER + tickLength, y );
++            g.drawLine( TICK_BUFFER, y, TICK_BUFFER + safeLength, y );
+         }
+         else {
+-            g.drawLine( 0, y, tickLength, y );
++            g.drawLine( 0, y, safeLength, y );
+         }
+     }
+ }
+-
+--- old/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java	2009-08-11 12:06:35.519050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java	2009-08-11 12:06:34.752050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -31,14 +31,12 @@
+ import sun.swing.UIAction;
+ import javax.swing.*;
+ import javax.swing.border.Border;
+-import javax.swing.event.*;
+ import java.awt.*;
+ import java.awt.event.*;
+ import java.awt.peer.ComponentPeer;
+ import java.awt.peer.LightweightPeer;
+ import java.beans.*;
+ import java.util.*;
+-import javax.swing.plaf.ActionMapUIResource;
+ import javax.swing.plaf.SplitPaneUI;
+ import javax.swing.plaf.ComponentUI;
+ import javax.swing.plaf.UIResource;
+@@ -106,13 +104,13 @@
+      * Keys to use for forward focus traversal when the JComponent is
+      * managing focus.
+      */
+-    private static Set managingFocusForwardTraversalKeys;
++    private Set managingFocusForwardTraversalKeys;
+ 
+     /**
+      * Keys to use for backward focus traversal when the JComponent is
+      * managing focus.
+      */
+-    private static Set managingFocusBackwardTraversalKeys;
++    private Set managingFocusBackwardTraversalKeys;
+ 
+ 
+     /**
+@@ -674,7 +672,7 @@
+      * @return increment via keyboard methods.
+      */
+     int getKeyboardMoveIncrement() {
+-        return KEYBOARD_DIVIDER_MOVE_OFFSET;
++        return 3;
+     }
+ 
+     /**
+
+--- old/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java	2009-08-11 12:06:46.036050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java	2009-08-11 12:06:45.272050200 +0400
+@@ -65,6 +65,9 @@
+     protected static BasicLabelUI labelUI = new BasicLabelUI();
+     private final static BasicLabelUI SAFE_BASIC_LABEL_UI = new BasicLabelUI();
+ 
++    private Rectangle paintIconR = new Rectangle();
++    private Rectangle paintTextR = new Rectangle();
++
+     static void loadActionMap(LazyActionMap map) {
+         map.put(new Actions(Actions.PRESS));
+         map.put(new Actions(Actions.RELEASE));
+@@ -135,17 +138,6 @@
+                                                    textX, textY);
+     }
+ 
+-
+-    /* These rectangles/insets are allocated once for this shared LabelUI
+-     * implementation.  Re-using rectangles rather than allocating
+-     * them in each paint call halved the time it took paint to run.
+-     */
+-    private static Rectangle paintIconR = new Rectangle();
+-    private static Rectangle paintTextR = new Rectangle();
+-    private static Rectangle paintViewR = new Rectangle();
+-    private static Insets paintViewInsets = new Insets(0, 0, 0, 0);
+-
+-
+     /**
+      * Paint the label text in the foreground color, if the label
+      * is opaque then paint the entire background with the background
+@@ -194,10 +186,11 @@
+ 
+     private String layout(JLabel label, FontMetrics fm,
+                           int width, int height) {
+-        Insets insets = label.getInsets(paintViewInsets);
++        Insets insets = label.getInsets(null);
+         String text = label.getText();
+         Icon icon = (label.isEnabled()) ? label.getIcon() :
+                                           label.getDisabledIcon();
++        Rectangle paintViewR = new Rectangle();
+         paintViewR.x = insets.left;
+         paintViewR.y = insets.top;
+         paintViewR.width = width - (insets.left + insets.right);
+@@ -208,24 +201,13 @@
+                         paintTextR);
+     }
+ 
+-
+-    /* These rectangles/insets are allocated once for this shared LabelUI
+-     * implementation.  Re-using rectangles rather than allocating
+-     * them in each getPreferredSize call sped up the method substantially.
+-     */
+-    private static Rectangle iconR = new Rectangle();
+-    private static Rectangle textR = new Rectangle();
+-    private static Rectangle viewR = new Rectangle();
+-    private static Insets viewInsets = new Insets(0, 0, 0, 0);
+-
+-
+     public Dimension getPreferredSize(JComponent c)
+     {
+         JLabel label = (JLabel)c;
+         String text = label.getText();
+         Icon icon = (label.isEnabled()) ? label.getIcon() :
+                                           label.getDisabledIcon();
+-        Insets insets = label.getInsets(viewInsets);
++        Insets insets = label.getInsets(null);
+         Font font = label.getFont();
+ 
+         int dx = insets.left + insets.right;
+@@ -243,6 +225,9 @@
+         else {
+             FontMetrics fm = label.getFontMetrics(font);
+ 
++            Rectangle iconR = new Rectangle();
++            Rectangle textR = new Rectangle();
++            Rectangle viewR = new Rectangle();
+             iconR.x = iconR.y = iconR.width = iconR.height = 0;
+             textR.x = textR.y = textR.width = textR.height = 0;
+             viewR.x = dx;
+--- old/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java	2009-08-11 12:06:52.019050200 +0400
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java	2009-08-11 12:06:51.308050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2002-2009 Sun Microsystems, Inc.  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
+@@ -27,7 +27,6 @@
+ 
+ import java.awt.*;
+ import java.lang.reflect.*;
+-import java.security.*;
+ import java.util.*;
+ import javax.swing.*;
+ import javax.swing.plaf.*;
+@@ -908,7 +907,7 @@
+ 
+     static class GTKStockIconInfo {
+         private static Map<String,Integer> ICON_TYPE_MAP;
+-        private static final Object ICON_SIZE_KEY = new StringBuffer("IconSize");
++        private static final Object ICON_SIZE_KEY = new Object(); // IconSize
+ 
+         private static Dimension[] getIconSizesMap() {
+             AppContext appContext = AppContext.getAppContext();
+--- old/src/share/classes/javax/swing/JComponent.java	2009-08-11 12:06:58.204050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/JComponent.java	2009-08-11 12:06:57.513050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -27,22 +27,15 @@
+ 
+ import java.util.HashSet;
+ import java.util.Hashtable;
+-import java.util.Dictionary;
+ import java.util.Enumeration;
+ import java.util.Locale;
+ import java.util.Vector;
+ import java.util.EventListener;
+ import java.util.Set;
+-import java.util.Map;
+-import java.util.HashMap;
+ 
+ import java.awt.*;
+ import java.awt.event.*;
+-import java.awt.image.VolatileImage;
+-import java.awt.Graphics2D;
+ import java.awt.peer.LightweightPeer;
+-import java.awt.dnd.DropTarget;
+-import java.awt.font.FontRenderContext;
+ import java.beans.*;
+ 
+ import java.applet.Applet;
+@@ -220,8 +213,7 @@
+      * indicates the EDT is calling into the InputVerifier from the
+      * returned component.
+      */
+-    private static final Object INPUT_VERIFIER_SOURCE_KEY =
+-            new StringBuilder("InputVerifierSourceKey");
++    private static final Object INPUT_VERIFIER_SOURCE_KEY = new Object(); // InputVerifierSourceKey
+ 
+     /* The following fields support set methods for the corresponding
+      * java.awt.Component properties.
+@@ -369,8 +361,7 @@
+     private static final String defaultLocale = "JComponent.defaultLocale";
+ 
+     private static Component componentObtainingGraphicsFrom;
+-    private static Object componentObtainingGraphicsFromLock = new
+-            StringBuilder("componentObtainingGraphicsFrom");
++    private static Object componentObtainingGraphicsFromLock = new Object(); // componentObtainingGraphicsFrom
+ 
+     /**
+      * AA text hints.
+--- old/src/share/classes/javax/swing/JDialog.java	2009-08-11 12:07:04.991050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/JDialog.java	2009-08-11 12:07:04.288050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -26,12 +26,7 @@
+ 
+ import java.awt.*;
+ import java.awt.event.*;
+-import java.beans.PropertyChangeListener;
+-import java.util.Locale;
+-import java.util.Vector;
+-import java.io.Serializable;
+ import javax.accessibility.*;
+-import java.applet.Applet;
+ 
+ /**
+  * The main class for creating a dialog window. You can use this class
+@@ -108,8 +103,7 @@
+      * Key into the AppContext, used to check if should provide decorations
+      * by default.
+      */
+-    private static final Object defaultLookAndFeelDecoratedKey =
+-            new StringBuffer("JDialog.defaultLookAndFeelDecorated");
++    private static final Object defaultLookAndFeelDecoratedKey = new Object(); // JDialog.defaultLookAndFeelDecorated
+ 
+     private int defaultCloseOperation = HIDE_ON_CLOSE;
+ 
+--- old/src/share/classes/javax/swing/JEditorPane.java	2009-08-11 12:07:11.080050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/JEditorPane.java	2009-08-11 12:07:10.427050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+  *
+  * This code is free software; you can redistribute it and/or modify it
+@@ -25,12 +25,10 @@
+ package javax.swing;
+ 
+ import java.awt.*;
+-import java.awt.event.*;
+ import java.lang.reflect.*;
+ import java.net.*;
+ import java.util.*;
+ import java.io.*;
+-import java.util.*;
+ 
+ import javax.swing.plaf.*;
+ import javax.swing.text.*;
+@@ -1598,12 +1596,9 @@
+     /*
+      * Private AppContext keys for this class's static variables.
+      */
+-    private static final Object kitRegistryKey =
+-        new StringBuffer("JEditorPane.kitRegistry");
+-    private static final Object kitTypeRegistryKey =
+-        new StringBuffer("JEditorPane.kitTypeRegistry");
+-    private static final Object kitLoaderRegistryKey =
+-        new StringBuffer("JEditorPane.kitLoaderRegistry");
++    private static final Object kitRegistryKey = new Object(); // JEditorPane.kitRegistry
++    private static final Object kitTypeRegistryKey = new Object(); // JEditorPane.kitTypeRegistry
++    private static final Object kitLoaderRegistryKey = new Object(); // JEditorPane.kitLoaderRegistry
+ 
+     /**
+      * @see #getUIClassID
+--- old/src/share/classes/javax/swing/JFrame.java	2009-08-11 12:07:17.419050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/JFrame.java	2009-08-11 12:07:16.686050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -26,11 +26,6 @@
+ 
+ import java.awt.*;
+ import java.awt.event.*;
+-import java.beans.PropertyChangeListener;
+-import java.util.Locale;
+-import java.util.Vector;
+-import java.io.Serializable;
+-
+ import javax.accessibility.*;
+ 
+ 
+@@ -130,8 +125,7 @@
+      * Key into the AppContext, used to check if should provide decorations
+      * by default.
+      */
+-    private static final Object defaultLookAndFeelDecoratedKey =
+-            new StringBuffer("JFrame.defaultLookAndFeelDecorated");
++    private static final Object defaultLookAndFeelDecoratedKey = new Object(); // JFrame.defaultLookAndFeelDecorated
+ 
+     private int defaultCloseOperation = HIDE_ON_CLOSE;
+ 
+--- old/src/share/classes/javax/swing/JInternalFrame.java	2009-08-11 12:07:23.366050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/JInternalFrame.java	2009-08-11 12:07:22.658050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -26,13 +26,10 @@
+ package javax.swing;
+ 
+ import java.awt.*;
+-import java.awt.event.*;
+ 
+ import java.beans.PropertyVetoException;
+ import java.beans.PropertyChangeEvent;
+-import java.util.EventListener;
+ 
+-import javax.swing.border.Border;
+ import javax.swing.event.InternalFrameEvent;
+ import javax.swing.event.InternalFrameListener;
+ import javax.swing.plaf.*;
+@@ -40,9 +37,7 @@
+ import javax.accessibility.*;
+ 
+ import java.io.ObjectOutputStream;
+-import java.io.ObjectInputStream;
+ import java.io.IOException;
+-import java.lang.StringBuilder;
+ import java.beans.PropertyChangeListener;
+ import sun.awt.AppContext;
+ import sun.swing.SwingUtilities2;
+@@ -226,8 +221,7 @@
+     /** Constrained property name indicating that the internal frame is iconified. */
+     public final static String IS_ICON_PROPERTY = "icon";
+ 
+-    private static final Object PROPERTY_CHANGE_LISTENER_KEY =
+-        new StringBuilder("InternalFramePropertyChangeListener");
++    private static final Object PROPERTY_CHANGE_LISTENER_KEY = new Object(); // InternalFramePropertyChangeListener
+ 
+     private static void addPropertyChangeListenerIfNecessary() {
+         if (AppContext.getAppContext().get(PROPERTY_CHANGE_LISTENER_KEY) ==
+--- old/src/share/classes/javax/swing/JPopupMenu.java	2009-08-11 12:07:29.900050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/JPopupMenu.java	2009-08-11 12:07:29.192050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -33,17 +33,12 @@
+ import java.io.Serializable;
+ import java.beans.*;
+ 
+-import java.util.Locale;
+ import java.util.Vector;
+-import java.util.Hashtable;
+ import javax.accessibility.*;
+ import javax.swing.plaf.PopupMenuUI;
+-import javax.swing.plaf.ComponentUI;
+ import javax.swing.plaf.basic.BasicComboPopup;
+ import javax.swing.event.*;
+ 
+-import java.applet.Applet;
+-
+ /**
+  * An implementation of a popup menu -- a small window that pops up
+  * and displays a series of choices. A <code>JPopupMenu</code> is used for the
+@@ -91,8 +86,7 @@
+     /**
+      * Key used in AppContext to determine if light way popups are the default.
+      */
+-    private static final Object defaultLWPopupEnabledKey =
+-        new StringBuffer("JPopupMenu.defaultLWPopupEnabledKey");
++    private static final Object defaultLWPopupEnabledKey = new Object(); // JPopupMenu.defaultLWPopupEnabledKey
+ 
+     /** Bug#4425878-Property javax.swing.adjustPopupLocationToFit introduced */
+     static boolean popupPostionFixDisabled = false;
+--- old/src/share/classes/javax/swing/MenuSelectionManager.java	2009-08-11 12:07:36.023050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/MenuSelectionManager.java	2009-08-11 12:07:35.359050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -44,8 +44,7 @@
+     private static final boolean VERBOSE = false; // show reuse hits/misses
+     private static final boolean DEBUG =   false;  // show bad params, misc.
+ 
+-    private static final StringBuilder MENU_SELECTION_MANAGER_KEY =
+-                       new StringBuilder("javax.swing.MenuSelectionManager");
++    private static final Object MENU_SELECTION_MANAGER_KEY = new Object(); // javax.swing.MenuSelectionManager
+ 
+     /**
+      * Returns the default menu selection manager.
+--- old/src/share/classes/javax/swing/PopupFactory.java	2009-08-11 12:07:42.008050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/PopupFactory.java	2009-08-11 12:07:41.328050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1999-2009 Sun Microsystems, Inc.  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
+@@ -61,8 +61,7 @@
+      * <code>AppContext</code>. This is the key used in the
+      * <code>AppContext</code> to locate the <code>PopupFactory</code>.
+      */
+-    private static final Object SharedInstanceKey =
+-        new StringBuffer("PopupFactory.SharedInstanceKey");
++    private static final Object SharedInstanceKey = new Object(); // PopupFactory.SharedInstanceKey
+ 
+     /**
+      * Max number of items to store in any one particular cache.
+@@ -291,8 +290,7 @@
+      * Popup implementation that uses a Window as the popup.
+      */
+     private static class HeavyWeightPopup extends Popup {
+-        private static final Object heavyWeightPopupCacheKey =
+-                 new StringBuffer("PopupFactory.heavyWeightPopupCache");
++        private static final Object heavyWeightPopupCacheKey = new Object(); // PopupFactory.heavyWeightPopupCache
+ 
+         /**
+          * Returns either a new or recycled <code>Popup</code> containing
+@@ -641,8 +639,7 @@
+      * Popup implementation that uses a JPanel as the popup.
+      */
+     private static class LightWeightPopup extends ContainerPopup {
+-        private static final Object lightWeightPopupCacheKey =
+-                         new StringBuffer("PopupFactory.lightPopupCache");
++        private static final Object lightWeightPopupCacheKey = new Object(); // PopupFactory.lightPopupCache
+ 
+         /**
+          * Returns a light weight <code>Popup</code> implementation. If
+@@ -796,8 +793,7 @@
+      * Popup implementation that uses a Panel as the popup.
+      */
+     private static class MediumWeightPopup extends ContainerPopup {
+-        private static final Object mediumWeightPopupCacheKey =
+-                             new StringBuffer("PopupFactory.mediumPopupCache");
++        private static final Object mediumWeightPopupCacheKey = new Object(); // PopupFactory.mediumPopupCache
+ 
+         /** Child of the panel. The contents are added to this. */
+         private JRootPane rootPane;
+--- old/src/share/classes/javax/swing/SwingUtilities.java	2009-08-11 12:07:48.053050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/SwingUtilities.java	2009-08-11 12:07:47.366050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -33,9 +33,6 @@
+ import java.awt.event.*;
+ import java.awt.dnd.DropTarget;
+ 
+-import java.util.Vector;
+-import java.util.Hashtable;
+-
+ import java.lang.reflect.*;
+ 
+ import javax.accessibility.*;
+@@ -1750,8 +1747,7 @@
+ 
+ 
+     // Don't use String, as it's not guaranteed to be unique in a Hashtable.
+-    private static final Object sharedOwnerFrameKey =
+-       new StringBuffer("SwingUtilities.sharedOwnerFrame");
++    private static final Object sharedOwnerFrameKey = new Object(); // SwingUtilities.sharedOwnerFrame
+ 
+     static class SharedOwnerFrame extends Frame implements WindowListener {
+         public void addNotify() {
+--- old/src/share/classes/javax/swing/SwingWorker.java	2009-08-11 12:07:54.496050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/SwingWorker.java	2009-08-11 12:07:53.575050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2005-2009 Sun Microsystems, Inc.  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
+@@ -28,16 +28,12 @@
+ import java.beans.PropertyChangeSupport;
+ import java.beans.PropertyChangeEvent;
+ import java.util.List;
+-import java.util.ArrayList;
+-import java.util.Collections;
+ 
+ import java.util.concurrent.*;
+ import java.util.concurrent.locks.*;
+ 
+ import java.awt.event.*;
+ 
+-import javax.swing.SwingUtilities;
+-
+ import sun.awt.AppContext;
+ import sun.swing.AccumulativeRunnable;
+ 
+@@ -860,7 +856,7 @@
+         return (ExecutorService)obj;
+     }
+ 
+-    private static final Object DO_SUBMIT_KEY = new StringBuilder("doSubmit");
++    private static final Object DO_SUBMIT_KEY = new Object(); // doSubmit
+     private static AccumulativeRunnable<Runnable> getDoSubmit() {
+         synchronized (DO_SUBMIT_KEY) {
+             final AppContext appContext = AppContext.getAppContext();
+--- old/src/share/classes/javax/swing/TimerQueue.java	2009-08-11 12:08:00.562050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/TimerQueue.java	2009-08-11 12:07:59.868050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -29,7 +29,6 @@
+ 
+ 
+ 
+-import java.util.*;
+ import java.util.concurrent.*;
+ import java.util.concurrent.atomic.AtomicLong;
+ import sun.awt.AppContext;
+@@ -46,10 +45,7 @@
+  */
+ class TimerQueue implements Runnable
+ {
+-    private static final Object sharedInstanceKey =
+-        new StringBuffer("TimerQueue.sharedInstanceKey");
+-    private static final Object expiredTimersKey =
+-        new StringBuffer("TimerQueue.expiredTimersKey");
++    private static final Object sharedInstanceKey = new Object(); // TimerQueue.sharedInstanceKey
+ 
+     private final DelayQueue<DelayedTimer> queue;
+     volatile boolean running;
+--- old/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java	2009-08-11 12:08:06.552050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java	2009-08-11 12:08:05.879050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -29,9 +29,7 @@
+ import java.awt.event.*;
+ import javax.swing.*;
+ import javax.accessibility.*;
+-import javax.swing.FocusManager;
+ import javax.swing.plaf.*;
+-import javax.swing.border.*;
+ import javax.swing.text.*;
+ import javax.swing.event.*;
+ import java.beans.PropertyChangeListener;
+@@ -176,11 +174,9 @@
+     private Dimension cachedDisplaySize = new Dimension( 0, 0 );
+ 
+     // Key used for lookup of the DefaultListCellRenderer in the AppContext.
+-    private static final Object COMBO_UI_LIST_CELL_RENDERER_KEY =
+-                        new StringBuffer("DefaultListCellRendererKey");
++    private static final Object COMBO_UI_LIST_CELL_RENDERER_KEY = new Object(); // DefaultListCellRendererKey
+ 
+-    static final StringBuffer HIDE_POPUP_KEY
+-                  = new StringBuffer("HidePopupKey");
++    static final Object HIDE_POPUP_KEY = new Object(); // HidePopupKey
+ 
+     /**
+      * Whether or not all cells have the same baseline.
+--- old/src/share/classes/javax/swing/plaf/basic/BasicListUI.java	2009-08-11 12:08:12.745050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java	2009-08-11 12:08:12.055050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -56,8 +56,7 @@
+  */
+ public class BasicListUI extends ListUI
+ {
+-    private static final StringBuilder BASELINE_COMPONENT_KEY =
+-        new StringBuilder("List.baselineComponent");
++    private static final Object BASELINE_COMPONENT_KEY = new Object(); // List.baselineComponent
+ 
+     protected JList list = null;
+     protected CellRendererPane rendererPane;
+--- old/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java	2009-08-11 12:08:19.099050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java	2009-08-11 12:08:18.377050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -28,26 +28,18 @@
+ import javax.swing.*;
+ import javax.swing.event.*;
+ import javax.swing.plaf.*;
+-import javax.swing.plaf.basic.*;
+-import javax.swing.border.*;
+ 
+ import java.applet.Applet;
+ 
+ import java.awt.Component;
+-import java.awt.Container;
+-import java.awt.Dimension;
+ import java.awt.KeyboardFocusManager;
+ import java.awt.Window;
+ import java.awt.event.*;
+ import java.awt.AWTEvent;
+ import java.awt.Toolkit;
+ 
+-import java.beans.PropertyChangeListener;
+-import java.beans.PropertyChangeEvent;
+-
+ import java.util.*;
+ 
+-import sun.swing.DefaultLookup;
+ import sun.swing.UIAction;
+ 
+ import sun.awt.AppContext;
+@@ -61,10 +53,8 @@
+  * @author Arnaud Weber
+  */
+ public class BasicPopupMenuUI extends PopupMenuUI {
+-    static final StringBuilder MOUSE_GRABBER_KEY = new StringBuilder(
+-                   "javax.swing.plaf.basic.BasicPopupMenuUI.MouseGrabber");
+-    static final StringBuilder MENU_KEYBOARD_HELPER_KEY = new StringBuilder(
+-                   "javax.swing.plaf.basic.BasicPopupMenuUI.MenuKeyboardHelper");
++    static final Object MOUSE_GRABBER_KEY = new Object(); // javax.swing.plaf.basic.BasicPopupMenuUI.MouseGrabber
++    static final Object MENU_KEYBOARD_HELPER_KEY = new Object(); // javax.swing.plaf.basic.BasicPopupMenuUI.MenuKeyboardHelper
+ 
+     protected JPopupMenu popupMenu = null;
+     private transient PopupMenuListener popupMenuListener = null;
+--- old/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java	2009-08-11 12:08:25.175050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java	2009-08-11 12:08:24.502050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -27,16 +27,11 @@
+ 
+ import java.awt.*;
+ import java.awt.datatransfer.*;
+-import java.awt.dnd.*;
+ import java.awt.event.*;
+ import java.util.Enumeration;
+-import java.util.EventObject;
+-import java.util.Hashtable;
+-import java.util.TooManyListenersException;
+ import javax.swing.*;
+ import javax.swing.event.*;
+ import javax.swing.plaf.*;
+-import javax.swing.text.*;
+ import javax.swing.table.*;
+ import javax.swing.plaf.basic.DragRecognitionSupport.BeforeDrag;
+ import sun.swing.SwingUtilities2;
+@@ -56,8 +51,7 @@
+  */
+ public class BasicTableUI extends TableUI
+ {
+-    private static final StringBuilder BASELINE_COMPONENT_KEY =
+-        new StringBuilder("Table.baselineComponent");
++    private static final Object BASELINE_COMPONENT_KEY = new Object(); // Table.baselineComponent
+ 
+ //
+ // Instance Variables
+--- old/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java	2009-08-11 12:08:32.053050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java	2009-08-11 12:08:30.695050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -30,16 +30,12 @@
+ import java.awt.*;
+ import java.awt.event.*;
+ import java.awt.datatransfer.*;
+-import java.awt.dnd.*;
+ import java.beans.*;
+-import java.io.*;
+ import java.util.Enumeration;
+ import java.util.Hashtable;
+-import java.util.TooManyListenersException;
+ import java.util.ArrayList;
+ import java.util.Collections;
+ import java.util.Comparator;
+-import javax.swing.plaf.ActionMapUIResource;
+ import javax.swing.plaf.ComponentUI;
+ import javax.swing.plaf.UIResource;
+ import javax.swing.plaf.TreeUI;
+@@ -61,8 +57,7 @@
+ 
+ public class BasicTreeUI extends TreeUI
+ {
+-    private static final StringBuilder BASELINE_COMPONENT_KEY =
+-        new StringBuilder("Tree.baselineComponent");
++    private static final Object BASELINE_COMPONENT_KEY = new Object(); // Tree.baselineComponent
+ 
+     // Old actions forward to an instance of this.
+     static private final Actions SHARED_ACTION = new Actions();
+--- old/src/share/classes/javax/swing/plaf/synth/ImagePainter.java	2009-08-11 12:08:38.675050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/synth/ImagePainter.java	2009-08-11 12:08:37.988050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2005 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2002-2009 Sun Microsystems, Inc.  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
+@@ -41,8 +41,7 @@
+  * @author Scott Violet
+  */
+ class ImagePainter extends SynthPainter {
+-    private static final StringBuffer CACHE_KEY =
+-                               new StringBuffer("SynthCacheKey");
++    private static final Object CACHE_KEY = new Object(); // SynthCacheKey
+ 
+     private Image image;
+     private Insets sInsets;
+--- old/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java	2009-08-11 12:08:44.720050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java	2009-08-11 12:08:44.005050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2002-2009 Sun Microsystems, Inc.  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
+@@ -73,8 +73,7 @@
+     /**
+      * AppContext key to get the current SynthStyleFactory.
+      */
+-    private static final Object STYLE_FACTORY_KEY =
+-                  new StringBuffer("com.sun.java.swing.plaf.gtk.StyleCache");
++    private static final Object STYLE_FACTORY_KEY = new Object(); // com.sun.java.swing.plaf.gtk.StyleCache
+ 
+     /**
+      * The last SynthStyleFactory that was asked for from AppContext
+--- old/src/share/classes/javax/swing/text/JTextComponent.java	2009-08-11 12:08:50.823050200 +0400
++++ openjdk/jdk/src/share/classes/javax/swing/text/JTextComponent.java	2009-08-11 12:08:50.146050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 1997-2009 Sun Microsystems, Inc.  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
+@@ -34,10 +34,7 @@
+ import java.util.Hashtable;
+ import java.util.Enumeration;
+ import java.util.Vector;
+-import java.util.Iterator;
+ import java.util.Map;
+-import java.util.Map.Entry;
+-import java.util.Set;
+ 
+ import java.util.concurrent.*;
+ 
+@@ -4041,8 +4038,7 @@
+         return modifiers;
+     }
+ 
+-    private static final Object KEYMAP_TABLE =
+-        new StringBuilder("JTextComponent_KeymapTable");
++    private static final Object KEYMAP_TABLE = new Object(); // JTextComponent_KeymapTable
+     private JTextComponent editor;
+     //
+     // member variables used for on-the-spot input method
+@@ -4376,8 +4372,7 @@
+         }
+     }
+ 
+-    private static final Object FOCUSED_COMPONENT =
+-        new StringBuilder("JTextComponent_FocusedComponent");
++    private static final Object FOCUSED_COMPONENT = new Object(); // JTextComponent_FocusedComponent
+ 
+     /**
+      * The default keymap that will be shared by all
+--- old/src/share/classes/sun/swing/DefaultLookup.java	2009-08-11 12:08:57.514050200 +0400
++++ openjdk/jdk/src/share/classes/sun/swing/DefaultLookup.java	2009-08-11 12:08:56.800050200 +0400
+@@ -46,8 +46,7 @@
+     /**
+      * Key used to store DefaultLookup for AppContext.
+      */
+-    private static final Object DEFAULT_LOOKUP_KEY = new
+-                                        StringBuffer("DefaultLookup");
++    private static final Object DEFAULT_LOOKUP_KEY = new Object(); // DefaultLookup
+     /**
+      * Thread that last asked for a default.
+      */
+--- old/src/share/classes/sun/swing/SwingUtilities2.java	2009-08-11 12:09:03.402050200 +0400
++++ openjdk/jdk/src/share/classes/sun/swing/SwingUtilities2.java	2009-08-11 12:09:02.664050200 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2002-2009 Sun Microsystems, Inc.  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
+@@ -32,25 +32,18 @@
+ import static java.awt.RenderingHints.*;
+ import java.awt.event.*;
+ import java.awt.font.*;
+-import java.awt.geom.*;
+ import java.awt.print.PrinterGraphics;
+-import java.text.Bidi;
+ import java.text.AttributedCharacterIterator;
+ import java.text.AttributedString;
+ 
+ import javax.swing.*;
+-import javax.swing.plaf.*;
+ import javax.swing.text.Highlighter;
+ import javax.swing.text.JTextComponent;
+ import javax.swing.text.DefaultHighlighter;
+ import javax.swing.text.DefaultCaret;
+ import javax.swing.table.TableCellRenderer;
+-import sun.swing.PrintColorUIResource;
+-import sun.swing.ImageIconUIResource;
+ import sun.print.ProxyPrintGraphics;
+ import sun.awt.*;
+-import sun.security.action.GetPropertyAction;
+-import sun.security.util.SecurityConstants;
+ import java.io.*;
+ import java.util.*;
+ import sun.font.FontDesignMetrics;
+@@ -74,8 +67,7 @@
+      * The <code>AppContext</code> key for our one <code>LAFState</code>
+      * instance.
+      */
+-    public static final Object LAF_STATE_KEY =
+-            new StringBuffer("LookAndFeel State");
++    public static final Object LAF_STATE_KEY = new Object(); // LookAndFeel State
+ 
+     // Most of applications use 10 or less fonts simultaneously
+     private static final int STRONG_BEARING_CACHE_SIZE = 10;
+@@ -97,15 +89,13 @@
+      * To avoid having this property persist between look and feels changes
+      * the value of the property is set to null in JComponent.setUI
+      */
+-    public static final Object AA_TEXT_PROPERTY_KEY =
+-                          new StringBuffer("AATextInfoPropertyKey");
++    public static final Object AA_TEXT_PROPERTY_KEY = new Object(); // AATextInfoPropertyKey
+ 
+     /**
+      * Used to tell a text component, being used as an editor for table
+      * or tree, how many clicks it took to start editing.
+      */
+-    private static final StringBuilder SKIP_CLICK_COUNT =
+-        new StringBuilder("skipClickCount");
++    private static final Object SKIP_CLICK_COUNT = new Object(); // skipClickCount
+ 
+     /* Presently this class assumes default fractional metrics.
+      * This may need to change to emulate future platform L&Fs.
+@@ -165,8 +155,7 @@
+      * Key used in client properties used to indicate that the
+      * <code>ComponentUI</code> of the JComponent instance should be returned.
+      */
+-    public static final Object COMPONENT_UI_PROPERTY_KEY =
+-                            new StringBuffer("ComponentUIPropertyKey");
++    public static final Object COMPONENT_UI_PROPERTY_KEY = new Object(); // ComponentUIPropertyKey
+ 
+     /** Client Property key for the text maximal offsets for BasicMenuItemUI */
+     public static final StringUIClientPropertyKey BASICMENUITEMUI_MAX_TEXT_OFFSET =
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6657138.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,745 @@
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifButtonUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifButtonUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifButtonUI.java	2009-11-08 22:51:56.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package com.sun.java.swing.plaf.motif;
+ 
++import sun.awt.AppContext;
++
+ import javax.swing.*;
+ import javax.swing.border.*;
+ import javax.swing.plaf.basic.*;
+@@ -46,16 +48,23 @@
+  */
+ public class MotifButtonUI extends BasicButtonUI {
+ 
+-    private final static MotifButtonUI motifButtonUI = new MotifButtonUI();
+-
+     protected Color selectColor;
+ 
+     private boolean defaults_initialized = false;
+ 
++    private static final Object MOTIF_BUTTON_UI_KEY = new Object();
++
+     // ********************************
+     //          Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent c){
++        AppContext appContext = AppContext.getAppContext();
++        MotifButtonUI motifButtonUI =
++                (MotifButtonUI) appContext.get(MOTIF_BUTTON_UI_KEY);
++        if (motifButtonUI == null) {
++            motifButtonUI = new MotifButtonUI();
++            appContext.put(MOTIF_BUTTON_UI_KEY, motifButtonUI);
++        }
+         return motifButtonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxUI.java	2009-11-08 22:53:23.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package com.sun.java.swing.plaf.motif;
+ 
++import sun.awt.AppContext;
++
+ import javax.swing.*;
+ 
+ import javax.swing.plaf.*;
+@@ -45,7 +47,7 @@
+  */
+ public class MotifCheckBoxUI extends MotifRadioButtonUI {
+ 
+-    private static final MotifCheckBoxUI motifCheckBoxUI = new MotifCheckBoxUI();
++    private static final Object MOTIF_CHECK_BOX_UI_KEY = new Object();
+ 
+     private final static String propertyPrefix = "CheckBox" + ".";
+ 
+@@ -56,6 +58,13 @@
+     //         Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent c){
++        AppContext appContext = AppContext.getAppContext();
++        MotifCheckBoxUI motifCheckBoxUI =
++                (MotifCheckBoxUI) appContext.get(MOTIF_CHECK_BOX_UI_KEY);
++        if (motifCheckBoxUI == null) {
++            motifCheckBoxUI = new MotifCheckBoxUI();
++            appContext.put(MOTIF_CHECK_BOX_UI_KEY, motifCheckBoxUI);
++        }
+         return motifCheckBoxUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java	2009-11-08 22:46:58.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package com.sun.java.swing.plaf.motif;
+ 
++import sun.awt.AppContext;
++
+ import javax.swing.*;
+ import javax.swing.plaf.basic.BasicLabelUI;
+ import javax.swing.plaf.ComponentUI;
+@@ -44,9 +46,16 @@
+  */
+ public class MotifLabelUI extends BasicLabelUI
+ {
+-    static MotifLabelUI sharedInstance = new MotifLabelUI();
++    private static final Object MOTIF_LABEL_UI_KEY = new Object();
+ 
+     public static ComponentUI createUI(JComponent c) {
+-        return sharedInstance;
++        AppContext appContext = AppContext.getAppContext();
++        MotifLabelUI motifLabelUI = 
++                (MotifLabelUI) appContext.get(MOTIF_LABEL_UI_KEY);
++        if (motifLabelUI == null) {
++            motifLabelUI = new MotifLabelUI();
++            appContext.put(MOTIF_LABEL_UI_KEY, motifLabelUI);
++        }
++        return motifLabelUI;
+     }
+ }
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifRadioButtonUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifRadioButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifRadioButtonUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifRadioButtonUI.java	2009-11-08 22:53:03.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package com.sun.java.swing.plaf.motif;
+ 
++import sun.awt.AppContext;
++
+ import javax.swing.*;
+ import javax.swing.border.*;
+ import javax.swing.plaf.basic.BasicRadioButtonUI;
+@@ -47,7 +49,7 @@
+  */
+ public class MotifRadioButtonUI extends BasicRadioButtonUI {
+ 
+-    private static final MotifRadioButtonUI motifRadioButtonUI = new MotifRadioButtonUI();
++    private static final Object MOTIF_RADIO_BUTTON_UI_KEY = new Object();
+ 
+     protected Color focusColor;
+ 
+@@ -57,6 +59,13 @@
+     //         Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent c) {
++        AppContext appContext = AppContext.getAppContext();
++        MotifRadioButtonUI motifRadioButtonUI =
++                (MotifRadioButtonUI) appContext.get(MOTIF_RADIO_BUTTON_UI_KEY);
++        if (motifRadioButtonUI == null) {
++            motifRadioButtonUI = new MotifRadioButtonUI();
++            appContext.put(MOTIF_RADIO_BUTTON_UI_KEY, motifRadioButtonUI);
++        }
+         return motifRadioButtonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifToggleButtonUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifToggleButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifToggleButtonUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifToggleButtonUI.java	2009-11-08 22:52:35.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package com.sun.java.swing.plaf.motif;
+ 
++import sun.awt.AppContext;
++
+ import java.awt.*;
+ import java.awt.event.*;
+ 
+@@ -48,7 +50,7 @@
+  */
+ public class MotifToggleButtonUI extends BasicToggleButtonUI
+ {
+-    private final static MotifToggleButtonUI motifToggleButtonUI = new MotifToggleButtonUI();
++    private static final Object MOTIF_TOGGLE_BUTTON_UI_KEY = new Object();
+ 
+     protected Color selectColor;
+ 
+@@ -58,6 +60,13 @@
+     //         Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent b) {
++        AppContext appContext = AppContext.getAppContext();
++        MotifToggleButtonUI motifToggleButtonUI =
++                (MotifToggleButtonUI) appContext.get(MOTIF_TOGGLE_BUTTON_UI_KEY);
++        if (motifToggleButtonUI == null) {
++            motifToggleButtonUI = new MotifToggleButtonUI();
++            appContext.put(MOTIF_TOGGLE_BUTTON_UI_KEY, motifToggleButtonUI);
++        }
+         return motifToggleButtonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsButtonUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsButtonUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsButtonUI.java	2009-11-08 22:54:23.000000000 +0000
+@@ -35,6 +35,7 @@
+ import static com.sun.java.swing.plaf.windows.TMSchema.*;
+ import static com.sun.java.swing.plaf.windows.TMSchema.Part.*;
+ import static com.sun.java.swing.plaf.windows.XPStyle.Skin;
++import sun.awt.AppContext;
+ 
+ 
+ /**
+@@ -52,8 +53,6 @@
+  */
+ public class WindowsButtonUI extends BasicButtonUI
+ {
+-    private final static WindowsButtonUI windowsButtonUI = new WindowsButtonUI();
+-
+     protected int dashedRectGapX;
+     protected int dashedRectGapY;
+     protected int dashedRectGapWidth;
+@@ -63,11 +62,19 @@
+ 
+     private boolean defaults_initialized = false;
+ 
++    private static final Object WINDOWS_BUTTON_UI_KEY = new Object();
+ 
+     // ********************************
+     //          Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent c){
++        AppContext appContext = AppContext.getAppContext();
++        WindowsButtonUI windowsButtonUI =
++                (WindowsButtonUI) appContext.get(WINDOWS_BUTTON_UI_KEY);
++        if (windowsButtonUI == null) {
++            windowsButtonUI = new WindowsButtonUI();
++            appContext.put(WINDOWS_BUTTON_UI_KEY, windowsButtonUI);
++        }
+         return windowsButtonUI;
+     }
+ 
+@@ -151,7 +158,7 @@
+      * allocating them in each paint call substantially reduced the time
+      * it took paint to run.  Obviously, this method can't be re-entered.
+      */
+-    private static Rectangle viewRect = new Rectangle();
++    private Rectangle viewRect = new Rectangle();
+ 
+     public void paint(Graphics g, JComponent c) {
+         if (XPStyle.getXP() != null) {
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxUI.java	2009-11-08 22:53:46.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package com.sun.java.swing.plaf.windows;
+ 
++import sun.awt.AppContext;
++
+ import javax.swing.plaf.basic.*;
+ import javax.swing.*;
+ import javax.swing.plaf.*;
+@@ -49,7 +51,7 @@
+     // of BasicCheckBoxUI because we want to pick up all the
+     // painting changes made in MetalRadioButtonUI.
+ 
+-    private static final WindowsCheckBoxUI windowsCheckBoxUI = new WindowsCheckBoxUI();
++    private static final Object WINDOWS_CHECK_BOX_UI_KEY = new Object();
+ 
+     private final static String propertyPrefix = "CheckBox" + ".";
+ 
+@@ -59,6 +61,13 @@
+     //          Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent c) {
++        AppContext appContext = AppContext.getAppContext();
++        WindowsCheckBoxUI windowsCheckBoxUI =
++                (WindowsCheckBoxUI) appContext.get(WINDOWS_CHECK_BOX_UI_KEY);
++        if (windowsCheckBoxUI == null) {
++            windowsCheckBoxUI = new WindowsCheckBoxUI();
++            appContext.put(WINDOWS_CHECK_BOX_UI_KEY, windowsCheckBoxUI);
++        }
+         return windowsCheckBoxUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLabelUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLabelUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLabelUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLabelUI.java	2009-11-08 22:56:38.000000000 +0000
+@@ -26,6 +26,8 @@
+ package com.sun.java.swing.plaf.windows;
+ 
+ import sun.swing.SwingUtilities2;
++import sun.awt.AppContext;
++
+ import java.awt.Color;
+ import java.awt.Graphics;
+ 
+@@ -51,12 +53,19 @@
+  */
+ public class WindowsLabelUI extends BasicLabelUI {
+ 
+-    private final static WindowsLabelUI windowsLabelUI = new WindowsLabelUI();
++    private static final Object WINDOWS_LABEL_UI_KEY = new Object();
+ 
+     // ********************************
+     //          Create PLAF
+     // ********************************
+-    public static ComponentUI createUI(JComponent c){
++    public static ComponentUI createUI(JComponent c) {
++        AppContext appContext = AppContext.getAppContext();
++        WindowsLabelUI windowsLabelUI =
++                (WindowsLabelUI) appContext.get(WINDOWS_LABEL_UI_KEY);
++        if (windowsLabelUI == null) {
++            windowsLabelUI = new WindowsLabelUI();
++            appContext.put(WINDOWS_LABEL_UI_KEY, windowsLabelUI);
++        }
+         return windowsLabelUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonUI.java	2009-11-08 22:54:50.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package com.sun.java.swing.plaf.windows;
+ 
++import sun.awt.AppContext;
++
+ import javax.swing.plaf.basic.*;
+ import javax.swing.*;
+ import javax.swing.plaf.*;
+@@ -44,7 +46,7 @@
+  */
+ public class WindowsRadioButtonUI extends BasicRadioButtonUI
+ {
+-    private static final WindowsRadioButtonUI windowsRadioButtonUI = new WindowsRadioButtonUI();
++    private static final Object WINDOWS_RADIO_BUTTON_UI_KEY = new Object();
+ 
+     protected int dashedRectGapX;
+     protected int dashedRectGapY;
+@@ -59,6 +61,13 @@
+     //          Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent c) {
++        AppContext appContext = AppContext.getAppContext();
++        WindowsRadioButtonUI windowsRadioButtonUI =
++                (WindowsRadioButtonUI) appContext.get(WINDOWS_RADIO_BUTTON_UI_KEY);
++        if (windowsRadioButtonUI == null) {
++            windowsRadioButtonUI = new WindowsRadioButtonUI();
++            appContext.put(WINDOWS_RADIO_BUTTON_UI_KEY, windowsRadioButtonUI);
++        }
+         return windowsRadioButtonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsToggleButtonUI.java openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsToggleButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsToggleButtonUI.java	2009-10-14 18:17:19.000000000 +0100
++++ openjdk/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsToggleButtonUI.java	2009-11-08 22:56:04.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package com.sun.java.swing.plaf.windows;
+ 
++import sun.awt.AppContext;
++
+ import javax.swing.plaf.basic.*;
+ import javax.swing.border.*;
+ import javax.swing.plaf.*;
+@@ -49,18 +51,25 @@
+  */
+ public class WindowsToggleButtonUI extends BasicToggleButtonUI
+ {
+-    protected static int dashedRectGapX;
+-    protected static int dashedRectGapY;
+-    protected static int dashedRectGapWidth;
+-    protected static int dashedRectGapHeight;
++    protected int dashedRectGapX;
++    protected int dashedRectGapY;
++    protected int dashedRectGapWidth;
++    protected int dashedRectGapHeight;
+ 
+     protected Color focusColor;
+ 
+-    private final static WindowsToggleButtonUI windowsToggleButtonUI = new WindowsToggleButtonUI();
++    private static final Object WINDOWS_TOGGLE_BUTTON_UI_KEY = new Object();
+ 
+     private boolean defaults_initialized = false;
+ 
+     public static ComponentUI createUI(JComponent b) {
++        AppContext appContext = AppContext.getAppContext();
++        WindowsToggleButtonUI windowsToggleButtonUI =
++                (WindowsToggleButtonUI) appContext.get(WINDOWS_TOGGLE_BUTTON_UI_KEY);
++        if (windowsToggleButtonUI == null) {
++            windowsToggleButtonUI = new WindowsToggleButtonUI();
++            appContext.put(WINDOWS_TOGGLE_BUTTON_UI_KEY, windowsToggleButtonUI);
++        }
+         return windowsToggleButtonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicButtonUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicButtonUI.java	2009-10-14 18:17:35.000000000 +0100
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicButtonUI.java	2009-11-08 22:46:57.000000000 +0000
+@@ -26,6 +26,8 @@
+ package javax.swing.plaf.basic;
+ 
+ import sun.swing.SwingUtilities2;
++import sun.awt.AppContext;
++
+ import java.awt.*;
+ import java.awt.event.*;
+ import java.io.Serializable;
+@@ -44,9 +46,6 @@
+  * @author Jeff Dinkins
+  */
+ public class BasicButtonUI extends ButtonUI{
+-    // Shared UI object
+-    private final static BasicButtonUI buttonUI = new BasicButtonUI();
+-
+     // Visual constants
+     // NOTE: This is not used or set any where. Were we allowed to remove
+     // fields, this would be removed.
+@@ -60,11 +59,20 @@
+     protected int defaultTextShiftOffset;
+ 
+     private final static String propertyPrefix = "Button" + ".";
++    
++    private static final Object BASIC_BUTTON_UI_KEY = new Object();
+ 
+     // ********************************
+     //          Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent c) {
++        AppContext appContext = AppContext.getAppContext();
++        BasicButtonUI buttonUI = 
++                (BasicButtonUI) appContext.get(BASIC_BUTTON_UI_KEY);
++        if (buttonUI == null) {
++            buttonUI = new BasicButtonUI();
++            appContext.put(BASIC_BUTTON_UI_KEY, buttonUI);
++        }
+         return buttonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicCheckBoxUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicCheckBoxUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicCheckBoxUI.java	2009-10-14 18:17:35.000000000 +0100
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicCheckBoxUI.java	2009-11-08 22:46:57.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package javax.swing.plaf.basic;
+ 
++import sun.awt.AppContext;
++
+ import javax.swing.*;
+ 
+ import java.awt.*;
+@@ -49,7 +51,7 @@
+  */
+ public class BasicCheckBoxUI extends BasicRadioButtonUI {
+ 
+-    private final static BasicCheckBoxUI checkboxUI = new BasicCheckBoxUI();
++    private static final Object BASIC_CHECK_BOX_UI_KEY = new Object();
+ 
+     private final static String propertyPrefix = "CheckBox" + ".";
+ 
+@@ -57,6 +59,13 @@
+     //            Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent b) {
++        AppContext appContext = AppContext.getAppContext();
++        BasicCheckBoxUI checkboxUI = 
++                (BasicCheckBoxUI) appContext.get(BASIC_CHECK_BOX_UI_KEY);
++        if (checkboxUI == null) {
++            checkboxUI = new BasicCheckBoxUI();
++            appContext.put(BASIC_CHECK_BOX_UI_KEY, checkboxUI);
++        }
+         return checkboxUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java	2009-11-08 20:12:39.000000000 +0000
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java	2009-11-08 22:58:35.000000000 +0000
+@@ -28,6 +28,8 @@
+ import sun.swing.SwingUtilities2;
+ import sun.swing.DefaultLookup;
+ import sun.swing.UIAction;
++import sun.awt.AppContext;
++
+ import javax.swing.*;
+ import javax.swing.plaf.*;
+ import javax.swing.text.View;
+@@ -63,7 +65,8 @@
+     * name in defaults table under the key "LabelUI".
+     */
+     protected static BasicLabelUI labelUI = new BasicLabelUI();
+-    private final static BasicLabelUI SAFE_BASIC_LABEL_UI = new BasicLabelUI();
++
++    private static final Object BASIC_LABEL_UI_KEY = new Object();
+ 
+     private Rectangle paintIconR = new Rectangle();
+     private Rectangle paintTextR = new Rectangle();
+@@ -394,10 +397,16 @@
+ 
+     public static ComponentUI createUI(JComponent c) {
+         if (System.getSecurityManager() != null) {
+-            return SAFE_BASIC_LABEL_UI;
+-        } else {
+-            return labelUI;
++            AppContext appContext = AppContext.getAppContext();
++            BasicLabelUI safeBasicLabelUI =
++                    (BasicLabelUI) appContext.get(BASIC_LABEL_UI_KEY);
++            if (safeBasicLabelUI == null) {
++                safeBasicLabelUI = new BasicLabelUI();
++                appContext.put(BASIC_LABEL_UI_KEY, safeBasicLabelUI);
++            }
++            return safeBasicLabelUI;
+         }
++        return labelUI;
+     }
+ 
+     public void propertyChange(PropertyChangeEvent e) {
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java	2009-10-14 18:17:35.000000000 +0100
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java	2009-11-08 22:46:57.000000000 +0000
+@@ -32,6 +32,7 @@
+ import javax.swing.plaf.*;
+ import javax.swing.text.View;
+ import sun.swing.SwingUtilities2;
++import sun.awt.AppContext;
+ 
+ 
+ /**
+@@ -41,7 +42,7 @@
+  */
+ public class BasicRadioButtonUI extends BasicToggleButtonUI
+ {
+-    private final static BasicRadioButtonUI radioButtonUI = new BasicRadioButtonUI();
++    private static final Object BASIC_RADIO_BUTTON_UI_KEY = new Object();
+ 
+     protected Icon icon;
+ 
+@@ -53,6 +54,13 @@
+     //        Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent b) {
++        AppContext appContext = AppContext.getAppContext();
++        BasicRadioButtonUI radioButtonUI = 
++                (BasicRadioButtonUI) appContext.get(BASIC_RADIO_BUTTON_UI_KEY);
++        if (radioButtonUI == null) {
++            radioButtonUI = new BasicRadioButtonUI();
++            appContext.put(BASIC_RADIO_BUTTON_UI_KEY, radioButtonUI);
++        }
+         return radioButtonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicToggleButtonUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicToggleButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/basic/BasicToggleButtonUI.java	2009-10-14 18:17:35.000000000 +0100
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/basic/BasicToggleButtonUI.java	2009-11-08 22:46:57.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package javax.swing.plaf.basic;
+ 
++import sun.awt.AppContext;
++
+ import java.awt.*;
+ import java.awt.event.*;
+ 
+@@ -43,7 +45,7 @@
+  */
+ public class BasicToggleButtonUI extends BasicButtonUI {
+ 
+-    private final static BasicToggleButtonUI toggleButtonUI = new BasicToggleButtonUI();
++    private static final Object BASIC_TOGGLE_BUTTON_UI_KEY = new Object();
+ 
+     private final static String propertyPrefix = "ToggleButton" + ".";
+ 
+@@ -51,6 +53,13 @@
+     //          Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent b) {
++        AppContext appContext = AppContext.getAppContext();
++        BasicToggleButtonUI toggleButtonUI = 
++                (BasicToggleButtonUI) appContext.get(BASIC_TOGGLE_BUTTON_UI_KEY);
++        if (toggleButtonUI == null) {
++            toggleButtonUI = new BasicToggleButtonUI();
++            appContext.put(BASIC_TOGGLE_BUTTON_UI_KEY, toggleButtonUI);
++        }
+         return toggleButtonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalButtonUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalButtonUI.java	2009-10-14 18:17:35.000000000 +0100
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalButtonUI.java	2009-11-08 22:59:26.000000000 +0000
+@@ -26,6 +26,8 @@
+ package javax.swing.plaf.metal;
+ 
+ import sun.swing.SwingUtilities2;
++import sun.awt.AppContext;
++
+ import javax.swing.*;
+ import javax.swing.border.*;
+ import javax.swing.plaf.basic.*;
+@@ -49,19 +51,25 @@
+  * @author Tom Santos
+  */
+ public class MetalButtonUI extends BasicButtonUI {
+-
+-    private final static MetalButtonUI metalButtonUI = new MetalButtonUI();
+-
+     // NOTE: These are not really needed, but at this point we can't pull
+     // them. Their values are updated purely for historical reasons.
+     protected Color focusColor;
+     protected Color selectColor;
+     protected Color disabledTextColor;
+ 
++    private static final Object METAL_BUTTON_UI_KEY = new Object();
++
+     // ********************************
+     //          Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent c) {
++        AppContext appContext = AppContext.getAppContext();
++        MetalButtonUI metalButtonUI =
++                (MetalButtonUI) appContext.get(METAL_BUTTON_UI_KEY);
++        if (metalButtonUI == null) {
++            metalButtonUI = new MetalButtonUI();
++            appContext.put(METAL_BUTTON_UI_KEY, metalButtonUI);
++        }
+         return metalButtonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalCheckBoxUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalCheckBoxUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalCheckBoxUI.java	2009-10-14 18:17:35.000000000 +0100
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalCheckBoxUI.java	2009-11-08 22:46:57.000000000 +0000
+@@ -25,6 +25,8 @@
+ 
+ package javax.swing.plaf.metal;
+ 
++import sun.awt.AppContext;
++
+ import javax.swing.*;
+ import javax.swing.plaf.basic.BasicCheckBoxUI;
+ 
+@@ -55,7 +57,7 @@
+     // of BasicCheckBoxUI because we want to pick up all the
+     // painting changes made in MetalRadioButtonUI.
+ 
+-    private final static MetalCheckBoxUI checkboxUI = new MetalCheckBoxUI();
++    private static final Object METAL_CHECK_BOX_UI_KEY = new Object();
+ 
+     private final static String propertyPrefix = "CheckBox" + ".";
+ 
+@@ -65,6 +67,13 @@
+     //         Create PlAF
+     // ********************************
+     public static ComponentUI createUI(JComponent b) {
++        AppContext appContext = AppContext.getAppContext();
++        MetalCheckBoxUI checkboxUI = 
++                (MetalCheckBoxUI) appContext.get(METAL_CHECK_BOX_UI_KEY);
++        if (checkboxUI == null) {
++            checkboxUI = new MetalCheckBoxUI();
++            appContext.put(METAL_CHECK_BOX_UI_KEY, checkboxUI);
++        }
+         return checkboxUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalLabelUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalLabelUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalLabelUI.java	2009-10-14 18:17:35.000000000 +0100
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalLabelUI.java	2009-11-08 22:46:57.000000000 +0000
+@@ -26,6 +26,8 @@
+ package javax.swing.plaf.metal;
+ 
+ import sun.swing.SwingUtilities2;
++import sun.awt.AppContext;
++
+ import javax.swing.*;
+ import javax.swing.plaf.*;
+ import javax.swing.plaf.basic.*;
+@@ -51,15 +53,21 @@
+     * name in defaults table under the key "LabelUI".
+     */
+     protected static MetalLabelUI metalLabelUI = new MetalLabelUI();
+-    private final static MetalLabelUI SAFE_METAL_LABEL_UI = new MetalLabelUI();
+-
++    
++    private static final Object METAL_LABEL_UI_KEY = new Object();
+ 
+     public static ComponentUI createUI(JComponent c) {
+         if (System.getSecurityManager() != null) {
+-            return SAFE_METAL_LABEL_UI;
+-        } else {
+-            return metalLabelUI;
+-        }
++            AppContext appContext = AppContext.getAppContext();
++            MetalLabelUI safeMetalLabelUI = 
++                    (MetalLabelUI) appContext.get(METAL_LABEL_UI_KEY);
++            if (safeMetalLabelUI == null) {
++                safeMetalLabelUI = new MetalLabelUI();
++                appContext.put(METAL_LABEL_UI_KEY, safeMetalLabelUI);
++            }
++            return safeMetalLabelUI;
++        }   
++        return metalLabelUI;
+     }
+ 
+     /**
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalRadioButtonUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalRadioButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalRadioButtonUI.java	2009-10-14 18:17:35.000000000 +0100
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalRadioButtonUI.java	2009-11-08 22:46:57.000000000 +0000
+@@ -26,6 +26,8 @@
+ package javax.swing.plaf.metal;
+ 
+ import sun.swing.SwingUtilities2;
++import sun.awt.AppContext;
++
+ import java.awt.*;
+ import java.awt.event.*;
+ import javax.swing.*;
+@@ -53,7 +55,7 @@
+  */
+ public class MetalRadioButtonUI extends BasicRadioButtonUI {
+ 
+-    private static final MetalRadioButtonUI metalRadioButtonUI = new MetalRadioButtonUI();
++    private static final Object METAL_RADIO_BUTTON_UI_KEY = new Object();
+ 
+     protected Color focusColor;
+     protected Color selectColor;
+@@ -65,6 +67,13 @@
+     //        Create PlAF
+     // ********************************
+     public static ComponentUI createUI(JComponent c) {
++        AppContext appContext = AppContext.getAppContext();
++        MetalRadioButtonUI metalRadioButtonUI = 
++                (MetalRadioButtonUI) appContext.get(METAL_RADIO_BUTTON_UI_KEY);
++        if (metalRadioButtonUI == null) {
++            metalRadioButtonUI = new MetalRadioButtonUI();
++            appContext.put(METAL_RADIO_BUTTON_UI_KEY, metalRadioButtonUI);
++        }
+         return metalRadioButtonUI;
+     }
+ 
+diff -Nru openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalToggleButtonUI.java openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalToggleButtonUI.java
+--- openjdk.orig/jdk/src/share/classes/javax/swing/plaf/metal/MetalToggleButtonUI.java	2009-10-14 18:17:35.000000000 +0100
++++ openjdk/jdk/src/share/classes/javax/swing/plaf/metal/MetalToggleButtonUI.java	2009-11-08 22:46:57.000000000 +0000
+@@ -26,6 +26,8 @@
+ package javax.swing.plaf.metal;
+ 
+ import sun.swing.SwingUtilities2;
++import sun.awt.AppContext;
++
+ import java.awt.*;
+ import java.awt.event.*;
+ import java.lang.ref.*;
+@@ -55,7 +57,7 @@
+  */
+ public class MetalToggleButtonUI extends BasicToggleButtonUI {
+ 
+-    private static final MetalToggleButtonUI metalToggleButtonUI = new MetalToggleButtonUI();
++    private static final Object METAL_TOGGLE_BUTTON_UI_KEY = new Object();
+ 
+     protected Color focusColor;
+     protected Color selectColor;
+@@ -67,6 +69,13 @@
+     //        Create PLAF
+     // ********************************
+     public static ComponentUI createUI(JComponent b) {
++        AppContext appContext = AppContext.getAppContext();
++        MetalToggleButtonUI metalToggleButtonUI = 
++                (MetalToggleButtonUI) appContext.get(METAL_TOGGLE_BUTTON_UI_KEY);
++        if (metalToggleButtonUI == null) {
++            metalToggleButtonUI = new MetalToggleButtonUI();
++            appContext.put(METAL_TOGGLE_BUTTON_UI_KEY, metalToggleButtonUI);
++        }
+         return metalToggleButtonUI;
+     }
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6664512.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,1227 @@
+# HG changeset patch
+# User dcherepanov
+# Date 1250778007 -14400
+# Node ID 39a17e09441859169794efccf55e1f4b77f72a6b
+# Parent  39a8e48517ce4a860ae87caf02faeb4f88bb9f1f
+6664512: Component and [Default]KeyboardFocusManager pass security sensitive objects to loggers
+Summary: toString is called on security sensitive objects
+Reviewed-by: art, hawtin
+
+diff -r 39a8e48517ce -r 39a17e094418 src/share/classes/java/awt/Component.java
+--- openjdk.orig/jdk/src/share/classes/java/awt/Component.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/share/classes/java/awt/Component.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -4307,7 +4307,7 @@
+         }
+ 
+         if (eventLog.isLoggable(Level.FINEST)) {
+-            eventLog.log(Level.FINEST, "{0}", e);
++            eventLog.log(Level.FINEST, "{0}", String.valueOf(e));
+         }
+ 
+         /*
+diff -r 39a8e48517ce -r 39a17e094418 src/share/classes/java/awt/DefaultKeyboardFocusManager.java
+--- openjdk.orig/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -379,7 +379,7 @@
+                     // should receive focus first
+                     if (focusLog.isLoggable(Level.FINER)) {
+                         focusLog.log(Level.FINER, "tempLost {0}, toFocus {1}",
+-                                     new Object[]{tempLost, toFocus});
++                                     new Object[]{String.valueOf(tempLost), String.valueOf(toFocus)});
+                     }
+                     if (tempLost != null) {
+                         tempLost.requestFocusInWindow(CausedFocusEvent.Cause.ACTIVATION);
+@@ -447,7 +447,8 @@
+                 Component newFocusOwner = fe.getComponent();
+                 if (oldFocusOwner == newFocusOwner) {
+                     if (focusLog.isLoggable(Level.FINE)) {
+-                        focusLog.log(Level.FINE, "Skipping {0} because focus owner is the same", new Object[] {e});
++                        focusLog.log(Level.FINE, "Skipping {0} because focus owner is the same",
++                                                 new Object[] {String.valueOf(e)});
+                     }
+                     // We can't just drop the event - there could be
+                     // type-ahead markers associated with it.
+@@ -554,16 +555,20 @@
+                 FocusEvent fe = (FocusEvent)e;
+                 Component currentFocusOwner = getGlobalFocusOwner();
+                 if (currentFocusOwner == null) {
+-                    if (focusLog.isLoggable(Level.FINE)) focusLog.log(Level.FINE, "Skipping {0} because focus owner is null",
+-                                                                        new Object[] {e});
++                    if (focusLog.isLoggable(Level.FINE)) {
++                        focusLog.log(Level.FINE, "Skipping {0} because focus owner is null",
++                                                 new Object[] {String.valueOf(e)});
++                    }
+                     break;
+                 }
+                 // Ignore cases where a Component loses focus to itself.
+                 // If we make a mistake because of retargeting, then the
+                 // FOCUS_GAINED handler will correct it.
+                 if (currentFocusOwner == fe.getOppositeComponent()) {
+-                    if (focusLog.isLoggable(Level.FINE)) focusLog.log(Level.FINE, "Skipping {0} because current focus owner is equal to opposite",
+-                                                                      new Object[] {e});
++                    if (focusLog.isLoggable(Level.FINE)) {
++                        focusLog.log(Level.FINE, "Skipping {0} because current focus owner is equal to opposite",
++                                                 new Object[] {String.valueOf(e)});
++                    }
+                     break;
+                 }
+ 
+@@ -631,9 +636,11 @@
+                 Window losingFocusWindow = we.getWindow();
+                 Window activeWindow = getGlobalActiveWindow();
+                 Window oppositeWindow = we.getOppositeWindow();
+-                if (focusLog.isLoggable(Level.FINE)) focusLog.log(Level.FINE, "Active {0}, Current focused {1}, losing focus {2} opposite {3}",
+-                                                                  new Object[] {activeWindow, currentFocusedWindow,
+-                                                                                losingFocusWindow, oppositeWindow});
++                if (focusLog.isLoggable(Level.FINE)) {
++                    focusLog.log(Level.FINE, "Active {0}, Current focused {1}, losing focus {2} opposite {3}",
++                                             new Object[] {String.valueOf(activeWindow), String.valueOf(currentFocusedWindow),
++                                                           String.valueOf(losingFocusWindow), String.valueOf(oppositeWindow)});
++                }
+                 if (currentFocusedWindow == null) {
+                     break;
+                 }
+@@ -818,7 +825,10 @@
+                         }
+                     }
+                     if (ke != null) {
+-                        focusLog.log(Level.FINER, "Pumping approved event {0}", new Object[] {ke});
++                        if (focusLog.isLoggable(Level.FINER)) {
++                            focusLog.log(Level.FINER, "Pumping approved event {0}",
++                                                      new Object[] {String.valueOf(ke)});
++                        }
+                         enqueuedKeyEvents.removeFirst();
+                     }
+                 }
+@@ -840,7 +850,7 @@
+                     Iterator iter = typeAheadMarkers.iterator();
+                     while (iter.hasNext()) {
+                         TypeAheadMarker marker = (TypeAheadMarker)iter.next();
+-                        focusLog.log(Level.FINEST, "    {0}", marker);
++                        focusLog.log(Level.FINEST, "    {0}", String.valueOf(marker));
+                     }
+                 }
+             }
+@@ -868,7 +878,10 @@
+                         // The fix is rolled out.
+ 
+                         if (ke.getWhen() > marker.after) {
+-                            focusLog.log(Level.FINER, "Storing event {0} because of marker {1}", new Object[] {ke, marker});
++                            if (focusLog.isLoggable(Level.FINER)) {
++                                focusLog.log(Level.FINER, "Storing event {0} because of marker {1}",
++                                                          new Object[] {String.valueOf(ke), String.valueOf(marker)});
++                            }
+                             enqueuedKeyEvents.addLast(ke);
+                             return true;
+                         }
+@@ -880,7 +893,10 @@
+             }
+ 
+             case FocusEvent.FOCUS_GAINED:
+-                focusLog.log(Level.FINEST, "Markers before FOCUS_GAINED on {0}", new Object[] {target});
++                if (focusLog.isLoggable(Level.FINEST)) {
++                    focusLog.log(Level.FINEST, "Markers before FOCUS_GAINED on {0}",
++                                 new Object[] {String.valueOf(target)});
++                }
+                 dumpMarkers();
+                 // Search the marker list for the first marker tied to
+                 // the Component which just gained focus. Then remove
+@@ -909,7 +925,9 @@
+                         }
+                     } else {
+                         // Exception condition - event without marker
+-                        focusLog.log(Level.FINER, "Event without marker {0}", e);
++                        if (focusLog.isLoggable(Level.FINER)) {
++                            focusLog.log(Level.FINER, "Event without marker {0}", String.valueOf(e));
++                        }
+                     }
+                 }
+                 focusLog.log(Level.FINEST, "Markers after FOCUS_GAINED");
+@@ -1146,8 +1164,10 @@
+             return;
+         }
+ 
+-        focusLog.log(Level.FINER, "Enqueue at {0} for {1}",
+-                     new Object[] {after, untilFocused});
++        if (focusLog.isLoggable(Level.FINER)) {
++            focusLog.log(Level.FINER, "Enqueue at {0} for {1}",
++                         new Object[] {after, String.valueOf(untilFocused)});
++        }
+ 
+         int insertionIndex = 0,
+             i = typeAheadMarkers.size();
+@@ -1186,8 +1206,10 @@
+             return;
+         }
+ 
+-        focusLog.log(Level.FINER, "Dequeue at {0} for {1}",
+-                     new Object[] {after, untilFocused});
++        if (focusLog.isLoggable(Level.FINER)) {
++            focusLog.log(Level.FINER, "Dequeue at {0} for {1}",
++                         new Object[] {after, String.valueOf(untilFocused)});
++        }
+ 
+         TypeAheadMarker marker;
+         ListIterator iter = typeAheadMarkers.listIterator
+diff -r 39a8e48517ce -r 39a17e094418 src/share/classes/java/awt/KeyboardFocusManager.java
+--- openjdk.orig/jdk/src/share/classes/java/awt/KeyboardFocusManager.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/share/classes/java/awt/KeyboardFocusManager.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -586,7 +586,7 @@
+     void setNativeFocusOwner(Component comp) {
+         if (focusLog.isLoggable(Level.FINEST)) {
+             focusLog.log(Level.FINEST, "Calling peer {0} setCurrentFocusOwner for {1}",
+-                         new Object[] {peer, comp});
++                         new Object[] {String.valueOf(peer), String.valueOf(comp)});
+         }
+         peer.setCurrentFocusOwner(comp);
+     }
+@@ -2338,20 +2338,20 @@
+         Window nativeFocusedWindow = thisManager.getNativeFocusedWindow();
+         if (focusLog.isLoggable(Level.FINER)) {
+             focusLog.log(Level.FINER, "SNFH for {0} in {1}",
+-                         new Object[] {descendant, heavyweight});
++                         new Object[] {String.valueOf(descendant), String.valueOf(heavyweight)});
+         }
+         if (focusLog.isLoggable(Level.FINEST)) {
+             focusLog.log(Level.FINEST, "0. Current focus owner {0}",
+-                         currentFocusOwner);
++                         String.valueOf(currentFocusOwner));
+             focusLog.log(Level.FINEST, "0. Native focus owner {0}",
+-                         nativeFocusOwner);
++                         String.valueOf(nativeFocusOwner));
+             focusLog.log(Level.FINEST, "0. Native focused window {0}",
+-                         nativeFocusedWindow);
++                         String.valueOf(nativeFocusedWindow));
+         }
+         synchronized (heavyweightRequests) {
+             HeavyweightFocusRequest hwFocusRequest = getLastHWRequest();
+             if (focusLog.isLoggable(Level.FINEST)) {
+-                focusLog.log(Level.FINEST, "Request {0}", hwFocusRequest);
++                focusLog.log(Level.FINEST, "Request {0}", String.valueOf(hwFocusRequest));
+             }
+             if (hwFocusRequest == null &&
+                 heavyweight == nativeFocusOwner)
+@@ -2360,7 +2360,7 @@
+                     // Redundant request.
+                     if (focusLog.isLoggable(Level.FINEST))
+                         focusLog.log(Level.FINEST, "1. SNFH_FAILURE for {0}",
+-                                     descendant);
++                                     String.valueOf(descendant));
+                     return SNFH_FAILURE;
+                 }
+ 
+@@ -2393,7 +2393,7 @@
+                 SunToolkit.postEvent(descendant.appContext, newFocusOwnerEvent);
+ 
+                 if (focusLog.isLoggable(Level.FINEST))
+-                    focusLog.log(Level.FINEST, "2. SNFH_HANDLED for {0}", descendant);
++                    focusLog.log(Level.FINEST, "2. SNFH_HANDLED for {0}", String.valueOf(descendant));
+                 return SNFH_SUCCESS_HANDLED;
+             } else if (hwFocusRequest != null &&
+                        hwFocusRequest.heavyweight == heavyweight) {
+@@ -2900,11 +2900,11 @@
+         KeyboardFocusManager manager = getCurrentKeyboardFocusManager();
+         if (focusLog.isLoggable(Level.FINER)) {
+             if (event instanceof FocusEvent || event instanceof WindowEvent) {
+-                focusLog.log(Level.FINER, ">>> {0}", new Object[] {event});
++                focusLog.log(Level.FINER, ">>> {0}", new Object[] {String.valueOf(event)});
+             }
+             if (focusLog.isLoggable(Level.FINER) && event instanceof KeyEvent) {
+-                focusLog.log(Level.FINER, "    focus owner is {0}", new Object[] {manager.getGlobalFocusOwner()});
+-                focusLog.log(Level.FINER, ">>> {0}", new Object[] {event});
++                focusLog.log(Level.FINER, "    focus owner is {0}", new Object[] {String.valueOf(manager.getGlobalFocusOwner())});
++                focusLog.log(Level.FINER, ">>> {0}", new Object[] {String.valueOf(event)});
+             }
+         }
+ 
+diff -r 39a8e48517ce -r 39a17e094418 src/share/classes/sun/awt/DebugSettings.java
+--- openjdk.orig/jdk/src/share/classes/sun/awt/DebugSettings.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/share/classes/sun/awt/DebugSettings.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -129,7 +129,7 @@
+ 
+         // echo the initial property settings to stdout
+         if (log.isLoggable(Level.FINE)) {
+-            log.log(Level.FINE, "DebugSettings:\n{0}", this);
++            log.log(Level.FINE, "DebugSettings:\n{0}", String.valueOf(this));
+         }
+     }
+ 
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XBaseWindow.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -824,7 +824,9 @@
+      * The active grab overrides activated automatic grab.
+      */
+     public boolean grabInput() {
+-        grabLog.log(Level.FINE, "Grab input on {0}", new Object[] {this});
++        if (grabLog.isLoggable(Level.FINE)) {
++            grabLog.log(Level.FINE, "Grab input on {0}", new Object[] {String.valueOf(this)});
++        }
+ 
+         XToolkit.awtLock();
+         try {
+@@ -879,7 +881,10 @@
+         XToolkit.awtLock();
+         try {
+             XBaseWindow grabWindow = XAwtState.getGrabWindow();
+-            grabLog.log(Level.FINE, "UnGrab input on {0}", new Object[] {grabWindow});
++            if (grabLog.isLoggable(Level.FINE)) {
++                grabLog.log(Level.FINE, "UnGrab input on {0}",
++                            new Object[] {String.valueOf(grabWindow)});
++            }
+             if (grabWindow != null) {
+                 grabWindow.ungrabInputImpl();
+                 XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime);
+@@ -930,7 +935,7 @@
+             XPropertyCache.clearCache(window, XAtom.get(msg.get_atom()));
+         }
+         if (eventLog.isLoggable(Level.FINER)) {
+-            eventLog.log(Level.FINER, "{0}", new Object[] {msg});
++            eventLog.log(Level.FINER, "{0}", new Object[] {String.valueOf(msg)});
+         }
+     }
+ 
+@@ -1000,8 +1005,10 @@
+     }
+     public void handleConfigureNotifyEvent(XEvent xev) {
+         XConfigureEvent xe = xev.get_xconfigure();
+-        insLog.log(Level.FINER, "Configure, {0}",
+-                   new Object[] {xe});
++        if (insLog.isLoggable(Level.FINER)) {
++            insLog.log(Level.FINER, "Configure, {0}",
++                       new Object[] {String.valueOf(xe)});
++        }
+         x = xe.get_x();
+         y = xe.get_y();
+         width = xe.get_width();
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XCheckboxMenuItemPeer.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XCheckboxMenuItemPeer.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XCheckboxMenuItemPeer.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -29,8 +29,6 @@
+ import java.awt.peer.*;
+ import java.awt.event.*;
+ 
+-import java.util.logging.*;
+-
+ import java.lang.reflect.Field;
+ import sun.awt.SunToolkit;
+ 
+@@ -42,8 +40,6 @@
+      *
+      ************************************************/
+ 
+-    private static Logger log = Logger.getLogger("sun.awt.X11.XCheckboxMenuItemPeer");
+-
+     /*
+      * CheckboxMenuItem's fields
+      */
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XComponentPeer.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -261,7 +261,9 @@
+      * Called when component receives focus
+      */
+     public void focusGained(FocusEvent e) {
+-        focusLog.log(Level.FINE, "{0}", new Object[] {e});
++        if (focusLog.isLoggable(Level.FINER)) {
++            focusLog.log(Level.FINER, "{0}", new Object[] {String.valueOf(e)});
++        }
+         bHasFocus = true;
+     }
+ 
+@@ -269,7 +271,9 @@
+      * Called when component loses focus
+      */
+     public void focusLost(FocusEvent e) {
+-        focusLog.log(Level.FINE, "{0}", new Object[] {e});
++        if (focusLog.isLoggable(Level.FINE)) {
++            focusLog.log(Level.FINE, "{0}", new Object[] {String.valueOf(e)});
++        }
+         bHasFocus = false;
+     }
+ 
+@@ -511,7 +515,10 @@
+      * @see java.awt.peer.ComponentPeer
+      */
+     public void setEnabled(boolean value) {
+-        enableLog.log(Level.FINE, "{0}ing {1}", new Object[] {(value?"Enabl":"Disabl"), this});
++        if (enableLog.isLoggable(Level.FINE)) {
++            enableLog.log(Level.FINE, "{0}ing {1}",
++                          new Object[] {(value?"Enabl":"Disabl"), String.valueOf(this)});
++        }
+         boolean repaintNeeded = (enabled != value);
+         enabled = value;
+         if (target instanceof Container) {
+@@ -1346,7 +1353,10 @@
+      * ButtonPress, ButtonRelease, KeyPress, KeyRelease, EnterNotify, LeaveNotify, MotionNotify
+      */
+     protected boolean isEventDisabled(XEvent e) {
+-        enableLog.log(Level.FINEST, "Component is {1}, checking for disabled event {0}", new Object[] {e, (isEnabled()?"enabled":"disable")});
++        if (enableLog.isLoggable(Level.FINEST)) {
++            enableLog.log(Level.FINEST, "Component is {1}, checking for disabled event {0}",
++                          new Object[] {String.valueOf(e), (isEnabled()?"enabled":"disable")});
++        }
+         if (!isEnabled()) {
+             switch (e.get_type()) {
+               case ButtonPress:
+@@ -1356,7 +1366,9 @@
+               case EnterNotify:
+               case LeaveNotify:
+               case MotionNotify:
+-                  enableLog.log(Level.FINER, "Event {0} is disable", new Object[] {e});
++                  if (enableLog.isLoggable(Level.FINER)) {
++                      enableLog.log(Level.FINER, "Event {0} is disable", new Object[] {String.valueOf(e)});
++                  }
+                   return true;
+             }
+         }
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XContentWindow.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XContentWindow.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XContentWindow.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -98,8 +98,10 @@
+             if (in != null) {
+                 newBounds.setLocation(-in.left, -in.top);
+             }
+-            if (insLog.isLoggable(Level.FINE)) insLog.log(Level.FINE, "Setting content bounds {0}, old bounds {1}",
+-                                                          new Object[] {newBounds, getBounds()});
++            if (insLog.isLoggable(Level.FINE)) {
++                insLog.log(Level.FINE, "Setting content bounds {0}, old bounds {1}",
++                           new Object[] {String.valueOf(newBounds), String.valueOf(getBounds())});
++            }
+             // Fix for 5023533:
+             // Change in the size of the content window means, well, change of the size
+             // Change in the location of the content window means change in insets
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XDecoratedPeer.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -84,7 +84,11 @@
+         Rectangle bounds = (Rectangle)params.get(BOUNDS);
+         dimensions = new WindowDimensions(bounds, getRealInsets(), false);
+         params.put(BOUNDS, dimensions.getClientRect());
+-        insLog.log(Level.FINE, "Initial dimensions {0}", new Object[] { dimensions });
++
++        if (insLog.isLoggable(Level.FINE)) {
++            insLog.log(Level.FINE, "Initial dimensions {0}",
++                       new Object[] { String.valueOf(dimensions) });
++        }
+ 
+         // Deny default processing of these events on the shell - proxy will take care of
+         // them instead
+@@ -313,7 +317,10 @@
+                 // Check if we have insets provided by the WM
+                 Insets correctWM = getWMSetInsets(null);
+                 if (correctWM != null) {
+-                    insLog.log(Level.FINER, "wm-provided insets {0}", new Object[]{correctWM});
++                    if (insLog.isLoggable(Level.FINER)) {
++                        insLog.log(Level.FINER, "wm-provided insets {0}",
++                                   new Object[]{String.valueOf(correctWM)});
++                    }
+                     // If these insets are equal to our current insets - no actions are necessary
+                     Insets dimInsets = dimensions.getInsets();
+                     if (correctWM.equals(dimInsets)) {
+@@ -327,7 +334,10 @@
+                     correctWM = XWM.getWM().getInsets(this, xe.get_window(), xe.get_parent());
+ 
+                     if (correctWM != null) {
+-                        insLog.log(Level.FINER, "correctWM {0}", new Object[] {correctWM});
++                        if (insLog.isLoggable(Level.FINER)) {
++                            insLog.log(Level.FINER, "correctWM {0}",
++                                       new Object[] {String.valueOf(correctWM)});
++                        }
+                     } else {
+                         insLog.log(Level.FINER, "correctWM insets are not available, waiting for configureNotify");
+                     }
+@@ -350,7 +360,9 @@
+              * initial insets were wrong (most likely they were).
+              */
+             Insets correction = difference(correctWM, currentInsets);
+-            insLog.log(Level.FINEST, "Corrention {0}", new Object[] {correction});
++            if (insLog.isLoggable(Level.FINEST)) {
++                insLog.log(Level.FINEST, "Corrention {0}", new Object[] {String.valueOf(correction)});
++            }
+             if (!isNull(correction)) {
+                 /*
+                  * Actual insets account for menubar/warning label,
+@@ -440,7 +452,10 @@
+     public Insets getInsets() {
+         Insets in = copy(getRealInsets());
+         in.top += getMenuBarHeight() + getWarningWindowHeight();
+-        if (insLog.isLoggable(Level.FINEST)) insLog.log(Level.FINEST, "Get insets returns {0}", new Object[] {in});
++        if (insLog.isLoggable(Level.FINEST)) {
++            insLog.log(Level.FINEST, "Get insets returns {0}",
++                       new Object[] {String.valueOf(in)});
++        }
+         return in;
+     }
+ 
+@@ -589,8 +604,10 @@
+               dims.setSize(width, height);
+               break;
+         }
+-        if (insLog.isLoggable(Level.FINE)) insLog.log(Level.FINE, "For the operation {0} new dimensions are {1}",
+-                                                      new Object[] {operationToString(operation), dims});
++        if (insLog.isLoggable(Level.FINE)) {
++            insLog.log(Level.FINE, "For the operation {0} new dimensions are {1}",
++                       new Object[] {operationToString(operation), String.valueOf(dims)});
++        }
+ 
+         reshape(dims, operation, userReshape);
+     }
+@@ -660,7 +677,10 @@
+     public void handleConfigureNotifyEvent(XEvent xev) {
+         assert (SunToolkit.isAWTLockHeldByCurrentThread());
+         XConfigureEvent xe = xev.get_xconfigure();
+-        insLog.log(Level.FINE, "Configure notify {0}", new Object[] {xe});
++        if (insLog.isLoggable(Level.FINE)) {
++            insLog.log(Level.FINE, "Configure notify {0}",
++                       new Object[] {String.valueOf(xe)});
++        }
+ 
+         // XXX: should really only consider synthetic events, but
+         if (isReparented()) {
+@@ -752,7 +772,9 @@
+                 case XWM.SAWFISH_WM:
+                 {
+                     Point xlocation = queryXLocation();
+-                    if (log.isLoggable(Level.FINE)) log.log(Level.FINE, "New X location: {0}", new Object[]{xlocation});
++                    if (log.isLoggable(Level.FINE)) {
++                        log.log(Level.FINE, "New X location: {0}", new Object[]{String.valueOf(xlocation)});
++                    }
+                     if (xlocation != null) {
+                         newLocation = xlocation;
+                     }
+@@ -769,8 +791,10 @@
+                 copy(currentInsets),
+                 true);
+ 
+-        insLog.log(Level.FINER, "Insets are {0}, new dimensions {1}",
+-                new Object[] {currentInsets, newDimensions});
++        if (insLog.isLoggable(Level.FINER)) {
++            insLog.log(Level.FINER, "Insets are {0}, new dimensions {1}",
++                    new Object[] {String.valueOf(currentInsets), String.valueOf(newDimensions)});
++        }
+ 
+         checkIfOnNewScreen(newDimensions.getBounds());
+ 
+@@ -935,7 +959,7 @@
+                 Point location = target.getLocation();
+                 if (insLog.isLoggable(Level.FINE))
+                     insLog.log(Level.FINE, "getLocationOnScreen {0} not reparented: {1} ",
+-                               new Object[] {this, location});
++                               new Object[] {String.valueOf(this), String.valueOf(location)});
+                 return location;
+             }
+         } finally {
+@@ -972,7 +996,10 @@
+     }
+ 
+     public void setVisible(boolean vis) {
+-        log.log(Level.FINER, "Setting {0} to visible {1}", new Object[] {this, Boolean.valueOf(vis)});
++        if (log.isLoggable(Level.FINER)) {
++            log.log(Level.FINER, "Setting {0} to visible {1}",
++                    new Object[] {String.valueOf(this), Boolean.valueOf(vis)});
++        }
+         if (vis && !isVisible()) {
+             XWM.setShellDecor(this);
+             super.setVisible(vis);
+@@ -1027,7 +1054,10 @@
+     }
+ 
+     private void handleWmTakeFocus(XClientMessageEvent cl) {
+-        focusLog.log(Level.FINE, "WM_TAKE_FOCUS on {0}", new Object[]{this});
++        if (focusLog.isLoggable(Level.FINE)) {
++            focusLog.log(Level.FINE, "WM_TAKE_FOCUS on {0}",
++                         new Object[]{String.valueOf(this)});
++        }
+         requestWindowFocus(cl.get_data(1), true);
+     }
+ 
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XDropTargetProtocol.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XDropTargetProtocol.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XDropTargetProtocol.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -117,7 +117,7 @@
+         EmbedderRegistryEntry entry = getEmbedderRegistryEntry(toplevel);
+ 
+         if (logger.isLoggable(Level.FINEST)) {
+-            logger.log(Level.FINEST, "        entry={0}", new Object[] {entry});
++            logger.log(Level.FINEST, "        entry={0}", new Object[] {String.valueOf(entry)});
+         }
+         // Window not registered as an embedder for this protocol.
+         if (entry == null) {
+@@ -138,7 +138,8 @@
+         long proxy = entry.getProxy();
+ 
+         if (logger.isLoggable(Level.FINEST)) {
+-            logger.log(Level.FINEST, "        proxy={0} toplevel={1}", new Object[] {proxy, toplevel});
++            logger.log(Level.FINEST, "        proxy={0} toplevel={1}",
++                       new Object[] {String.valueOf(proxy), String.valueOf(toplevel)});
+         }
+         if (proxy == 0) {
+             proxy = toplevel;
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XFocusProxyWindow.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XFocusProxyWindow.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XFocusProxyWindow.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -34,7 +34,6 @@
+  * and therefore X doesn't control focus after we have set it to proxy.
+  */
+ public class XFocusProxyWindow extends XBaseWindow {
+-    private static final Logger focusLog = Logger.getLogger("sun.awt.X11.focus.XFocusProxyWindow");
+     XWindowPeer owner;
+ 
+     public XFocusProxyWindow(XWindowPeer owner) {
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XFramePeer.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -281,7 +281,10 @@
+         super.handlePropertyNotify(xev);
+         XPropertyEvent ev = xev.get_xproperty();
+ 
+-        log.log(Level.FINER, "Property change {0}", new Object[] {ev});
++        if (log.isLoggable(Level.FINER)) {
++            log.log(Level.FINER, "Property change {0}", new Object[] {String.valueOf(ev)});
++        }
++
+         /*
+          * Let's see if this is a window state protocol message, and
+          * if it is - decode a new state in terms of java constants.
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XIconWindow.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XIconWindow.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XIconWindow.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -75,7 +75,10 @@
+             XIconSize[] res = new XIconSize[count];
+             for (int i = 0; i < count; i++, sizes_ptr += XIconSize.getSize()) {
+                 res[i] = new XIconSize(sizes_ptr);
+-                log.log(Level.FINEST, "sizes_ptr[{1}] = {0}", new Object[] {res[i], Integer.valueOf(i)});
++                if (log.isLoggable(Level.FINEST)) {
++                    log.log(Level.FINEST, "sizes_ptr[{1}] = {0}",
++                            new Object[] {String.valueOf(res[i]), Integer.valueOf(i)});
++                }
+             }
+             return res;
+         } finally {
+@@ -92,7 +95,9 @@
+         }
+ 
+         XIconSize[] sizeList = getIconSizes();
+-        log.log(Level.FINEST, "Icon sizes: {0}", new Object[] {sizeList});
++        if (log.isLoggable(Level.FINEST)) {
++            log.log(Level.FINEST, "Icon sizes: {0}", new Object[] {String.valueOf(sizeList)});
++        }
+         if (sizeList == null) {
+             // No icon sizes so we simply fall back to 16x16
+             return new Dimension(16, 16);
+@@ -444,7 +449,9 @@
+             }
+             Dimension iconSize = getIconSize(width, height);
+             if (iconSize != null) {
+-                log.log(Level.FINEST, "Icon size: {0}", iconSize);
++                if (log.isLoggable(Level.FINEST)) {
++                    log.log(Level.FINEST, "Icon size: {0}", String.valueOf(iconSize));
++                }
+                 iconWidth = iconSize.width;
+                 iconHeight = iconSize.height;
+             } else {
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XInputMethod.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XInputMethod.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XInputMethod.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -108,8 +108,10 @@
+             client = getParent(client);
+             peer = (XComponentPeer)XToolkit.targetToPeer(client);
+         }
+-        log.log(Level.FINE, "Peer is {0}, client is {1}", new Object[] {peer, client});
+-
++        if (log.isLoggable(Level.FINE)) {
++            log.log(Level.FINE, "Peer is {0}, client is {1}",
++                    new Object[] {String.valueOf(peer), String.valueOf(client)});
++        }
+         if (peer != null)
+             return peer;
+ 
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XMenuItemPeer.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XMenuItemPeer.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XMenuItemPeer.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -43,8 +43,6 @@
+      *
+      ************************************************/
+ 
+-    private static Logger log = Logger.getLogger("sun.awt.X11.XMenuItemPeer");
+-
+     /*
+      * Primary members
+      */
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XNETProtocol.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -56,7 +56,11 @@
+ 
+     private void setInitialState(XWindowPeer window, int state) {
+         XAtomList old_state = window.getNETWMState();
+-        log.log(Level.FINE, "Current state of the window {0} is {1}", new Object[] {window, old_state});
++
++        if (log.isLoggable(Level.FINE)) {
++            log.log(Level.FINE, "Current state of the window {0} is {1}",
++                    new Object[] {String.valueOf(window), String.valueOf(old_state)});
++        }
+         if ((state & Frame.MAXIMIZED_VERT) != 0) {
+             old_state.add(XA_NET_WM_STATE_MAXIMIZED_VERT);
+         } else {
+@@ -67,7 +71,10 @@
+         } else {
+             old_state.remove(XA_NET_WM_STATE_MAXIMIZED_HORZ);
+         }
+-        log.log(Level.FINE, "Setting initial state of the window {0} to {1}", new Object[] {window, old_state});
++        if (log.isLoggable(Level.FINE)) {
++            log.log(Level.FINE, "Setting initial state of the window {0} to {1}",
++                                new Object[] {String.valueOf(window), String.valueOf(old_state)});
++        }
+         window.setNETWMState(old_state);
+     }
+ 
+@@ -191,7 +198,10 @@
+                 req.set_format(32);
+                 req.set_data(0, (!set) ? _NET_WM_STATE_REMOVE : _NET_WM_STATE_ADD);
+                 req.set_data(1, state.getAtom());
+-                log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(set)});
++                if (log.isLoggable(Level.FINE)) {
++                    log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}",
++                            new Object[] {String.valueOf(state), String.valueOf(window), Boolean.valueOf(set)});
++                }
+                 XToolkit.awtLock();
+                 try {
+                     XlibWrapper.XSendEvent(XToolkit.getDisplay(),
+@@ -208,13 +218,19 @@
+             }
+         } else {
+             XAtomList net_wm_state = window.getNETWMState();
+-            log.log(Level.FINE, "Current state on {0} is {1}", new Object[] {window, net_wm_state});
++            if (log.isLoggable(Level.FINE)) {
++                log.log(Level.FINE, "Current state on {0} is {1}",
++                        new Object[] {String.valueOf(window), String.valueOf(net_wm_state)});
++            }
+             if (!set) {
+                 net_wm_state.remove(state);
+             } else {
+                 net_wm_state.add(state);
+             }
+-            log.log(Level.FINE, "Setting states on {0} to {1}", new Object[] {window, net_wm_state});
++            if (log.isLoggable(Level.FINE)) {
++                log.log(Level.FINE, "Setting states on {0} to {1}",
++                        new Object[] {String.valueOf(window), String.valueOf(net_wm_state)});
++            }
+             window.setNETWMState(net_wm_state);
+         }
+         XToolkit.XSync();
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XProtocol.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XProtocol.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XProtocol.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -68,7 +68,10 @@
+         } finally {
+             if (firstCheck) {
+                 firstCheck = false;
+-                log.log(Level.FINE, "{0}:{1} supports {2}", new Object[] {this, listName, protocols});
++                if (log.isLoggable(Level.FINE)) {
++                    log.log(Level.FINE, "{0}:{1} supports {2}",
++                            new Object[] {String.valueOf(this), String.valueOf(listName), String.valueOf(protocols)});
++                }
+             }
+         }
+     }
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XQueryTree.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XQueryTree.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XQueryTree.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -32,7 +32,6 @@
+ 
+ public class XQueryTree {
+         private static Unsafe unsafe = XlibWrapper.unsafe;
+-    private static final Logger log = Logger.getLogger("sun.awt.X11.XQueryTree");
+         private boolean __executed = false;
+         long _w;
+         long root_ptr = unsafe.allocateMemory(Native.getLongSize());
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XToolkit.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -555,7 +555,7 @@
+                 }
+ 
+                 if (eventLog.isLoggable(Level.FINER)) {
+-                    eventLog.log(Level.FINER, "{0}", ev);
++                    eventLog.log(Level.FINER, "{0}", String.valueOf(ev));
+                 }
+ 
+                 // Check if input method consumes the event
+@@ -1668,8 +1668,10 @@
+             if (timeoutTaskLog.isLoggable(Level.FINER)) {
+                 timeoutTaskLog.log(Level.FINER, "XToolkit.schedule(): current time={0}" +
+                                    ";  interval={1}" +
+-                                   ";  task being added={2}" + ";  tasks before addition={3}", new Object[] {
+-                                   Long.valueOf(System.currentTimeMillis()), Long.valueOf(interval), task, timeoutTasks});
++                                   ";  task being added={2}" + ";  tasks before addition={3}",
++                                   new Object[] { Long.valueOf(System.currentTimeMillis()),
++                                                  Long.valueOf(interval), String.valueOf(task),
++                                                  String.valueOf(timeoutTasks)});
+             }
+ 
+             if (timeoutTasks == null) {
+@@ -1714,7 +1716,8 @@
+     private static void callTimeoutTasks() {
+         if (timeoutTaskLog.isLoggable(Level.FINER)) {
+             timeoutTaskLog.log(Level.FINER, "XToolkit.callTimeoutTasks(): current time={0}" +
+-                               ";  tasks={1}",  new Object[] {Long.valueOf(System.currentTimeMillis()), timeoutTasks});
++                               ";  tasks={1}",  new Object[] {Long.valueOf(System.currentTimeMillis()),
++                                                              String.valueOf(timeoutTasks)});
+         }
+ 
+         if (timeoutTasks == null || timeoutTasks.isEmpty()) {
+@@ -1732,7 +1735,8 @@
+ 
+                 if (timeoutTaskLog.isLoggable(Level.FINER)) {
+                     timeoutTaskLog.log(Level.FINER, "XToolkit.callTimeoutTasks(): current time={0}" +
+-                                       ";  about to run task={1}", new Object[] {Long.valueOf(currentTime), task});
++                                       ";  about to run task={1}",
++                                       new Object[] {Long.valueOf(currentTime), String.valueOf(task)});
+                 }
+ 
+                 try {
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XTrayIconPeer.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -106,10 +106,11 @@
+                     }
+ 
+                     XConfigureEvent ce = ev.get_xconfigure();
+-
+-                    ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}: {1}x{2}+{3}+{4} (old: {5}+{6})",
+-                               new Object[] { XTrayIconPeer.this, ce.get_width(), ce.get_height(),
+-                                              ce.get_x(), ce.get_y(), old_x, old_y });
++                    if (ctrLog.isLoggable(Level.FINE)) {
++                        ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}: {1}x{2}+{3}+{4} (old: {5}+{6})",
++                                   new Object[] { String.valueOf(XTrayIconPeer.this), ce.get_width(), ce.get_height(),
++                                                  ce.get_x(), ce.get_y(), old_x, old_y });
++                    }
+ 
+                     // A workaround for Gnome/Metacity (it doesn't affect the behaviour on KDE).
+                     // On Metacity the EmbeddedFrame's parent window bounds are larger
+@@ -129,15 +130,17 @@
+                         // If both the height and the width differ from the fixed size then WM
+                         // must level at least one side to the fixed size. For some reason it may take
+                         // a few hops (even after reparenting) and we have to skip the intermediate ones.
+-                        ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Skipping as intermediate resizing.",
+-                                   XTrayIconPeer.this);
++                        if (ctrLog.isLoggable(Level.FINE)) {
++                            ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Skipping as intermediate resizing.",
++                                       String.valueOf(XTrayIconPeer.this));
++                        }
+                         return;
+ 
+                     } else if (ce.get_height() > TRAY_ICON_HEIGHT) {
+-
+-                        ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Centering by \"Y\".",
+-                                   XTrayIconPeer.this);
+-
++                        if (ctrLog.isLoggable(Level.FINE)) {
++                            ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Centering by \"Y\".",
++                                       String.valueOf(XTrayIconPeer.this));
++                        }
+                         XlibWrapper.XMoveResizeWindow(XToolkit.getDisplay(), eframeParentID,
+                                                       ce.get_x(),
+                                                       ce.get_y()+ce.get_height()/2-TRAY_ICON_HEIGHT/2,
+@@ -147,10 +150,10 @@
+                         ex_width = 0;
+ 
+                     } else if (ce.get_width() > TRAY_ICON_WIDTH) {
+-
+-                        ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Centering by \"X\".",
+-                                   XTrayIconPeer.this);
+-
++                        if (ctrLog.isLoggable(Level.FINE)) {
++                            ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Centering by \"X\".",
++                                       String.valueOf(XTrayIconPeer.this));
++                        }
+                         XlibWrapper.XMoveResizeWindow(XToolkit.getDisplay(), eframeParentID,
+                                                       ce.get_x()+ce.get_width()/2 - TRAY_ICON_WIDTH/2,
+                                                       ce.get_y(),
+@@ -165,25 +168,27 @@
+                         // In this case the parent window also lose centering. We have to restore it.
+ 
+                         if (ex_height != 0) {
+-
+-                            ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Move detected. Centering by \"Y\".",
+-                                       XTrayIconPeer.this);
+-
++                            if (ctrLog.isLoggable(Level.FINE)) {
++                                ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Move detected. Centering by \"Y\".",
++                                           String.valueOf(XTrayIconPeer.this));
++                            }
+                             XlibWrapper.XMoveWindow(XToolkit.getDisplay(), eframeParentID,
+                                                     ce.get_x(),
+                                                     ce.get_y() + ex_height/2 - TRAY_ICON_HEIGHT/2);
+ 
+                         } else if (ex_width != 0) {
+-
+-                            ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Move detected. Centering by \"X\".",
+-                                       XTrayIconPeer.this);
+-
++                            if (ctrLog.isLoggable(Level.FINE)) {
++                                ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Move detected. Centering by \"X\".",
++                                           String.valueOf(XTrayIconPeer.this));
++                            }
+                             XlibWrapper.XMoveWindow(XToolkit.getDisplay(), eframeParentID,
+                                                     ce.get_x() + ex_width/2 - TRAY_ICON_WIDTH/2,
+                                                     ce.get_y());
+                         } else {
+-                            ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Move detected. Skipping.",
+-                                       XTrayIconPeer.this);
++                            if (ctrLog.isLoggable(Level.FINE)) {
++                                ctrLog.log(Level.FINE, "ConfigureNotify on parent of {0}. Move detected. Skipping.",
++                                           String.valueOf(XTrayIconPeer.this));
++                            }
+                         }
+                     }
+                     old_x = ce.get_x();
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XWM.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XWM.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XWM.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -398,7 +398,10 @@
+     static boolean isCDE() {
+ 
+         if (!XA_DT_SM_WINDOW_INFO.isInterned()) {
+-            log.log(Level.FINER, "{0} is not interned", new Object[] {XA_DT_SM_WINDOW_INFO});
++            if (log.isLoggable(Level.FINER)) {
++                log.log(Level.FINER, "{0} is not interned",
++                        new Object[] {String.valueOf(XA_DT_SM_WINDOW_INFO)});
++            }
+             return false;
+         }
+ 
+@@ -429,7 +432,10 @@
+ 
+             /* Now check that this window has _DT_SM_STATE_INFO (ignore contents) */
+             if (!XA_DT_SM_STATE_INFO.isInterned()) {
+-                log.log(Level.FINER, "{0} is not interned", new Object[] {XA_DT_SM_STATE_INFO});
++                if (log.isLoggable(Level.FINER)) {
++                    log.log(Level.FINER, "{0} is not interned",
++                            new Object[] {String.valueOf(XA_DT_SM_STATE_INFO)});
++                }
+                 return false;
+             }
+             WindowPropertyGetter getter2 =
+@@ -608,7 +614,10 @@
+          */
+ 
+         if (!XA_ICEWM_WINOPTHINT.isInterned()) {
+-            log.log(Level.FINER, "{0} is not interned", new Object[] {XA_ICEWM_WINOPTHINT});
++            if (log.isLoggable(Level.FINER)) {
++                log.log(Level.FINER, "{0} is not interned",
++                        new Object[] {String.valueOf(XA_ICEWM_WINOPTHINT)});
++            }
+             return false;
+         }
+ 
+@@ -641,7 +650,10 @@
+      */
+     static boolean isIceWM() {
+         if (!XA_ICEWM_WINOPTHINT.isInterned()) {
+-            log.log(Level.FINER, "{0} is not interned", new Object[] {XA_ICEWM_WINOPTHINT});
++            if (log.isLoggable(Level.FINER)) {
++                log.log(Level.FINER, "{0} is not interned",
++                        new Object[] {String.valueOf(XA_ICEWM_WINOPTHINT)});
++            }
+             return false;
+         }
+ 
+@@ -1376,8 +1388,9 @@
+         XNETProtocol net_protocol = getWM().getNETProtocol();
+         if (net_protocol != null && net_protocol.active()) {
+             Insets insets = getInsetsFromProp(window, XA_NET_FRAME_EXTENTS);
+-            insLog.log(Level.FINE, "_NET_FRAME_EXTENTS: {0}", insets);
+-
++            if (insLog.isLoggable(Level.FINE)) {
++                insLog.log(Level.FINE, "_NET_FRAME_EXTENTS: {0}", String.valueOf(insets));
++            }
+             if (insets != null) {
+                 return insets;
+             }
+@@ -1515,7 +1528,9 @@
+          *       [mwm, e!, kwin, fvwm2 ... ]
+          */
+         Insets correctWM = XWM.getInsetsFromExtents(window);
+-        insLog.log(Level.FINER, "Got insets from property: {0}", correctWM);
++        if (insLog.isLoggable(Level.FINER)) {
++            insLog.log(Level.FINER, "Got insets from property: {0}", String.valueOf(correctWM));
++        }
+ 
+         if (correctWM == null) {
+             correctWM = new Insets(0,0,0,0);
+@@ -1576,7 +1591,10 @@
+                   }
+                   case XWM.OTHER_WM:
+                   default: {                /* this is very similar to the E! case above */
+-                      insLog.log(Level.FINEST, "Getting correct insets for OTHER_WM/default, parent: {0}", parent);
++                      if (insLog.isLoggable(Level.FINEST)) {
++                          insLog.log(Level.FINEST, "Getting correct insets for OTHER_WM/default, parent: {0}",
++                                                   String.valueOf(parent));
++                      }
+                       syncTopLevelPos(parent, lwinAttr);
+                       int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
+                                                                     window, lwinAttr.pData);
+@@ -1603,8 +1621,11 @@
+                           && lwinAttr.get_width()+2*lwinAttr.get_border_width() == pattr.get_width()
+                           && lwinAttr.get_height()+2*lwinAttr.get_border_width() == pattr.get_height())
+                       {
+-                          insLog.log(Level.FINEST, "Double reparenting detected, pattr({2})={0}, lwinAttr({3})={1}",
+-                                     new Object[] {lwinAttr, pattr, parent, window});
++                          if (insLog.isLoggable(Level.FINEST)) {
++                              insLog.log(Level.FINEST, "Double reparenting detected, pattr({2})={0}, lwinAttr({3})={1}",
++                                         new Object[] {String.valueOf(lwinAttr), String.valueOf(pattr),
++                                                       String.valueOf(parent), String.valueOf(window)});
++                          }
+                           lwinAttr.set_x(pattr.get_x());
+                           lwinAttr.set_y(pattr.get_y());
+                           lwinAttr.set_border_width(lwinAttr.get_border_width()+pattr.get_border_width());
+@@ -1631,8 +1652,11 @@
+                        * widths and inner/outer distinction, so for the time
+                        * being, just ignore it.
+                        */
+-                      insLog.log(Level.FINEST, "Attrs before calculation: pattr({2})={0}, lwinAttr({3})={1}",
+-                                 new Object[] {lwinAttr, pattr, parent, window});
++                      if (insLog.isLoggable(Level.FINEST)) {
++                          insLog.log(Level.FINEST, "Attrs before calculation: pattr({2})={0}, lwinAttr({3})={1}",
++                                     new Object[] {String.valueOf(lwinAttr), String.valueOf(pattr),
++                                                   String.valueOf(parent), String.valueOf(window)});
++                      }
+                       correctWM = new Insets(lwinAttr.get_y() + lwinAttr.get_border_width(),
+                                              lwinAttr.get_x() + lwinAttr.get_border_width(),
+                                              pattr.get_height() - (lwinAttr.get_y() + lwinAttr.get_height() + 2*lwinAttr.get_border_width()),
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XWindow.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XWindow.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XWindow.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -901,8 +901,10 @@
+         Rectangle oldBounds = getBounds();
+ 
+         super.handleConfigureNotifyEvent(xev);
+-        insLog.log(Level.FINER, "Configure, {0}, event disabled: {1}",
+-                   new Object[] {xev, isEventDisabled(xev)});
++        if (insLog.isLoggable(Level.FINER)) {
++            insLog.log(Level.FINER, "Configure, {0}, event disabled: {1}",
++                       new Object[] {String.valueOf(xev), isEventDisabled(xev)});
++        }
+         if (isEventDisabled(xev)) {
+             return;
+         }
+@@ -923,7 +925,9 @@
+ 
+     public void handleMapNotifyEvent(XEvent xev) {
+         super.handleMapNotifyEvent(xev);
+-        log.log(Level.FINE, "Mapped {0}", new Object[] {this});
++        if (log.isLoggable(Level.FINE)) {
++            log.log(Level.FINE, "Mapped {0}", new Object[] {String.valueOf(this)});
++        }
+         if (isEventDisabled(xev)) {
+             return;
+         }
+@@ -1151,10 +1155,14 @@
+     void updateSizeHints(int x, int y, int width, int height) {
+         long flags = XlibWrapper.PSize | (isLocationByPlatform() ? 0 : (XlibWrapper.PPosition | XlibWrapper.USPosition));
+         if (!isResizable()) {
+-            log.log(Level.FINER, "Window {0} is not resizable", new Object[] {this});
++            if (log.isLoggable(Level.FINER)) {
++                log.log(Level.FINER, "Window {0} is not resizable", new Object[] {String.valueOf(this)});
++            }
+             flags |= XlibWrapper.PMinSize | XlibWrapper.PMaxSize;
+         } else {
+-            log.log(Level.FINER, "Window {0} is resizable", new Object[] {this});
++            if (log.isLoggable(Level.FINER)) {
++                log.log(Level.FINER, "Window {0} is resizable", new Object[] {String.valueOf(this)});
++            }
+         }
+         setSizeHints(flags, x, y, width, height);
+     }
+@@ -1162,10 +1170,14 @@
+     void updateSizeHints(int x, int y) {
+         long flags = isLocationByPlatform() ? 0 : (XlibWrapper.PPosition | XlibWrapper.USPosition);
+         if (!isResizable()) {
+-            log.log(Level.FINER, "Window {0} is not resizable", new Object[] {this});
++            if (log.isLoggable(Level.FINER)) {
++                log.log(Level.FINER, "Window {0} is not resizable", new Object[] {String.valueOf(this)});
++            }
+             flags |= XlibWrapper.PMinSize | XlibWrapper.PMaxSize | XlibWrapper.PSize;
+         } else {
+-            log.log(Level.FINER, "Window {0} is resizable", new Object[] {this});
++            if (log.isLoggable(Level.FINER)) {
++                log.log(Level.FINER, "Window {0} is resizable", new Object[] {String.valueOf(this)});
++            }
+         }
+         setSizeHints(flags, x, y, width, height);
+     }
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11/XWindowPeer.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -376,7 +376,7 @@
+         if (iconLog.isLoggable(Level.FINEST)) {
+             iconLog.log(Level.FINEST, ">>> Sizes of icon images:");
+             for (Iterator<XIconInfo> i = icons.iterator(); i.hasNext(); ) {
+-                iconLog.log(Level.FINEST, "    {0}", i.next());
++                iconLog.log(Level.FINEST, "    {0}", String.valueOf(i.next()));
+             }
+         }
+     }
+@@ -826,7 +826,9 @@
+     public void handleFocusEvent(XEvent xev) {
+         XFocusChangeEvent xfe = xev.get_xfocus();
+         FocusEvent fe;
+-        focusLog.log(Level.FINE, "{0}", new Object[] {xfe});
++        if (focusLog.isLoggable(Level.FINER)) {
++            focusLog.log(Level.FINER, "{0}", new Object[] {String.valueOf(xfe)});
++        }
+         if (isEventDisabled(xev)) {
+             return;
+         }
+@@ -1438,7 +1440,10 @@
+             synchronized(getStateLock()) {
+                 XDialogPeer blockerPeer = (XDialogPeer) ComponentAccessor.getPeer(d);
+                 if (blocked) {
+-                    log.log(Level.FINE, "{0} is blocked by {1}", new Object[] { this, blockerPeer});
++                    if (log.isLoggable(Level.FINE)) {
++                        log.log(Level.FINE, "{0} is blocked by {1}",
++                                new Object[] { String.valueOf(this), String.valueOf(blockerPeer)});
++                    }
+                     modalBlocker = d;
+ 
+                     if (isReparented() || XWM.isNonReparentingWM()) {
+@@ -1899,7 +1904,9 @@
+             wm_set_insets = XWM.getInsetsFromProp(getWindow(), changedAtom);
+         }
+ 
+-        insLog.log(Level.FINER, "FRAME_EXTENTS: {0}", new Object[]{wm_set_insets});
++        if (insLog.isLoggable(Level.FINER)) {
++            insLog.log(Level.FINER, "FRAME_EXTENTS: {0}", new Object[]{String.valueOf(wm_set_insets)});
++        }
+ 
+         if (wm_set_insets != null) {
+             handleWMSetInsets(wm_set_insets);
+@@ -1942,7 +1949,8 @@
+         XCrossingEvent xce = xev.get_xcrossing();
+         if (grabLog.isLoggable(Level.FINE)) {
+             grabLog.log(Level.FINE, "{0}, when grabbed {1}, contains {2}",
+-                        new Object[] {xce, isGrabbed(), containsGlobal(xce.get_x_root(), xce.get_y_root())});
++                        new Object[] {String.valueOf(xce), isGrabbed(),
++                                      containsGlobal(xce.get_x_root(), xce.get_y_root())});
+         }
+         if (isGrabbed()) {
+             // When window is grabbed, all events are dispatched to
+@@ -1953,7 +1961,10 @@
+             // since it generates MOUSE_ENTERED/MOUSE_EXITED for frame and dialog.
+             // (fix for 6390326)
+             XBaseWindow target = XToolkit.windowToXWindow(xce.get_window());
+-            grabLog.log(Level.FINER, "  -  Grab event target {0}", new Object[] {target});
++            if (grabLog.isLoggable(Level.FINER)) {
++                grabLog.log(Level.FINER, "  -  Grab event target {0}",
++                            new Object[] {String.valueOf(target)});
++            }
+             if (target != null && target != this) {
+                 target.dispatchEvent(xev);
+                 return;
+@@ -1966,7 +1977,8 @@
+         XMotionEvent xme = xev.get_xmotion();
+         if (grabLog.isLoggable(Level.FINE)) {
+             grabLog.log(Level.FINER, "{0}, when grabbed {1}, contains {2}",
+-                        new Object[] {xme, isGrabbed(), containsGlobal(xme.get_x_root(), xme.get_y_root())});
++                        new Object[] {String.valueOf(xme), isGrabbed(),
++                                      containsGlobal(xme.get_x_root(), xme.get_y_root())});
+         }
+         if (isGrabbed()) {
+             boolean dragging = (xme.get_state() & (Button1Mask | Button2Mask | Button3Mask)) != 0;
+@@ -1986,7 +1998,10 @@
+                 xme.set_x(xme.get_x_root() - target.getX());
+                 xme.set_y(xme.get_y_root() - target.getY());
+             }
+-            grabLog.log(Level.FINER, "  -  Grab event target {0}", new Object[] {target});
++            if (grabLog.isLoggable(Level.FINER)) {
++                grabLog.log(Level.FINER, "  -  Grab event target {0}",
++                            new Object[] {String.valueOf(target)});
++            }
+             if (target != null) {
+                 if (target != getContentXWindow() && target != this) {
+                     target.dispatchEvent(xev);
+@@ -2011,7 +2026,8 @@
+         XButtonEvent xbe = xev.get_xbutton();
+         if (grabLog.isLoggable(Level.FINE)) {
+             grabLog.log(Level.FINE, "{0}, when grabbed {1}, contains {2} ({3}, {4}, {5}x{6})",
+-                        new Object[] {xbe, isGrabbed(), containsGlobal(xbe.get_x_root(), xbe.get_y_root()), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight()});
++                        new Object[] {String.valueOf(xbe), isGrabbed(), containsGlobal(xbe.get_x_root(),
++                                      xbe.get_y_root()), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight()});
+         }
+         if (isGrabbed()) {
+             // When window is grabbed, all events are dispatched to
+@@ -2020,7 +2036,10 @@
+             // translation)
+             XBaseWindow target = XToolkit.windowToXWindow(xbe.get_window());
+             try {
+-                grabLog.log(Level.FINER, "  -  Grab event target {0} (press target {1})", new Object[] {target, pressTarget});
++                if (grabLog.isLoggable(Level.FINER)) {
++                    grabLog.log(Level.FINER, "  -  Grab event target {0} (press target {1})",
++                                new Object[] {String.valueOf(target), String.valueOf(pressTarget)});
++                }
+                 if (xbe.get_type() == XConstants.ButtonPress
+                     && xbe.get_button() == XlibWrapper.Button1)
+                 {
+@@ -2052,7 +2071,10 @@
+                         // Outside this toplevel hierarchy
+                         // According to the specification of UngrabEvent, post it
+                         // when press occurs outside of the window and not on its owned windows
+-                        grabLog.log(Level.FINE, "Generating UngrabEvent on {0} because not inside of shell", this);
++                        if (grabLog.isLoggable(Level.FINE)) {
++                            grabLog.log(Level.FINE, "Generating UngrabEvent on {0} because not inside of shell",
++                                        String.valueOf(this));
++                        }
+                         postEventToEventQueue(new sun.awt.UngrabEvent(getEventSource()));
+                         return;
+                     }
+@@ -2070,18 +2092,27 @@
+                             // toplevel == null - outside of
+                             // hierarchy, toplevel is Dialog - should
+                             // send ungrab (but shouldn't for Window)
+-                            grabLog.log(Level.FINE, "Generating UngrabEvent on {0} because hierarchy ended", this);
++                            if (grabLog.isLoggable(Level.FINE)) {
++                                grabLog.log(Level.FINE, "Generating UngrabEvent on {0} because hierarchy ended",
++                                            String.valueOf(this));
++                            }
+                             postEventToEventQueue(new sun.awt.UngrabEvent(getEventSource()));
+                         }
+                     } else {
+                         // toplevel is null - outside of hierarchy
+-                        grabLog.log(Level.FINE, "Generating UngrabEvent on {0} because toplevel is null", this);
++                        if (grabLog.isLoggable(Level.FINE)) {
++                            grabLog.log(Level.FINE, "Generating UngrabEvent on {0} because toplevel is null",
++                                        String.valueOf(this));
++                        }
+                         postEventToEventQueue(new sun.awt.UngrabEvent(getEventSource()));
+                         return;
+                     }
+                 } else {
+                     // target doesn't map to XAWT window - outside of hierarchy
+-                    grabLog.log(Level.FINE, "Generating UngrabEvent on because target is null {0}", this);
++                    if (grabLog.isLoggable(Level.FINE)) {
++                        grabLog.log(Level.FINE, "Generating UngrabEvent on because target is null {0}",
++                                    String.valueOf(this));
++                    }
+                     postEventToEventQueue(new sun.awt.UngrabEvent(getEventSource()));
+                     return;
+                 }
+diff -r 39a8e48517ce -r 39a17e094418 src/solaris/classes/sun/awt/X11InputMethod.java
+--- openjdk.orig/jdk/src/solaris/classes/sun/awt/X11InputMethod.java	Tue Aug 18 11:13:57 2009 +0800
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11InputMethod.java	Thu Aug 20 18:20:07 2009 +0400
+@@ -324,8 +324,11 @@
+             return;
+ 
+         if (lastXICFocussedComponent != null){
+-            if (log.isLoggable(Level.FINE)) log.log(Level.FINE, "XICFocused {0}, AWTFocused {1}", new Object[] {
+-                lastXICFocussedComponent, awtFocussedComponent});
++            if (log.isLoggable(Level.FINE)) {
++                log.log(Level.FINE, "XICFocused {0}, AWTFocused {1}",
++                        new Object[] { String.valueOf(lastXICFocussedComponent),
++                                       String.valueOf(awtFocussedComponent)});
++            }
+         }
+ 
+         if (pData == 0) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6822057.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,32 @@
+--- old/src/solaris/classes/sun/awt/X11GraphicsDevice.java	2009-07-28 16:57:02.545000000 +0400
++++ openjdk/jdk/src/solaris/classes/sun/awt/X11GraphicsDevice.java	2009-07-28 16:57:01.921000000 +0400
+@@ -134,7 +134,7 @@
+                 makeConfigurations();
+             }
+         }
+-        return configs;
++        return configs.clone();
+     }
+ 
+     private void makeConfigurations() {
+--- old/src/windows/classes/sun/awt/Win32GraphicsDevice.java	2009-07-28 16:57:08.184000000 +0400
++++ openjdk/jdk/src/windows/classes/sun/awt/Win32GraphicsDevice.java	2009-07-28 16:57:07.557000000 +0400
+@@ -170,7 +170,7 @@
+                 if (defaultConfig != null) {
+                     configs = new GraphicsConfiguration[1];
+                     configs[0] = defaultConfig;
+-                    return configs;
++                    return configs.clone();
+                 }
+             }
+ 
+@@ -202,7 +202,7 @@
+             configs = new GraphicsConfiguration[v.size()];
+             v.copyInto(configs);
+         }
+-        return configs;
++        return configs.clone();
+     }
+ 
+     /**
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6824265.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,142 @@
+diff -Nru openjdk.orig/jdk/src/share/classes/sun/util/calendar/ZoneInfoFile.java openjdk/jdk/src/share/classes/sun/util/calendar/ZoneInfoFile.java
+--- openjdk.orig/jdk/src/share/classes/sun/util/calendar/ZoneInfoFile.java	2009-11-08 23:11:42.000000000 +0000
++++ openjdk/jdk/src/share/classes/sun/util/calendar/ZoneInfoFile.java	2009-11-08 23:25:32.000000000 +0000
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2000-2009 Sun Microsystems, Inc.  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
+@@ -465,10 +465,7 @@
+      */
+     public static final byte    TAG_TZDataVersion = 68;
+ 
+-    // Cached location of the TZDATA files
+-    private static final String JAVAZI_DIR = setup_JAVAZI_DIR();
+-
+-    private static String setup_JAVAZI_DIR() {
++    private static String setupJavaZIDir() {
+       try {
+         final String dir = AccessController.doPrivileged
+           (new sun.security.action.GetPropertyAction("user.zoneinfo.dir"));
+@@ -493,6 +490,21 @@
+ 
+     private static Map<String, ZoneInfo> zoneInfoObjects = null;
+ 
++    private static final String ziDir;
++    static {
++        String zi = setupJavaZIDir();
++        if (zi == null) {
++            zi = AccessController.doPrivileged(
++                         new sun.security.action.GetPropertyAction("java.home"))
++                + File.separator + "lib" + File.separator + "zi";
++        }
++        try {
++            zi = new File(zi).getCanonicalPath();
++        } catch (Exception e) {
++        }
++        ziDir = zi;
++    }
++
+     /**
+      * Converts the given time zone ID to a platform dependent path
+      * name. For example, "America/Los_Angeles" is converted to
+@@ -597,20 +609,7 @@
+             return null;
+         }
+ 
+-        int index;
+-        for (index = 0; index < JAVAZI_LABEL.length; index++) {
+-            if (buf[index] != JAVAZI_LABEL[index]) {
+-                System.err.println("ZoneInfo: wrong magic number: " + id);
+-                return null;
+-            }
+-        }
+-
+-        if (buf[index++] > JAVAZI_VERSION) {
+-            System.err.println("ZoneInfo: incompatible version ("
+-                               + buf[index - 1] + "): " + id);
+-            return null;
+-        }
+-
++        int index = 0;
+         int filesize = buf.length;
+         int rawOffset = 0;
+         int dstSavings = 0;
+@@ -621,6 +620,18 @@
+         int[] simpleTimeZoneParams = null;
+ 
+         try {
++            for (index = 0; index < JAVAZI_LABEL.length; index++) {
++                if (buf[index] != JAVAZI_LABEL[index]) {
++                    System.err.println("ZoneInfo: wrong magic number: " + id);
++                    return null;
++                }
++            }
++            if (buf[index++] > JAVAZI_VERSION) {
++                System.err.println("ZoneInfo: incompatible version ("
++                                   + buf[index - 1] + "): " + id);
++                return null;
++            }
++
+             while (index < filesize) {
+                 byte tag = buf[index++];
+                 int  len = ((buf[index++] & 0xFF) << 8) + (buf[index++] & 0xFF);
+@@ -1038,36 +1049,34 @@
+      * Reads the specified file under &lt;java.home&gt;/lib/zi into a buffer.
+      * @return the buffer, or null if any I/O error occurred.
+      */
+-    private static byte[] readZoneInfoFile(String fileName) {
++    private static byte[] readZoneInfoFile(final String fileName) {
+         byte[] buffer = null;
+ 
+         try {
+ 
+-	  String zi_dir = JAVAZI_DIR;
+-	  if (zi_dir == null) {
+-	    // Fall back to JDK-supplied tzdata
+-	    String homeDir = (String) AccessController.doPrivileged(new sun.security.action.GetPropertyAction("java.home"));
+-	    zi_dir = homeDir + File.separator + "lib" + File.separator
+-	      + "zi";
+-	  }
+-
+-          final String fname =  zi_dir + File.separator + fileName;
+-	  buffer = (byte[]) AccessController.doPrivileged(new PrivilegedExceptionAction() {
++          buffer = (byte[]) AccessController.doPrivileged(new PrivilegedExceptionAction() {
+                 public Object run() throws IOException {
+-                    File file = new File(fname);
+-                    if (!file.canRead()) {
++                    File file = new File(ziDir, fileName);
++                    if (!file.exists() || !file.isFile()) {
+                         return null;
+                     }
+-                    int filesize = (int)file.length();
+-                    byte[] buf = new byte[filesize];
+-
+-                    FileInputStream fis = new FileInputStream(file);
+-
+-                    if (fis.read(buf) != filesize) {
+-                        fis.close();
+-                        throw new IOException("read error on " + fname);
++                    file = file.getCanonicalFile();
++                    String path = file.getCanonicalPath();
++                    byte[] buf = null;
++                    if (path != null && path.startsWith(ziDir)) {
++                        int filesize = (int)file.length();
++                        if (filesize > 0) {
++                            FileInputStream fis = new FileInputStream(file);
++                            buf = new byte[filesize];
++                            try {
++                                if (fis.read(buf) != filesize) {
++                                    throw new IOException("read error on " + fileName);
++                                }
++                            } finally {
++                                fis.close();
++                            }
++                        }
+                     }
+-                    fis.close();
+                     return buf;
+                 }
+             });
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6861062.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,344 @@
+--- old/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java	Tue Sep 22 05:44:00 2009
++++ openjdk/jdk/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java	Tue Sep 22 05:43:59 2009
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2002-2009 Sun Microsystems, Inc.  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
+@@ -308,6 +308,16 @@
+         X500Name certIssuer = (X500Name) certImpl.getIssuerDN();
+         X500Name crlIssuer = (X500Name) crlImpl.getIssuerDN();
+ 
++        // check the crl signature algorithm
++        try {
++            AlgorithmChecker.check(crl);
++        } catch (CertPathValidatorException cpve) {
++            if (debug != null) {
++                debug.println("CRL signature algorithm check failed: " + cpve);
++            }
++            return false;
++        }
++
+         // if crlIssuer is set, verify that it matches the issuer of the
+         // CRL and the CRL contains an IDP extension with the indirectCRL
+         // boolean asserted. Otherwise, verify that the CRL issuer matches the
+--- old/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java	Tue Sep 22 05:44:02 2009
++++ openjdk/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java	Tue Sep 22 05:44:01 2009
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2000-2009 Sun Microsystems, Inc.  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
+@@ -676,6 +676,11 @@
+         /* we don't perform any validation of the trusted cert */
+         if (!isTrustedCert) {
+             /*
++             * check that the signature algorithm is not disabled.
++             */
++            AlgorithmChecker.check(cert);
++
++            /*
+              * Check CRITICAL private extensions for user checkers that
+              * support forward checking (forwardCheckers) and remove
+              * ones we know how to check.
+--- old/src/share/classes/sun/security/provider/certpath/OCSPChecker.java	Tue Sep 22 05:44:05 2009
++++ openjdk/jdk/src/share/classes/sun/security/provider/certpath/OCSPChecker.java	Tue Sep 22 05:44:04 2009
+@@ -290,12 +290,29 @@
+                     }
+                     if (filter != null) {
+                         List<CertStore> certStores = pkixParams.getCertStores();
++                        AlgorithmChecker algChecker=
++                                                AlgorithmChecker.getInstance();
+                         for (CertStore certStore : certStores) {
+-                            Iterator i =
+-                                certStore.getCertificates(filter).iterator();
+-                            if (i.hasNext()) {
+-                                responderCert = (X509Certificate) i.next();
+-                                seekResponderCert = false; // done
++                            for (Certificate selected :
++                                    certStore.getCertificates(filter)) {
++                                try {
++                                    // don't bother to trust algorithm disabled
++                                    // certificate as responder
++                                    algChecker.check(selected);
++
++                                    responderCert = (X509Certificate)selected;
++                                    seekResponderCert = false; // done
++                                    break;
++                                } catch (CertPathValidatorException cpve) {
++                                    if (DEBUG != null) {
++                                        DEBUG.println(
++                                            "OCSP responder certificate " +
++                                            "algorithm check failed: " + cpve);
++                                    }
++                                }
++                            }
++
++                            if (!seekResponderCert) {
+                                 break;
+                             }
+                         }
+--- old/src/share/classes/sun/security/provider/certpath/OCSPResponse.java	Tue Sep 22 05:44:07 2009
++++ openjdk/jdk/src/share/classes/sun/security/provider/certpath/OCSPResponse.java	Tue Sep 22 05:44:07 2009
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2003-2009 Sun Microsystems, Inc.  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
+@@ -222,6 +222,10 @@
+                 new DerInputStream(derIn.getOctetString());
+ 
+             DerValue[]  seqTmp = basicOCSPResponse.getSequence(2);
++            if (seqTmp.length < 3) {
++                throw new IOException("Unexpected BasicOCSPResponse value");
++            }
++
+             DerValue responseData = seqTmp[0];
+ 
+             // Need the DER encoded ResponseData to verify the signature later
+@@ -304,6 +308,9 @@
+             // signatureAlgorithmId
+             sigAlgId = AlgorithmId.parse(seqTmp[1]);
+ 
++            // check that the signature algorithm is not disabled.
++            AlgorithmChecker.check(sigAlgId);
++
+             // signature
+             byte[] signature = seqTmp[2].getBitString();
+             X509CertImpl[] x509Certs = null;
+@@ -337,6 +344,9 @@
+                 } else if (cert.getIssuerDN().equals(
+                     responderCert.getSubjectDN())) {
+ 
++                    // check the certificate algorithm
++                    AlgorithmChecker.check(cert);
++
+                     // Check for the OCSPSigning key purpose
+                     List<String> keyPurposes = cert.getExtendedKeyUsage();
+                     if (keyPurposes == null ||
+--- old/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java	Tue Sep 22 05:44:09 2009
++++ openjdk/jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java	Tue Sep 22 05:44:09 2009
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2000-2009 Sun Microsystems, Inc.  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
+@@ -268,6 +268,7 @@
+         int certPathLen = certList.size();
+ 
+         basicChecker = new BasicChecker(anchor, testDate, sigProvider, false);
++        AlgorithmChecker algorithmChecker= AlgorithmChecker.getInstance();
+         KeyChecker keyChecker = new KeyChecker(certPathLen,
+             pkixParam.getTargetCertConstraints());
+         ConstraintsChecker constraintsChecker =
+@@ -282,6 +283,7 @@
+                               rootNode);
+ 
+         // add standard checkers that we will be using
++        certPathCheckers.add(algorithmChecker);
+         certPathCheckers.add(keyChecker);
+         certPathCheckers.add(constraintsChecker);
+         certPathCheckers.add(policyChecker);
+--- old/src/share/classes/sun/security/provider/certpath/ReverseBuilder.java	Tue Sep 22 05:44:11 2009
++++ openjdk/jdk/src/share/classes/sun/security/provider/certpath/ReverseBuilder.java	Tue Sep 22 05:44:11 2009
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2000-2009 Sun Microsystems, Inc.  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
+@@ -346,6 +346,9 @@
+             return;
+         }
+ 
++        /* check that the signature algorithm is not disabled. */
++        AlgorithmChecker.check(cert);
++
+         /*
+          * check for looping - abort a loop if
+          * ((we encounter the same certificate twice) AND
+--- old/src/share/classes/sun/security/validator/SimpleValidator.java	Tue Sep 22 05:44:14 2009
++++ openjdk/jdk/src/share/classes/sun/security/validator/SimpleValidator.java	Tue Sep 22 05:44:13 2009
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2006 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2002-2009 Sun Microsystems, Inc.  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
+@@ -40,6 +40,8 @@
+ import sun.security.util.DerOutputStream;
+ import sun.security.util.ObjectIdentifier;
+ 
++import sun.security.provider.certpath.AlgorithmChecker;
++
+ /**
+  * A simple validator implementation. It is based on code from the JSSE
+  * X509TrustManagerImpl. This implementation is designed for compatibility with
+@@ -133,6 +135,13 @@
+             X509Certificate issuerCert = chain[i + 1];
+             X509Certificate cert = chain[i];
+ 
++            // check certificate algorithm
++            try {
++                AlgorithmChecker.check(cert);
++            } catch (CertPathValidatorException cpve) {
++                throw new ValidatorException
++                        (ValidatorException.T_ALGORITHM_DISABLED, cert, cpve);
++            }
+ 
+             // no validity check for code signing certs
+             if ((variant.equals(VAR_CODE_SIGNING) == false)
+--- old/src/share/classes/sun/security/validator/ValidatorException.java	Tue Sep 22 05:44:16 2009
++++ openjdk/jdk/src/share/classes/sun/security/validator/ValidatorException.java	Tue Sep 22 05:44:15 2009
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2003 Sun Microsystems, Inc.  All Rights Reserved.
++ * Copyright 2002-2009 Sun Microsystems, Inc.  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
+@@ -55,6 +55,9 @@
+     public final static Object T_NAME_CHAINING =
+         "Certificate chaining error";
+ 
++    public final static Object T_ALGORITHM_DISABLED =
++        "Certificate signature algorithm disabled";
++
+     private Object type;
+     private X509Certificate cert;
+ 
+--- /dev/null	Tue Sep 22 05:44:18 2009
++++ openjdk/jdk/src/share/classes/sun/security/provider/certpath/AlgorithmChecker.java	Tue Sep 22 05:44:17 2009
+@@ -0,0 +1,119 @@
++/*
++ * Copyright 2009 Sun Microsystems, Inc.  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.  Sun designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
++ * CA 95054 USA or visit www.sun.com if you need additional information or
++ * have any questions.
++ */
++
++package sun.security.provider.certpath;
++
++import java.util.Set;
++import java.util.Collection;
++import java.util.Locale;
++import java.security.cert.Certificate;
++import java.security.cert.X509Certificate;
++import java.security.cert.X509CRL;
++import java.security.cert.CertPathValidatorException;
++import java.security.cert.PKIXCertPathChecker;
++
++import sun.security.x509.AlgorithmId;
++
++/**
++ * AlgorithmChecker is a <code>PKIXCertPathChecker</code> that checks that
++ * the signature algorithm of the specified certificate is not disabled.
++ *
++ * @author      Xuelei Fan
++ */
++final public class AlgorithmChecker extends PKIXCertPathChecker {
++
++    // the disabled algorithms
++    private static final String[] disabledAlgorithms = new String[] {"md2"};
++
++    // singleton instance
++    static final AlgorithmChecker INSTANCE = new AlgorithmChecker();
++
++    /**
++     * Default Constructor
++     */
++    private AlgorithmChecker() {
++        // do nothing
++    }
++
++    /**
++     * Return a AlgorithmChecker instance.
++     */
++    static AlgorithmChecker getInstance() {
++        return INSTANCE;
++    }
++
++    /**
++     * Initializes the internal state of the checker from parameters
++     * specified in the constructor.
++     */
++    public void init(boolean forward) throws CertPathValidatorException {
++        // do nothing
++    }
++
++    public boolean isForwardCheckingSupported() {
++        return false;
++    }
++
++    public Set<String> getSupportedExtensions() {
++        return null;
++    }
++
++    /**
++     * Checks the signature algorithm of the specified certificate.
++     */
++    public void check(Certificate cert, Collection<String> unresolvedCritExts)
++            throws CertPathValidatorException {
++        check(cert);
++    }
++
++    public static void check(Certificate cert)
++            throws CertPathValidatorException {
++        X509Certificate xcert = (X509Certificate)cert;
++        check(xcert.getSigAlgName());
++    }
++
++    static void check(AlgorithmId aid) throws CertPathValidatorException {
++        check(aid.getName());
++    }
++
++    static void check(X509CRL crl) throws CertPathValidatorException {
++        check(crl.getSigAlgName());
++    }
++
++    private static void check(String algName)
++            throws CertPathValidatorException {
++
++        String lowerCaseAlgName = algName.toLowerCase(Locale.ENGLISH);
++
++        for (String disabled : disabledAlgorithms) {
++            // checking the signature algorithm name
++            if (lowerCaseAlgName.indexOf(disabled) != -1) {
++                throw new CertPathValidatorException(
++                    "algorithm check failed: " + algName + " is disabled");
++            }
++        }
++    }
++
++}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/security/icedtea-6872358.patch	Mon Nov 09 17:42:27 2009 +0000
@@ -0,0 +1,157 @@
+--- old/make/sun/awt/mapfile-vers	Wed Sep  9 17:45:20 2009
++++ openjdk/jdk/make/sun/awt/mapfile-vers	Wed Sep  9 17:45:19 2009
+@@ -53,7 +53,6 @@
+ 		Java_sun_awt_image_GifImageDecoder_initIDs;
+ 		Java_sun_awt_image_GifImageDecoder_parseImage;
+ 		Java_sun_awt_image_ImageRepresentation_initIDs;
+-		Java_sun_awt_image_ImageRepresentation_setBytePixels;
+ 		Java_sun_awt_image_ImageRepresentation_setDiffICM;
+ 		Java_sun_awt_image_ImageRepresentation_setICMpixels;
+ 		Java_sun_awt_image_ImagingLib_convolveBI;
+--- old/make/sun/awt/mapfile-vers-linux	Wed Sep  9 17:45:23 2009
++++ openjdk/jdk/make/sun/awt/mapfile-vers-linux	Wed Sep  9 17:45:22 2009
+@@ -55,7 +55,6 @@
+ 		Java_sun_awt_image_GifImageDecoder_parseImage;
+ 		Java_sun_awt_image_Image_initIDs;
+ 		Java_sun_awt_image_ImageRepresentation_initIDs;
+-		Java_sun_awt_image_ImageRepresentation_setBytePixels;
+ 		Java_sun_awt_image_ImageRepresentation_setDiffICM;
+ 		Java_sun_awt_image_ImageRepresentation_setICMpixels;
+ 		Java_sun_awt_image_ImagingLib_convolveBI;
+--- old/src/share/classes/sun/awt/image/ImageRepresentation.java	Wed Sep  9 17:45:26 2009
++++ openjdk/jdk/src/share/classes/sun/awt/image/ImageRepresentation.java	Wed Sep  9 17:45:25 2009
+@@ -336,10 +336,6 @@
+     public native void setICMpixels(int x, int y, int w, int h, int[] lut,
+                                     byte[] pix, int off, int scansize,
+                                     IntegerComponentRaster ict);
+-
+-    public native void setBytePixels(int x, int y, int w, int h, byte[] pix,
+-                                     int off, int scansize,
+-                                     ByteComponentRaster bct, int chanOff);
+     public native int setDiffICM(int x, int y, int w, int h, int[] lut,
+                                  int transPix, int numLut, IndexColorModel icm,
+                                  byte[] pix, int off, int scansize,
+@@ -450,27 +446,17 @@
+                      (biRaster instanceof ByteComponentRaster) &&
+                      (biRaster.getNumDataElements() == 1)){
+                 ByteComponentRaster bt = (ByteComponentRaster) biRaster;
+-                if (w*h > 200) {
+-                    if (off == 0 && scansize == w) {
+-                        bt.putByteData(x, y, w, h, pix);
+-                    }
+-                    else {
+-                        byte[] bpix = new byte[w];
+-                        poff = off;
+-                        for (int yoff=y; yoff < y+h; yoff++) {
+-                            System.arraycopy(pix, poff, bpix, 0, w);
+-                            bt.putByteData(x, yoff, w, 1, bpix);
+-                            poff += scansize;
+-                        }
+-                    }
++                if (off == 0 && scansize == w) {
++                    bt.putByteData(x, y, w, h, pix);
+                 }
+                 else {
+-                    // Only is faster if #pixels
+-                    // Note that setBytePixels modifies the raster directly
+-                    // so we must mark it as changed afterwards
+-                    setBytePixels(x, y, w, h, pix, off, scansize, bt,
+-                                  bt.getDataOffset(0));
+-                    bt.markDirty();
++                    byte[] bpix = new byte[w];
++                    poff = off;
++                    for (int yoff=y; yoff < y+h; yoff++) {
++                        System.arraycopy(pix, poff, bpix, 0, w);
++                        bt.putByteData(x, yoff, w, 1, bpix);
++                        poff += scansize;
++                    }
+                 }
+             }
+             else {
+--- old/src/share/native/sun/awt/image/awt_ImageRep.c	Wed Sep  9 17:45:28 2009
++++ openjdk/jdk/src/share/native/sun/awt/image/awt_ImageRep.c	Wed Sep  9 17:45:28 2009
+@@ -142,84 +142,6 @@
+ 
+ }
+ 
+-JNIEXPORT void JNICALL
+-Java_sun_awt_image_ImageRepresentation_setBytePixels(JNIEnv *env, jclass cls,
+-                                                     jint x, jint y, jint w,
+-                                                     jint h, jbyteArray jpix,
+-                                                     jint off, jint scansize,
+-                                                     jobject jbct,
+-                                                     jint chanOffs)
+-{
+-    int sStride;
+-    int pixelStride;
+-    jobject jdata;
+-    unsigned char *srcData;
+-    unsigned char *dstData;
+-    unsigned char *dataP;
+-    unsigned char *pixP;
+-    int i;
+-    int j;
+-
+-
+-    if (JNU_IsNull(env, jpix)) {
+-        JNU_ThrowNullPointerException(env, "NullPointerException");
+-        return;
+-    }
+-
+-    sStride = (*env)->GetIntField(env, jbct, g_BCRscanstrID);
+-    pixelStride = (*env)->GetIntField(env, jbct, g_BCRpixstrID);
+-    jdata = (*env)->GetObjectField(env, jbct, g_BCRdataID);
+-
+-    srcData = (unsigned char *) (*env)->GetPrimitiveArrayCritical(env, jpix,
+-                                                                  NULL);
+-    if (srcData == NULL) {
+-        /* out of memory error already thrown */
+-        return;
+-    }
+-
+-    dstData = (unsigned char *) (*env)->GetPrimitiveArrayCritical(env, jdata,
+-                                                                  NULL);
+-    if (dstData == NULL) {
+-        /* out of memory error already thrown */
+-        (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT);
+-        return;
+-    }
+-
+-    dataP = dstData + chanOffs + y*sStride + x*pixelStride;
+-    pixP  = srcData + off;
+-    if (pixelStride == 1) {
+-        if (sStride == scansize && scansize == w) {
+-            memcpy(dataP, pixP, w*h);
+-        }
+-        else {
+-            for (i=0; i < h; i++) {
+-                memcpy(dataP, pixP, w);
+-                dataP += sStride;
+-                pixP  += scansize;
+-            }
+-        }
+-    }
+-    else {
+-        unsigned char *ydataP = dataP;
+-        unsigned char *ypixP  = pixP;
+-
+-        for (i=0; i < h; i++) {
+-            dataP = ydataP;
+-            pixP = ypixP;
+-            for (j=0; j < w; j++) {
+-                *dataP = *pixP++;
+-                dataP += pixelStride;
+-            }
+-            ydataP += sStride;
+-            ypixP  += scansize;
+-        }
+-    }
+-
+-    (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT);
+-    (*env)->ReleasePrimitiveArrayCritical(env, jdata, dstData, JNI_ABORT);
+-
+-}
+-
+ JNIEXPORT jint JNICALL
+ Java_sun_awt_image_ImageRepresentation_setDiffICM(JNIEnv *env, jclass cls,
+                                                   jint x, jint y, jint w,