8000970: break out auxiliary classes that will prevent multi-core compilation of the JDK
Reviewed-by: alanb, wetmore
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/make/tools/src/build/tools/generatenimbus/Paint.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/make/tools/src/build/tools/generatenimbus/Shape.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/make/tools/src/build/tools/generatenimbus/SynthModel.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/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/jdk/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/jdk/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/jdk/make/tools/src/build/tools/generatenimbus/UIDefault.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/make/tools/src/build/tools/generatenimbus/UIStyle.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/src/share/classes/javax/management/timer/Timer.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/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/jdk/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.
+ * <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/jdk/src/share/classes/sun/awt/im/InputMethodManager.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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.
- * <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/jdk/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/jdk/src/share/classes/sun/misc/FloatingDecimal.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/src/share/classes/sun/net/httpserver/Event.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/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/jdk/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/jdk/src/share/classes/sun/net/www/http/KeepAliveStream.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/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/jdk/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/jdk/src/share/classes/sun/security/ssl/HelloExtensions.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/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/jdk/src/solaris/classes/sun/awt/X11/XChoicePeer.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/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/jdk/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/jdk/src/solaris/classes/sun/font/NativeStrike.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java Mon Oct 29 09:23:55 2012 +0100
+++ b/jdk/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/jdk/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;
+ }
+}