changeset 6061:17384fc6b31f

8000970: break out auxiliary classes that will prevent multi-core compilation of the JDK Reviewed-by: alanb, wetmore
author ohrstrom
date Mon, 29 Oct 2012 14:12:37 +0100
parents d1ffbdf7e3c6
children 7fa45c455034 054470092795
files make/tools/src/build/tools/generatenimbus/AbstractGradient.java make/tools/src/build/tools/generatenimbus/Border.java make/tools/src/build/tools/generatenimbus/Canvas.java make/tools/src/build/tools/generatenimbus/ComponentColor.java make/tools/src/build/tools/generatenimbus/Dimension.java make/tools/src/build/tools/generatenimbus/Ellipse.java make/tools/src/build/tools/generatenimbus/Gradient.java make/tools/src/build/tools/generatenimbus/GradientStop.java make/tools/src/build/tools/generatenimbus/Insets.java make/tools/src/build/tools/generatenimbus/Layer.java make/tools/src/build/tools/generatenimbus/Matte.java make/tools/src/build/tools/generatenimbus/Paint.java make/tools/src/build/tools/generatenimbus/Path.java make/tools/src/build/tools/generatenimbus/Point.java make/tools/src/build/tools/generatenimbus/RadialGradient.java make/tools/src/build/tools/generatenimbus/Rectangle.java make/tools/src/build/tools/generatenimbus/Shape.java make/tools/src/build/tools/generatenimbus/SynthModel.java make/tools/src/build/tools/generatenimbus/Typeface.java make/tools/src/build/tools/generatenimbus/UIColor.java make/tools/src/build/tools/generatenimbus/UIComponent.java make/tools/src/build/tools/generatenimbus/UIDefault.java make/tools/src/build/tools/generatenimbus/UIFont.java make/tools/src/build/tools/generatenimbus/UIIconRegion.java make/tools/src/build/tools/generatenimbus/UIProperty.java make/tools/src/build/tools/generatenimbus/UIRegion.java make/tools/src/build/tools/generatenimbus/UIState.java make/tools/src/build/tools/generatenimbus/UIStateType.java make/tools/src/build/tools/generatenimbus/UIStyle.java src/share/classes/javax/management/timer/Timer.java src/share/classes/javax/management/timer/TimerAlarmClock.java src/share/classes/sun/awt/im/ExecutableInputMethodManager.java src/share/classes/sun/awt/im/InputMethodManager.java src/share/classes/sun/misc/FDBigInt.java src/share/classes/sun/misc/FloatingDecimal.java src/share/classes/sun/net/httpserver/Event.java src/share/classes/sun/net/httpserver/WriteFinishedEvent.java src/share/classes/sun/net/www/http/KeepAliveCleanerEntry.java src/share/classes/sun/net/www/http/KeepAliveStream.java src/share/classes/sun/security/ssl/ExtensionType.java src/share/classes/sun/security/ssl/HelloExtension.java src/share/classes/sun/security/ssl/HelloExtensions.java src/share/classes/sun/security/ssl/RenegotiationInfoExtension.java src/share/classes/sun/security/ssl/ServerNameExtension.java src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java src/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java src/share/classes/sun/security/ssl/SupportedEllipticPointFormatsExtension.java src/share/classes/sun/security/ssl/UnknownExtension.java src/solaris/classes/sun/awt/X11/XChoicePeer.java src/solaris/classes/sun/awt/X11/XChoicePeerListener.java src/solaris/classes/sun/font/DelegateStrike.java src/solaris/classes/sun/font/NativeStrike.java src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java src/solaris/classes/sun/java2d/jules/TileTrapContainer.java
diffstat 54 files changed, 3976 insertions(+), 2784 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/AbstractGradient.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+class AbstractGradient extends Paint {
+    public static enum CycleMethod {
+        NO_CYCLE, REFLECT, REPEAT
+    }
+
+    @XmlElement(name="stop") private ArrayList<GradientStop> stops;
+    public List<GradientStop> getStops() { return stops; }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Border.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlEnumValue;
+
+class Border {
+    enum BorderType {
+        @XmlEnumValue("empty") EMPTY,
+        @XmlEnumValue("painter") PAINTER
+    }
+    @XmlAttribute private BorderType type;
+    @XmlAttribute private String painter;
+    @XmlAttribute private int top;
+    @XmlAttribute private int left;
+    @XmlAttribute private int bottom;
+    @XmlAttribute private int right;
+
+    public String write() {
+        switch (type) {
+            case PAINTER:
+                return String.format("new PainterBorder(\"%s\", new Insets(%d, %d, %d, %d))",
+                                     painter, top, left, bottom, right);
+            case EMPTY:
+                return String.format("BorderFactory.createEmptyBorder(%d, %d, %d, %d)",
+                                     top, left, bottom, right);
+            default:
+                return "### Look, here's an unknown border! $$$";
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Canvas.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+class Canvas {
+    @XmlElement private Dimension size;
+    public Dimension getSize() { return size; }
+
+    @XmlElement(name="layer") private List<Layer> layers;
+    public List<Layer> getLayers() { return layers; }
+
+    @XmlElement private Insets stretchingInsets = null;
+    public Insets getStretchingInsets() { return stretchingInsets; }
+
+    public boolean isBlank() {
+        return layers.size() == 0 || (layers.size() == 1 && layers.get(0).isEmpty());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/ComponentColor.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+class ComponentColor {
+    private String propertyName;
+    private String defaultColorVariableName;
+    private float saturationOffset = 0,  brightnessOffset = 0;
+    private int alphaOffset = 0;
+
+    ComponentColor(String propertyName,
+            String defaultColorVariableName,
+            float saturationOffset,
+            float brightnessOffset,
+            int alphaOffset) {
+        this.propertyName = propertyName;
+        this.defaultColorVariableName = defaultColorVariableName;
+        this.saturationOffset = saturationOffset;
+        this.brightnessOffset = brightnessOffset;
+        this.alphaOffset = alphaOffset;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        ComponentColor c = (ComponentColor) o;
+        if (alphaOffset != c.alphaOffset) {
+            return false;
+        }
+        if (Float.compare(saturationOffset, c.saturationOffset) != 0) {
+            return false;
+        }
+        if (Float.compare(brightnessOffset, c.brightnessOffset) != 0) {
+            return false;
+        }
+        if (defaultColorVariableName != null ? !defaultColorVariableName.equals(c.defaultColorVariableName) : c.defaultColorVariableName != null) {
+            return false;
+        }
+        if (propertyName != null ? !propertyName.equals(c.propertyName) : c.propertyName != null) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 5;
+        hash = 61 * hash + (this.propertyName != null ? this.propertyName.hashCode() : 0);
+        hash = 61 * hash + (this.defaultColorVariableName != null ? this.defaultColorVariableName.hashCode() : 0);
+        hash = 61 * hash + Float.floatToIntBits(this.saturationOffset);
+        hash = 61 * hash + Float.floatToIntBits(this.brightnessOffset);
+        hash = 61 * hash + this.alphaOffset;
+        return hash;
+    }
+
+    public void write(StringBuilder sb) {
+        sb.append("                     getComponentColor(c, \"").
+           append(propertyName).append("\", ").
+           append(defaultColorVariableName).append(", ").
+           append(saturationOffset).append("f, ").
+           append(brightnessOffset).append("f, ").
+           append(alphaOffset);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Dimension.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+class Dimension {
+    @XmlAttribute int width;
+    @XmlAttribute int height;
+
+    public String write(boolean uiResource) {
+        String uiSuffix = (uiResource ? "UIResource" : "");
+        return String.format("new Dimension%s(%d, %d)", uiSuffix, width, height);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Ellipse.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+class Ellipse extends Shape {
+    @XmlAttribute private double x1;
+    public double getX1() { return x1; }
+
+    @XmlAttribute private double x2;
+    public double getX2() { return x2; }
+
+    @XmlAttribute private double y1;
+    public double getY1() { return y1; }
+
+    @XmlAttribute private double y2;
+    public double getY2() { return y2; }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Gradient.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+class Gradient extends AbstractGradient {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/GradientStop.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+
+class GradientStop {
+    @XmlAttribute private float position;
+    public float getPosition() { return position; }
+
+    @XmlAttribute private float midpoint;
+    public float getMidpoint() { return midpoint; }
+
+    @XmlElement private Matte matte;
+    public Matte getColor() { return matte; }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Insets.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+class Insets {
+    @XmlAttribute int top;
+    @XmlAttribute int left;
+    @XmlAttribute int bottom;
+    @XmlAttribute int right;
+
+    public Insets() {
+        this(0, 0, 0, 0);
+    }
+
+    public Insets(int top, int left, int bottom, int right) {
+        this.top = top;
+        this.left = left;
+        this.bottom = bottom;
+        this.right = right;
+    }
+
+    public String write(boolean uiResource) {
+        String uiSuffix = (uiResource ? "UIResource" : "");
+        return String.format("new Insets%s(%d, %d, %d, %d)",
+                             uiSuffix, top, left, bottom, right);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Layer.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlElements;
+
+class Layer {
+    /** List of shapes in this layer, first shape is painted on top */
+    @XmlElements({
+        @XmlElement(name = "ellipse", type = Ellipse.class),
+        @XmlElement(name = "path", type = Path.class),
+        @XmlElement(name = "rectangle", type = Rectangle.class)
+    })
+    @XmlElementWrapper(name="shapes")
+    private List<Shape> shapes = new ArrayList<Shape>();
+    public List<Shape> getShapes() { return shapes; }
+
+    public boolean isEmpty() {
+        return shapes.isEmpty();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Matte.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+class Matte extends Paint {
+    @XmlAttribute private int red;
+    @XmlAttribute private int green;
+    @XmlAttribute private int blue;
+    @XmlAttribute private int alpha;
+
+    @XmlAttribute private String uiDefaultParentName = null;
+    @XmlAttribute private float hueOffset = 0;
+    @XmlAttribute private float saturationOffset = 0;
+    @XmlAttribute private float brightnessOffset = 0;
+    @XmlAttribute private int alphaOffset = 0;
+
+    @XmlAttribute private String componentPropertyName = null;
+    public String getComponentPropertyName() { return componentPropertyName; }
+
+    @XmlAttribute private boolean uiResource = true;
+
+    public boolean isAbsolute() {
+        return uiDefaultParentName == null;
+    }
+
+    public String getDeclaration() {
+        if (isAbsolute()) {
+            return String.format("new Color(%d, %d, %d, %d)",
+                                 red, green, blue, alpha);
+        } else {
+            return String.format("decodeColor(\"%s\", %sf, %sf, %sf, %d)",
+                    uiDefaultParentName, String.valueOf(hueOffset),
+                    String.valueOf(saturationOffset),
+                    String.valueOf(brightnessOffset), alphaOffset);
+        }
+    }
+
+    public String write() {
+        if (isAbsolute()) {
+            return String.format("%s, %s, %s, %s", red, green, blue, alpha);
+        } else {
+            String s = String.format("\"%s\", %sf, %sf, %sf, %d",
+                    uiDefaultParentName, String.valueOf(hueOffset),
+                    String.valueOf(saturationOffset),
+                    String.valueOf(brightnessOffset), alphaOffset);
+            if (! uiResource) {
+                s += ", false";
+            }
+            return s;
+        }
+    }
+
+    public ComponentColor createComponentColor(String variableName) {
+        return new ComponentColor(componentPropertyName, variableName,
+                saturationOffset, brightnessOffset, alphaOffset);
+    }
+}
--- a/make/tools/src/build/tools/generatenimbus/Paint.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/make/tools/src/build/tools/generatenimbus/Paint.java	Mon Oct 29 14:12:37 2012 +0100
@@ -25,157 +25,6 @@
 
 package build.tools.generatenimbus;
 
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
 
 public abstract class Paint {
 }
-
-class Matte extends Paint {
-    @XmlAttribute private int red;
-    @XmlAttribute private int green;
-    @XmlAttribute private int blue;
-    @XmlAttribute private int alpha;
-
-    @XmlAttribute private String uiDefaultParentName = null;
-    @XmlAttribute private float hueOffset = 0;
-    @XmlAttribute private float saturationOffset = 0;
-    @XmlAttribute private float brightnessOffset = 0;
-    @XmlAttribute private int alphaOffset = 0;
-
-    @XmlAttribute private String componentPropertyName = null;
-    public String getComponentPropertyName() { return componentPropertyName; }
-
-    @XmlAttribute private boolean uiResource = true;
-
-    public boolean isAbsolute() {
-        return uiDefaultParentName == null;
-    }
-
-    public String getDeclaration() {
-        if (isAbsolute()) {
-            return String.format("new Color(%d, %d, %d, %d)",
-                                 red, green, blue, alpha);
-        } else {
-            return String.format("decodeColor(\"%s\", %sf, %sf, %sf, %d)",
-                    uiDefaultParentName, String.valueOf(hueOffset),
-                    String.valueOf(saturationOffset),
-                    String.valueOf(brightnessOffset), alphaOffset);
-        }
-    }
-
-    public String write() {
-        if (isAbsolute()) {
-            return String.format("%s, %s, %s, %s", red, green, blue, alpha);
-        } else {
-            String s = String.format("\"%s\", %sf, %sf, %sf, %d",
-                    uiDefaultParentName, String.valueOf(hueOffset),
-                    String.valueOf(saturationOffset),
-                    String.valueOf(brightnessOffset), alphaOffset);
-            if (! uiResource) {
-                s += ", false";
-            }
-            return s;
-        }
-    }
-
-    public ComponentColor createComponentColor(String variableName) {
-        return new ComponentColor(componentPropertyName, variableName,
-                saturationOffset, brightnessOffset, alphaOffset);
-    }
-}
-
-class ComponentColor {
-    private String propertyName;
-    private String defaultColorVariableName;
-    private float saturationOffset = 0,  brightnessOffset = 0;
-    private int alphaOffset = 0;
-
-    ComponentColor(String propertyName,
-            String defaultColorVariableName,
-            float saturationOffset,
-            float brightnessOffset,
-            int alphaOffset) {
-        this.propertyName = propertyName;
-        this.defaultColorVariableName = defaultColorVariableName;
-        this.saturationOffset = saturationOffset;
-        this.brightnessOffset = brightnessOffset;
-        this.alphaOffset = alphaOffset;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ComponentColor c = (ComponentColor) o;
-        if (alphaOffset != c.alphaOffset) {
-            return false;
-        }
-        if (Float.compare(saturationOffset, c.saturationOffset) != 0) {
-            return false;
-        }
-        if (Float.compare(brightnessOffset, c.brightnessOffset) != 0) {
-            return false;
-        }
-        if (defaultColorVariableName != null ? !defaultColorVariableName.equals(c.defaultColorVariableName) : c.defaultColorVariableName != null) {
-            return false;
-        }
-        if (propertyName != null ? !propertyName.equals(c.propertyName) : c.propertyName != null) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 5;
-        hash = 61 * hash + (this.propertyName != null ? this.propertyName.hashCode() : 0);
-        hash = 61 * hash + (this.defaultColorVariableName != null ? this.defaultColorVariableName.hashCode() : 0);
-        hash = 61 * hash + Float.floatToIntBits(this.saturationOffset);
-        hash = 61 * hash + Float.floatToIntBits(this.brightnessOffset);
-        hash = 61 * hash + this.alphaOffset;
-        return hash;
-    }
-
-    public void write(StringBuilder sb) {
-        sb.append("                     getComponentColor(c, \"").
-           append(propertyName).append("\", ").
-           append(defaultColorVariableName).append(", ").
-           append(saturationOffset).append("f, ").
-           append(brightnessOffset).append("f, ").
-           append(alphaOffset);
-    }
-}
-
-class GradientStop {
-    @XmlAttribute private float position;
-    public float getPosition() { return position; }
-
-    @XmlAttribute private float midpoint;
-    public float getMidpoint() { return midpoint; }
-
-    @XmlElement private Matte matte;
-    public Matte getColor() { return matte; }
-}
-
-class AbstractGradient extends Paint {
-    public static enum CycleMethod {
-        NO_CYCLE, REFLECT, REPEAT
-    }
-
-    @XmlElement(name="stop") private ArrayList<GradientStop> stops;
-    public List<GradientStop> getStops() { return stops; }
-}
-
-class Gradient extends AbstractGradient {
-}
-
-class RadialGradient extends AbstractGradient {
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Path.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+
+class Path extends Shape {
+    @XmlElement(name="point")
+    @XmlElementWrapper(name="points")
+    private List<Point> controlPoints = new ArrayList<Point>();
+    public List<Point> getControlPoints() { return controlPoints; }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Point.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+class Point {
+    @XmlAttribute private double x;
+    public double getX() { return x; }
+
+    @XmlAttribute private double y;
+    public double getY() { return y; }
+
+    @XmlAttribute(name="cp1x") private double cp1x;
+    public double getCp1X() { return cp1x; }
+
+    @XmlAttribute(name="cp1y") private double cp1y;
+    public double getCp1Y() { return cp1y; }
+
+    @XmlAttribute(name="cp2x") private double cp2x;
+    public double getCp2X() { return cp2x; }
+
+    @XmlAttribute(name="cp2y") private double cp2y;
+    public double getCp2Y() { return cp2y; }
+
+    public boolean isP1Sharp() {
+        return cp1x == x && cp1y == y;
+    }
+
+    public boolean isP2Sharp() {
+        return cp2x == x && cp2y == y;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/RadialGradient.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+class RadialGradient extends AbstractGradient {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Rectangle.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+class Rectangle extends Shape {
+    @XmlAttribute private double x1;
+    public double getX1() { return x1; }
+
+    @XmlAttribute private double x2;
+    public double getX2() { return x2; }
+
+    @XmlAttribute private double y1;
+    public double getY1() { return y1; }
+
+    @XmlAttribute private double y2;
+    public double getY2() { return y2; }
+
+    @XmlAttribute
+    public double getRounding() {
+        double rounding = Math.abs(roundingX - x1) * 2;
+        return rounding > 2 ? rounding : 0;
+    }
+
+    public void setRounding(double rounding) {
+        if (rounding > 0 && rounding < 2) {
+            rounding = 0;
+        }
+        roundingX = rounding / 2d + x1;
+    }
+    private double roundingX;
+
+    public boolean isRounded() {
+        return getRounding() > 0;
+    }
+
+}
--- a/make/tools/src/build/tools/generatenimbus/Shape.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/make/tools/src/build/tools/generatenimbus/Shape.java	Mon Oct 29 14:12:37 2012 +0100
@@ -25,11 +25,8 @@
 
 package build.tools.generatenimbus;
 
-import java.util.ArrayList;
-import java.util.List;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlElements;
 
 
@@ -56,85 +53,3 @@
         @XmlAttribute double y2;
     }
 }
-
-class Point {
-    @XmlAttribute private double x;
-    public double getX() { return x; }
-
-    @XmlAttribute private double y;
-    public double getY() { return y; }
-
-    @XmlAttribute(name="cp1x") private double cp1x;
-    public double getCp1X() { return cp1x; }
-
-    @XmlAttribute(name="cp1y") private double cp1y;
-    public double getCp1Y() { return cp1y; }
-
-    @XmlAttribute(name="cp2x") private double cp2x;
-    public double getCp2X() { return cp2x; }
-
-    @XmlAttribute(name="cp2y") private double cp2y;
-    public double getCp2Y() { return cp2y; }
-
-    public boolean isP1Sharp() {
-        return cp1x == x && cp1y == y;
-    }
-
-    public boolean isP2Sharp() {
-        return cp2x == x && cp2y == y;
-    }
-}
-
-class Path extends Shape {
-    @XmlElement(name="point")
-    @XmlElementWrapper(name="points")
-    private List<Point> controlPoints = new ArrayList<Point>();
-    public List<Point> getControlPoints() { return controlPoints; }
-}
-
-class Rectangle extends Shape {
-    @XmlAttribute private double x1;
-    public double getX1() { return x1; }
-
-    @XmlAttribute private double x2;
-    public double getX2() { return x2; }
-
-    @XmlAttribute private double y1;
-    public double getY1() { return y1; }
-
-    @XmlAttribute private double y2;
-    public double getY2() { return y2; }
-
-    @XmlAttribute
-    public double getRounding() {
-        double rounding = Math.abs(roundingX - x1) * 2;
-        return rounding > 2 ? rounding : 0;
-    }
-
-    public void setRounding(double rounding) {
-        if (rounding > 0 && rounding < 2) {
-            rounding = 0;
-        }
-        roundingX = rounding / 2d + x1;
-    }
-    private double roundingX;
-
-    public boolean isRounded() {
-        return getRounding() > 0;
-    }
-
-}
-
-class Ellipse extends Shape {
-    @XmlAttribute private double x1;
-    public double getX1() { return x1; }
-
-    @XmlAttribute private double x2;
-    public double getX2() { return x2; }
-
-    @XmlAttribute private double y1;
-    public double getY1() { return y1; }
-
-    @XmlAttribute private double y2;
-    public double getY2() { return y2; }
-}
--- a/make/tools/src/build/tools/generatenimbus/SynthModel.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/make/tools/src/build/tools/generatenimbus/SynthModel.java	Mon Oct 29 14:12:37 2012 +0100
@@ -25,9 +25,7 @@
 
 package build.tools.generatenimbus;
 
-import java.awt.Font;
 import java.util.ArrayList;
-import java.util.List;
 import javax.xml.bind.annotation.*;
 
 
@@ -78,139 +76,3 @@
         }
     }
 }
-
-class Typeface {
-    public enum DeriveStyle {
-        Default, Off, On;
-
-        @Override public String toString() {
-            switch (this) {
-                default:  return "null";
-                case On:  return "true";
-                case Off: return "false";
-            }
-        }
-    }
-
-    @XmlAttribute private String uiDefaultParentName;
-    @XmlAttribute(name="family") private String name;
-    @XmlAttribute private int size;
-    @XmlAttribute private DeriveStyle bold = DeriveStyle.Default;
-    @XmlAttribute private DeriveStyle italic = DeriveStyle.Default;
-    @XmlAttribute private float sizeOffset = 1f;
-
-    public boolean isAbsolute() {
-        return uiDefaultParentName == null;
-    }
-
-    public String write() {
-        if (isAbsolute()) {
-            int style = Font.PLAIN;
-            if (bold == DeriveStyle.On) {
-                style = style | Font.BOLD;
-            }
-            if (italic == DeriveStyle.On) {
-                style = style | Font.ITALIC;
-            }
-
-            return String.format(
-                    "new javax.swing.plaf.FontUIResource(\"%s\", %d, %d)",
-                    name, style, size);
-        } else {
-            return String.format(
-                    "new DerivedFont(\"%s\", %sf, %s, %s)",
-                    uiDefaultParentName, String.valueOf(sizeOffset), bold, italic);
-        }
-    }
-}
-
-class Border {
-    enum BorderType {
-        @XmlEnumValue("empty") EMPTY,
-        @XmlEnumValue("painter") PAINTER
-    }
-    @XmlAttribute private BorderType type;
-    @XmlAttribute private String painter;
-    @XmlAttribute private int top;
-    @XmlAttribute private int left;
-    @XmlAttribute private int bottom;
-    @XmlAttribute private int right;
-
-    public String write() {
-        switch (type) {
-            case PAINTER:
-                return String.format("new PainterBorder(\"%s\", new Insets(%d, %d, %d, %d))",
-                                     painter, top, left, bottom, right);
-            case EMPTY:
-                return String.format("BorderFactory.createEmptyBorder(%d, %d, %d, %d)",
-                                     top, left, bottom, right);
-            default:
-                return "### Look, here's an unknown border! $$$";
-        }
-    }
-}
-
-class Insets {
-    @XmlAttribute int top;
-    @XmlAttribute int left;
-    @XmlAttribute int bottom;
-    @XmlAttribute int right;
-
-    public Insets() {
-        this(0, 0, 0, 0);
-    }
-
-    public Insets(int top, int left, int bottom, int right) {
-        this.top = top;
-        this.left = left;
-        this.bottom = bottom;
-        this.right = right;
-    }
-
-    public String write(boolean uiResource) {
-        String uiSuffix = (uiResource ? "UIResource" : "");
-        return String.format("new Insets%s(%d, %d, %d, %d)",
-                             uiSuffix, top, left, bottom, right);
-    }
-}
-
-class Dimension {
-    @XmlAttribute int width;
-    @XmlAttribute int height;
-
-    public String write(boolean uiResource) {
-        String uiSuffix = (uiResource ? "UIResource" : "");
-        return String.format("new Dimension%s(%d, %d)", uiSuffix, width, height);
-    }
-}
-
-class Canvas {
-    @XmlElement private Dimension size;
-    public Dimension getSize() { return size; }
-
-    @XmlElement(name="layer") private List<Layer> layers;
-    public List<Layer> getLayers() { return layers; }
-
-    @XmlElement private Insets stretchingInsets = null;
-    public Insets getStretchingInsets() { return stretchingInsets; }
-
-    public boolean isBlank() {
-        return layers.size() == 0 || (layers.size() == 1 && layers.get(0).isEmpty());
-    }
-}
-
-class Layer {
-    /** List of shapes in this layer, first shape is painted on top */
-    @XmlElements({
-        @XmlElement(name = "ellipse", type = Ellipse.class),
-        @XmlElement(name = "path", type = Path.class),
-        @XmlElement(name = "rectangle", type = Rectangle.class)
-    })
-    @XmlElementWrapper(name="shapes")
-    private List<Shape> shapes = new ArrayList<Shape>();
-    public List<Shape> getShapes() { return shapes; }
-
-    public boolean isEmpty() {
-        return shapes.isEmpty();
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/Typeface.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import java.awt.Font;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+class Typeface {
+    public enum DeriveStyle {
+        Default, Off, On;
+
+        @Override public String toString() {
+            switch (this) {
+                default:  return "null";
+                case On:  return "true";
+                case Off: return "false";
+            }
+        }
+    }
+
+    @XmlAttribute private String uiDefaultParentName;
+    @XmlAttribute(name="family") private String name;
+    @XmlAttribute private int size;
+    @XmlAttribute private DeriveStyle bold = DeriveStyle.Default;
+    @XmlAttribute private DeriveStyle italic = DeriveStyle.Default;
+    @XmlAttribute private float sizeOffset = 1f;
+
+    public boolean isAbsolute() {
+        return uiDefaultParentName == null;
+    }
+
+    public String write() {
+        if (isAbsolute()) {
+            int style = Font.PLAIN;
+            if (bold == DeriveStyle.On) {
+                style = style | Font.BOLD;
+            }
+            if (italic == DeriveStyle.On) {
+                style = style | Font.ITALIC;
+            }
+
+            return String.format(
+                    "new javax.swing.plaf.FontUIResource(\"%s\", %d, %d)",
+                    name, style, size);
+        } else {
+            return String.format(
+                    "new DerivedFont(\"%s\", %sf, %s, %s)",
+                    uiDefaultParentName, String.valueOf(sizeOffset), bold, italic);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/UIColor.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlElement;
+
+class UIColor extends UIDefault<Matte> {
+
+    @XmlElement
+    public void setMatte(Matte m) {
+        setValue(m);
+    }
+
+    public String write() {
+        return String.format("        addColor(d, \"%s\", %s);\n",
+                             getName(), getValue().write());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/UIComponent.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+
+class UIComponent extends UIRegion {
+    @XmlAttribute private String componentName;
+
+    @XmlElement(name="stateType")
+    @XmlElementWrapper(name="stateTypes")
+    private List<UIStateType> stateTypes = new ArrayList<UIStateType>();
+    public List<UIStateType> getStateTypes() { return stateTypes; }
+
+    @Override public String getKey() {
+        if (key == null || "".equals(key)) {
+            if (componentName == null || "".equals(componentName)) {
+                return name;
+            } else {
+                return "\"" + componentName + "\"";
+            }
+        } else {
+            return key;
+        }
+    }
+}
--- a/make/tools/src/build/tools/generatenimbus/UIDefault.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/make/tools/src/build/tools/generatenimbus/UIDefault.java	Mon Oct 29 14:12:37 2012 +0100
@@ -26,7 +26,6 @@
 package build.tools.generatenimbus;
 
 import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
 
 public class UIDefault<T> {
     @XmlAttribute private String name;
@@ -44,83 +43,3 @@
         this.value = value;
     }
 }
-
-class UIColor extends UIDefault<Matte> {
-
-    @XmlElement
-    public void setMatte(Matte m) {
-        setValue(m);
-    }
-
-    public String write() {
-        return String.format("        addColor(d, \"%s\", %s);\n",
-                             getName(), getValue().write());
-    }
-}
-
-class UIFont extends UIDefault<Typeface> {
-    @XmlElement
-    public void setTypeface(Typeface t) {
-        setValue(t);
-    }
-
-    public String write() {
-        return String.format("        d.put(\"%s\", %s);\n",
-                             getName(), getValue().write());
-    }
-}
-
-class UIProperty extends UIDefault<String> {
-    public static enum PropertyType {
-        BOOLEAN, INT, FLOAT, DOUBLE, STRING, FONT, COLOR, INSETS, DIMENSION, BORDER
-    }
-    @XmlAttribute private PropertyType type;
-
-    @XmlElement private Border border;
-    @XmlElement private Dimension dimension;
-    @XmlElement private Insets insets;
-    @XmlElement private Matte matte;
-    @XmlElement private Typeface typeface;
-
-    @XmlAttribute
-    @Override public void setValue(String value) {
-        super.setValue(value);
-    }
-
-    public String write(String prefix) {
-        switch (type) {
-            case BOOLEAN:
-                return String.format("        d.put(\"%s%s\", Boolean.%s);\n",
-                                     prefix, getName(), getValue().toUpperCase());  ///autobox
-            case STRING:
-                return String.format("        d.put(\"%s%s\", \"%s\");\n",
-                                     prefix, getName(), getValue());
-            case INT:
-                return String.format("        d.put(\"%s%s\", new Integer(%s));\n",
-                                     prefix, getName(), getValue());
-            case FLOAT:
-                return String.format("        d.put(\"%s%s\", new Float(%sf));\n",
-                                     prefix, getName(), getValue());
-            case DOUBLE:
-                return String.format("        d.put(\"%s%s\", new Double(%s));\n",
-                                     prefix, getName(), getValue());
-            case COLOR:
-                return String.format("        addColor(d, \"%s%s\", %s);\n",
-                                     prefix, getName(), matte.write());
-            case FONT:
-                return String.format("        d.put(\"%s%s\", %s);\n",
-                                     prefix, getName(), typeface.write());
-            case INSETS:
-                return String.format("        d.put(\"%s%s\", %s);\n",
-                                     prefix, getName(), insets.write(true));
-            case DIMENSION:
-                return String.format("        d.put(\"%s%s\", new DimensionUIResource(%d, %d));\n",
-                                     prefix, getName(), dimension.width, dimension.height);
-            case BORDER:
-                return String.format("        d.put(\"%s%s\", new BorderUIResource(%s));\n",
-                                     prefix, getName(), border.write());
-            default:
-                return "###  Look, something's wrong with UIProperty.write()  $$$";
-        }
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/UIFont.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlElement;
+
+class UIFont extends UIDefault<Typeface> {
+    @XmlElement
+    public void setTypeface(Typeface t) {
+        setValue(t);
+    }
+
+    public String write() {
+        return String.format("        d.put(\"%s\", %s);\n",
+                             getName(), getValue().write());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/UIIconRegion.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+class UIIconRegion extends UIRegion {
+    @XmlAttribute private String basicKey;
+
+    @Override public void write(StringBuilder sb, StringBuilder styleBuffer, UIComponent comp, String prefix, String pkg) {
+        Dimension size = null;
+        String fileNamePrefix = Utils.normalize(prefix) + "Painter";
+        // write states ui defaults
+        for (UIState state : backgroundStates) {
+            Canvas canvas = state.getCanvas();
+            if (!canvas.isBlank()) {
+                state.write(sb, prefix, pkg, fileNamePrefix, getKey());
+                size = canvas.getSize();
+            }
+        }
+
+        if (size != null) {
+            // Put SynthIconImpl wrapper in UiDefaults
+            String k = (basicKey == null ? prefix + "." + getKey() : basicKey);
+            sb.append(String.format(
+                    "        d.put(\"%s\", new NimbusIcon(\"%s\", \"%sPainter\", %d, %d));\n",
+                    k, prefix, getKey(), size.width, size.height));
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/UIProperty.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+
+class UIProperty extends UIDefault<String> {
+    public static enum PropertyType {
+        BOOLEAN, INT, FLOAT, DOUBLE, STRING, FONT, COLOR, INSETS, DIMENSION, BORDER
+    }
+    @XmlAttribute private PropertyType type;
+
+    @XmlElement private Border border;
+    @XmlElement private Dimension dimension;
+    @XmlElement private Insets insets;
+    @XmlElement private Matte matte;
+    @XmlElement private Typeface typeface;
+
+    @XmlAttribute
+    @Override public void setValue(String value) {
+        super.setValue(value);
+    }
+
+    public String write(String prefix) {
+        switch (type) {
+            case BOOLEAN:
+                return String.format("        d.put(\"%s%s\", Boolean.%s);\n",
+                                     prefix, getName(), getValue().toUpperCase());  ///autobox
+            case STRING:
+                return String.format("        d.put(\"%s%s\", \"%s\");\n",
+                                     prefix, getName(), getValue());
+            case INT:
+                return String.format("        d.put(\"%s%s\", new Integer(%s));\n",
+                                     prefix, getName(), getValue());
+            case FLOAT:
+                return String.format("        d.put(\"%s%s\", new Float(%sf));\n",
+                                     prefix, getName(), getValue());
+            case DOUBLE:
+                return String.format("        d.put(\"%s%s\", new Double(%s));\n",
+                                     prefix, getName(), getValue());
+            case COLOR:
+                return String.format("        addColor(d, \"%s%s\", %s);\n",
+                                     prefix, getName(), matte.write());
+            case FONT:
+                return String.format("        d.put(\"%s%s\", %s);\n",
+                                     prefix, getName(), typeface.write());
+            case INSETS:
+                return String.format("        d.put(\"%s%s\", %s);\n",
+                                     prefix, getName(), insets.write(true));
+            case DIMENSION:
+                return String.format("        d.put(\"%s%s\", new DimensionUIResource(%d, %d));\n",
+                                     prefix, getName(), dimension.width, dimension.height);
+            case BORDER:
+                return String.format("        d.put(\"%s%s\", new BorderUIResource(%s));\n",
+                                     prefix, getName(), border.write());
+            default:
+                return "###  Look, something's wrong with UIProperty.write()  $$$";
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/UIRegion.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlElements;
+
+class UIRegion {
+    @XmlAttribute protected String name;
+    @XmlAttribute protected String key;
+    @XmlAttribute private boolean opaque = false;
+
+    @XmlElement private Insets contentMargins = new Insets(0, 0, 0, 0);
+
+    @XmlElement(name="state")
+    @XmlElementWrapper(name="backgroundStates")
+    protected List<UIState> backgroundStates = new ArrayList<UIState>();
+    public List<UIState> getBackgroundStates() { return backgroundStates; }
+
+    @XmlElement(name="state")
+    @XmlElementWrapper(name="foregroundStates")
+    protected List<UIState> foregroundStates = new ArrayList<UIState>();
+    public List<UIState> getForegroundStates() { return foregroundStates; }
+
+    @XmlElement(name="state")
+    @XmlElementWrapper(name="borderStates")
+    protected List<UIState> borderStates = new ArrayList<UIState>();
+    public List<UIState> getBorderStates() { return borderStates; }
+
+    @XmlElement private UIStyle style = new UIStyle();
+
+    @XmlElements({
+        @XmlElement(name = "region", type = UIRegion.class),
+        @XmlElement(name = "uiComponent", type = UIComponent.class),
+        @XmlElement(name = "uiIconRegion", type = UIIconRegion.class)
+    })
+    @XmlElementWrapper(name="regions")
+    private List<UIRegion> subRegions = new ArrayList<UIRegion>();
+    public List<UIRegion> getSubRegions() { return subRegions; }
+
+    protected void initStyles(UIStyle parentStyle) {
+        style.setParentStyle(parentStyle);
+        for (UIState state: backgroundStates) {
+            state.getStyle().setParentStyle(this.style);
+        }
+        for (UIState state: foregroundStates) {
+            state.getStyle().setParentStyle(this.style);
+        }
+        for (UIState state: borderStates) {
+            state.getStyle().setParentStyle(this.style);
+        }
+        for (UIRegion region: subRegions) {
+            region.initStyles(this.style);
+        }
+    }
+
+    public String getKey() {
+        return key == null || "".equals(key) ? name : key;
+    }
+
+    private boolean hasCanvas() {
+        for (UIState s : backgroundStates) {
+            if (s.hasCanvas()) return true;
+        }
+        for (UIState s : borderStates) {
+            if (s.hasCanvas()) return true;
+        }
+        for (UIState s : foregroundStates) {
+            if (s.hasCanvas()) return true;
+        }
+        for (UIRegion r: subRegions) {
+            if (r.hasCanvas()) return true;
+        }
+        return false;
+    }
+
+    public void write(StringBuilder sb, StringBuilder styleBuffer,
+                      UIComponent comp, String prefix, String pkg) {
+        // write content margins
+        sb.append(String.format("        d.put(\"%s.contentMargins\", %s);\n",
+                                prefix, contentMargins.write(true)));
+        // write opaque if true
+        if (opaque) {
+            sb.append(String.format("        d.put(\"%s.opaque\", Boolean.TRUE);\n", prefix));
+        }
+
+        // register component with LAF
+        String regionCode = "Region." + Utils.regionNameToCaps(name);
+        styleBuffer.append(String.format("        register(%s, \"%s\");\n",
+                                         regionCode, prefix));
+
+        //write the State, if necessary
+        StringBuffer regString = new StringBuffer();
+        List<UIStateType> types = comp.getStateTypes();
+        if (types != null && types.size() > 0) {
+            for (UIStateType type : types) {
+                regString.append(type.getKey());
+                regString.append(",");
+            }
+            //remove the last ","
+            regString.deleteCharAt(regString.length() - 1);
+        }
+
+        if (! regString.equals("Enabled,MouseOver,Pressed,Disabled,Focused,Selected,Default") && types.size() > 0) {
+            //there were either custom states, or the normal states were in a custom order
+            //so go ahead and write out prefix.State
+            sb.append(String.format("        d.put(\"%s.States\", \"%s\");\n",
+                                    prefix, regString));
+        }
+
+        // write out any custom states, if necessary
+        for (UIStateType type : types) {
+            String synthState = type.getKey();
+            if (! "Enabled".equals(synthState) &&
+                ! "MouseOver".equals(synthState) &&
+                ! "Pressed".equals(synthState) &&
+                ! "Disabled".equals(synthState) &&
+                ! "Focused".equals(synthState) &&
+                ! "Selected".equals(synthState) &&
+                ! "Default".equals(synthState)) {
+
+                //what we have here, gentlemen, is a bona-fide custom state.
+                //if the type is not one of the standard types, then construct a name for
+                //the new type, and write out a new subclass of State.
+                String className = Utils.normalize(prefix) + synthState + "State";
+                sb.append(String.format("        d.put(\"%s.%s\", new %s());\n",
+                                        prefix, synthState, className));
+
+                String body = type.getCodeSnippet();
+                Map<String, String> variables = Generator.getVariables();
+                variables.put("STATE_NAME", className);
+                variables.put("STATE_KEY", synthState);
+                variables.put("BODY", body);
+
+                Generator.writeSrcFile("StateImpl", variables, className);
+            }
+        }
+
+        // write style
+        sb.append(style.write(prefix + '.'));
+
+        String fileName = Utils.normalize(prefix) + "Painter";
+        boolean hasCanvas = hasCanvas();
+        if (hasCanvas) {
+            PainterGenerator.writePainter(this, fileName);
+        }
+        // write states ui defaults
+        for (UIState state : backgroundStates) {
+            state.write(sb, prefix, pkg, fileName, "background");
+        }
+        for (UIState state : foregroundStates) {
+            state.write(sb, prefix, pkg, fileName, "foreground");
+        }
+        for (UIState state : borderStates) {
+            state.write(sb, prefix, pkg, fileName, "border");
+        }
+
+        // handle sub regions
+        for (UIRegion subreg : subRegions) {
+            String p = prefix;
+            if (! (subreg instanceof UIIconRegion)) {
+                p = prefix + ":" + Utils.escape(subreg.getKey());
+            }
+            UIComponent c = comp;
+            if (subreg instanceof UIComponent) {
+                c = (UIComponent) subreg;
+            }
+            subreg.write(sb, styleBuffer, c, p, pkg);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/UIState.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+
+class UIState {
+    @XmlAttribute private String stateKeys;
+    public String getStateKeys() { return stateKeys; }
+
+    /** Indicates whether to invert the meaning of the 9-square stretching insets */
+    @XmlAttribute private boolean inverted;
+
+    /** A cached string representing the list of stateKeys deliminated with "+" */
+    private String cachedName = null;
+
+    @XmlElement private Canvas canvas;
+    public Canvas getCanvas() { return canvas; }
+
+    @XmlElement private UIStyle style;
+    public UIStyle getStyle() { return style; }
+
+    public boolean hasCanvas() {
+        return ! canvas.isBlank();
+    }
+
+    public static List<String> stringToKeys(String keysString) {
+        return Arrays.asList(keysString.split("\\+"));
+    }
+
+    public String getName() {
+        if (cachedName == null) {
+            StringBuilder buf = new StringBuilder();
+            List<String> keys = stringToKeys(stateKeys);
+            Collections.sort(keys);
+            for (Iterator<String> iter = keys.iterator(); iter.hasNext();) {
+                buf.append(iter.next());
+                if (iter.hasNext()) {
+                    buf.append('+');
+                }
+            }
+            cachedName = buf.toString();
+        }
+        return cachedName;
+    }
+
+    public void write(StringBuilder sb, String prefix, String pkg, String fileNamePrefix, String painterPrefix) {
+        String statePrefix = prefix + "[" + getName() + "]";
+        // write state style
+        sb.append(style.write(statePrefix + '.'));
+        // write painter
+        if (hasCanvas()) {
+            writeLazyPainter(sb, statePrefix, pkg, fileNamePrefix, painterPrefix);
+        }
+    }
+
+    private void writeLazyPainter(StringBuilder sb, String statePrefix, String packageNamePrefix, String fileNamePrefix, String painterPrefix) {
+        String cacheModeString = "AbstractRegionPainter.PaintContext.CacheMode." + style.getCacheMode();
+        String stateConstant = Utils.statesToConstantName(painterPrefix + "_" + stateKeys);
+        sb.append(String.format(
+                "        d.put(\"%s.%sPainter\", new LazyPainter(\"%s.%s\", %s.%s, %s, %s, %b, %s, %s, %s));\n",
+                statePrefix, painterPrefix, packageNamePrefix, fileNamePrefix,
+                fileNamePrefix, stateConstant, canvas.getStretchingInsets().write(false),
+                canvas.getSize().write(false), inverted, cacheModeString,
+                Utils.formatDouble(style.getMaxHozCachedImgScaling()),
+                Utils.formatDouble(style.getMaxVertCachedImgScaling())));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/generatenimbus/UIStateType.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.generatenimbus;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+
+class UIStateType {
+    @XmlAttribute private String key;
+    public String getKey() { return key; }
+
+    @XmlElement private String codeSnippet;
+    public String getCodeSnippet() { return codeSnippet; }
+}
--- a/make/tools/src/build/tools/generatenimbus/UIStyle.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/make/tools/src/build/tools/generatenimbus/UIStyle.java	Mon Oct 29 14:12:37 2012 +0100
@@ -26,15 +26,9 @@
 package build.tools.generatenimbus;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlElements;
 
 
 class UIStyle {
@@ -115,285 +109,3 @@
         return sb.toString();
     }
 }
-
-class UIRegion {
-    @XmlAttribute protected String name;
-    @XmlAttribute protected String key;
-    @XmlAttribute private boolean opaque = false;
-
-    @XmlElement private Insets contentMargins = new Insets(0, 0, 0, 0);
-
-    @XmlElement(name="state")
-    @XmlElementWrapper(name="backgroundStates")
-    protected List<UIState> backgroundStates = new ArrayList<UIState>();
-    public List<UIState> getBackgroundStates() { return backgroundStates; }
-
-    @XmlElement(name="state")
-    @XmlElementWrapper(name="foregroundStates")
-    protected List<UIState> foregroundStates = new ArrayList<UIState>();
-    public List<UIState> getForegroundStates() { return foregroundStates; }
-
-    @XmlElement(name="state")
-    @XmlElementWrapper(name="borderStates")
-    protected List<UIState> borderStates = new ArrayList<UIState>();
-    public List<UIState> getBorderStates() { return borderStates; }
-
-    @XmlElement private UIStyle style = new UIStyle();
-
-    @XmlElements({
-        @XmlElement(name = "region", type = UIRegion.class),
-        @XmlElement(name = "uiComponent", type = UIComponent.class),
-        @XmlElement(name = "uiIconRegion", type = UIIconRegion.class)
-    })
-    @XmlElementWrapper(name="regions")
-    private List<UIRegion> subRegions = new ArrayList<UIRegion>();
-    public List<UIRegion> getSubRegions() { return subRegions; }
-
-    protected void initStyles(UIStyle parentStyle) {
-        style.setParentStyle(parentStyle);
-        for (UIState state: backgroundStates) {
-            state.getStyle().setParentStyle(this.style);
-        }
-        for (UIState state: foregroundStates) {
-            state.getStyle().setParentStyle(this.style);
-        }
-        for (UIState state: borderStates) {
-            state.getStyle().setParentStyle(this.style);
-        }
-        for (UIRegion region: subRegions) {
-            region.initStyles(this.style);
-        }
-    }
-
-    public String getKey() {
-        return key == null || "".equals(key) ? name : key;
-    }
-
-    private boolean hasCanvas() {
-        for (UIState s : backgroundStates) {
-            if (s.hasCanvas()) return true;
-        }
-        for (UIState s : borderStates) {
-            if (s.hasCanvas()) return true;
-        }
-        for (UIState s : foregroundStates) {
-            if (s.hasCanvas()) return true;
-        }
-        for (UIRegion r: subRegions) {
-            if (r.hasCanvas()) return true;
-        }
-        return false;
-    }
-
-    public void write(StringBuilder sb, StringBuilder styleBuffer,
-                      UIComponent comp, String prefix, String pkg) {
-        // write content margins
-        sb.append(String.format("        d.put(\"%s.contentMargins\", %s);\n",
-                                prefix, contentMargins.write(true)));
-        // write opaque if true
-        if (opaque) {
-            sb.append(String.format("        d.put(\"%s.opaque\", Boolean.TRUE);\n", prefix));
-        }
-
-        // register component with LAF
-        String regionCode = "Region." + Utils.regionNameToCaps(name);
-        styleBuffer.append(String.format("        register(%s, \"%s\");\n",
-                                         regionCode, prefix));
-
-        //write the State, if necessary
-        StringBuffer regString = new StringBuffer();
-        List<UIStateType> types = comp.getStateTypes();
-        if (types != null && types.size() > 0) {
-            for (UIStateType type : types) {
-                regString.append(type.getKey());
-                regString.append(",");
-            }
-            //remove the last ","
-            regString.deleteCharAt(regString.length() - 1);
-        }
-
-        if (! regString.equals("Enabled,MouseOver,Pressed,Disabled,Focused,Selected,Default") && types.size() > 0) {
-            //there were either custom states, or the normal states were in a custom order
-            //so go ahead and write out prefix.State
-            sb.append(String.format("        d.put(\"%s.States\", \"%s\");\n",
-                                    prefix, regString));
-        }
-
-        // write out any custom states, if necessary
-        for (UIStateType type : types) {
-            String synthState = type.getKey();
-            if (! "Enabled".equals(synthState) &&
-                ! "MouseOver".equals(synthState) &&
-                ! "Pressed".equals(synthState) &&
-                ! "Disabled".equals(synthState) &&
-                ! "Focused".equals(synthState) &&
-                ! "Selected".equals(synthState) &&
-                ! "Default".equals(synthState)) {
-
-                //what we have here, gentlemen, is a bona-fide custom state.
-                //if the type is not one of the standard types, then construct a name for
-                //the new type, and write out a new subclass of State.
-                String className = Utils.normalize(prefix) + synthState + "State";
-                sb.append(String.format("        d.put(\"%s.%s\", new %s());\n",
-                                        prefix, synthState, className));
-
-                String body = type.getCodeSnippet();
-                Map<String, String> variables = Generator.getVariables();
-                variables.put("STATE_NAME", className);
-                variables.put("STATE_KEY", synthState);
-                variables.put("BODY", body);
-
-                Generator.writeSrcFile("StateImpl", variables, className);
-            }
-        }
-
-        // write style
-        sb.append(style.write(prefix + '.'));
-
-        String fileName = Utils.normalize(prefix) + "Painter";
-        boolean hasCanvas = hasCanvas();
-        if (hasCanvas) {
-            PainterGenerator.writePainter(this, fileName);
-        }
-        // write states ui defaults
-        for (UIState state : backgroundStates) {
-            state.write(sb, prefix, pkg, fileName, "background");
-        }
-        for (UIState state : foregroundStates) {
-            state.write(sb, prefix, pkg, fileName, "foreground");
-        }
-        for (UIState state : borderStates) {
-            state.write(sb, prefix, pkg, fileName, "border");
-        }
-
-        // handle sub regions
-        for (UIRegion subreg : subRegions) {
-            String p = prefix;
-            if (! (subreg instanceof UIIconRegion)) {
-                p = prefix + ":" + Utils.escape(subreg.getKey());
-            }
-            UIComponent c = comp;
-            if (subreg instanceof UIComponent) {
-                c = (UIComponent) subreg;
-            }
-            subreg.write(sb, styleBuffer, c, p, pkg);
-        }
-    }
-}
-
-class UIIconRegion extends UIRegion {
-    @XmlAttribute private String basicKey;
-
-    @Override public void write(StringBuilder sb, StringBuilder styleBuffer, UIComponent comp, String prefix, String pkg) {
-        Dimension size = null;
-        String fileNamePrefix = Utils.normalize(prefix) + "Painter";
-        // write states ui defaults
-        for (UIState state : backgroundStates) {
-            Canvas canvas = state.getCanvas();
-            if (!canvas.isBlank()) {
-                state.write(sb, prefix, pkg, fileNamePrefix, getKey());
-                size = canvas.getSize();
-            }
-        }
-
-        if (size != null) {
-            // Put SynthIconImpl wrapper in UiDefaults
-            String k = (basicKey == null ? prefix + "." + getKey() : basicKey);
-            sb.append(String.format(
-                    "        d.put(\"%s\", new NimbusIcon(\"%s\", \"%sPainter\", %d, %d));\n",
-                    k, prefix, getKey(), size.width, size.height));
-        }
-    }
-}
-
-class UIComponent extends UIRegion {
-    @XmlAttribute private String componentName;
-
-    @XmlElement(name="stateType")
-    @XmlElementWrapper(name="stateTypes")
-    private List<UIStateType> stateTypes = new ArrayList<UIStateType>();
-    public List<UIStateType> getStateTypes() { return stateTypes; }
-
-    @Override public String getKey() {
-        if (key == null || "".equals(key)) {
-            if (componentName == null || "".equals(componentName)) {
-                return name;
-            } else {
-                return "\"" + componentName + "\"";
-            }
-        } else {
-            return key;
-        }
-    }
-}
-
-class UIState {
-    @XmlAttribute private String stateKeys;
-    public String getStateKeys() { return stateKeys; }
-
-    /** Indicates whether to invert the meaning of the 9-square stretching insets */
-    @XmlAttribute private boolean inverted;
-
-    /** A cached string representing the list of stateKeys deliminated with "+" */
-    private String cachedName = null;
-
-    @XmlElement private Canvas canvas;
-    public Canvas getCanvas() { return canvas; }
-
-    @XmlElement private UIStyle style;
-    public UIStyle getStyle() { return style; }
-
-    public boolean hasCanvas() {
-        return ! canvas.isBlank();
-    }
-
-    public static List<String> stringToKeys(String keysString) {
-        return Arrays.asList(keysString.split("\\+"));
-    }
-
-    public String getName() {
-        if (cachedName == null) {
-            StringBuilder buf = new StringBuilder();
-            List<String> keys = stringToKeys(stateKeys);
-            Collections.sort(keys);
-            for (Iterator<String> iter = keys.iterator(); iter.hasNext();) {
-                buf.append(iter.next());
-                if (iter.hasNext()) {
-                    buf.append('+');
-                }
-            }
-            cachedName = buf.toString();
-        }
-        return cachedName;
-    }
-
-    public void write(StringBuilder sb, String prefix, String pkg, String fileNamePrefix, String painterPrefix) {
-        String statePrefix = prefix + "[" + getName() + "]";
-        // write state style
-        sb.append(style.write(statePrefix + '.'));
-        // write painter
-        if (hasCanvas()) {
-            writeLazyPainter(sb, statePrefix, pkg, fileNamePrefix, painterPrefix);
-        }
-    }
-
-    private void writeLazyPainter(StringBuilder sb, String statePrefix, String packageNamePrefix, String fileNamePrefix, String painterPrefix) {
-        String cacheModeString = "AbstractRegionPainter.PaintContext.CacheMode." + style.getCacheMode();
-        String stateConstant = Utils.statesToConstantName(painterPrefix + "_" + stateKeys);
-        sb.append(String.format(
-                "        d.put(\"%s.%sPainter\", new LazyPainter(\"%s.%s\", %s.%s, %s, %s, %b, %s, %s, %s));\n",
-                statePrefix, painterPrefix, packageNamePrefix, fileNamePrefix,
-                fileNamePrefix, stateConstant, canvas.getStretchingInsets().write(false),
-                canvas.getSize().write(false), inverted, cacheModeString,
-                Utils.formatDouble(style.getMaxHozCachedImgScaling()),
-                Utils.formatDouble(style.getMaxVertCachedImgScaling())));
-    }
-}
-
-class UIStateType {
-    @XmlAttribute private String key;
-    public String getKey() { return key; }
-
-    @XmlElement private String codeSnippet;
-    public String getCodeSnippet() { return codeSnippet; }
-}
--- a/src/share/classes/javax/management/timer/Timer.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/src/share/classes/javax/management/timer/Timer.java	Mon Oct 29 14:12:37 2012 +0100
@@ -1240,54 +1240,3 @@
                 "sendNotification", "timer notification sent");
     }
 }
-
-/**
- * TimerAlarmClock inner class:
- * This class provides a simple implementation of an alarm clock MBean.
- * The aim of this MBean is to set up an alarm which wakes up the timer every timeout (fixed-delay)
- * or at the specified date (fixed-rate).
- */
-
-class TimerAlarmClock extends java.util.TimerTask {
-
-    Timer listener = null;
-    long timeout = 10000;
-    Date next = null;
-
-    /*
-     * ------------------------------------------
-     *  CONSTRUCTORS
-     * ------------------------------------------
-     */
-
-    public TimerAlarmClock(Timer listener, long timeout) {
-        this.listener = listener;
-        this.timeout = Math.max(0L, timeout);
-    }
-
-    public TimerAlarmClock(Timer listener, Date next) {
-        this.listener = listener;
-        this.next = next;
-    }
-
-    /*
-     * ------------------------------------------
-     *  PUBLIC METHODS
-     * ------------------------------------------
-     */
-
-    /**
-     * This method is called by the timer when it is started.
-     */
-    public void run() {
-
-        try {
-            //this.sleep(timeout);
-            TimerAlarmClockNotification notif = new TimerAlarmClockNotification(this);
-            listener.notifyAlarmClock(notif);
-        } catch (Exception e) {
-            TIMER_LOGGER.logp(Level.FINEST, Timer.class.getName(), "run",
-                    "Got unexpected exception when sending a notification", e);
-        }
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/javax/management/timer/TimerAlarmClock.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javax.management.timer;
+
+import java.util.Date;
+import java.util.logging.Level;
+import static com.sun.jmx.defaults.JmxProperties.TIMER_LOGGER;
+
+/**
+ * This class provides a simple implementation of an alarm clock MBean.
+ * The aim of this MBean is to set up an alarm which wakes up the timer every timeout (fixed-delay)
+ * or at the specified date (fixed-rate).
+ */
+
+class TimerAlarmClock extends java.util.TimerTask {
+
+    Timer listener = null;
+    long timeout = 10000;
+    Date next = null;
+
+    /*
+     * ------------------------------------------
+     *  CONSTRUCTORS
+     * ------------------------------------------
+     */
+
+    public TimerAlarmClock(Timer listener, long timeout) {
+        this.listener = listener;
+        this.timeout = Math.max(0L, timeout);
+    }
+
+    public TimerAlarmClock(Timer listener, Date next) {
+        this.listener = listener;
+        this.next = next;
+    }
+
+    /*
+     * ------------------------------------------
+     *  PUBLIC METHODS
+     * ------------------------------------------
+     */
+
+    /**
+     * This method is called by the timer when it is started.
+     */
+    public void run() {
+
+        try {
+            //this.sleep(timeout);
+            TimerAlarmClockNotification notif = new TimerAlarmClockNotification(this);
+            listener.notifyAlarmClock(notif);
+        } catch (Exception e) {
+            TIMER_LOGGER.logp(Level.FINEST, Timer.class.getName(), "run",
+                    "Got unexpected exception when sending a notification", e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/awt/im/ExecutableInputMethodManager.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,632 @@
+/*
+ * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.awt.im;
+
+import java.awt.AWTException;
+import java.awt.CheckboxMenuItem;
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.EventQueue;
+import java.awt.Frame;
+import java.awt.PopupMenu;
+import java.awt.Menu;
+import java.awt.MenuItem;
+import java.awt.Toolkit;
+import sun.awt.AppContext;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InvocationEvent;
+import java.awt.im.spi.InputMethodDescriptor;
+import java.lang.reflect.InvocationTargetException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.ServiceLoader;
+import java.util.Vector;
+import java.util.Set;
+import java.util.prefs.BackingStoreException;
+import java.util.prefs.Preferences;
+import sun.awt.InputMethodSupport;
+import sun.awt.SunToolkit;
+
+/**
+ * <code>ExecutableInputMethodManager</code> is the implementation of the
+ * <code>InputMethodManager</code> class. It is runnable as a separate
+ * thread in the AWT environment.&nbsp;
+ * <code>InputMethodManager.getInstance()</code> creates an instance of
+ * <code>ExecutableInputMethodManager</code> and executes it as a deamon
+ * thread.
+ *
+ * @see InputMethodManager
+ */
+class ExecutableInputMethodManager extends InputMethodManager
+                                   implements Runnable
+{
+    // the input context that's informed about selections from the user interface
+    private InputContext currentInputContext;
+
+    // Menu item string for the trigger menu.
+    private String triggerMenuString;
+
+    // popup menu for selecting an input method
+    private InputMethodPopupMenu selectionMenu;
+    private static String selectInputMethodMenuTitle;
+
+    // locator and name of host adapter
+    private InputMethodLocator hostAdapterLocator;
+
+    // locators for Java input methods
+    private int javaInputMethodCount;         // number of Java input methods found
+    private Vector<InputMethodLocator> javaInputMethodLocatorList;
+
+    // component that is requesting input method switch
+    // must be Frame or Dialog
+    private Component requestComponent;
+
+    // input context that is requesting input method switch
+    private InputContext requestInputContext;
+
+    // IM preference stuff
+    private static final String preferredIMNode = "/sun/awt/im/preferredInputMethod";
+    private static final String descriptorKey = "descriptor";
+    private Hashtable<String, InputMethodLocator> preferredLocatorCache = new Hashtable<>();
+    private Preferences userRoot;
+
+    ExecutableInputMethodManager() {
+
+        // set up host adapter locator
+        Toolkit toolkit = Toolkit.getDefaultToolkit();
+        try {
+            if (toolkit instanceof InputMethodSupport) {
+                InputMethodDescriptor hostAdapterDescriptor =
+                    ((InputMethodSupport)toolkit)
+                    .getInputMethodAdapterDescriptor();
+                if (hostAdapterDescriptor != null) {
+                    hostAdapterLocator = new InputMethodLocator(hostAdapterDescriptor, null, null);
+                }
+            }
+        } catch (AWTException e) {
+            // if we can't get a descriptor, we'll just have to do without native input methods
+        }
+
+        javaInputMethodLocatorList = new Vector<InputMethodLocator>();
+        initializeInputMethodLocatorList();
+    }
+
+    synchronized void initialize() {
+        selectInputMethodMenuTitle = Toolkit.getProperty("AWT.InputMethodSelectionMenu", "Select Input Method");
+
+        triggerMenuString = selectInputMethodMenuTitle;
+    }
+
+    public void run() {
+        // If there are no multiple input methods to choose from, wait forever
+        while (!hasMultipleInputMethods()) {
+            try {
+                synchronized (this) {
+                    wait();
+                }
+            } catch (InterruptedException e) {
+            }
+        }
+
+        // Loop for processing input method change requests
+        while (true) {
+            waitForChangeRequest();
+            initializeInputMethodLocatorList();
+            try {
+                if (requestComponent != null) {
+                    showInputMethodMenuOnRequesterEDT(requestComponent);
+                } else {
+                    // show the popup menu within the event thread
+                    EventQueue.invokeAndWait(new Runnable() {
+                        public void run() {
+                            showInputMethodMenu();
+                        }
+                    });
+                }
+            } catch (InterruptedException ie) {
+            } catch (InvocationTargetException ite) {
+                // should we do anything under these exceptions?
+            }
+        }
+    }
+
+    // Shows Input Method Menu on the EDT of requester component
+    // to avoid side effects. See 6544309.
+    private void showInputMethodMenuOnRequesterEDT(Component requester)
+        throws InterruptedException, InvocationTargetException {
+
+        if (requester == null){
+            return;
+        }
+
+        class AWTInvocationLock {}
+        Object lock = new AWTInvocationLock();
+
+        InvocationEvent event =
+                new InvocationEvent(requester,
+                                    new Runnable() {
+                                        public void run() {
+                                            showInputMethodMenu();
+                                        }
+                                    },
+                                    lock,
+                                    true);
+
+        AppContext requesterAppContext = SunToolkit.targetToAppContext(requester);
+        synchronized (lock) {
+            SunToolkit.postEvent(requesterAppContext, event);
+            while (!event.isDispatched()) {
+                lock.wait();
+            }
+        }
+
+        Throwable eventThrowable = event.getThrowable();
+        if (eventThrowable != null) {
+            throw new InvocationTargetException(eventThrowable);
+        }
+    }
+
+    void setInputContext(InputContext inputContext) {
+        if (currentInputContext != null && inputContext != null) {
+            // don't throw this exception until 4237852 is fixed
+            // throw new IllegalStateException("Can't have two active InputContext at the same time");
+        }
+        currentInputContext = inputContext;
+    }
+
+    public synchronized void notifyChangeRequest(Component comp) {
+        if (!(comp instanceof Frame || comp instanceof Dialog))
+            return;
+
+        // if busy with the current request, ignore this request.
+        if (requestComponent != null)
+            return;
+
+        requestComponent = comp;
+        notify();
+    }
+
+    public synchronized void notifyChangeRequestByHotKey(Component comp) {
+        while (!(comp instanceof Frame || comp instanceof Dialog)) {
+            if (comp == null) {
+                // no Frame or Dialog found in containment hierarchy.
+                return;
+            }
+            comp = comp.getParent();
+        }
+
+        notifyChangeRequest(comp);
+    }
+
+    public String getTriggerMenuString() {
+        return triggerMenuString;
+    }
+
+    /*
+     * Returns true if the environment indicates there are multiple input methods
+     */
+    boolean hasMultipleInputMethods() {
+        return ((hostAdapterLocator != null) && (javaInputMethodCount > 0)
+                || (javaInputMethodCount > 1));
+    }
+
+    private synchronized void waitForChangeRequest() {
+        try {
+            while (requestComponent == null) {
+                wait();
+            }
+        } catch (InterruptedException e) {
+        }
+    }
+
+    /*
+     * initializes the input method locator list for all
+     * installed input method descriptors.
+     */
+    private void initializeInputMethodLocatorList() {
+        synchronized (javaInputMethodLocatorList) {
+            javaInputMethodLocatorList.clear();
+            try {
+                AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+                    public Object run() {
+                        for (InputMethodDescriptor descriptor :
+                            ServiceLoader.loadInstalled(InputMethodDescriptor.class)) {
+                            ClassLoader cl = descriptor.getClass().getClassLoader();
+                            javaInputMethodLocatorList.add(new InputMethodLocator(descriptor, cl, null));
+                        }
+                        return null;
+                    }
+                });
+            }  catch (PrivilegedActionException e) {
+                e.printStackTrace();
+            }
+            javaInputMethodCount = javaInputMethodLocatorList.size();
+        }
+
+        if (hasMultipleInputMethods()) {
+            // initialize preferences
+            if (userRoot == null) {
+                userRoot = getUserRoot();
+            }
+        } else {
+            // indicate to clients not to offer the menu
+            triggerMenuString = null;
+        }
+    }
+
+    private void showInputMethodMenu() {
+
+        if (!hasMultipleInputMethods()) {
+            requestComponent = null;
+            return;
+        }
+
+        // initialize pop-up menu
+        selectionMenu = InputMethodPopupMenu.getInstance(requestComponent, selectInputMethodMenuTitle);
+
+        // we have to rebuild the menu each time because
+        // some input methods (such as IIIMP) may change
+        // their list of supported locales dynamically
+        selectionMenu.removeAll();
+
+        // get information about the currently selected input method
+        // ??? if there's no current input context, what's the point
+        // of showing the menu?
+        String currentSelection = getCurrentSelection();
+
+        // Add menu item for host adapter
+        if (hostAdapterLocator != null) {
+            selectionMenu.addOneInputMethodToMenu(hostAdapterLocator, currentSelection);
+            selectionMenu.addSeparator();
+        }
+
+        // Add menu items for other input methods
+        for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
+            InputMethodLocator locator = javaInputMethodLocatorList.get(i);
+            selectionMenu.addOneInputMethodToMenu(locator, currentSelection);
+        }
+
+        synchronized (this) {
+            selectionMenu.addToComponent(requestComponent);
+            requestInputContext = currentInputContext;
+            selectionMenu.show(requestComponent, 60, 80); // TODO: get proper x, y...
+            requestComponent = null;
+        }
+    }
+
+    private String getCurrentSelection() {
+        InputContext inputContext = currentInputContext;
+        if (inputContext != null) {
+            InputMethodLocator locator = inputContext.getInputMethodLocator();
+            if (locator != null) {
+                return locator.getActionCommandString();
+            }
+        }
+        return null;
+    }
+
+    synchronized void changeInputMethod(String choice) {
+        InputMethodLocator locator = null;
+
+        String inputMethodName = choice;
+        String localeString = null;
+        int index = choice.indexOf('\n');
+        if (index != -1) {
+            localeString = choice.substring(index + 1);
+            inputMethodName = choice.substring(0, index);
+        }
+        if (hostAdapterLocator.getActionCommandString().equals(inputMethodName)) {
+            locator = hostAdapterLocator;
+        } else {
+            for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
+                InputMethodLocator candidate = javaInputMethodLocatorList.get(i);
+                String name = candidate.getActionCommandString();
+                if (name.equals(inputMethodName)) {
+                    locator = candidate;
+                    break;
+                }
+            }
+        }
+
+        if (locator != null && localeString != null) {
+            String language = "", country = "", variant = "";
+            int postIndex = localeString.indexOf('_');
+            if (postIndex == -1) {
+                language = localeString;
+            } else {
+                language = localeString.substring(0, postIndex);
+                int preIndex = postIndex + 1;
+                postIndex = localeString.indexOf('_', preIndex);
+                if (postIndex == -1) {
+                    country = localeString.substring(preIndex);
+                } else {
+                    country = localeString.substring(preIndex, postIndex);
+                    variant = localeString.substring(postIndex + 1);
+                }
+            }
+            Locale locale = new Locale(language, country, variant);
+            locator = locator.deriveLocator(locale);
+        }
+
+        if (locator == null)
+            return;
+
+        // tell the input context about the change
+        if (requestInputContext != null) {
+            requestInputContext.changeInputMethod(locator);
+            requestInputContext = null;
+
+            // remember the selection
+            putPreferredInputMethod(locator);
+        }
+    }
+
+    InputMethodLocator findInputMethod(Locale locale) {
+        // look for preferred input method first
+        InputMethodLocator locator = getPreferredInputMethod(locale);
+        if (locator != null) {
+            return locator;
+        }
+
+        if (hostAdapterLocator != null && hostAdapterLocator.isLocaleAvailable(locale)) {
+            return hostAdapterLocator.deriveLocator(locale);
+        }
+
+        // Update the locator list
+        initializeInputMethodLocatorList();
+
+        for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
+            InputMethodLocator candidate = javaInputMethodLocatorList.get(i);
+            if (candidate.isLocaleAvailable(locale)) {
+                return candidate.deriveLocator(locale);
+            }
+        }
+        return null;
+    }
+
+    Locale getDefaultKeyboardLocale() {
+        Toolkit toolkit = Toolkit.getDefaultToolkit();
+        if (toolkit instanceof InputMethodSupport) {
+            return ((InputMethodSupport)toolkit).getDefaultKeyboardLocale();
+        } else {
+            return Locale.getDefault();
+        }
+    }
+
+    /**
+     * Returns a InputMethodLocator object that the
+     * user prefers for the given locale.
+     *
+     * @param locale Locale for which the user prefers the input method.
+     */
+    private synchronized InputMethodLocator getPreferredInputMethod(Locale locale) {
+        InputMethodLocator preferredLocator = null;
+
+        if (!hasMultipleInputMethods()) {
+            // No need to look for a preferred Java input method
+            return null;
+        }
+
+        // look for the cached preference first.
+        preferredLocator = preferredLocatorCache.get(locale.toString().intern());
+        if (preferredLocator != null) {
+            return preferredLocator;
+        }
+
+        // look for the preference in the user preference tree
+        String nodePath = findPreferredInputMethodNode(locale);
+        String descriptorName = readPreferredInputMethod(nodePath);
+        Locale advertised;
+
+        // get the locator object
+        if (descriptorName != null) {
+            // check for the host adapter first
+            if (hostAdapterLocator != null &&
+                hostAdapterLocator.getDescriptor().getClass().getName().equals(descriptorName)) {
+                advertised = getAdvertisedLocale(hostAdapterLocator, locale);
+                if (advertised != null) {
+                    preferredLocator = hostAdapterLocator.deriveLocator(advertised);
+                    preferredLocatorCache.put(locale.toString().intern(), preferredLocator);
+                }
+                return preferredLocator;
+            }
+            // look for Java input methods
+            for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
+                InputMethodLocator locator = javaInputMethodLocatorList.get(i);
+                InputMethodDescriptor descriptor = locator.getDescriptor();
+                if (descriptor.getClass().getName().equals(descriptorName)) {
+                    advertised = getAdvertisedLocale(locator, locale);
+                    if (advertised != null) {
+                        preferredLocator = locator.deriveLocator(advertised);
+                        preferredLocatorCache.put(locale.toString().intern(), preferredLocator);
+                    }
+                    return preferredLocator;
+                }
+            }
+
+            // maybe preferred input method information is bogus.
+            writePreferredInputMethod(nodePath, null);
+        }
+
+        return null;
+    }
+
+    private String findPreferredInputMethodNode(Locale locale) {
+        if (userRoot == null) {
+            return null;
+        }
+
+        // create locale node relative path
+        String nodePath = preferredIMNode + "/" + createLocalePath(locale);
+
+        // look for the descriptor
+        while (!nodePath.equals(preferredIMNode)) {
+            try {
+                if (userRoot.nodeExists(nodePath)) {
+                    if (readPreferredInputMethod(nodePath) != null) {
+                        return nodePath;
+                    }
+                }
+            } catch (BackingStoreException bse) {
+            }
+
+            // search at parent's node
+            nodePath = nodePath.substring(0, nodePath.lastIndexOf('/'));
+        }
+
+        return null;
+    }
+
+    private String readPreferredInputMethod(String nodePath) {
+        if ((userRoot == null) || (nodePath == null)) {
+            return null;
+        }
+
+        return userRoot.node(nodePath).get(descriptorKey, null);
+    }
+
+    /**
+     * Writes the preferred input method descriptor class name into
+     * the user's Preferences tree in accordance with the given locale.
+     *
+     * @param inputMethodLocator input method locator to remember.
+     */
+    private synchronized void putPreferredInputMethod(InputMethodLocator locator) {
+        InputMethodDescriptor descriptor = locator.getDescriptor();
+        Locale preferredLocale = locator.getLocale();
+
+        if (preferredLocale == null) {
+            // check available locales of the input method
+            try {
+                Locale[] availableLocales = descriptor.getAvailableLocales();
+                if (availableLocales.length == 1) {
+                    preferredLocale = availableLocales[0];
+                } else {
+                    // there is no way to know which locale is the preferred one, so do nothing.
+                    return;
+                }
+            } catch (AWTException ae) {
+                // do nothing here, either.
+                return;
+            }
+        }
+
+        // for regions that have only one language, we need to regard
+        // "xx_YY" as "xx" when putting the preference into tree
+        if (preferredLocale.equals(Locale.JAPAN)) {
+            preferredLocale = Locale.JAPANESE;
+        }
+        if (preferredLocale.equals(Locale.KOREA)) {
+            preferredLocale = Locale.KOREAN;
+        }
+        if (preferredLocale.equals(new Locale("th", "TH"))) {
+            preferredLocale = new Locale("th");
+        }
+
+        // obtain node
+        String path = preferredIMNode + "/" + createLocalePath(preferredLocale);
+
+        // write in the preference tree
+        writePreferredInputMethod(path, descriptor.getClass().getName());
+        preferredLocatorCache.put(preferredLocale.toString().intern(),
+            locator.deriveLocator(preferredLocale));
+
+        return;
+    }
+
+    private String createLocalePath(Locale locale) {
+        String language = locale.getLanguage();
+        String country = locale.getCountry();
+        String variant = locale.getVariant();
+        String localePath = null;
+        if (!variant.equals("")) {
+            localePath = "_" + language + "/_" + country + "/_" + variant;
+        } else if (!country.equals("")) {
+            localePath = "_" + language + "/_" + country;
+        } else {
+            localePath = "_" + language;
+        }
+
+        return localePath;
+    }
+
+    private void writePreferredInputMethod(String path, String descriptorName) {
+        if (userRoot != null) {
+            Preferences node = userRoot.node(path);
+
+            // record it
+            if (descriptorName != null) {
+                node.put(descriptorKey, descriptorName);
+            } else {
+                node.remove(descriptorKey);
+            }
+        }
+    }
+
+    private Preferences getUserRoot() {
+        return AccessController.doPrivileged(new PrivilegedAction<Preferences>() {
+            public Preferences run() {
+                return Preferences.userRoot();
+            }
+        });
+    }
+
+    private Locale getAdvertisedLocale(InputMethodLocator locator, Locale locale) {
+        Locale advertised = null;
+
+        if (locator.isLocaleAvailable(locale)) {
+            advertised = locale;
+        } else if (locale.getLanguage().equals("ja")) {
+            // for Japanese, Korean, and Thai, check whether the input method supports
+            // language or language_COUNTRY.
+            if (locator.isLocaleAvailable(Locale.JAPAN)) {
+                advertised = Locale.JAPAN;
+            } else if (locator.isLocaleAvailable(Locale.JAPANESE)) {
+                advertised = Locale.JAPANESE;
+            }
+        } else if (locale.getLanguage().equals("ko")) {
+            if (locator.isLocaleAvailable(Locale.KOREA)) {
+                advertised = Locale.KOREA;
+            } else if (locator.isLocaleAvailable(Locale.KOREAN)) {
+                advertised = Locale.KOREAN;
+            }
+        } else if (locale.getLanguage().equals("th")) {
+            if (locator.isLocaleAvailable(new Locale("th", "TH"))) {
+                advertised = new Locale("th", "TH");
+            } else if (locator.isLocaleAvailable(new Locale("th"))) {
+                advertised = new Locale("th");
+            }
+        }
+
+        return advertised;
+    }
+}
--- a/src/share/classes/sun/awt/im/InputMethodManager.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/src/share/classes/sun/awt/im/InputMethodManager.java	Mon Oct 29 14:12:37 2012 +0100
@@ -229,578 +229,3 @@
     abstract boolean hasMultipleInputMethods();
 
 }
-
-/**
- * <code>ExecutableInputMethodManager</code> is the implementation of the
- * <code>InputMethodManager</code> class. It is runnable as a separate
- * thread in the AWT environment.&nbsp;
- * <code>InputMethodManager.getInstance()</code> creates an instance of
- * <code>ExecutableInputMethodManager</code> and executes it as a deamon
- * thread.
- *
- * @see InputMethodManager
- */
-class ExecutableInputMethodManager extends InputMethodManager
-                                   implements Runnable
-{
-    // the input context that's informed about selections from the user interface
-    private InputContext currentInputContext;
-
-    // Menu item string for the trigger menu.
-    private String triggerMenuString;
-
-    // popup menu for selecting an input method
-    private InputMethodPopupMenu selectionMenu;
-    private static String selectInputMethodMenuTitle;
-
-    // locator and name of host adapter
-    private InputMethodLocator hostAdapterLocator;
-
-    // locators for Java input methods
-    private int javaInputMethodCount;         // number of Java input methods found
-    private Vector<InputMethodLocator> javaInputMethodLocatorList;
-
-    // component that is requesting input method switch
-    // must be Frame or Dialog
-    private Component requestComponent;
-
-    // input context that is requesting input method switch
-    private InputContext requestInputContext;
-
-    // IM preference stuff
-    private static final String preferredIMNode = "/sun/awt/im/preferredInputMethod";
-    private static final String descriptorKey = "descriptor";
-    private Hashtable<String, InputMethodLocator> preferredLocatorCache = new Hashtable<>();
-    private Preferences userRoot;
-
-    ExecutableInputMethodManager() {
-
-        // set up host adapter locator
-        Toolkit toolkit = Toolkit.getDefaultToolkit();
-        try {
-            if (toolkit instanceof InputMethodSupport) {
-                InputMethodDescriptor hostAdapterDescriptor =
-                    ((InputMethodSupport)toolkit)
-                    .getInputMethodAdapterDescriptor();
-                if (hostAdapterDescriptor != null) {
-                    hostAdapterLocator = new InputMethodLocator(hostAdapterDescriptor, null, null);
-                }
-            }
-        } catch (AWTException e) {
-            // if we can't get a descriptor, we'll just have to do without native input methods
-        }
-
-        javaInputMethodLocatorList = new Vector<InputMethodLocator>();
-        initializeInputMethodLocatorList();
-    }
-
-    synchronized void initialize() {
-        selectInputMethodMenuTitle = Toolkit.getProperty("AWT.InputMethodSelectionMenu", "Select Input Method");
-
-        triggerMenuString = selectInputMethodMenuTitle;
-    }
-
-    public void run() {
-        // If there are no multiple input methods to choose from, wait forever
-        while (!hasMultipleInputMethods()) {
-            try {
-                synchronized (this) {
-                    wait();
-                }
-            } catch (InterruptedException e) {
-            }
-        }
-
-        // Loop for processing input method change requests
-        while (true) {
-            waitForChangeRequest();
-            initializeInputMethodLocatorList();
-            try {
-                if (requestComponent != null) {
-                    showInputMethodMenuOnRequesterEDT(requestComponent);
-                } else {
-                    // show the popup menu within the event thread
-                    EventQueue.invokeAndWait(new Runnable() {
-                        public void run() {
-                            showInputMethodMenu();
-                        }
-                    });
-                }
-            } catch (InterruptedException ie) {
-            } catch (InvocationTargetException ite) {
-                // should we do anything under these exceptions?
-            }
-        }
-    }
-
-    // Shows Input Method Menu on the EDT of requester component
-    // to avoid side effects. See 6544309.
-    private void showInputMethodMenuOnRequesterEDT(Component requester)
-        throws InterruptedException, InvocationTargetException {
-
-        if (requester == null){
-            return;
-        }
-
-        class AWTInvocationLock {}
-        Object lock = new AWTInvocationLock();
-
-        InvocationEvent event =
-                new InvocationEvent(requester,
-                                    new Runnable() {
-                                        public void run() {
-                                            showInputMethodMenu();
-                                        }
-                                    },
-                                    lock,
-                                    true);
-
-        AppContext requesterAppContext = SunToolkit.targetToAppContext(requester);
-        synchronized (lock) {
-            SunToolkit.postEvent(requesterAppContext, event);
-            while (!event.isDispatched()) {
-                lock.wait();
-            }
-        }
-
-        Throwable eventThrowable = event.getThrowable();
-        if (eventThrowable != null) {
-            throw new InvocationTargetException(eventThrowable);
-        }
-    }
-
-    void setInputContext(InputContext inputContext) {
-        if (currentInputContext != null && inputContext != null) {
-            // don't throw this exception until 4237852 is fixed
-            // throw new IllegalStateException("Can't have two active InputContext at the same time");
-        }
-        currentInputContext = inputContext;
-    }
-
-    public synchronized void notifyChangeRequest(Component comp) {
-        if (!(comp instanceof Frame || comp instanceof Dialog))
-            return;
-
-        // if busy with the current request, ignore this request.
-        if (requestComponent != null)
-            return;
-
-        requestComponent = comp;
-        notify();
-    }
-
-    public synchronized void notifyChangeRequestByHotKey(Component comp) {
-        while (!(comp instanceof Frame || comp instanceof Dialog)) {
-            if (comp == null) {
-                // no Frame or Dialog found in containment hierarchy.
-                return;
-            }
-            comp = comp.getParent();
-        }
-
-        notifyChangeRequest(comp);
-    }
-
-    public String getTriggerMenuString() {
-        return triggerMenuString;
-    }
-
-    /*
-     * Returns true if the environment indicates there are multiple input methods
-     */
-    boolean hasMultipleInputMethods() {
-        return ((hostAdapterLocator != null) && (javaInputMethodCount > 0)
-                || (javaInputMethodCount > 1));
-    }
-
-    private synchronized void waitForChangeRequest() {
-        try {
-            while (requestComponent == null) {
-                wait();
-            }
-        } catch (InterruptedException e) {
-        }
-    }
-
-    /*
-     * initializes the input method locator list for all
-     * installed input method descriptors.
-     */
-    private void initializeInputMethodLocatorList() {
-        synchronized (javaInputMethodLocatorList) {
-            javaInputMethodLocatorList.clear();
-            try {
-                AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
-                    public Object run() {
-                        for (InputMethodDescriptor descriptor :
-                            ServiceLoader.loadInstalled(InputMethodDescriptor.class)) {
-                            ClassLoader cl = descriptor.getClass().getClassLoader();
-                            javaInputMethodLocatorList.add(new InputMethodLocator(descriptor, cl, null));
-                        }
-                        return null;
-                    }
-                });
-            }  catch (PrivilegedActionException e) {
-                e.printStackTrace();
-            }
-            javaInputMethodCount = javaInputMethodLocatorList.size();
-        }
-
-        if (hasMultipleInputMethods()) {
-            // initialize preferences
-            if (userRoot == null) {
-                userRoot = getUserRoot();
-            }
-        } else {
-            // indicate to clients not to offer the menu
-            triggerMenuString = null;
-        }
-    }
-
-    private void showInputMethodMenu() {
-
-        if (!hasMultipleInputMethods()) {
-            requestComponent = null;
-            return;
-        }
-
-        // initialize pop-up menu
-        selectionMenu = InputMethodPopupMenu.getInstance(requestComponent, selectInputMethodMenuTitle);
-
-        // we have to rebuild the menu each time because
-        // some input methods (such as IIIMP) may change
-        // their list of supported locales dynamically
-        selectionMenu.removeAll();
-
-        // get information about the currently selected input method
-        // ??? if there's no current input context, what's the point
-        // of showing the menu?
-        String currentSelection = getCurrentSelection();
-
-        // Add menu item for host adapter
-        if (hostAdapterLocator != null) {
-            selectionMenu.addOneInputMethodToMenu(hostAdapterLocator, currentSelection);
-            selectionMenu.addSeparator();
-        }
-
-        // Add menu items for other input methods
-        for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
-            InputMethodLocator locator = javaInputMethodLocatorList.get(i);
-            selectionMenu.addOneInputMethodToMenu(locator, currentSelection);
-        }
-
-        synchronized (this) {
-            selectionMenu.addToComponent(requestComponent);
-            requestInputContext = currentInputContext;
-            selectionMenu.show(requestComponent, 60, 80); // TODO: get proper x, y...
-            requestComponent = null;
-        }
-    }
-
-    private String getCurrentSelection() {
-        InputContext inputContext = currentInputContext;
-        if (inputContext != null) {
-            InputMethodLocator locator = inputContext.getInputMethodLocator();
-            if (locator != null) {
-                return locator.getActionCommandString();
-            }
-        }
-        return null;
-    }
-
-    synchronized void changeInputMethod(String choice) {
-        InputMethodLocator locator = null;
-
-        String inputMethodName = choice;
-        String localeString = null;
-        int index = choice.indexOf('\n');
-        if (index != -1) {
-            localeString = choice.substring(index + 1);
-            inputMethodName = choice.substring(0, index);
-        }
-        if (hostAdapterLocator.getActionCommandString().equals(inputMethodName)) {
-            locator = hostAdapterLocator;
-        } else {
-            for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
-                InputMethodLocator candidate = javaInputMethodLocatorList.get(i);
-                String name = candidate.getActionCommandString();
-                if (name.equals(inputMethodName)) {
-                    locator = candidate;
-                    break;
-                }
-            }
-        }
-
-        if (locator != null && localeString != null) {
-            String language = "", country = "", variant = "";
-            int postIndex = localeString.indexOf('_');
-            if (postIndex == -1) {
-                language = localeString;
-            } else {
-                language = localeString.substring(0, postIndex);
-                int preIndex = postIndex + 1;
-                postIndex = localeString.indexOf('_', preIndex);
-                if (postIndex == -1) {
-                    country = localeString.substring(preIndex);
-                } else {
-                    country = localeString.substring(preIndex, postIndex);
-                    variant = localeString.substring(postIndex + 1);
-                }
-            }
-            Locale locale = new Locale(language, country, variant);
-            locator = locator.deriveLocator(locale);
-        }
-
-        if (locator == null)
-            return;
-
-        // tell the input context about the change
-        if (requestInputContext != null) {
-            requestInputContext.changeInputMethod(locator);
-            requestInputContext = null;
-
-            // remember the selection
-            putPreferredInputMethod(locator);
-        }
-    }
-
-    InputMethodLocator findInputMethod(Locale locale) {
-        // look for preferred input method first
-        InputMethodLocator locator = getPreferredInputMethod(locale);
-        if (locator != null) {
-            return locator;
-        }
-
-        if (hostAdapterLocator != null && hostAdapterLocator.isLocaleAvailable(locale)) {
-            return hostAdapterLocator.deriveLocator(locale);
-        }
-
-        // Update the locator list
-        initializeInputMethodLocatorList();
-
-        for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
-            InputMethodLocator candidate = javaInputMethodLocatorList.get(i);
-            if (candidate.isLocaleAvailable(locale)) {
-                return candidate.deriveLocator(locale);
-            }
-        }
-        return null;
-    }
-
-    Locale getDefaultKeyboardLocale() {
-        Toolkit toolkit = Toolkit.getDefaultToolkit();
-        if (toolkit instanceof InputMethodSupport) {
-            return ((InputMethodSupport)toolkit).getDefaultKeyboardLocale();
-        } else {
-            return Locale.getDefault();
-        }
-    }
-
-    /**
-     * Returns a InputMethodLocator object that the
-     * user prefers for the given locale.
-     *
-     * @param locale Locale for which the user prefers the input method.
-     */
-    private synchronized InputMethodLocator getPreferredInputMethod(Locale locale) {
-        InputMethodLocator preferredLocator = null;
-
-        if (!hasMultipleInputMethods()) {
-            // No need to look for a preferred Java input method
-            return null;
-        }
-
-        // look for the cached preference first.
-        preferredLocator = preferredLocatorCache.get(locale.toString().intern());
-        if (preferredLocator != null) {
-            return preferredLocator;
-        }
-
-        // look for the preference in the user preference tree
-        String nodePath = findPreferredInputMethodNode(locale);
-        String descriptorName = readPreferredInputMethod(nodePath);
-        Locale advertised;
-
-        // get the locator object
-        if (descriptorName != null) {
-            // check for the host adapter first
-            if (hostAdapterLocator != null &&
-                hostAdapterLocator.getDescriptor().getClass().getName().equals(descriptorName)) {
-                advertised = getAdvertisedLocale(hostAdapterLocator, locale);
-                if (advertised != null) {
-                    preferredLocator = hostAdapterLocator.deriveLocator(advertised);
-                    preferredLocatorCache.put(locale.toString().intern(), preferredLocator);
-                }
-                return preferredLocator;
-            }
-            // look for Java input methods
-            for (int i = 0; i < javaInputMethodLocatorList.size(); i++) {
-                InputMethodLocator locator = javaInputMethodLocatorList.get(i);
-                InputMethodDescriptor descriptor = locator.getDescriptor();
-                if (descriptor.getClass().getName().equals(descriptorName)) {
-                    advertised = getAdvertisedLocale(locator, locale);
-                    if (advertised != null) {
-                        preferredLocator = locator.deriveLocator(advertised);
-                        preferredLocatorCache.put(locale.toString().intern(), preferredLocator);
-                    }
-                    return preferredLocator;
-                }
-            }
-
-            // maybe preferred input method information is bogus.
-            writePreferredInputMethod(nodePath, null);
-        }
-
-        return null;
-    }
-
-    private String findPreferredInputMethodNode(Locale locale) {
-        if (userRoot == null) {
-            return null;
-        }
-
-        // create locale node relative path
-        String nodePath = preferredIMNode + "/" + createLocalePath(locale);
-
-        // look for the descriptor
-        while (!nodePath.equals(preferredIMNode)) {
-            try {
-                if (userRoot.nodeExists(nodePath)) {
-                    if (readPreferredInputMethod(nodePath) != null) {
-                        return nodePath;
-                    }
-                }
-            } catch (BackingStoreException bse) {
-            }
-
-            // search at parent's node
-            nodePath = nodePath.substring(0, nodePath.lastIndexOf('/'));
-        }
-
-        return null;
-    }
-
-    private String readPreferredInputMethod(String nodePath) {
-        if ((userRoot == null) || (nodePath == null)) {
-            return null;
-        }
-
-        return userRoot.node(nodePath).get(descriptorKey, null);
-    }
-
-    /**
-     * Writes the preferred input method descriptor class name into
-     * the user's Preferences tree in accordance with the given locale.
-     *
-     * @param inputMethodLocator input method locator to remember.
-     */
-    private synchronized void putPreferredInputMethod(InputMethodLocator locator) {
-        InputMethodDescriptor descriptor = locator.getDescriptor();
-        Locale preferredLocale = locator.getLocale();
-
-        if (preferredLocale == null) {
-            // check available locales of the input method
-            try {
-                Locale[] availableLocales = descriptor.getAvailableLocales();
-                if (availableLocales.length == 1) {
-                    preferredLocale = availableLocales[0];
-                } else {
-                    // there is no way to know which locale is the preferred one, so do nothing.
-                    return;
-                }
-            } catch (AWTException ae) {
-                // do nothing here, either.
-                return;
-            }
-        }
-
-        // for regions that have only one language, we need to regard
-        // "xx_YY" as "xx" when putting the preference into tree
-        if (preferredLocale.equals(Locale.JAPAN)) {
-            preferredLocale = Locale.JAPANESE;
-        }
-        if (preferredLocale.equals(Locale.KOREA)) {
-            preferredLocale = Locale.KOREAN;
-        }
-        if (preferredLocale.equals(new Locale("th", "TH"))) {
-            preferredLocale = new Locale("th");
-        }
-
-        // obtain node
-        String path = preferredIMNode + "/" + createLocalePath(preferredLocale);
-
-        // write in the preference tree
-        writePreferredInputMethod(path, descriptor.getClass().getName());
-        preferredLocatorCache.put(preferredLocale.toString().intern(),
-            locator.deriveLocator(preferredLocale));
-
-        return;
-    }
-
-    private String createLocalePath(Locale locale) {
-        String language = locale.getLanguage();
-        String country = locale.getCountry();
-        String variant = locale.getVariant();
-        String localePath = null;
-        if (!variant.equals("")) {
-            localePath = "_" + language + "/_" + country + "/_" + variant;
-        } else if (!country.equals("")) {
-            localePath = "_" + language + "/_" + country;
-        } else {
-            localePath = "_" + language;
-        }
-
-        return localePath;
-    }
-
-    private void writePreferredInputMethod(String path, String descriptorName) {
-        if (userRoot != null) {
-            Preferences node = userRoot.node(path);
-
-            // record it
-            if (descriptorName != null) {
-                node.put(descriptorKey, descriptorName);
-            } else {
-                node.remove(descriptorKey);
-            }
-        }
-    }
-
-    private Preferences getUserRoot() {
-        return AccessController.doPrivileged(new PrivilegedAction<Preferences>() {
-            public Preferences run() {
-                return Preferences.userRoot();
-            }
-        });
-    }
-
-    private Locale getAdvertisedLocale(InputMethodLocator locator, Locale locale) {
-        Locale advertised = null;
-
-        if (locator.isLocaleAvailable(locale)) {
-            advertised = locale;
-        } else if (locale.getLanguage().equals("ja")) {
-            // for Japanese, Korean, and Thai, check whether the input method supports
-            // language or language_COUNTRY.
-            if (locator.isLocaleAvailable(Locale.JAPAN)) {
-                advertised = Locale.JAPAN;
-            } else if (locator.isLocaleAvailable(Locale.JAPANESE)) {
-                advertised = Locale.JAPANESE;
-            }
-        } else if (locale.getLanguage().equals("ko")) {
-            if (locator.isLocaleAvailable(Locale.KOREA)) {
-                advertised = Locale.KOREA;
-            } else if (locator.isLocaleAvailable(Locale.KOREAN)) {
-                advertised = Locale.KOREAN;
-            }
-        } else if (locale.getLanguage().equals("th")) {
-            if (locator.isLocaleAvailable(new Locale("th", "TH"))) {
-                advertised = new Locale("th", "TH");
-            } else if (locator.isLocaleAvailable(new Locale("th"))) {
-                advertised = new Locale("th");
-            }
-        }
-
-        return advertised;
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/misc/FDBigInt.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,493 @@
+/*
+ * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.misc;
+
+/*
+ * A really, really simple bigint package
+ * tailored to the needs of floating base conversion.
+ */
+class FDBigInt {
+    int nWords; // number of words used
+    int data[]; // value: data[0] is least significant
+
+
+    public FDBigInt( int v ){
+        nWords = 1;
+        data = new int[1];
+        data[0] = v;
+    }
+
+    public FDBigInt( long v ){
+        data = new int[2];
+        data[0] = (int)v;
+        data[1] = (int)(v>>>32);
+        nWords = (data[1]==0) ? 1 : 2;
+    }
+
+    public FDBigInt( FDBigInt other ){
+        data = new int[nWords = other.nWords];
+        System.arraycopy( other.data, 0, data, 0, nWords );
+    }
+
+    private FDBigInt( int [] d, int n ){
+        data = d;
+        nWords = n;
+    }
+
+    public FDBigInt( long seed, char digit[], int nd0, int nd ){
+        int n= (nd+8)/9;        // estimate size needed.
+        if ( n < 2 ) n = 2;
+        data = new int[n];      // allocate enough space
+        data[0] = (int)seed;    // starting value
+        data[1] = (int)(seed>>>32);
+        nWords = (data[1]==0) ? 1 : 2;
+        int i = nd0;
+        int limit = nd-5;       // slurp digits 5 at a time.
+        int v;
+        while ( i < limit ){
+            int ilim = i+5;
+            v = (int)digit[i++]-(int)'0';
+            while( i <ilim ){
+                v = 10*v + (int)digit[i++]-(int)'0';
+            }
+            multaddMe( 100000, v); // ... where 100000 is 10^5.
+        }
+        int factor = 1;
+        v = 0;
+        while ( i < nd ){
+            v = 10*v + (int)digit[i++]-(int)'0';
+            factor *= 10;
+        }
+        if ( factor != 1 ){
+            multaddMe( factor, v );
+        }
+    }
+
+    /*
+     * Left shift by c bits.
+     * Shifts this in place.
+     */
+    public void
+    lshiftMe( int c )throws IllegalArgumentException {
+        if ( c <= 0 ){
+            if ( c == 0 )
+                return; // silly.
+            else
+                throw new IllegalArgumentException("negative shift count");
+        }
+        int wordcount = c>>5;
+        int bitcount  = c & 0x1f;
+        int anticount = 32-bitcount;
+        int t[] = data;
+        int s[] = data;
+        if ( nWords+wordcount+1 > t.length ){
+            // reallocate.
+            t = new int[ nWords+wordcount+1 ];
+        }
+        int target = nWords+wordcount;
+        int src    = nWords-1;
+        if ( bitcount == 0 ){
+            // special hack, since an anticount of 32 won't go!
+            System.arraycopy( s, 0, t, wordcount, nWords );
+            target = wordcount-1;
+        } else {
+            t[target--] = s[src]>>>anticount;
+            while ( src >= 1 ){
+                t[target--] = (s[src]<<bitcount) | (s[--src]>>>anticount);
+            }
+            t[target--] = s[src]<<bitcount;
+        }
+        while( target >= 0 ){
+            t[target--] = 0;
+        }
+        data = t;
+        nWords += wordcount + 1;
+        // may have constructed high-order word of 0.
+        // if so, trim it
+        while ( nWords > 1 && data[nWords-1] == 0 )
+            nWords--;
+    }
+
+    /*
+     * normalize this number by shifting until
+     * the MSB of the number is at 0x08000000.
+     * This is in preparation for quoRemIteration, below.
+     * The idea is that, to make division easier, we want the
+     * divisor to be "normalized" -- usually this means shifting
+     * the MSB into the high words sign bit. But because we know that
+     * the quotient will be 0 < q < 10, we would like to arrange that
+     * the dividend not span up into another word of precision.
+     * (This needs to be explained more clearly!)
+     */
+    public int
+    normalizeMe() throws IllegalArgumentException {
+        int src;
+        int wordcount = 0;
+        int bitcount  = 0;
+        int v = 0;
+        for ( src= nWords-1 ; src >= 0 && (v=data[src]) == 0 ; src--){
+            wordcount += 1;
+        }
+        if ( src < 0 ){
+            // oops. Value is zero. Cannot normalize it!
+            throw new IllegalArgumentException("zero value");
+        }
+        /*
+         * In most cases, we assume that wordcount is zero. This only
+         * makes sense, as we try not to maintain any high-order
+         * words full of zeros. In fact, if there are zeros, we will
+         * simply SHORTEN our number at this point. Watch closely...
+         */
+        nWords -= wordcount;
+        /*
+         * Compute how far left we have to shift v s.t. its highest-
+         * order bit is in the right place. Then call lshiftMe to
+         * do the work.
+         */
+        if ( (v & 0xf0000000) != 0 ){
+            // will have to shift up into the next word.
+            // too bad.
+            for( bitcount = 32 ; (v & 0xf0000000) != 0 ; bitcount-- )
+                v >>>= 1;
+        } else {
+            while ( v <= 0x000fffff ){
+                // hack: byte-at-a-time shifting
+                v <<= 8;
+                bitcount += 8;
+            }
+            while ( v <= 0x07ffffff ){
+                v <<= 1;
+                bitcount += 1;
+            }
+        }
+        if ( bitcount != 0 )
+            lshiftMe( bitcount );
+        return bitcount;
+    }
+
+    /*
+     * Multiply a FDBigInt by an int.
+     * Result is a new FDBigInt.
+     */
+    public FDBigInt
+    mult( int iv ) {
+        long v = iv;
+        int r[];
+        long p;
+
+        // guess adequate size of r.
+        r = new int[ ( v * ((long)data[nWords-1]&0xffffffffL) > 0xfffffffL ) ? nWords+1 : nWords ];
+        p = 0L;
+        for( int i=0; i < nWords; i++ ) {
+            p += v * ((long)data[i]&0xffffffffL);
+            r[i] = (int)p;
+            p >>>= 32;
+        }
+        if ( p == 0L){
+            return new FDBigInt( r, nWords );
+        } else {
+            r[nWords] = (int)p;
+            return new FDBigInt( r, nWords+1 );
+        }
+    }
+
+    /*
+     * Multiply a FDBigInt by an int and add another int.
+     * Result is computed in place.
+     * Hope it fits!
+     */
+    public void
+    multaddMe( int iv, int addend ) {
+        long v = iv;
+        long p;
+
+        // unroll 0th iteration, doing addition.
+        p = v * ((long)data[0]&0xffffffffL) + ((long)addend&0xffffffffL);
+        data[0] = (int)p;
+        p >>>= 32;
+        for( int i=1; i < nWords; i++ ) {
+            p += v * ((long)data[i]&0xffffffffL);
+            data[i] = (int)p;
+            p >>>= 32;
+        }
+        if ( p != 0L){
+            data[nWords] = (int)p; // will fail noisily if illegal!
+            nWords++;
+        }
+    }
+
+    /*
+     * Multiply a FDBigInt by another FDBigInt.
+     * Result is a new FDBigInt.
+     */
+    public FDBigInt
+    mult( FDBigInt other ){
+        // crudely guess adequate size for r
+        int r[] = new int[ nWords + other.nWords ];
+        int i;
+        // I think I am promised zeros...
+
+        for( i = 0; i < this.nWords; i++ ){
+            long v = (long)this.data[i] & 0xffffffffL; // UNSIGNED CONVERSION
+            long p = 0L;
+            int j;
+            for( j = 0; j < other.nWords; j++ ){
+                p += ((long)r[i+j]&0xffffffffL) + v*((long)other.data[j]&0xffffffffL); // UNSIGNED CONVERSIONS ALL 'ROUND.
+                r[i+j] = (int)p;
+                p >>>= 32;
+            }
+            r[i+j] = (int)p;
+        }
+        // compute how much of r we actually needed for all that.
+        for ( i = r.length-1; i> 0; i--)
+            if ( r[i] != 0 )
+                break;
+        return new FDBigInt( r, i+1 );
+    }
+
+    /*
+     * Add one FDBigInt to another. Return a FDBigInt
+     */
+    public FDBigInt
+    add( FDBigInt other ){
+        int i;
+        int a[], b[];
+        int n, m;
+        long c = 0L;
+        // arrange such that a.nWords >= b.nWords;
+        // n = a.nWords, m = b.nWords
+        if ( this.nWords >= other.nWords ){
+            a = this.data;
+            n = this.nWords;
+            b = other.data;
+            m = other.nWords;
+        } else {
+            a = other.data;
+            n = other.nWords;
+            b = this.data;
+            m = this.nWords;
+        }
+        int r[] = new int[ n ];
+        for ( i = 0; i < n; i++ ){
+            c += (long)a[i] & 0xffffffffL;
+            if ( i < m ){
+                c += (long)b[i] & 0xffffffffL;
+            }
+            r[i] = (int) c;
+            c >>= 32; // signed shift.
+        }
+        if ( c != 0L ){
+            // oops -- carry out -- need longer result.
+            int s[] = new int[ r.length+1 ];
+            System.arraycopy( r, 0, s, 0, r.length );
+            s[i++] = (int)c;
+            return new FDBigInt( s, i );
+        }
+        return new FDBigInt( r, i );
+    }
+
+    /*
+     * Subtract one FDBigInt from another. Return a FDBigInt
+     * Assert that the result is positive.
+     */
+    public FDBigInt
+    sub( FDBigInt other ){
+        int r[] = new int[ this.nWords ];
+        int i;
+        int n = this.nWords;
+        int m = other.nWords;
+        int nzeros = 0;
+        long c = 0L;
+        for ( i = 0; i < n; i++ ){
+            c += (long)this.data[i] & 0xffffffffL;
+            if ( i < m ){
+                c -= (long)other.data[i] & 0xffffffffL;
+            }
+            if ( ( r[i] = (int) c ) == 0 )
+                nzeros++;
+            else
+                nzeros = 0;
+            c >>= 32; // signed shift
+        }
+        assert c == 0L : c; // borrow out of subtract
+        assert dataInRangeIsZero(i, m, other); // negative result of subtract
+        return new FDBigInt( r, n-nzeros );
+    }
+
+    private static boolean dataInRangeIsZero(int i, int m, FDBigInt other) {
+        while ( i < m )
+            if (other.data[i++] != 0)
+                return false;
+        return true;
+    }
+
+    /*
+     * Compare FDBigInt with another FDBigInt. Return an integer
+     * >0: this > other
+     *  0: this == other
+     * <0: this < other
+     */
+    public int
+    cmp( FDBigInt other ){
+        int i;
+        if ( this.nWords > other.nWords ){
+            // if any of my high-order words is non-zero,
+            // then the answer is evident
+            int j = other.nWords-1;
+            for ( i = this.nWords-1; i > j ; i-- )
+                if ( this.data[i] != 0 ) return 1;
+        }else if ( this.nWords < other.nWords ){
+            // if any of other's high-order words is non-zero,
+            // then the answer is evident
+            int j = this.nWords-1;
+            for ( i = other.nWords-1; i > j ; i-- )
+                if ( other.data[i] != 0 ) return -1;
+        } else{
+            i = this.nWords-1;
+        }
+        for ( ; i > 0 ; i-- )
+            if ( this.data[i] != other.data[i] )
+                break;
+        // careful! want unsigned compare!
+        // use brute force here.
+        int a = this.data[i];
+        int b = other.data[i];
+        if ( a < 0 ){
+            // a is really big, unsigned
+            if ( b < 0 ){
+                return a-b; // both big, negative
+            } else {
+                return 1; // b not big, answer is obvious;
+            }
+        } else {
+            // a is not really big
+            if ( b < 0 ) {
+                // but b is really big
+                return -1;
+            } else {
+                return a - b;
+            }
+        }
+    }
+
+    /*
+     * Compute
+     * q = (int)( this / S )
+     * this = 10 * ( this mod S )
+     * Return q.
+     * This is the iteration step of digit development for output.
+     * We assume that S has been normalized, as above, and that
+     * "this" has been lshift'ed accordingly.
+     * Also assume, of course, that the result, q, can be expressed
+     * as an integer, 0 <= q < 10.
+     */
+    public int
+    quoRemIteration( FDBigInt S )throws IllegalArgumentException {
+        // ensure that this and S have the same number of
+        // digits. If S is properly normalized and q < 10 then
+        // this must be so.
+        if ( nWords != S.nWords ){
+            throw new IllegalArgumentException("disparate values");
+        }
+        // estimate q the obvious way. We will usually be
+        // right. If not, then we're only off by a little and
+        // will re-add.
+        int n = nWords-1;
+        long q = ((long)data[n]&0xffffffffL) / (long)S.data[n];
+        long diff = 0L;
+        for ( int i = 0; i <= n ; i++ ){
+            diff += ((long)data[i]&0xffffffffL) -  q*((long)S.data[i]&0xffffffffL);
+            data[i] = (int)diff;
+            diff >>= 32; // N.B. SIGNED shift.
+        }
+        if ( diff != 0L ) {
+            // damn, damn, damn. q is too big.
+            // add S back in until this turns +. This should
+            // not be very many times!
+            long sum = 0L;
+            while ( sum ==  0L ){
+                sum = 0L;
+                for ( int i = 0; i <= n; i++ ){
+                    sum += ((long)data[i]&0xffffffffL) +  ((long)S.data[i]&0xffffffffL);
+                    data[i] = (int) sum;
+                    sum >>= 32; // Signed or unsigned, answer is 0 or 1
+                }
+                /*
+                 * Originally the following line read
+                 * "if ( sum !=0 && sum != -1 )"
+                 * but that would be wrong, because of the
+                 * treatment of the two values as entirely unsigned,
+                 * it would be impossible for a carry-out to be interpreted
+                 * as -1 -- it would have to be a single-bit carry-out, or
+                 * +1.
+                 */
+                assert sum == 0 || sum == 1 : sum; // carry out of division correction
+                q -= 1;
+            }
+        }
+        // finally, we can multiply this by 10.
+        // it cannot overflow, right, as the high-order word has
+        // at least 4 high-order zeros!
+        long p = 0L;
+        for ( int i = 0; i <= n; i++ ){
+            p += 10*((long)data[i]&0xffffffffL);
+            data[i] = (int)p;
+            p >>= 32; // SIGNED shift.
+        }
+        assert p == 0L : p; // Carry out of *10
+        return (int)q;
+    }
+
+    public long
+    longValue(){
+        // if this can be represented as a long, return the value
+        assert this.nWords > 0 : this.nWords; // longValue confused
+
+        if (this.nWords == 1)
+            return ((long)data[0]&0xffffffffL);
+
+        assert dataInRangeIsZero(2, this.nWords, this); // value too big
+        assert data[1] >= 0;  // value too big
+        return ((long)(data[1]) << 32) | ((long)data[0]&0xffffffffL);
+    }
+
+    public String
+    toString() {
+        StringBuffer r = new StringBuffer(30);
+        r.append('[');
+        int i = Math.min( nWords-1, data.length-1) ;
+        if ( nWords > data.length ){
+            r.append( "("+data.length+"<"+nWords+"!)" );
+        }
+        for( ; i> 0 ; i-- ){
+            r.append( Integer.toHexString( data[i] ) );
+            r.append(' ');
+        }
+        r.append( Integer.toHexString( data[0] ) );
+        r.append(']');
+        return new String( r );
+    }
+}
--- a/src/share/classes/sun/misc/FloatingDecimal.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/src/share/classes/sun/misc/FloatingDecimal.java	Mon Oct 29 14:12:37 2012 +0100
@@ -2409,470 +2409,3 @@
 
 
 }
-
-/*
- * A really, really simple bigint package
- * tailored to the needs of floating base conversion.
- */
-class FDBigInt {
-    int nWords; // number of words used
-    int data[]; // value: data[0] is least significant
-
-
-    public FDBigInt( int v ){
-        nWords = 1;
-        data = new int[1];
-        data[0] = v;
-    }
-
-    public FDBigInt( long v ){
-        data = new int[2];
-        data[0] = (int)v;
-        data[1] = (int)(v>>>32);
-        nWords = (data[1]==0) ? 1 : 2;
-    }
-
-    public FDBigInt( FDBigInt other ){
-        data = new int[nWords = other.nWords];
-        System.arraycopy( other.data, 0, data, 0, nWords );
-    }
-
-    private FDBigInt( int [] d, int n ){
-        data = d;
-        nWords = n;
-    }
-
-    public FDBigInt( long seed, char digit[], int nd0, int nd ){
-        int n= (nd+8)/9;        // estimate size needed.
-        if ( n < 2 ) n = 2;
-        data = new int[n];      // allocate enough space
-        data[0] = (int)seed;    // starting value
-        data[1] = (int)(seed>>>32);
-        nWords = (data[1]==0) ? 1 : 2;
-        int i = nd0;
-        int limit = nd-5;       // slurp digits 5 at a time.
-        int v;
-        while ( i < limit ){
-            int ilim = i+5;
-            v = (int)digit[i++]-(int)'0';
-            while( i <ilim ){
-                v = 10*v + (int)digit[i++]-(int)'0';
-            }
-            multaddMe( 100000, v); // ... where 100000 is 10^5.
-        }
-        int factor = 1;
-        v = 0;
-        while ( i < nd ){
-            v = 10*v + (int)digit[i++]-(int)'0';
-            factor *= 10;
-        }
-        if ( factor != 1 ){
-            multaddMe( factor, v );
-        }
-    }
-
-    /*
-     * Left shift by c bits.
-     * Shifts this in place.
-     */
-    public void
-    lshiftMe( int c )throws IllegalArgumentException {
-        if ( c <= 0 ){
-            if ( c == 0 )
-                return; // silly.
-            else
-                throw new IllegalArgumentException("negative shift count");
-        }
-        int wordcount = c>>5;
-        int bitcount  = c & 0x1f;
-        int anticount = 32-bitcount;
-        int t[] = data;
-        int s[] = data;
-        if ( nWords+wordcount+1 > t.length ){
-            // reallocate.
-            t = new int[ nWords+wordcount+1 ];
-        }
-        int target = nWords+wordcount;
-        int src    = nWords-1;
-        if ( bitcount == 0 ){
-            // special hack, since an anticount of 32 won't go!
-            System.arraycopy( s, 0, t, wordcount, nWords );
-            target = wordcount-1;
-        } else {
-            t[target--] = s[src]>>>anticount;
-            while ( src >= 1 ){
-                t[target--] = (s[src]<<bitcount) | (s[--src]>>>anticount);
-            }
-            t[target--] = s[src]<<bitcount;
-        }
-        while( target >= 0 ){
-            t[target--] = 0;
-        }
-        data = t;
-        nWords += wordcount + 1;
-        // may have constructed high-order word of 0.
-        // if so, trim it
-        while ( nWords > 1 && data[nWords-1] == 0 )
-            nWords--;
-    }
-
-    /*
-     * normalize this number by shifting until
-     * the MSB of the number is at 0x08000000.
-     * This is in preparation for quoRemIteration, below.
-     * The idea is that, to make division easier, we want the
-     * divisor to be "normalized" -- usually this means shifting
-     * the MSB into the high words sign bit. But because we know that
-     * the quotient will be 0 < q < 10, we would like to arrange that
-     * the dividend not span up into another word of precision.
-     * (This needs to be explained more clearly!)
-     */
-    public int
-    normalizeMe() throws IllegalArgumentException {
-        int src;
-        int wordcount = 0;
-        int bitcount  = 0;
-        int v = 0;
-        for ( src= nWords-1 ; src >= 0 && (v=data[src]) == 0 ; src--){
-            wordcount += 1;
-        }
-        if ( src < 0 ){
-            // oops. Value is zero. Cannot normalize it!
-            throw new IllegalArgumentException("zero value");
-        }
-        /*
-         * In most cases, we assume that wordcount is zero. This only
-         * makes sense, as we try not to maintain any high-order
-         * words full of zeros. In fact, if there are zeros, we will
-         * simply SHORTEN our number at this point. Watch closely...
-         */
-        nWords -= wordcount;
-        /*
-         * Compute how far left we have to shift v s.t. its highest-
-         * order bit is in the right place. Then call lshiftMe to
-         * do the work.
-         */
-        if ( (v & 0xf0000000) != 0 ){
-            // will have to shift up into the next word.
-            // too bad.
-            for( bitcount = 32 ; (v & 0xf0000000) != 0 ; bitcount-- )
-                v >>>= 1;
-        } else {
-            while ( v <= 0x000fffff ){
-                // hack: byte-at-a-time shifting
-                v <<= 8;
-                bitcount += 8;
-            }
-            while ( v <= 0x07ffffff ){
-                v <<= 1;
-                bitcount += 1;
-            }
-        }
-        if ( bitcount != 0 )
-            lshiftMe( bitcount );
-        return bitcount;
-    }
-
-    /*
-     * Multiply a FDBigInt by an int.
-     * Result is a new FDBigInt.
-     */
-    public FDBigInt
-    mult( int iv ) {
-        long v = iv;
-        int r[];
-        long p;
-
-        // guess adequate size of r.
-        r = new int[ ( v * ((long)data[nWords-1]&0xffffffffL) > 0xfffffffL ) ? nWords+1 : nWords ];
-        p = 0L;
-        for( int i=0; i < nWords; i++ ) {
-            p += v * ((long)data[i]&0xffffffffL);
-            r[i] = (int)p;
-            p >>>= 32;
-        }
-        if ( p == 0L){
-            return new FDBigInt( r, nWords );
-        } else {
-            r[nWords] = (int)p;
-            return new FDBigInt( r, nWords+1 );
-        }
-    }
-
-    /*
-     * Multiply a FDBigInt by an int and add another int.
-     * Result is computed in place.
-     * Hope it fits!
-     */
-    public void
-    multaddMe( int iv, int addend ) {
-        long v = iv;
-        long p;
-
-        // unroll 0th iteration, doing addition.
-        p = v * ((long)data[0]&0xffffffffL) + ((long)addend&0xffffffffL);
-        data[0] = (int)p;
-        p >>>= 32;
-        for( int i=1; i < nWords; i++ ) {
-            p += v * ((long)data[i]&0xffffffffL);
-            data[i] = (int)p;
-            p >>>= 32;
-        }
-        if ( p != 0L){
-            data[nWords] = (int)p; // will fail noisily if illegal!
-            nWords++;
-        }
-    }
-
-    /*
-     * Multiply a FDBigInt by another FDBigInt.
-     * Result is a new FDBigInt.
-     */
-    public FDBigInt
-    mult( FDBigInt other ){
-        // crudely guess adequate size for r
-        int r[] = new int[ nWords + other.nWords ];
-        int i;
-        // I think I am promised zeros...
-
-        for( i = 0; i < this.nWords; i++ ){
-            long v = (long)this.data[i] & 0xffffffffL; // UNSIGNED CONVERSION
-            long p = 0L;
-            int j;
-            for( j = 0; j < other.nWords; j++ ){
-                p += ((long)r[i+j]&0xffffffffL) + v*((long)other.data[j]&0xffffffffL); // UNSIGNED CONVERSIONS ALL 'ROUND.
-                r[i+j] = (int)p;
-                p >>>= 32;
-            }
-            r[i+j] = (int)p;
-        }
-        // compute how much of r we actually needed for all that.
-        for ( i = r.length-1; i> 0; i--)
-            if ( r[i] != 0 )
-                break;
-        return new FDBigInt( r, i+1 );
-    }
-
-    /*
-     * Add one FDBigInt to another. Return a FDBigInt
-     */
-    public FDBigInt
-    add( FDBigInt other ){
-        int i;
-        int a[], b[];
-        int n, m;
-        long c = 0L;
-        // arrange such that a.nWords >= b.nWords;
-        // n = a.nWords, m = b.nWords
-        if ( this.nWords >= other.nWords ){
-            a = this.data;
-            n = this.nWords;
-            b = other.data;
-            m = other.nWords;
-        } else {
-            a = other.data;
-            n = other.nWords;
-            b = this.data;
-            m = this.nWords;
-        }
-        int r[] = new int[ n ];
-        for ( i = 0; i < n; i++ ){
-            c += (long)a[i] & 0xffffffffL;
-            if ( i < m ){
-                c += (long)b[i] & 0xffffffffL;
-            }
-            r[i] = (int) c;
-            c >>= 32; // signed shift.
-        }
-        if ( c != 0L ){
-            // oops -- carry out -- need longer result.
-            int s[] = new int[ r.length+1 ];
-            System.arraycopy( r, 0, s, 0, r.length );
-            s[i++] = (int)c;
-            return new FDBigInt( s, i );
-        }
-        return new FDBigInt( r, i );
-    }
-
-    /*
-     * Subtract one FDBigInt from another. Return a FDBigInt
-     * Assert that the result is positive.
-     */
-    public FDBigInt
-    sub( FDBigInt other ){
-        int r[] = new int[ this.nWords ];
-        int i;
-        int n = this.nWords;
-        int m = other.nWords;
-        int nzeros = 0;
-        long c = 0L;
-        for ( i = 0; i < n; i++ ){
-            c += (long)this.data[i] & 0xffffffffL;
-            if ( i < m ){
-                c -= (long)other.data[i] & 0xffffffffL;
-            }
-            if ( ( r[i] = (int) c ) == 0 )
-                nzeros++;
-            else
-                nzeros = 0;
-            c >>= 32; // signed shift
-        }
-        assert c == 0L : c; // borrow out of subtract
-        assert dataInRangeIsZero(i, m, other); // negative result of subtract
-        return new FDBigInt( r, n-nzeros );
-    }
-
-    private static boolean dataInRangeIsZero(int i, int m, FDBigInt other) {
-        while ( i < m )
-            if (other.data[i++] != 0)
-                return false;
-        return true;
-    }
-
-    /*
-     * Compare FDBigInt with another FDBigInt. Return an integer
-     * >0: this > other
-     *  0: this == other
-     * <0: this < other
-     */
-    public int
-    cmp( FDBigInt other ){
-        int i;
-        if ( this.nWords > other.nWords ){
-            // if any of my high-order words is non-zero,
-            // then the answer is evident
-            int j = other.nWords-1;
-            for ( i = this.nWords-1; i > j ; i-- )
-                if ( this.data[i] != 0 ) return 1;
-        }else if ( this.nWords < other.nWords ){
-            // if any of other's high-order words is non-zero,
-            // then the answer is evident
-            int j = this.nWords-1;
-            for ( i = other.nWords-1; i > j ; i-- )
-                if ( other.data[i] != 0 ) return -1;
-        } else{
-            i = this.nWords-1;
-        }
-        for ( ; i > 0 ; i-- )
-            if ( this.data[i] != other.data[i] )
-                break;
-        // careful! want unsigned compare!
-        // use brute force here.
-        int a = this.data[i];
-        int b = other.data[i];
-        if ( a < 0 ){
-            // a is really big, unsigned
-            if ( b < 0 ){
-                return a-b; // both big, negative
-            } else {
-                return 1; // b not big, answer is obvious;
-            }
-        } else {
-            // a is not really big
-            if ( b < 0 ) {
-                // but b is really big
-                return -1;
-            } else {
-                return a - b;
-            }
-        }
-    }
-
-    /*
-     * Compute
-     * q = (int)( this / S )
-     * this = 10 * ( this mod S )
-     * Return q.
-     * This is the iteration step of digit development for output.
-     * We assume that S has been normalized, as above, and that
-     * "this" has been lshift'ed accordingly.
-     * Also assume, of course, that the result, q, can be expressed
-     * as an integer, 0 <= q < 10.
-     */
-    public int
-    quoRemIteration( FDBigInt S )throws IllegalArgumentException {
-        // ensure that this and S have the same number of
-        // digits. If S is properly normalized and q < 10 then
-        // this must be so.
-        if ( nWords != S.nWords ){
-            throw new IllegalArgumentException("disparate values");
-        }
-        // estimate q the obvious way. We will usually be
-        // right. If not, then we're only off by a little and
-        // will re-add.
-        int n = nWords-1;
-        long q = ((long)data[n]&0xffffffffL) / (long)S.data[n];
-        long diff = 0L;
-        for ( int i = 0; i <= n ; i++ ){
-            diff += ((long)data[i]&0xffffffffL) -  q*((long)S.data[i]&0xffffffffL);
-            data[i] = (int)diff;
-            diff >>= 32; // N.B. SIGNED shift.
-        }
-        if ( diff != 0L ) {
-            // damn, damn, damn. q is too big.
-            // add S back in until this turns +. This should
-            // not be very many times!
-            long sum = 0L;
-            while ( sum ==  0L ){
-                sum = 0L;
-                for ( int i = 0; i <= n; i++ ){
-                    sum += ((long)data[i]&0xffffffffL) +  ((long)S.data[i]&0xffffffffL);
-                    data[i] = (int) sum;
-                    sum >>= 32; // Signed or unsigned, answer is 0 or 1
-                }
-                /*
-                 * Originally the following line read
-                 * "if ( sum !=0 && sum != -1 )"
-                 * but that would be wrong, because of the
-                 * treatment of the two values as entirely unsigned,
-                 * it would be impossible for a carry-out to be interpreted
-                 * as -1 -- it would have to be a single-bit carry-out, or
-                 * +1.
-                 */
-                assert sum == 0 || sum == 1 : sum; // carry out of division correction
-                q -= 1;
-            }
-        }
-        // finally, we can multiply this by 10.
-        // it cannot overflow, right, as the high-order word has
-        // at least 4 high-order zeros!
-        long p = 0L;
-        for ( int i = 0; i <= n; i++ ){
-            p += 10*((long)data[i]&0xffffffffL);
-            data[i] = (int)p;
-            p >>= 32; // SIGNED shift.
-        }
-        assert p == 0L : p; // Carry out of *10
-        return (int)q;
-    }
-
-    public long
-    longValue(){
-        // if this can be represented as a long, return the value
-        assert this.nWords > 0 : this.nWords; // longValue confused
-
-        if (this.nWords == 1)
-            return ((long)data[0]&0xffffffffL);
-
-        assert dataInRangeIsZero(2, this.nWords, this); // value too big
-        assert data[1] >= 0;  // value too big
-        return ((long)(data[1]) << 32) | ((long)data[0]&0xffffffffL);
-    }
-
-    public String
-    toString() {
-        StringBuffer r = new StringBuffer(30);
-        r.append('[');
-        int i = Math.min( nWords-1, data.length-1) ;
-        if ( nWords > data.length ){
-            r.append( "("+data.length+"<"+nWords+"!)" );
-        }
-        for( ; i> 0 ; i-- ){
-            r.append( Integer.toHexString( data[i] ) );
-            r.append(' ');
-        }
-        r.append( Integer.toHexString( data[0] ) );
-        r.append(']');
-        return new String( r );
-    }
-}
--- a/src/share/classes/sun/net/httpserver/Event.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/src/share/classes/sun/net/httpserver/Event.java	Mon Oct 29 14:12:37 2012 +0100
@@ -36,11 +36,3 @@
         this.exchange = t;
     }
 }
-
-class WriteFinishedEvent extends Event {
-    WriteFinishedEvent (ExchangeImpl t) {
-        super (t);
-        assert !t.writefinished;
-        t.writefinished = true;
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/net/httpserver/WriteFinishedEvent.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.net.httpserver;
+
+class WriteFinishedEvent extends Event {
+    WriteFinishedEvent (ExchangeImpl t) {
+        super (t);
+        assert !t.writefinished;
+        t.writefinished = true;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/net/www/http/KeepAliveCleanerEntry.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.net.www.http;
+
+import java.io.*;
+
+class KeepAliveCleanerEntry
+{
+    KeepAliveStream kas;
+    HttpClient hc;
+
+    public KeepAliveCleanerEntry(KeepAliveStream kas, HttpClient hc) {
+        this.kas = kas;
+        this.hc = hc;
+    }
+
+    protected KeepAliveStream getKeepAliveStream() {
+        return kas;
+    }
+
+    protected HttpClient getHttpClient() {
+        return hc;
+    }
+
+    protected void setQueuedForCleanup() {
+        kas.queuedForCleanup = true;
+    }
+
+    protected boolean getQueuedForCleanup() {
+        return kas.queuedForCleanup;
+    }
+
+}
--- a/src/share/classes/sun/net/www/http/KeepAliveStream.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/src/share/classes/sun/net/www/http/KeepAliveStream.java	Mon Oct 29 14:12:37 2012 +0100
@@ -206,32 +206,3 @@
         closed = true;
     }
 }
-
-
-class KeepAliveCleanerEntry
-{
-    KeepAliveStream kas;
-    HttpClient hc;
-
-    public KeepAliveCleanerEntry(KeepAliveStream kas, HttpClient hc) {
-        this.kas = kas;
-        this.hc = hc;
-    }
-
-    protected KeepAliveStream getKeepAliveStream() {
-        return kas;
-    }
-
-    protected HttpClient getHttpClient() {
-        return hc;
-    }
-
-    protected void setQueuedForCleanup() {
-        kas.queuedForCleanup = true;
-    }
-
-    protected boolean getQueuedForCleanup() {
-        return kas.queuedForCleanup;
-    }
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/security/ssl/ExtensionType.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.ssl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+final class ExtensionType {
+
+    final int id;
+    final String name;
+
+    private ExtensionType(int id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public String toString() {
+        return name;
+    }
+
+    static List<ExtensionType> knownExtensions = new ArrayList<ExtensionType>(9);
+
+    static ExtensionType get(int id) {
+        for (ExtensionType ext : knownExtensions) {
+            if (ext.id == id) {
+                return ext;
+            }
+        }
+        return new ExtensionType(id, "type_" + id);
+    }
+
+    private static ExtensionType e(int id, String name) {
+        ExtensionType ext = new ExtensionType(id, name);
+        knownExtensions.add(ext);
+        return ext;
+    }
+
+    // extensions defined in RFC 3546
+    final static ExtensionType EXT_SERVER_NAME =
+            e(0x0000, "server_name");            // IANA registry value: 0
+    final static ExtensionType EXT_MAX_FRAGMENT_LENGTH =
+            e(0x0001, "max_fragment_length");    // IANA registry value: 1
+    final static ExtensionType EXT_CLIENT_CERTIFICATE_URL =
+            e(0x0002, "client_certificate_url"); // IANA registry value: 2
+    final static ExtensionType EXT_TRUSTED_CA_KEYS =
+            e(0x0003, "trusted_ca_keys");        // IANA registry value: 3
+    final static ExtensionType EXT_TRUNCATED_HMAC =
+            e(0x0004, "truncated_hmac");         // IANA registry value: 4
+    final static ExtensionType EXT_STATUS_REQUEST =
+            e(0x0005, "status_request");         // IANA registry value: 5
+
+    // extensions defined in RFC 4681
+    final static ExtensionType EXT_USER_MAPPING =
+            e(0x0006, "user_mapping");           // IANA registry value: 6
+
+    // extensions defined in RFC 5081
+    final static ExtensionType EXT_CERT_TYPE =
+            e(0x0009, "cert_type");              // IANA registry value: 9
+
+    // extensions defined in RFC 4492 (ECC)
+    final static ExtensionType EXT_ELLIPTIC_CURVES =
+            e(0x000A, "elliptic_curves");        // IANA registry value: 10
+    final static ExtensionType EXT_EC_POINT_FORMATS =
+            e(0x000B, "ec_point_formats");       // IANA registry value: 11
+
+    // extensions defined in RFC 5054
+    final static ExtensionType EXT_SRP =
+            e(0x000C, "srp");                    // IANA registry value: 12
+
+    // extensions defined in RFC 5246
+    final static ExtensionType EXT_SIGNATURE_ALGORITHMS =
+            e(0x000D, "signature_algorithms");   // IANA registry value: 13
+
+    // extensions defined in RFC 5746
+    final static ExtensionType EXT_RENEGOTIATION_INFO =
+            e(0xff01, "renegotiation_info");     // IANA registry value: 65281
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/security/ssl/HelloExtension.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.ssl;
+
+import java.io.IOException;
+
+abstract class HelloExtension {
+
+    final ExtensionType type;
+
+    HelloExtension(ExtensionType type) {
+        this.type = type;
+    }
+
+    // Length of the encoded extension, including the type and length fields
+    abstract int length();
+
+    abstract void send(HandshakeOutStream s) throws IOException;
+
+    public abstract String toString();
+
+}
--- a/src/share/classes/sun/security/ssl/HelloExtensions.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/src/share/classes/sun/security/ssl/HelloExtensions.java	Mon Oct 29 14:12:37 2012 +0100
@@ -153,795 +153,3 @@
         }
     }
 }
-
-final class ExtensionType {
-
-    final int id;
-    final String name;
-
-    private ExtensionType(int id, String name) {
-        this.id = id;
-        this.name = name;
-    }
-
-    public String toString() {
-        return name;
-    }
-
-    static List<ExtensionType> knownExtensions = new ArrayList<>(9);
-
-    static ExtensionType get(int id) {
-        for (ExtensionType ext : knownExtensions) {
-            if (ext.id == id) {
-                return ext;
-            }
-        }
-        return new ExtensionType(id, "type_" + id);
-    }
-
-    private static ExtensionType e(int id, String name) {
-        ExtensionType ext = new ExtensionType(id, name);
-        knownExtensions.add(ext);
-        return ext;
-    }
-
-    // extensions defined in RFC 3546
-    final static ExtensionType EXT_SERVER_NAME =
-            e(0x0000, "server_name");            // IANA registry value: 0
-    final static ExtensionType EXT_MAX_FRAGMENT_LENGTH =
-            e(0x0001, "max_fragment_length");    // IANA registry value: 1
-    final static ExtensionType EXT_CLIENT_CERTIFICATE_URL =
-            e(0x0002, "client_certificate_url"); // IANA registry value: 2
-    final static ExtensionType EXT_TRUSTED_CA_KEYS =
-            e(0x0003, "trusted_ca_keys");        // IANA registry value: 3
-    final static ExtensionType EXT_TRUNCATED_HMAC =
-            e(0x0004, "truncated_hmac");         // IANA registry value: 4
-    final static ExtensionType EXT_STATUS_REQUEST =
-            e(0x0005, "status_request");         // IANA registry value: 5
-
-    // extensions defined in RFC 4681
-    final static ExtensionType EXT_USER_MAPPING =
-            e(0x0006, "user_mapping");           // IANA registry value: 6
-
-    // extensions defined in RFC 5081
-    final static ExtensionType EXT_CERT_TYPE =
-            e(0x0009, "cert_type");              // IANA registry value: 9
-
-    // extensions defined in RFC 4492 (ECC)
-    final static ExtensionType EXT_ELLIPTIC_CURVES =
-            e(0x000A, "elliptic_curves");        // IANA registry value: 10
-    final static ExtensionType EXT_EC_POINT_FORMATS =
-            e(0x000B, "ec_point_formats");       // IANA registry value: 11
-
-    // extensions defined in RFC 5054
-    final static ExtensionType EXT_SRP =
-            e(0x000C, "srp");                    // IANA registry value: 12
-
-    // extensions defined in RFC 5246
-    final static ExtensionType EXT_SIGNATURE_ALGORITHMS =
-            e(0x000D, "signature_algorithms");   // IANA registry value: 13
-
-    // extensions defined in RFC 5746
-    final static ExtensionType EXT_RENEGOTIATION_INFO =
-            e(0xff01, "renegotiation_info");     // IANA registry value: 65281
-}
-
-abstract class HelloExtension {
-
-    final ExtensionType type;
-
-    HelloExtension(ExtensionType type) {
-        this.type = type;
-    }
-
-    // Length of the encoded extension, including the type and length fields
-    abstract int length();
-
-    abstract void send(HandshakeOutStream s) throws IOException;
-
-    public abstract String toString();
-
-}
-
-final class UnknownExtension extends HelloExtension {
-
-    private final byte[] data;
-
-    UnknownExtension(HandshakeInStream s, int len, ExtensionType type)
-            throws IOException {
-        super(type);
-        data = new byte[len];
-        // s.read() does not handle 0-length arrays.
-        if (len != 0) {
-            s.read(data);
-        }
-    }
-
-    int length() {
-        return 4 + data.length;
-    }
-
-    void send(HandshakeOutStream s) throws IOException {
-        s.putInt16(type.id);
-        s.putBytes16(data);
-    }
-
-    public String toString() {
-        return "Unsupported extension " + type + ", data: " +
-            Debug.toString(data);
-    }
-}
-
-/*
- * [RFC 4366/6066] To facilitate secure connections to servers that host
- * multiple 'virtual' servers at a single underlying network address, clients
- * MAY include an extension of type "server_name" in the (extended) client
- * hello.  The "extension_data" field of this extension SHALL contain
- * "ServerNameList" where:
- *
- *     struct {
- *         NameType name_type;
- *         select (name_type) {
- *             case host_name: HostName;
- *         } name;
- *     } ServerName;
- *
- *     enum {
- *         host_name(0), (255)
- *     } NameType;
- *
- *     opaque HostName<1..2^16-1>;
- *
- *     struct {
- *         ServerName server_name_list<1..2^16-1>
- *     } ServerNameList;
- */
-final class ServerNameExtension extends HelloExtension {
-
-    // For backward compatibility, all future data structures associated with
-    // new NameTypes MUST begin with a 16-bit length field.
-    final static int NAME_HEADER_LENGTH = 3;    // NameType: 1 byte
-                                                // Name length: 2 bytes
-    private Map<Integer, SNIServerName> sniMap;
-    private int listLength;     // ServerNameList length
-
-    // constructor for ServerHello
-    ServerNameExtension() throws IOException {
-        super(ExtensionType.EXT_SERVER_NAME);
-
-        listLength = 0;
-        sniMap = Collections.<Integer, SNIServerName>emptyMap();
-    }
-
-    // constructor for ClientHello
-    ServerNameExtension(List<SNIServerName> serverNames)
-            throws IOException {
-        super(ExtensionType.EXT_SERVER_NAME);
-
-        listLength = 0;
-        sniMap = new LinkedHashMap<>();
-        for (SNIServerName serverName : serverNames) {
-            // check for duplicated server name type
-            if (sniMap.put(serverName.getType(), serverName) != null) {
-                // unlikely to happen, but in case ...
-                throw new RuntimeException(
-                    "Duplicated server name of type " + serverName.getType());
-            }
-
-            listLength += serverName.getEncoded().length + NAME_HEADER_LENGTH;
-        }
-
-        // This constructor is used for ClientHello only.  Empty list is
-        // not allowed in client mode.
-        if (listLength == 0) {
-            throw new RuntimeException("The ServerNameList cannot be empty");
-        }
-    }
-
-    // constructor for ServerHello for parsing SNI extension
-    ServerNameExtension(HandshakeInStream s, int len)
-            throws IOException {
-        super(ExtensionType.EXT_SERVER_NAME);
-
-        int remains = len;
-        if (len >= 2) {    // "server_name" extension in ClientHello
-            listLength = s.getInt16();     // ServerNameList length
-            if (listLength == 0 || listLength + 2 != len) {
-                throw new SSLProtocolException(
-                        "Invalid " + type + " extension");
-            }
-
-            remains -= 2;
-            sniMap = new LinkedHashMap<>();
-            while (remains > 0) {
-                int code = s.getInt8();       // NameType
-
-                // HostName (length read in getBytes16);
-                byte[] encoded = s.getBytes16();
-                SNIServerName serverName;
-                switch (code) {
-                    case StandardConstants.SNI_HOST_NAME:
-                        if (encoded.length == 0) {
-                            throw new SSLProtocolException(
-                                "Empty HostName in server name indication");
-                        }
-                        try {
-                            serverName = new SNIHostName(encoded);
-                        } catch (IllegalArgumentException iae) {
-                            SSLProtocolException spe = new SSLProtocolException(
-                                "Illegal server name, type=host_name(" +
-                                code + "), name=" +
-                                (new String(encoded, StandardCharsets.UTF_8)) +
-                                ", value=" + Debug.toString(encoded));
-                            spe.initCause(iae);
-                            throw spe;
-                        }
-                        break;
-                    default:
-                        try {
-                            serverName = new UnknownServerName(code, encoded);
-                        } catch (IllegalArgumentException iae) {
-                            SSLProtocolException spe = new SSLProtocolException(
-                                "Illegal server name, type=(" + code +
-                                "), value=" + Debug.toString(encoded));
-                            spe.initCause(iae);
-                            throw spe;
-                        }
-                }
-                // check for duplicated server name type
-                if (sniMap.put(serverName.getType(), serverName) != null) {
-                    throw new SSLProtocolException(
-                            "Duplicated server name of type " +
-                            serverName.getType());
-                }
-
-                remains -= encoded.length + NAME_HEADER_LENGTH;
-            }
-        } else if (len == 0) {     // "server_name" extension in ServerHello
-            listLength = 0;
-            sniMap = Collections.<Integer, SNIServerName>emptyMap();
-        }
-
-        if (remains != 0) {
-            throw new SSLProtocolException("Invalid server_name extension");
-        }
-    }
-
-    List<SNIServerName> getServerNames() {
-        if (sniMap != null && !sniMap.isEmpty()) {
-            return Collections.<SNIServerName>unmodifiableList(
-                                        new ArrayList<>(sniMap.values()));
-        }
-
-        return Collections.<SNIServerName>emptyList();
-    }
-
-    /*
-     * Is the extension recognized by the corresponding matcher?
-     *
-     * This method is used to check whether the server name indication can
-     * be recognized by the server name matchers.
-     *
-     * Per RFC 6066, if the server understood the ClientHello extension but
-     * does not recognize the server name, the server SHOULD take one of two
-     * actions: either abort the handshake by sending a fatal-level
-     * unrecognized_name(112) alert or continue the handshake.
-     *
-     * If there is an instance of SNIMatcher defined for a particular name
-     * type, it must be used to perform match operations on the server name.
-     */
-    boolean isMatched(Collection<SNIMatcher> matchers) {
-        if (sniMap != null && !sniMap.isEmpty()) {
-            for (SNIMatcher matcher : matchers) {
-                SNIServerName sniName = sniMap.get(matcher.getType());
-                if (sniName != null && (!matcher.matches(sniName))) {
-                    return false;
-                }
-            }
-        }
-
-        return true;
-    }
-
-    /*
-     * Is the extension is identical to a server name list?
-     *
-     * This method is used to check the server name indication during session
-     * resumption.
-     *
-     * Per RFC 6066, when the server is deciding whether or not to accept a
-     * request to resume a session, the contents of a server_name extension
-     * MAY be used in the lookup of the session in the session cache.  The
-     * client SHOULD include the same server_name extension in the session
-     * resumption request as it did in the full handshake that established
-     * the session.  A server that implements this extension MUST NOT accept
-     * the request to resume the session if the server_name extension contains
-     * a different name.  Instead, it proceeds with a full handshake to
-     * establish a new session.  When resuming a session, the server MUST NOT
-     * include a server_name extension in the server hello.
-     */
-    boolean isIdentical(List<SNIServerName> other) {
-        if (other.size() == sniMap.size()) {
-            for(SNIServerName sniInOther : other) {
-                SNIServerName sniName = sniMap.get(sniInOther.getType());
-                if (sniName == null || !sniInOther.equals(sniName)) {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-    int length() {
-        return listLength == 0 ? 4 : 6 + listLength;
-    }
-
-    void send(HandshakeOutStream s) throws IOException {
-        s.putInt16(type.id);
-        if (listLength == 0) {
-            s.putInt16(listLength);     // in ServerHello, empty extension_data
-        } else {
-            s.putInt16(listLength + 2); // length of extension_data
-            s.putInt16(listLength);     // length of ServerNameList
-
-            for (SNIServerName sniName : sniMap.values()) {
-                s.putInt8(sniName.getType());         // server name type
-                s.putBytes16(sniName.getEncoded());   // server name value
-            }
-        }
-    }
-
-    public String toString() {
-        StringBuffer buffer = new StringBuffer();
-        for (SNIServerName sniName : sniMap.values()) {
-            buffer.append("[" + sniName + "]");
-        }
-
-        return "Extension " + type + ", server_name: " + buffer;
-    }
-
-    private static class UnknownServerName extends SNIServerName {
-        UnknownServerName(int code, byte[] encoded) {
-            super(code, encoded);
-        }
-    }
-
-}
-
-final class SupportedEllipticCurvesExtension extends HelloExtension {
-
-    // the extension value to send in the ClientHello message
-    static final SupportedEllipticCurvesExtension DEFAULT;
-
-    private static final boolean fips;
-
-    static {
-        int[] ids;
-        fips = SunJSSE.isFIPS();
-        if (fips == false) {
-            ids = new int[] {
-                // NIST curves first
-                // prefer NIST P-256, rest in order of increasing key length
-                23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14,
-                // non-NIST curves
-                15, 16, 17, 2, 18, 4, 5, 20, 8, 22,
-            };
-        } else {
-            ids = new int[] {
-                // same as above, but allow only NIST curves in FIPS mode
-                23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14,
-            };
-        }
-        DEFAULT = new SupportedEllipticCurvesExtension(ids);
-    }
-
-    private final int[] curveIds;
-
-    private SupportedEllipticCurvesExtension(int[] curveIds) {
-        super(ExtensionType.EXT_ELLIPTIC_CURVES);
-        this.curveIds = curveIds;
-    }
-
-    SupportedEllipticCurvesExtension(HandshakeInStream s, int len)
-            throws IOException {
-        super(ExtensionType.EXT_ELLIPTIC_CURVES);
-        int k = s.getInt16();
-        if (((len & 1) != 0) || (k + 2 != len)) {
-            throw new SSLProtocolException("Invalid " + type + " extension");
-        }
-        curveIds = new int[k >> 1];
-        for (int i = 0; i < curveIds.length; i++) {
-            curveIds[i] = s.getInt16();
-        }
-    }
-
-    boolean contains(int index) {
-        for (int curveId : curveIds) {
-            if (index == curveId) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Return a reference to the internal curveIds array.
-    // The caller must NOT modify the contents.
-    int[] curveIds() {
-        return curveIds;
-    }
-
-    int length() {
-        return 6 + (curveIds.length << 1);
-    }
-
-    void send(HandshakeOutStream s) throws IOException {
-        s.putInt16(type.id);
-        int k = curveIds.length << 1;
-        s.putInt16(k + 2);
-        s.putInt16(k);
-        for (int curveId : curveIds) {
-            s.putInt16(curveId);
-        }
-    }
-
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("Extension " + type + ", curve names: {");
-        boolean first = true;
-        for (int curveId : curveIds) {
-            if (first) {
-                first = false;
-            } else {
-                sb.append(", ");
-            }
-            // first check if it is a known named curve, then try other cases.
-            String oid = getCurveOid(curveId);
-            if (oid != null) {
-                ECParameterSpec spec = JsseJce.getECParameterSpec(oid);
-                // this toString() output will look nice for the current
-                // implementation of the ECParameterSpec class in the Sun
-                // provider, but may not look good for other implementations.
-                if (spec != null) {
-                    sb.append(spec.toString().split(" ")[0]);
-                } else {
-                    sb.append(oid);
-                }
-            } else if (curveId == ARBITRARY_PRIME) {
-                sb.append("arbitrary_explicit_prime_curves");
-            } else if (curveId == ARBITRARY_CHAR2) {
-                sb.append("arbitrary_explicit_char2_curves");
-            } else {
-                sb.append("unknown curve " + curveId);
-            }
-        }
-        sb.append("}");
-        return sb.toString();
-    }
-
-    // Test whether we support the curve with the given index.
-    static boolean isSupported(int index) {
-        if ((index <= 0) || (index >= NAMED_CURVE_OID_TABLE.length)) {
-            return false;
-        }
-        if (fips == false) {
-            // in non-FIPS mode, we support all valid indices
-            return true;
-        }
-        return DEFAULT.contains(index);
-    }
-
-    static int getCurveIndex(ECParameterSpec params) {
-        String oid = JsseJce.getNamedCurveOid(params);
-        if (oid == null) {
-            return -1;
-        }
-        Integer n = curveIndices.get(oid);
-        return (n == null) ? -1 : n;
-    }
-
-    static String getCurveOid(int index) {
-        if ((index > 0) && (index < NAMED_CURVE_OID_TABLE.length)) {
-            return NAMED_CURVE_OID_TABLE[index];
-        }
-        return null;
-    }
-
-    private final static int ARBITRARY_PRIME = 0xff01;
-    private final static int ARBITRARY_CHAR2 = 0xff02;
-
-    // See sun.security.ec.NamedCurve for the OIDs
-    private final static String[] NAMED_CURVE_OID_TABLE = new String[] {
-        null,                   //  (0) unused
-        "1.3.132.0.1",          //  (1) sect163k1, NIST K-163
-        "1.3.132.0.2",          //  (2) sect163r1
-        "1.3.132.0.15",         //  (3) sect163r2, NIST B-163
-        "1.3.132.0.24",         //  (4) sect193r1
-        "1.3.132.0.25",         //  (5) sect193r2
-        "1.3.132.0.26",         //  (6) sect233k1, NIST K-233
-        "1.3.132.0.27",         //  (7) sect233r1, NIST B-233
-        "1.3.132.0.3",          //  (8) sect239k1
-        "1.3.132.0.16",         //  (9) sect283k1, NIST K-283
-        "1.3.132.0.17",         // (10) sect283r1, NIST B-283
-        "1.3.132.0.36",         // (11) sect409k1, NIST K-409
-        "1.3.132.0.37",         // (12) sect409r1, NIST B-409
-        "1.3.132.0.38",         // (13) sect571k1, NIST K-571
-        "1.3.132.0.39",         // (14) sect571r1, NIST B-571
-        "1.3.132.0.9",          // (15) secp160k1
-        "1.3.132.0.8",          // (16) secp160r1
-        "1.3.132.0.30",         // (17) secp160r2
-        "1.3.132.0.31",         // (18) secp192k1
-        "1.2.840.10045.3.1.1",  // (19) secp192r1, NIST P-192
-        "1.3.132.0.32",         // (20) secp224k1
-        "1.3.132.0.33",         // (21) secp224r1, NIST P-224
-        "1.3.132.0.10",         // (22) secp256k1
-        "1.2.840.10045.3.1.7",  // (23) secp256r1, NIST P-256
-        "1.3.132.0.34",         // (24) secp384r1, NIST P-384
-        "1.3.132.0.35",         // (25) secp521r1, NIST P-521
-    };
-
-    private final static Map<String,Integer> curveIndices;
-
-    static {
-        curveIndices = new HashMap<String,Integer>();
-        for (int i = 1; i < NAMED_CURVE_OID_TABLE.length; i++) {
-            curveIndices.put(NAMED_CURVE_OID_TABLE[i], i);
-        }
-    }
-
-}
-
-final class SupportedEllipticPointFormatsExtension extends HelloExtension {
-
-    final static int FMT_UNCOMPRESSED = 0;
-    final static int FMT_ANSIX962_COMPRESSED_PRIME = 1;
-    final static int FMT_ANSIX962_COMPRESSED_CHAR2 = 2;
-
-    static final HelloExtension DEFAULT =
-        new SupportedEllipticPointFormatsExtension(
-            new byte[] {FMT_UNCOMPRESSED});
-
-    private final byte[] formats;
-
-    private SupportedEllipticPointFormatsExtension(byte[] formats) {
-        super(ExtensionType.EXT_EC_POINT_FORMATS);
-        this.formats = formats;
-    }
-
-    SupportedEllipticPointFormatsExtension(HandshakeInStream s, int len)
-            throws IOException {
-        super(ExtensionType.EXT_EC_POINT_FORMATS);
-        formats = s.getBytes8();
-        // RFC 4492 says uncompressed points must always be supported.
-        // Check just to make sure.
-        boolean uncompressed = false;
-        for (int format : formats) {
-            if (format == FMT_UNCOMPRESSED) {
-                uncompressed = true;
-                break;
-            }
-        }
-        if (uncompressed == false) {
-            throw new SSLProtocolException
-                ("Peer does not support uncompressed points");
-        }
-    }
-
-    int length() {
-        return 5 + formats.length;
-    }
-
-    void send(HandshakeOutStream s) throws IOException {
-        s.putInt16(type.id);
-        s.putInt16(formats.length + 1);
-        s.putBytes8(formats);
-    }
-
-    private static String toString(byte format) {
-        int f = format & 0xff;
-        switch (f) {
-        case FMT_UNCOMPRESSED:
-            return "uncompressed";
-        case FMT_ANSIX962_COMPRESSED_PRIME:
-            return "ansiX962_compressed_prime";
-        case FMT_ANSIX962_COMPRESSED_CHAR2:
-            return "ansiX962_compressed_char2";
-        default:
-            return "unknown-" + f;
-        }
-    }
-
-    public String toString() {
-        List<String> list = new ArrayList<>();
-        for (byte format : formats) {
-            list.add(toString(format));
-        }
-        return "Extension " + type + ", formats: " + list;
-    }
-}
-
-/*
- * For secure renegotiation, RFC5746 defines a new TLS extension,
- * "renegotiation_info" (with extension type 0xff01), which contains a
- * cryptographic binding to the enclosing TLS connection (if any) for
- * which the renegotiation is being performed.  The "extension data"
- * field of this extension contains a "RenegotiationInfo" structure:
- *
- *      struct {
- *          opaque renegotiated_connection<0..255>;
- *      } RenegotiationInfo;
- */
-final class RenegotiationInfoExtension extends HelloExtension {
-    private final byte[] renegotiated_connection;
-
-    RenegotiationInfoExtension(byte[] clientVerifyData,
-                byte[] serverVerifyData) {
-        super(ExtensionType.EXT_RENEGOTIATION_INFO);
-
-        if (clientVerifyData.length != 0) {
-            renegotiated_connection =
-                    new byte[clientVerifyData.length + serverVerifyData.length];
-            System.arraycopy(clientVerifyData, 0, renegotiated_connection,
-                    0, clientVerifyData.length);
-
-            if (serverVerifyData.length != 0) {
-                System.arraycopy(serverVerifyData, 0, renegotiated_connection,
-                        clientVerifyData.length, serverVerifyData.length);
-            }
-        } else {
-            // ignore both the client and server verify data.
-            renegotiated_connection = new byte[0];
-        }
-    }
-
-    RenegotiationInfoExtension(HandshakeInStream s, int len)
-                throws IOException {
-        super(ExtensionType.EXT_RENEGOTIATION_INFO);
-
-        // check the extension length
-        if (len < 1) {
-            throw new SSLProtocolException("Invalid " + type + " extension");
-        }
-
-        int renegoInfoDataLen = s.getInt8();
-        if (renegoInfoDataLen + 1 != len) {  // + 1 = the byte we just read
-            throw new SSLProtocolException("Invalid " + type + " extension");
-        }
-
-        renegotiated_connection = new byte[renegoInfoDataLen];
-        if (renegoInfoDataLen != 0) {
-            s.read(renegotiated_connection, 0, renegoInfoDataLen);
-        }
-    }
-
-
-    // Length of the encoded extension, including the type and length fields
-    int length() {
-        return 5 + renegotiated_connection.length;
-    }
-
-    void send(HandshakeOutStream s) throws IOException {
-        s.putInt16(type.id);
-        s.putInt16(renegotiated_connection.length + 1);
-        s.putBytes8(renegotiated_connection);
-    }
-
-    boolean isEmpty() {
-        return renegotiated_connection.length == 0;
-    }
-
-    byte[] getRenegotiatedConnection() {
-        return renegotiated_connection;
-    }
-
-    public String toString() {
-        return "Extension " + type + ", renegotiated_connection: " +
-                    (renegotiated_connection.length == 0 ? "<empty>" :
-                    Debug.toString(renegotiated_connection));
-    }
-
-}
-
-/*
- * [RFC5246] The client uses the "signature_algorithms" extension to
- * indicate to the server which signature/hash algorithm pairs may be
- * used in digital signatures.  The "extension_data" field of this
- * extension contains a "supported_signature_algorithms" value.
- *
- *     enum {
- *         none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
- *         sha512(6), (255)
- *     } HashAlgorithm;
- *
- *     enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
- *       SignatureAlgorithm;
- *
- *     struct {
- *           HashAlgorithm hash;
- *           SignatureAlgorithm signature;
- *     } SignatureAndHashAlgorithm;
- *
- *     SignatureAndHashAlgorithm
- *       supported_signature_algorithms<2..2^16-2>;
- */
-final class SignatureAlgorithmsExtension extends HelloExtension {
-
-    private Collection<SignatureAndHashAlgorithm> algorithms;
-    private int algorithmsLen;  // length of supported_signature_algorithms
-
-    SignatureAlgorithmsExtension(
-            Collection<SignatureAndHashAlgorithm> signAlgs) {
-
-        super(ExtensionType.EXT_SIGNATURE_ALGORITHMS);
-
-        algorithms = new ArrayList<SignatureAndHashAlgorithm>(signAlgs);
-        algorithmsLen =
-            SignatureAndHashAlgorithm.sizeInRecord() * algorithms.size();
-    }
-
-    SignatureAlgorithmsExtension(HandshakeInStream s, int len)
-                throws IOException {
-        super(ExtensionType.EXT_SIGNATURE_ALGORITHMS);
-
-        algorithmsLen = s.getInt16();
-        if (algorithmsLen == 0 || algorithmsLen + 2 != len) {
-            throw new SSLProtocolException("Invalid " + type + " extension");
-        }
-
-        algorithms = new ArrayList<SignatureAndHashAlgorithm>();
-        int remains = algorithmsLen;
-        int sequence = 0;
-        while (remains > 1) {   // needs at least two bytes
-            int hash = s.getInt8();         // hash algorithm
-            int signature = s.getInt8();    // signature algorithm
-
-            SignatureAndHashAlgorithm algorithm =
-                SignatureAndHashAlgorithm.valueOf(hash, signature, ++sequence);
-            algorithms.add(algorithm);
-            remains -= 2;  // one byte for hash, one byte for signature
-        }
-
-        if (remains != 0) {
-            throw new SSLProtocolException("Invalid server_name extension");
-        }
-    }
-
-    Collection<SignatureAndHashAlgorithm> getSignAlgorithms() {
-        return algorithms;
-    }
-
-    @Override
-    int length() {
-        return 6 + algorithmsLen;
-    }
-
-    @Override
-    void send(HandshakeOutStream s) throws IOException {
-        s.putInt16(type.id);
-        s.putInt16(algorithmsLen + 2);
-        s.putInt16(algorithmsLen);
-
-        for (SignatureAndHashAlgorithm algorithm : algorithms) {
-            s.putInt8(algorithm.getHashValue());      // HashAlgorithm
-            s.putInt8(algorithm.getSignatureValue()); // SignatureAlgorithm
-        }
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer buffer = new StringBuffer();
-        boolean opened = false;
-        for (SignatureAndHashAlgorithm signAlg : algorithms) {
-            if (opened) {
-                buffer.append(", " + signAlg.getAlgorithmName());
-            } else {
-                buffer.append(signAlg.getAlgorithmName());
-                opened = true;
-            }
-        }
-
-        return "Extension " + type + ", signature_algorithms: " + buffer;
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/security/ssl/RenegotiationInfoExtension.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.ssl;
+
+import java.io.IOException;
+
+import javax.net.ssl.SSLProtocolException;
+
+/*
+ * For secure renegotiation, RFC5746 defines a new TLS extension,
+ * "renegotiation_info" (with extension type 0xff01), which contains a
+ * cryptographic binding to the enclosing TLS connection (if any) for
+ * which the renegotiation is being performed.  The "extension data"
+ * field of this extension contains a "RenegotiationInfo" structure:
+ *
+ *      struct {
+ *          opaque renegotiated_connection<0..255>;
+ *      } RenegotiationInfo;
+ */
+final class RenegotiationInfoExtension extends HelloExtension {
+    private final byte[] renegotiated_connection;
+
+    RenegotiationInfoExtension(byte[] clientVerifyData,
+                byte[] serverVerifyData) {
+        super(ExtensionType.EXT_RENEGOTIATION_INFO);
+
+        if (clientVerifyData.length != 0) {
+            renegotiated_connection =
+                    new byte[clientVerifyData.length + serverVerifyData.length];
+            System.arraycopy(clientVerifyData, 0, renegotiated_connection,
+                    0, clientVerifyData.length);
+
+            if (serverVerifyData.length != 0) {
+                System.arraycopy(serverVerifyData, 0, renegotiated_connection,
+                        clientVerifyData.length, serverVerifyData.length);
+            }
+        } else {
+            // ignore both the client and server verify data.
+            renegotiated_connection = new byte[0];
+        }
+    }
+
+    RenegotiationInfoExtension(HandshakeInStream s, int len)
+                throws IOException {
+        super(ExtensionType.EXT_RENEGOTIATION_INFO);
+
+        // check the extension length
+        if (len < 1) {
+            throw new SSLProtocolException("Invalid " + type + " extension");
+        }
+
+        int renegoInfoDataLen = s.getInt8();
+        if (renegoInfoDataLen + 1 != len) {  // + 1 = the byte we just read
+            throw new SSLProtocolException("Invalid " + type + " extension");
+        }
+
+        renegotiated_connection = new byte[renegoInfoDataLen];
+        if (renegoInfoDataLen != 0) {
+            s.read(renegotiated_connection, 0, renegoInfoDataLen);
+        }
+    }
+
+
+    // Length of the encoded extension, including the type and length fields
+    int length() {
+        return 5 + renegotiated_connection.length;
+    }
+
+    void send(HandshakeOutStream s) throws IOException {
+        s.putInt16(type.id);
+        s.putInt16(renegotiated_connection.length + 1);
+        s.putBytes8(renegotiated_connection);
+    }
+
+    boolean isEmpty() {
+        return renegotiated_connection.length == 0;
+    }
+
+    byte[] getRenegotiatedConnection() {
+        return renegotiated_connection;
+    }
+
+    public String toString() {
+        return "Extension " + type + ", renegotiated_connection: " +
+                    (renegotiated_connection.length == 0 ? "<empty>" :
+                    Debug.toString(renegotiated_connection));
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/security/ssl/ServerNameExtension.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.ssl;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.net.ssl.SNIHostName;
+import javax.net.ssl.SNIMatcher;
+import javax.net.ssl.SNIServerName;
+import javax.net.ssl.SSLProtocolException;
+import javax.net.ssl.StandardConstants;
+
+/*
+ * [RFC 4366/6066] To facilitate secure connections to servers that host
+ * multiple 'virtual' servers at a single underlying network address, clients
+ * MAY include an extension of type "server_name" in the (extended) client
+ * hello.  The "extension_data" field of this extension SHALL contain
+ * "ServerNameList" where:
+ *
+ *     struct {
+ *         NameType name_type;
+ *         select (name_type) {
+ *             case host_name: HostName;
+ *         } name;
+ *     } ServerName;
+ *
+ *     enum {
+ *         host_name(0), (255)
+ *     } NameType;
+ *
+ *     opaque HostName<1..2^16-1>;
+ *
+ *     struct {
+ *         ServerName server_name_list<1..2^16-1>
+ *     } ServerNameList;
+ */
+final class ServerNameExtension extends HelloExtension {
+
+    // For backward compatibility, all future data structures associated with
+    // new NameTypes MUST begin with a 16-bit length field.
+    final static int NAME_HEADER_LENGTH = 3;    // NameType: 1 byte
+                                                // Name length: 2 bytes
+    private Map<Integer, SNIServerName> sniMap;
+    private int listLength;     // ServerNameList length
+
+    // constructor for ServerHello
+    ServerNameExtension() throws IOException {
+        super(ExtensionType.EXT_SERVER_NAME);
+
+        listLength = 0;
+        sniMap = Collections.<Integer, SNIServerName>emptyMap();
+    }
+
+    // constructor for ClientHello
+    ServerNameExtension(List<SNIServerName> serverNames)
+            throws IOException {
+        super(ExtensionType.EXT_SERVER_NAME);
+
+        listLength = 0;
+        sniMap = new LinkedHashMap<>();
+        for (SNIServerName serverName : serverNames) {
+            // check for duplicated server name type
+            if (sniMap.put(serverName.getType(), serverName) != null) {
+                // unlikely to happen, but in case ...
+                throw new RuntimeException(
+                    "Duplicated server name of type " + serverName.getType());
+            }
+
+            listLength += serverName.getEncoded().length + NAME_HEADER_LENGTH;
+        }
+
+        // This constructor is used for ClientHello only.  Empty list is
+        // not allowed in client mode.
+        if (listLength == 0) {
+            throw new RuntimeException("The ServerNameList cannot be empty");
+        }
+    }
+
+    // constructor for ServerHello for parsing SNI extension
+    ServerNameExtension(HandshakeInStream s, int len)
+            throws IOException {
+        super(ExtensionType.EXT_SERVER_NAME);
+
+        int remains = len;
+        if (len >= 2) {    // "server_name" extension in ClientHello
+            listLength = s.getInt16();     // ServerNameList length
+            if (listLength == 0 || listLength + 2 != len) {
+                throw new SSLProtocolException(
+                        "Invalid " + type + " extension");
+            }
+
+            remains -= 2;
+            sniMap = new LinkedHashMap<>();
+            while (remains > 0) {
+                int code = s.getInt8();       // NameType
+
+                // HostName (length read in getBytes16);
+                byte[] encoded = s.getBytes16();
+                SNIServerName serverName;
+                switch (code) {
+                    case StandardConstants.SNI_HOST_NAME:
+                        if (encoded.length == 0) {
+                            throw new SSLProtocolException(
+                                "Empty HostName in server name indication");
+                        }
+                        try {
+                            serverName = new SNIHostName(encoded);
+                        } catch (IllegalArgumentException iae) {
+                            SSLProtocolException spe = new SSLProtocolException(
+                                "Illegal server name, type=host_name(" +
+                                code + "), name=" +
+                                (new String(encoded, StandardCharsets.UTF_8)) +
+                                ", value=" + Debug.toString(encoded));
+                            spe.initCause(iae);
+                            throw spe;
+                        }
+                        break;
+                    default:
+                        try {
+                            serverName = new UnknownServerName(code, encoded);
+                        } catch (IllegalArgumentException iae) {
+                            SSLProtocolException spe = new SSLProtocolException(
+                                "Illegal server name, type=(" + code +
+                                "), value=" + Debug.toString(encoded));
+                            spe.initCause(iae);
+                            throw spe;
+                        }
+                }
+                // check for duplicated server name type
+                if (sniMap.put(serverName.getType(), serverName) != null) {
+                    throw new SSLProtocolException(
+                            "Duplicated server name of type " +
+                            serverName.getType());
+                }
+
+                remains -= encoded.length + NAME_HEADER_LENGTH;
+            }
+        } else if (len == 0) {     // "server_name" extension in ServerHello
+            listLength = 0;
+            sniMap = Collections.<Integer, SNIServerName>emptyMap();
+        }
+
+        if (remains != 0) {
+            throw new SSLProtocolException("Invalid server_name extension");
+        }
+    }
+
+    List<SNIServerName> getServerNames() {
+        if (sniMap != null && !sniMap.isEmpty()) {
+            return Collections.<SNIServerName>unmodifiableList(
+                                        new ArrayList<>(sniMap.values()));
+        }
+
+        return Collections.<SNIServerName>emptyList();
+    }
+
+    /*
+     * Is the extension recognized by the corresponding matcher?
+     *
+     * This method is used to check whether the server name indication can
+     * be recognized by the server name matchers.
+     *
+     * Per RFC 6066, if the server understood the ClientHello extension but
+     * does not recognize the server name, the server SHOULD take one of two
+     * actions: either abort the handshake by sending a fatal-level
+     * unrecognized_name(112) alert or continue the handshake.
+     *
+     * If there is an instance of SNIMatcher defined for a particular name
+     * type, it must be used to perform match operations on the server name.
+     */
+    boolean isMatched(Collection<SNIMatcher> matchers) {
+        if (sniMap != null && !sniMap.isEmpty()) {
+            for (SNIMatcher matcher : matchers) {
+                SNIServerName sniName = sniMap.get(matcher.getType());
+                if (sniName != null && (!matcher.matches(sniName))) {
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    /*
+     * Is the extension is identical to a server name list?
+     *
+     * This method is used to check the server name indication during session
+     * resumption.
+     *
+     * Per RFC 6066, when the server is deciding whether or not to accept a
+     * request to resume a session, the contents of a server_name extension
+     * MAY be used in the lookup of the session in the session cache.  The
+     * client SHOULD include the same server_name extension in the session
+     * resumption request as it did in the full handshake that established
+     * the session.  A server that implements this extension MUST NOT accept
+     * the request to resume the session if the server_name extension contains
+     * a different name.  Instead, it proceeds with a full handshake to
+     * establish a new session.  When resuming a session, the server MUST NOT
+     * include a server_name extension in the server hello.
+     */
+    boolean isIdentical(List<SNIServerName> other) {
+        if (other.size() == sniMap.size()) {
+            for(SNIServerName sniInOther : other) {
+                SNIServerName sniName = sniMap.get(sniInOther.getType());
+                if (sniName == null || !sniInOther.equals(sniName)) {
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    int length() {
+        return listLength == 0 ? 4 : 6 + listLength;
+    }
+
+    void send(HandshakeOutStream s) throws IOException {
+        s.putInt16(type.id);
+        if (listLength == 0) {
+            s.putInt16(listLength);     // in ServerHello, empty extension_data
+        } else {
+            s.putInt16(listLength + 2); // length of extension_data
+            s.putInt16(listLength);     // length of ServerNameList
+
+            for (SNIServerName sniName : sniMap.values()) {
+                s.putInt8(sniName.getType());         // server name type
+                s.putBytes16(sniName.getEncoded());   // server name value
+            }
+        }
+    }
+
+    public String toString() {
+        StringBuffer buffer = new StringBuffer();
+        for (SNIServerName sniName : sniMap.values()) {
+            buffer.append("[" + sniName + "]");
+        }
+
+        return "Extension " + type + ", server_name: " + buffer;
+    }
+
+    private static class UnknownServerName extends SNIServerName {
+        UnknownServerName(int code, byte[] encoded) {
+            super(code, encoded);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.ssl;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.net.ssl.SSLProtocolException;
+
+/*
+ * [RFC5246] The client uses the "signature_algorithms" extension to
+ * indicate to the server which signature/hash algorithm pairs may be
+ * used in digital signatures.  The "extension_data" field of this
+ * extension contains a "supported_signature_algorithms" value.
+ *
+ *     enum {
+ *         none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
+ *         sha512(6), (255)
+ *     } HashAlgorithm;
+ *
+ *     enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
+ *       SignatureAlgorithm;
+ *
+ *     struct {
+ *           HashAlgorithm hash;
+ *           SignatureAlgorithm signature;
+ *     } SignatureAndHashAlgorithm;
+ *
+ *     SignatureAndHashAlgorithm
+ *       supported_signature_algorithms<2..2^16-2>;
+ */
+final class SignatureAlgorithmsExtension extends HelloExtension {
+
+    private Collection<SignatureAndHashAlgorithm> algorithms;
+    private int algorithmsLen;  // length of supported_signature_algorithms
+
+    SignatureAlgorithmsExtension(
+            Collection<SignatureAndHashAlgorithm> signAlgs) {
+
+        super(ExtensionType.EXT_SIGNATURE_ALGORITHMS);
+
+        algorithms = new ArrayList<SignatureAndHashAlgorithm>(signAlgs);
+        algorithmsLen =
+            SignatureAndHashAlgorithm.sizeInRecord() * algorithms.size();
+    }
+
+    SignatureAlgorithmsExtension(HandshakeInStream s, int len)
+                throws IOException {
+        super(ExtensionType.EXT_SIGNATURE_ALGORITHMS);
+
+        algorithmsLen = s.getInt16();
+        if (algorithmsLen == 0 || algorithmsLen + 2 != len) {
+            throw new SSLProtocolException("Invalid " + type + " extension");
+        }
+
+        algorithms = new ArrayList<SignatureAndHashAlgorithm>();
+        int remains = algorithmsLen;
+        int sequence = 0;
+        while (remains > 1) {   // needs at least two bytes
+            int hash = s.getInt8();         // hash algorithm
+            int signature = s.getInt8();    // signature algorithm
+
+            SignatureAndHashAlgorithm algorithm =
+                SignatureAndHashAlgorithm.valueOf(hash, signature, ++sequence);
+            algorithms.add(algorithm);
+            remains -= 2;  // one byte for hash, one byte for signature
+        }
+
+        if (remains != 0) {
+            throw new SSLProtocolException("Invalid server_name extension");
+        }
+    }
+
+    Collection<SignatureAndHashAlgorithm> getSignAlgorithms() {
+        return algorithms;
+    }
+
+    @Override
+    int length() {
+        return 6 + algorithmsLen;
+    }
+
+    @Override
+    void send(HandshakeOutStream s) throws IOException {
+        s.putInt16(type.id);
+        s.putInt16(algorithmsLen + 2);
+        s.putInt16(algorithmsLen);
+
+        for (SignatureAndHashAlgorithm algorithm : algorithms) {
+            s.putInt8(algorithm.getHashValue());      // HashAlgorithm
+            s.putInt8(algorithm.getSignatureValue()); // SignatureAlgorithm
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuffer buffer = new StringBuffer();
+        boolean opened = false;
+        for (SignatureAndHashAlgorithm signAlg : algorithms) {
+            if (opened) {
+                buffer.append(", " + signAlg.getAlgorithmName());
+            } else {
+                buffer.append(signAlg.getAlgorithmName());
+                opened = true;
+            }
+        }
+
+        return "Extension " + type + ", signature_algorithms: " + buffer;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.ssl;
+
+import java.io.IOException;
+import java.security.spec.ECParameterSpec;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.net.ssl.SSLProtocolException;
+
+final class SupportedEllipticCurvesExtension extends HelloExtension {
+
+    // the extension value to send in the ClientHello message
+    static final SupportedEllipticCurvesExtension DEFAULT;
+
+    private static final boolean fips;
+
+    static {
+        int[] ids;
+        fips = SunJSSE.isFIPS();
+        if (fips == false) {
+            ids = new int[] {
+                // NIST curves first
+                // prefer NIST P-256, rest in order of increasing key length
+                23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14,
+                // non-NIST curves
+                15, 16, 17, 2, 18, 4, 5, 20, 8, 22,
+            };
+        } else {
+            ids = new int[] {
+                // same as above, but allow only NIST curves in FIPS mode
+                23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14,
+            };
+        }
+        DEFAULT = new SupportedEllipticCurvesExtension(ids);
+    }
+
+    private final int[] curveIds;
+
+    private SupportedEllipticCurvesExtension(int[] curveIds) {
+        super(ExtensionType.EXT_ELLIPTIC_CURVES);
+        this.curveIds = curveIds;
+    }
+
+    SupportedEllipticCurvesExtension(HandshakeInStream s, int len)
+            throws IOException {
+        super(ExtensionType.EXT_ELLIPTIC_CURVES);
+        int k = s.getInt16();
+        if (((len & 1) != 0) || (k + 2 != len)) {
+            throw new SSLProtocolException("Invalid " + type + " extension");
+        }
+        curveIds = new int[k >> 1];
+        for (int i = 0; i < curveIds.length; i++) {
+            curveIds[i] = s.getInt16();
+        }
+    }
+
+    boolean contains(int index) {
+        for (int curveId : curveIds) {
+            if (index == curveId) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // Return a reference to the internal curveIds array.
+    // The caller must NOT modify the contents.
+    int[] curveIds() {
+        return curveIds;
+    }
+
+    int length() {
+        return 6 + (curveIds.length << 1);
+    }
+
+    void send(HandshakeOutStream s) throws IOException {
+        s.putInt16(type.id);
+        int k = curveIds.length << 1;
+        s.putInt16(k + 2);
+        s.putInt16(k);
+        for (int curveId : curveIds) {
+            s.putInt16(curveId);
+        }
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Extension " + type + ", curve names: {");
+        boolean first = true;
+        for (int curveId : curveIds) {
+            if (first) {
+                first = false;
+            } else {
+                sb.append(", ");
+            }
+            // first check if it is a known named curve, then try other cases.
+            String oid = getCurveOid(curveId);
+            if (oid != null) {
+                ECParameterSpec spec = JsseJce.getECParameterSpec(oid);
+                // this toString() output will look nice for the current
+                // implementation of the ECParameterSpec class in the Sun
+                // provider, but may not look good for other implementations.
+                if (spec != null) {
+                    sb.append(spec.toString().split(" ")[0]);
+                } else {
+                    sb.append(oid);
+                }
+            } else if (curveId == ARBITRARY_PRIME) {
+                sb.append("arbitrary_explicit_prime_curves");
+            } else if (curveId == ARBITRARY_CHAR2) {
+                sb.append("arbitrary_explicit_char2_curves");
+            } else {
+                sb.append("unknown curve " + curveId);
+            }
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+
+    // Test whether we support the curve with the given index.
+    static boolean isSupported(int index) {
+        if ((index <= 0) || (index >= NAMED_CURVE_OID_TABLE.length)) {
+            return false;
+        }
+        if (fips == false) {
+            // in non-FIPS mode, we support all valid indices
+            return true;
+        }
+        return DEFAULT.contains(index);
+    }
+
+    static int getCurveIndex(ECParameterSpec params) {
+        String oid = JsseJce.getNamedCurveOid(params);
+        if (oid == null) {
+            return -1;
+        }
+        Integer n = curveIndices.get(oid);
+        return (n == null) ? -1 : n;
+    }
+
+    static String getCurveOid(int index) {
+        if ((index > 0) && (index < NAMED_CURVE_OID_TABLE.length)) {
+            return NAMED_CURVE_OID_TABLE[index];
+        }
+        return null;
+    }
+
+    private final static int ARBITRARY_PRIME = 0xff01;
+    private final static int ARBITRARY_CHAR2 = 0xff02;
+
+    // See sun.security.ec.NamedCurve for the OIDs
+    private final static String[] NAMED_CURVE_OID_TABLE = new String[] {
+        null,                   //  (0) unused
+        "1.3.132.0.1",          //  (1) sect163k1, NIST K-163
+        "1.3.132.0.2",          //  (2) sect163r1
+        "1.3.132.0.15",         //  (3) sect163r2, NIST B-163
+        "1.3.132.0.24",         //  (4) sect193r1
+        "1.3.132.0.25",         //  (5) sect193r2
+        "1.3.132.0.26",         //  (6) sect233k1, NIST K-233
+        "1.3.132.0.27",         //  (7) sect233r1, NIST B-233
+        "1.3.132.0.3",          //  (8) sect239k1
+        "1.3.132.0.16",         //  (9) sect283k1, NIST K-283
+        "1.3.132.0.17",         // (10) sect283r1, NIST B-283
+        "1.3.132.0.36",         // (11) sect409k1, NIST K-409
+        "1.3.132.0.37",         // (12) sect409r1, NIST B-409
+        "1.3.132.0.38",         // (13) sect571k1, NIST K-571
+        "1.3.132.0.39",         // (14) sect571r1, NIST B-571
+        "1.3.132.0.9",          // (15) secp160k1
+        "1.3.132.0.8",          // (16) secp160r1
+        "1.3.132.0.30",         // (17) secp160r2
+        "1.3.132.0.31",         // (18) secp192k1
+        "1.2.840.10045.3.1.1",  // (19) secp192r1, NIST P-192
+        "1.3.132.0.32",         // (20) secp224k1
+        "1.3.132.0.33",         // (21) secp224r1, NIST P-224
+        "1.3.132.0.10",         // (22) secp256k1
+        "1.2.840.10045.3.1.7",  // (23) secp256r1, NIST P-256
+        "1.3.132.0.34",         // (24) secp384r1, NIST P-384
+        "1.3.132.0.35",         // (25) secp521r1, NIST P-521
+    };
+
+    private final static Map<String,Integer> curveIndices;
+
+    static {
+        curveIndices = new HashMap<String,Integer>();
+        for (int i = 1; i < NAMED_CURVE_OID_TABLE.length; i++) {
+            curveIndices.put(NAMED_CURVE_OID_TABLE[i], i);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/security/ssl/SupportedEllipticPointFormatsExtension.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.ssl;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.net.ssl.SSLProtocolException;
+
+final class SupportedEllipticPointFormatsExtension extends HelloExtension {
+
+    final static int FMT_UNCOMPRESSED = 0;
+    final static int FMT_ANSIX962_COMPRESSED_PRIME = 1;
+    final static int FMT_ANSIX962_COMPRESSED_CHAR2 = 2;
+
+    static final HelloExtension DEFAULT =
+        new SupportedEllipticPointFormatsExtension(
+            new byte[] {FMT_UNCOMPRESSED});
+
+    private final byte[] formats;
+
+    private SupportedEllipticPointFormatsExtension(byte[] formats) {
+        super(ExtensionType.EXT_EC_POINT_FORMATS);
+        this.formats = formats;
+    }
+
+    SupportedEllipticPointFormatsExtension(HandshakeInStream s, int len)
+            throws IOException {
+        super(ExtensionType.EXT_EC_POINT_FORMATS);
+        formats = s.getBytes8();
+        // RFC 4492 says uncompressed points must always be supported.
+        // Check just to make sure.
+        boolean uncompressed = false;
+        for (int format : formats) {
+            if (format == FMT_UNCOMPRESSED) {
+                uncompressed = true;
+                break;
+            }
+        }
+        if (uncompressed == false) {
+            throw new SSLProtocolException
+                ("Peer does not support uncompressed points");
+        }
+    }
+
+    int length() {
+        return 5 + formats.length;
+    }
+
+    void send(HandshakeOutStream s) throws IOException {
+        s.putInt16(type.id);
+        s.putInt16(formats.length + 1);
+        s.putBytes8(formats);
+    }
+
+    private static String toString(byte format) {
+        int f = format & 0xff;
+        switch (f) {
+        case FMT_UNCOMPRESSED:
+            return "uncompressed";
+        case FMT_ANSIX962_COMPRESSED_PRIME:
+            return "ansiX962_compressed_prime";
+        case FMT_ANSIX962_COMPRESSED_CHAR2:
+            return "ansiX962_compressed_char2";
+        default:
+            return "unknown-" + f;
+        }
+    }
+
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        for (byte format : formats) {
+            list.add(toString(format));
+        }
+        return "Extension " + type + ", formats: " + list;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/security/ssl/UnknownExtension.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.ssl;
+
+import java.io.IOException;
+
+final class UnknownExtension extends HelloExtension {
+
+    private final byte[] data;
+
+    UnknownExtension(HandshakeInStream s, int len, ExtensionType type)
+            throws IOException {
+        super(type);
+        data = new byte[len];
+        // s.read() does not handle 0-length arrays.
+        if (len != 0) {
+            s.read(data);
+        }
+    }
+
+    int length() {
+        return 4 + data.length;
+    }
+
+    void send(HandshakeOutStream s) throws IOException {
+        s.putInt16(type.id);
+        s.putBytes16(data);
+    }
+
+    public String toString() {
+        return "Unsupported extension " + type + ", data: " +
+            Debug.toString(data);
+    }
+}
--- a/src/solaris/classes/sun/awt/X11/XChoicePeer.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/src/solaris/classes/sun/awt/X11/XChoicePeer.java	Mon Oct 29 14:12:37 2012 +0100
@@ -1108,17 +1108,3 @@
         return true;
     }
 }
-
-/*
- * The listener interface for receiving "interesting" for XFileDialogPeer
- * choice events (opening, closing).
- * The listener added by means of the method addXChoicePeerListener
- * A opening choice event is generated when the invoking unfurledChoice.toFront()
- * A closing choice event is generated at the time of the processing the mouse releasing
- * and the Enter pressing.
- * see 6240074 for more information
- */
-interface XChoicePeerListener{
-    public void unfurledChoiceOpening(ListHelper choiceHelper);
-    public void unfurledChoiceClosing();
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/classes/sun/awt/X11/XChoicePeerListener.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.awt.X11;
+
+/*
+ * The listener interface for receiving "interesting" for XFileDialogPeer
+ * choice events (opening, closing).
+ * The listener added by means of the method addXChoicePeerListener
+ * A opening choice event is generated when the invoking unfurledChoice.toFront()
+ * A closing choice event is generated at the time of the processing the mouse releasing
+ * and the Enter pressing.
+ * see 6240074 for more information
+ */
+interface XChoicePeerListener{
+    public void unfurledChoiceOpening(ListHelper choiceHelper);
+    public void unfurledChoiceClosing();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/classes/sun/font/DelegateStrike.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.font;
+
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
+import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
+
+/* Returned instead of a NativeStrike.
+ * It can intercept any request it wants, but mostly
+ * passes them on to its delegate strike. It is important that
+ * it override all the inherited FontStrike methods to delegate them
+ * appropriately.
+ */
+
+class DelegateStrike extends NativeStrike {
+
+    private FontStrike delegateStrike;
+
+    DelegateStrike(NativeFont nativeFont, FontStrikeDesc desc,
+                   FontStrike delegate) {
+        super(nativeFont, desc);
+        this.delegateStrike = delegate;
+    }
+
+    /* We want the native font to be responsible for reporting the
+     * font metrics, even if it often delegates to another font.
+     * The code here isn't yet implementing exactly that. If the glyph
+     * transform was something native couldn't handle, there's no native
+     * context from which to obtain metrics. Need to revise this to obtain
+     * the metrics and transform them. But currently in such a case it
+     * gets the metrics from a different font - its glyph delegate font.
+     */
+   StrikeMetrics getFontMetrics() {
+       if (strikeMetrics == null) {
+           if (pScalerContext != 0) {
+               strikeMetrics = super.getFontMetrics();
+           }
+            if (strikeMetrics == null) {
+                strikeMetrics = delegateStrike.getFontMetrics();
+            }
+        }
+        return strikeMetrics;
+    }
+
+    void getGlyphImagePtrs(int[] glyphCodes, long[] images,int  len) {
+        delegateStrike.getGlyphImagePtrs(glyphCodes, images, len);
+    }
+
+    long getGlyphImagePtr(int glyphCode) {
+        return delegateStrike.getGlyphImagePtr(glyphCode);
+    }
+
+    void getGlyphImageBounds(int glyphCode,
+                             Point2D.Float pt, Rectangle result) {
+        delegateStrike.getGlyphImageBounds(glyphCode, pt, result);
+    }
+
+    Point2D.Float getGlyphMetrics(int glyphCode) {
+        return delegateStrike.getGlyphMetrics(glyphCode);
+    }
+
+    float getGlyphAdvance(int glyphCode) {
+        return delegateStrike.getGlyphAdvance(glyphCode);
+    }
+
+     Point2D.Float getCharMetrics(char ch) {
+        return delegateStrike.getCharMetrics(ch);
+    }
+
+    float getCodePointAdvance(int cp) {
+        if (cp < 0 || cp >= 0x10000) {
+            cp = 0xffff;
+        }
+        return delegateStrike.getGlyphAdvance(cp);
+    }
+
+    Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) {
+        return delegateStrike.getGlyphOutlineBounds(glyphCode);
+    }
+
+    GeneralPath getGlyphOutline(int glyphCode, float x, float y) {
+        return delegateStrike.getGlyphOutline(glyphCode, x, y);
+    }
+
+    GeneralPath getGlyphVectorOutline(int[] glyphs, float x, float y) {
+        return delegateStrike.getGlyphVectorOutline(glyphs, x, y);
+    }
+
+}
--- a/src/solaris/classes/sun/font/NativeStrike.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/src/solaris/classes/sun/font/NativeStrike.java	Mon Oct 29 14:12:37 2012 +0100
@@ -32,7 +32,7 @@
 import java.awt.geom.Rectangle2D;
 import java.awt.geom.NoninvertibleTransformException;
 
- class NativeStrike extends PhysicalStrike {
+class NativeStrike extends PhysicalStrike {
 
      NativeFont nativeFont;
      int numGlyphs;
@@ -294,86 +294,3 @@
      }
 
 }
-
-/* Returned instead of a NativeStrike.
- * It can intercept any request it wants, but mostly
- * passes them on to its delegate strike. It is important that
- * it override all the inherited FontStrike methods to delegate them
- * appropriately.
- */
-
-class DelegateStrike extends NativeStrike {
-
-    private FontStrike delegateStrike;
-
-    DelegateStrike(NativeFont nativeFont, FontStrikeDesc desc,
-                   FontStrike delegate) {
-        super(nativeFont, desc);
-        this.delegateStrike = delegate;
-    }
-
-    /* We want the native font to be responsible for reporting the
-     * font metrics, even if it often delegates to another font.
-     * The code here isn't yet implementing exactly that. If the glyph
-     * transform was something native couldn't handle, there's no native
-     * context from which to obtain metrics. Need to revise this to obtain
-     * the metrics and transform them. But currently in such a case it
-     * gets the metrics from a different font - its glyph delegate font.
-     */
-   StrikeMetrics getFontMetrics() {
-       if (strikeMetrics == null) {
-           if (pScalerContext != 0) {
-               strikeMetrics = super.getFontMetrics();
-           }
-            if (strikeMetrics == null) {
-                strikeMetrics = delegateStrike.getFontMetrics();
-            }
-        }
-        return strikeMetrics;
-    }
-
-    void getGlyphImagePtrs(int[] glyphCodes, long[] images,int  len) {
-        delegateStrike.getGlyphImagePtrs(glyphCodes, images, len);
-    }
-
-    long getGlyphImagePtr(int glyphCode) {
-        return delegateStrike.getGlyphImagePtr(glyphCode);
-    }
-
-    void getGlyphImageBounds(int glyphCode,
-                             Point2D.Float pt, Rectangle result) {
-        delegateStrike.getGlyphImageBounds(glyphCode, pt, result);
-    }
-
-    Point2D.Float getGlyphMetrics(int glyphCode) {
-        return delegateStrike.getGlyphMetrics(glyphCode);
-    }
-
-    float getGlyphAdvance(int glyphCode) {
-        return delegateStrike.getGlyphAdvance(glyphCode);
-    }
-
-     Point2D.Float getCharMetrics(char ch) {
-        return delegateStrike.getCharMetrics(ch);
-    }
-
-    float getCodePointAdvance(int cp) {
-        if (cp < 0 || cp >= 0x10000) {
-            cp = 0xffff;
-        }
-        return delegateStrike.getGlyphAdvance(cp);
-    }
-
-    Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) {
-        return delegateStrike.getGlyphOutlineBounds(glyphCode);
-    }
-
-    GeneralPath getGlyphOutline(int glyphCode, float x, float y) {
-        return delegateStrike.getGlyphOutline(glyphCode, x, y);
-    }
-
-    GeneralPath getGlyphVectorOutline(int[] glyphs, float x, float y) {
-        return delegateStrike.getGlyphVectorOutline(glyphs, x, y);
-    }
-
-}
--- a/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java	Mon Oct 29 09:23:55 2012 +0100
+++ b/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java	Mon Oct 29 14:12:37 2012 +0100
@@ -326,24 +326,3 @@
         return tiledTrapArray[index];
     }
 }
-
-class TileTrapContainer {
-    int tileAlpha;
-    GrowableIntArray traps;
-
-    public TileTrapContainer(GrowableIntArray traps) {
-        this.traps = traps;
-    }
-
-    public void setTileAlpha(int tileAlpha) {
-        this.tileAlpha = tileAlpha;
-    }
-
-    public int getTileAlpha() {
-        return tileAlpha;
-    }
-
-    public GrowableIntArray getTraps() {
-        return traps;
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/classes/sun/java2d/jules/TileTrapContainer.java	Mon Oct 29 14:12:37 2012 +0100
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.java2d.jules;
+
+import sun.java2d.xr.GrowableIntArray;
+
+class TileTrapContainer {
+    int tileAlpha;
+    GrowableIntArray traps;
+
+    public TileTrapContainer(GrowableIntArray traps) {
+        this.traps = traps;
+    }
+
+    public void setTileAlpha(int tileAlpha) {
+        this.tileAlpha = tileAlpha;
+    }
+
+    public int getTileAlpha() {
+        return tileAlpha;
+    }
+
+    public GrowableIntArray getTraps() {
+        return traps;
+    }
+}