提交 4856d8f9 编写于 作者: V vinnie

Merge

...@@ -95,3 +95,4 @@ e250cef36ea05e627e7e6f7d75e5e19f529e2ba3 jdk7-b114 ...@@ -95,3 +95,4 @@ e250cef36ea05e627e7e6f7d75e5e19f529e2ba3 jdk7-b114
b357910aa04aead2a16b6d6ff395a8df4b51d1dd jdk7-b118 b357910aa04aead2a16b6d6ff395a8df4b51d1dd jdk7-b118
ecab7eefb8f2326fd90fb632f47f1b6f81e928f8 jdk7-b119 ecab7eefb8f2326fd90fb632f47f1b6f81e928f8 jdk7-b119
37d74e29687cf07c2bf9411af58c7e42440855c3 jdk7-b120 37d74e29687cf07c2bf9411af58c7e42440855c3 jdk7-b120
a661d8587b5d8986aacae086f5df66af9e1a96b1 jdk7-b121
...@@ -83,14 +83,19 @@ ifndef CLOSED_SRC ...@@ -83,14 +83,19 @@ ifndef CLOSED_SRC
CLOSED_SRC = $(BUILDDIR)/../src/closed CLOSED_SRC = $(BUILDDIR)/../src/closed
endif endif
# If we have no closed directory, force it to an openjdk build # If CLOSE_SRC_INCLUDED isn't set to true, check if there's any
CLOSED_SRC_DIR_EXISTS := $(shell \ # closed directory.
ifneq ($(CLOSED_SRC_INCLUDED), true)
CLOSED_SRC_INCLUDED := $(shell \
if [ -d $(CLOSED_SRC) ] ; then \ if [ -d $(CLOSED_SRC) ] ; then \
echo true; \ echo true; \
else \ else \
echo false; \ echo false; \
fi) fi)
ifeq ($(CLOSED_SRC_DIR_EXISTS), false) endif
# Set OPENJDK based on CLOSED_SRC_INCLUDED
ifeq ($(CLOSED_SRC_INCLUDED), false)
OPENJDK = true OPENJDK = true
endif endif
......
...@@ -123,7 +123,7 @@ LIBM=-lm ...@@ -123,7 +123,7 @@ LIBM=-lm
# GCC29_COMPILER_PATH: is the path to where the gcc 2.9 compiler is installed # GCC29_COMPILER_PATH: is the path to where the gcc 2.9 compiler is installed
# NOTE: Must end with / so that it could be empty, allowing PATH usage. # NOTE: Must end with / so that it could be empty, allowing PATH usage.
ifneq "$(origin ALT_GCC29_COMPILER_PATH)" "undefined" ifdef ALT_GCC29_COMPILER_PATH
GCC29_COMPILER_PATH :=$(call PrefixPath,$(ALT_GCC29_COMPILER_PATH)) GCC29_COMPILER_PATH :=$(call PrefixPath,$(ALT_GCC29_COMPILER_PATH))
else else
GCC29_COMPILER_PATH = $(JDK_DEVTOOLS_DIR)/$(PLATFORM)/gcc29/usr/ GCC29_COMPILER_PATH = $(JDK_DEVTOOLS_DIR)/$(PLATFORM)/gcc29/usr/
......
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
# If we are using freetype, the freetype version expected. # If we are using freetype, the freetype version expected.
# #
# REQUIRED_GCC_VER # REQUIRED_GCC_VER
# Solaris and Linux only. The required version of gcc/g++ for the plugin. # Solaris and Linux only. The required version of gcc/g++ for the legacy OJI plugin.
# #
# REQUIRED_LINK_VER # REQUIRED_LINK_VER
# Windows only: The version of link.exe expected. # Windows only: The version of link.exe expected.
......
...@@ -99,12 +99,16 @@ ifeq ($(PLATFORM), linux) ...@@ -99,12 +99,16 @@ ifeq ($(PLATFORM), linux)
echo "RedHat"; \ echo "RedHat"; \
elif [ -f /etc/SuSE-release ] ; then \ elif [ -f /etc/SuSE-release ] ; then \
echo "SuSE"; \ echo "SuSE"; \
elif [ -f /etc/lsb-release ] ; then \
$(EGREP) DISTRIB_ID /etc/lsb-release | $(SED) -e 's@.*DISTRIB_ID=\(.*\)@\1@'; \
else \ else \
echo "Unknown"; \ echo "Unknown"; \
fi) fi)
OS_VARIANT_VERSION := $(shell \ OS_VARIANT_VERSION := $(shell \
if [ "$(OS_VARIANT_NAME)" = "Fedora" ] ; then \ if [ "$(OS_VARIANT_NAME)" = "Fedora" ] ; then \
$(CAT) /etc/fedora-release | $(HEAD) -1 | $(NAWK) '{ print $$3; }' ; \ $(CAT) /etc/fedora-release | $(HEAD) -1 | $(NAWK) '{ print $$3; }' ; \
elif [ -f /etc/lsb-release ] ; then \
$(EGREP) DISTRIB_RELEASE /etc/lsb-release | $(SED) -e 's@.*DISTRIB_RELEASE=\(.*\)@\1@'; \
fi) fi)
ALSA_INCLUDE=/usr/include/alsa/version.h ALSA_INCLUDE=/usr/include/alsa/version.h
ALSA_LIBRARY=/usr/lib/libasound.so ALSA_LIBRARY=/usr/lib/libasound.so
...@@ -279,7 +283,7 @@ sane-arch_data_model: ...@@ -279,7 +283,7 @@ sane-arch_data_model:
fi fi
###################################################### ######################################################
# Check the OS version (windows and linus have release name checks) # Check the OS version (windows and linux have release name checks)
# NOTE: OPENJDK explicitly does not check for OS release information. # NOTE: OPENJDK explicitly does not check for OS release information.
# Unless we know for sure that it will not build somewhere, we cannot # Unless we know for sure that it will not build somewhere, we cannot
# generate a fatal sanity error, and a warning about the official # generate a fatal sanity error, and a warning about the official
...@@ -1476,14 +1480,14 @@ ifeq ($(PLATFORM), windows) ...@@ -1476,14 +1480,14 @@ ifeq ($(PLATFORM), windows)
endif endif
###################################################### ######################################################
# Check the Solaris GNU c++ compiler for solaris plugin # Check the GNU C++ compiler for OJI plugin
###################################################### ######################################################
sane-gcc-compiler: sane-gcc-compiler:
ifeq ($(PLATFORM), solaris) ifndef OPENJDK
ifndef OPENJDK ifeq ($(PLATFORM), solaris)
@if [ -r $(GCC_COMPILER_PATH) ]; then \ @if [ -r $(GCC_COMPILER_PATH) ]; then \
if [ ! "$(GCC_VER)" = $(REQUIRED_GCC_VERSION) ]; then \ if [ ! "$(GCC_VER)" = $(REQUIRED_GCC_VER) ]; then \
$(ECHO) "ERROR: The Solaris GCC compiler version must be $(REQUIRED_GCC_VERSION). \n" \ $(ECHO) "ERROR: The Solaris GCC compiler version must be $(REQUIRED_GCC_VER). \n" \
" You are using the following compiler version: $(GCC_VER) \n" \ " You are using the following compiler version: $(GCC_VER) \n" \
" The compiler was obtained from the following location: \n" \ " The compiler was obtained from the following location: \n" \
" $(GCC_COMPILER_PATH) \n" \ " $(GCC_COMPILER_PATH) \n" \
...@@ -1501,6 +1505,7 @@ ifeq ($(PLATFORM), solaris) ...@@ -1501,6 +1505,7 @@ ifeq ($(PLATFORM), solaris)
endif endif
ifeq ($(PLATFORM), linux) ifeq ($(PLATFORM), linux)
ifeq ($(ARCH_DATA_MODEL), 32)
ifdef ALT_GCC29_COMPILER_PATH ifdef ALT_GCC29_COMPILER_PATH
@if [ ! -x $(ALT_GCC29_COMPILER_PATH)/bin/gcc ]; then \ @if [ ! -x $(ALT_GCC29_COMPILER_PATH)/bin/gcc ]; then \
$(ECHO) "ERROR: You do not have a valid ALT_GCC29_COMPILER_PATH setting. \n" \ $(ECHO) "ERROR: You do not have a valid ALT_GCC29_COMPILER_PATH setting. \n" \
...@@ -1509,7 +1514,7 @@ ifeq ($(PLATFORM), solaris) ...@@ -1509,7 +1514,7 @@ ifeq ($(PLATFORM), solaris)
" This will affect you if you build the plugin target. \n" \ " This will affect you if you build the plugin target. \n" \
"" >> $(ERROR_FILE) ; \ "" >> $(ERROR_FILE) ; \
fi fi
endif else
ifdef ALT_GCC29_PLUGIN_LIB_PATH ifdef ALT_GCC29_PLUGIN_LIB_PATH
@if [ ! -r $(ALT_GCC29_PLUGIN_LIB_PATH)/libjavaplugin_oji.so ]; then \ @if [ ! -r $(ALT_GCC29_PLUGIN_LIB_PATH)/libjavaplugin_oji.so ]; then \
$(ECHO) "Error: You do not have a valid ALT_GCC29_PLUGIN_LIB_PATH setting. \n" \ $(ECHO) "Error: You do not have a valid ALT_GCC29_PLUGIN_LIB_PATH setting. \n" \
...@@ -1523,13 +1528,15 @@ ifeq ($(PLATFORM), solaris) ...@@ -1523,13 +1528,15 @@ ifeq ($(PLATFORM), solaris)
$(ECHO) "ERROR: You do not have a valid GCC29_COMPILER_PATH setting. \n" \ $(ECHO) "ERROR: You do not have a valid GCC29_COMPILER_PATH setting. \n" \
" Please check your access to \n" \ " Please check your access to \n" \
" $(GCC29_COMPILER_PATH) \n" \ " $(GCC29_COMPILER_PATH) \n" \
" and/or check your value of ALT_GCC29_COMPILER_PATH. \n" \ " and/or check your value of ALT_GCC29_COMPILER_PATH or ALT_GCC29_PLUGIN_LIB_PATH \n" \
" This will affect you if you build the plugin target. \n" \ " This will affect you if you build the plugin target. \n" \
"" >> $(ERROR_FILE) ; \ "" >> $(ERROR_FILE) ; \
fi fi
endif endif # ALT_GCC29_PLUGIN_LIB_PATH
endif endif # ALT_GCC29_COMPILER_PATH
endif endif # ARCH_DATA_MODEL, 32
endif # LINUX
endif # OPEN_JDK
###################################################### ######################################################
......
...@@ -33,8 +33,8 @@ DEMONAME = zipfs ...@@ -33,8 +33,8 @@ DEMONAME = zipfs
include $(BUILDDIR)/common/Defs.gmk include $(BUILDDIR)/common/Defs.gmk
DEMO_ROOT = $(SHARE_SRC)/demo/nio/$(DEMONAME) DEMO_ROOT = $(SHARE_SRC)/demo/nio/$(DEMONAME)
DEMO_TOPFILES = ./README.txt DEMO_TOPFILES = README.txt Demo.java
DEMO_SRCDIR = $(DEMO_ROOT) DEMO_SRCDIR = $(DEMO_ROOT)/src
DEMO_DESTDIR = $(DEMODIR)/nio/$(DEMONAME) DEMO_DESTDIR = $(DEMODIR)/nio/$(DEMONAME)
# #
...@@ -42,10 +42,10 @@ DEMO_DESTDIR = $(DEMODIR)/nio/$(DEMONAME) ...@@ -42,10 +42,10 @@ DEMO_DESTDIR = $(DEMODIR)/nio/$(DEMONAME)
# #
include $(BUILDDIR)/common/Demo.gmk include $(BUILDDIR)/common/Demo.gmk
#EXTJAR = $(EXTDIR)/$(DEMONAME).jar EXTJAR = $(EXTDIR)/$(DEMONAME).jar
#
#all : build $(EXTJAR) all : build $(EXTJAR)
#
#$(EXTJAR) : $(DEMO_JAR) $(EXTJAR) : $(DEMO_JAR)
# $(prep-target) $(prep-target)
# $(CP) $(DEMO_JAR) $(EXTJAR) $(CP) $(DEMO_JAR) $(EXTJAR)
...@@ -432,6 +432,7 @@ SUNWprivate_1.1 { ...@@ -432,6 +432,7 @@ SUNWprivate_1.1 {
Java_sun_awt_X11_GtkFileDialogPeer_initIDs; Java_sun_awt_X11_GtkFileDialogPeer_initIDs;
Java_sun_awt_X11_GtkFileDialogPeer_run; Java_sun_awt_X11_GtkFileDialogPeer_run;
Java_sun_awt_X11_GtkFileDialogPeer_quit; Java_sun_awt_X11_GtkFileDialogPeer_quit;
Java_sun_awt_X11_GtkFileDialogPeer_toFront;
Java_sun_print_CUPSPrinter_initIDs; Java_sun_print_CUPSPrinter_initIDs;
Java_sun_print_CUPSPrinter_getCupsServer; Java_sun_print_CUPSPrinter_getCupsServer;
......
/* /*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -192,7 +192,11 @@ class CharacterData00 extends CharacterData { ...@@ -192,7 +192,11 @@ class CharacterData00 extends CharacterData {
case 0x2C6D : mapChar = 0x0251; break; case 0x2C6D : mapChar = 0x0251; break;
case 0x2C6E : mapChar = 0x0271; break; case 0x2C6E : mapChar = 0x0271; break;
case 0x2C6F : mapChar = 0x0250; break; case 0x2C6F : mapChar = 0x0250; break;
case 0x2C70 : mapChar = 0x0252; break;
case 0x2C7E : mapChar = 0x023F; break;
case 0x2C7F : mapChar = 0x0240; break;
case 0xA77D : mapChar = 0x1D79; break; case 0xA77D : mapChar = 0x1D79; break;
case 0xA78D : mapChar = 0x0265; break;
// default mapChar is already set, so no // default mapChar is already set, so no
// need to redo it here. // need to redo it here.
// default : mapChar = ch; // default : mapChar = ch;
...@@ -246,8 +250,12 @@ class CharacterData00 extends CharacterData { ...@@ -246,8 +250,12 @@ class CharacterData00 extends CharacterData {
case 0x1FC3 : mapChar = 0x1FCC; break; case 0x1FC3 : mapChar = 0x1FCC; break;
case 0x1FF3 : mapChar = 0x1FFC; break; case 0x1FF3 : mapChar = 0x1FFC; break;
case 0x023F : mapChar = 0x2C7E; break;
case 0x0240 : mapChar = 0x2C7F; break;
case 0x0250 : mapChar = 0x2C6F; break; case 0x0250 : mapChar = 0x2C6F; break;
case 0x0251 : mapChar = 0x2C6D; break; case 0x0251 : mapChar = 0x2C6D; break;
case 0x0252 : mapChar = 0x2C70; break;
case 0x0265 : mapChar = 0xA78D; break;
case 0x026B : mapChar = 0x2C62; break; case 0x026B : mapChar = 0x2C62; break;
case 0x0271 : mapChar = 0x2C6E; break; case 0x0271 : mapChar = 0x2C6E; break;
case 0x027D : mapChar = 0x2C64; break; case 0x027D : mapChar = 0x2C64; break;
...@@ -487,8 +495,12 @@ class CharacterData00 extends CharacterData { ...@@ -487,8 +495,12 @@ class CharacterData00 extends CharacterData {
case 0x017F : mapChar = 0x0053; break; case 0x017F : mapChar = 0x0053; break;
case 0x1FBE : mapChar = 0x0399; break; case 0x1FBE : mapChar = 0x0399; break;
case 0x023F : mapChar = 0x2C7E; break;
case 0x0240 : mapChar = 0x2C7F; break;
case 0x0250 : mapChar = 0x2C6F; break; case 0x0250 : mapChar = 0x2C6F; break;
case 0x0251 : mapChar = 0x2C6D; break; case 0x0251 : mapChar = 0x2C6D; break;
case 0x0252 : mapChar = 0x2C70; break;
case 0x0265 : mapChar = 0xA78D; break;
case 0x026B : mapChar = 0x2C62; break; case 0x026B : mapChar = 0x2C62; break;
case 0x0271 : mapChar = 0x2C6E; break; case 0x0271 : mapChar = 0x2C6E; break;
case 0x027D : mapChar = 0x2C64; break; case 0x027D : mapChar = 0x2C64; break;
......
/* /*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -251,9 +251,40 @@ class CharacterData01 extends CharacterData { ...@@ -251,9 +251,40 @@ class CharacterData01 extends CharacterData {
case 0x010341: retval = 90; break; // GOTHIC LETTER NINETY case 0x010341: retval = 90; break; // GOTHIC LETTER NINETY
case 0x01034A: retval = 900; break; // GOTHIC LETTER NINE HUNDRED case 0x01034A: retval = 900; break; // GOTHIC LETTER NINE HUNDRED
case 0x0103D5: retval = 100; break; // OLD PERSIAN NUMBER HUNDRED case 0x0103D5: retval = 100; break; // OLD PERSIAN NUMBER HUNDRED
case 0x01085D: retval = 100; break; // IMPERIAL ARAMAIC NUMBER ONE HUNDRED
case 0x01085E: retval = 1000; break; // IMPERIAL ARAMAIC NUMBER ONE THOUSAND
case 0x01085F: retval = 10000; break; // IMPERIAL ARAMAIC NUMBER TEN THOUSAND
case 0x010919: retval = 100; break; // PHOENICIAN NUMBER ONE HUNDRED case 0x010919: retval = 100; break; // PHOENICIAN NUMBER ONE HUNDRED
case 0x010A46: retval = 100; break; // KHAROSHTHI NUMBER ONE HUNDRED case 0x010A46: retval = 100; break; // KHAROSHTHI NUMBER ONE HUNDRED
case 0x010A47: retval = 1000; break; // KHAROSHTHI NUMBER ONE THOUSAND case 0x010A47: retval = 1000; break; // KHAROSHTHI NUMBER ONE THOUSAND
case 0x010A7E: retval = 50; break; // OLD SOUTH ARABIAN NUMBER FIFTY
case 0x010B5E: retval = 100; break; // INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED
case 0x010B5F: retval = 1000; break; // INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND
case 0x010B7E: retval = 100; break; // INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED
case 0x010B7F: retval = 1000; break; // INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND
case 0x010E6C: retval = 40; break; // RUMI NUMBER FORTY
case 0x010E6D: retval = 50; break; // RUMI NUMBER FIFTY
case 0x010E6E: retval = 60; break; // RUMI NUMBER SIXTY
case 0x010E6F: retval = 70; break; // RUMI NUMBER SEVENTY
case 0x010E70: retval = 80; break; // RUMI NUMBER EIGHTY
case 0x010E71: retval = 90; break; // RUMI NUMBER NINETY
case 0x010E72: retval = 100; break; // RUMI NUMBER ONE HUNDRED
case 0x010E73: retval = 200; break; // RUMI NUMBER TWO HUNDRED
case 0x010E74: retval = 300; break; // RUMI NUMBER THREE HUNDRED
case 0x010E75: retval = 400; break; // RUMI NUMBER FOUR HUNDRED
case 0x010E76: retval = 500; break; // RUMI NUMBER FIVE HUNDRED
case 0x010E77: retval = 600; break; // RUMI NUMBER SIX HUNDRED
case 0x010E78: retval = 700; break; // RUMI NUMBER SEVEN HUNDRED
case 0x010E79: retval = 800; break; // RUMI NUMBER EIGHT HUNDRED
case 0x010E7A: retval = 900; break; // RUMI NUMBER NINE HUNDRED
case 0x01105E: retval = 40; break; // BRAHMI NUMBER FORTY
case 0x01105F: retval = 50; break; // BRAHMI NUMBER FIFTY
case 0x011060: retval = 60; break; // BRAHMI NUMBER SIXTY
case 0x011061: retval = 70; break; // BRAHMI NUMBER SEVENTY
case 0x011062: retval = 80; break; // BRAHMI NUMBER EIGHTY
case 0x011063: retval = 90; break; // BRAHMI NUMBER NINETY
case 0x011064: retval = 100; break; // BRAHMI NUMBER ONE HUNDRED
case 0x011065: retval = 1000; break; // BRAHMI NUMBER ONE THOUSAND
case 0x01D36C: retval = 40; break; // COUNTING ROD TENS DIGIT FOUR case 0x01D36C: retval = 40; break; // COUNTING ROD TENS DIGIT FOUR
case 0x01D36D: retval = 50; break; // COUNTING ROD TENS DIGIT FIVE case 0x01D36D: retval = 50; break; // COUNTING ROD TENS DIGIT FIVE
case 0x01D36E: retval = 60; break; // COUNTING ROD TENS DIGIT SIX case 0x01D36E: retval = 60; break; // COUNTING ROD TENS DIGIT SIX
......
此差异已折叠。
# SpecialCasing-5.1.0.txt # SpecialCasing-6.0.0.txt
# Date: 2008-03-03, 21:58:10 GMT [MD] # Date: 2010-05-18, 00:49:39 GMT [MD]
# #
# Unicode Character Database # Unicode Character Database
# Copyright (c) 1991-2008 Unicode, Inc. # Copyright (c) 1991-2010 Unicode, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html # For terms of use, see http://www.unicode.org/terms_of_use.html
# For documentation, see UCD.html # For documentation, see http://www.unicode.org/reports/tr44/
# #
# Special Casing Properties # Special Casing Properties
# #
...@@ -106,11 +106,11 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH ...@@ -106,11 +106,11 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI 1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI 1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
# IMPORTANT-when capitalizing iota-subscript (0345) # IMPORTANT-when iota-subscript (0345) is uppercased or titlecased,
# It MUST be in normalized form--moved to the end of any sequence of combining marks. # the result will be incorrect unless the iota-subscript is moved to the end
# This is because logically it represents a following base character! # of any sequence of combining marks. Otherwise, the accents will go on the capital iota.
# E.g. <iota_subscript> (<Mn> | <Mc> | <Me>)+ => (<Mn> | <Mc> | <Me>)+ <iota_subscript> # This process can be achieved by first transforming the text to NFC before casing.
# It should never be the first character in a word, so in titlecasing it can be left as is. # E.g. <alpha><iota_subscript><acute> is uppercased to <ALPHA><acute><IOTA>
# The following cases are already in the UnicodeData file, so are only commented here. # The following cases are already in the UnicodeData file, so are only commented here.
......
/* /*
* Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -113,6 +113,6 @@ public class BasicControl implements Control { ...@@ -113,6 +113,6 @@ public class BasicControl implements Control {
* ASN.1 BER encoded value. * ASN.1 BER encoded value.
*/ */
public byte[] getEncodedValue() { public byte[] getEncodedValue() {
return value; return value == null ? null : value.clone();
} }
} }
...@@ -611,12 +611,15 @@ public class Color implements Paint, java.io.Serializable { ...@@ -611,12 +611,15 @@ public class Color implements Paint, java.io.Serializable {
* <p> * <p>
* This method applies an arbitrary scale factor to each of the three RGB * This method applies an arbitrary scale factor to each of the three RGB
* components of this <code>Color</code> to create a brighter version * components of this <code>Color</code> to create a brighter version
* of this <code>Color</code>. Although <code>brighter</code> and * of this <code>Color</code>.
* The {@code alpha} value is preserved.
* Although <code>brighter</code> and
* <code>darker</code> are inverse operations, the results of a * <code>darker</code> are inverse operations, the results of a
* series of invocations of these two methods might be inconsistent * series of invocations of these two methods might be inconsistent
* because of rounding errors. * because of rounding errors.
* @return a new <code>Color</code> object that is * @return a new <code>Color</code> object that is
* a brighter version of this <code>Color</code>. * a brighter version of this <code>Color</code>
* with the same {@code alpha} value.
* @see java.awt.Color#darker * @see java.awt.Color#darker
* @since JDK1.0 * @since JDK1.0
*/ */
...@@ -624,6 +627,7 @@ public class Color implements Paint, java.io.Serializable { ...@@ -624,6 +627,7 @@ public class Color implements Paint, java.io.Serializable {
int r = getRed(); int r = getRed();
int g = getGreen(); int g = getGreen();
int b = getBlue(); int b = getBlue();
int alpha = getAlpha();
/* From 2D group: /* From 2D group:
* 1. black.brighter() should return grey * 1. black.brighter() should return grey
...@@ -632,7 +636,7 @@ public class Color implements Paint, java.io.Serializable { ...@@ -632,7 +636,7 @@ public class Color implements Paint, java.io.Serializable {
*/ */
int i = (int)(1.0/(1.0-FACTOR)); int i = (int)(1.0/(1.0-FACTOR));
if ( r == 0 && g == 0 && b == 0) { if ( r == 0 && g == 0 && b == 0) {
return new Color(i, i, i); return new Color(i, i, i, alpha);
} }
if ( r > 0 && r < i ) r = i; if ( r > 0 && r < i ) r = i;
if ( g > 0 && g < i ) g = i; if ( g > 0 && g < i ) g = i;
...@@ -640,7 +644,8 @@ public class Color implements Paint, java.io.Serializable { ...@@ -640,7 +644,8 @@ public class Color implements Paint, java.io.Serializable {
return new Color(Math.min((int)(r/FACTOR), 255), return new Color(Math.min((int)(r/FACTOR), 255),
Math.min((int)(g/FACTOR), 255), Math.min((int)(g/FACTOR), 255),
Math.min((int)(b/FACTOR), 255)); Math.min((int)(b/FACTOR), 255),
alpha);
} }
/** /**
...@@ -649,19 +654,23 @@ public class Color implements Paint, java.io.Serializable { ...@@ -649,19 +654,23 @@ public class Color implements Paint, java.io.Serializable {
* <p> * <p>
* This method applies an arbitrary scale factor to each of the three RGB * This method applies an arbitrary scale factor to each of the three RGB
* components of this <code>Color</code> to create a darker version of * components of this <code>Color</code> to create a darker version of
* this <code>Color</code>. Although <code>brighter</code> and * this <code>Color</code>.
* The {@code alpha} value is preserved.
* Although <code>brighter</code> and
* <code>darker</code> are inverse operations, the results of a series * <code>darker</code> are inverse operations, the results of a series
* of invocations of these two methods might be inconsistent because * of invocations of these two methods might be inconsistent because
* of rounding errors. * of rounding errors.
* @return a new <code>Color</code> object that is * @return a new <code>Color</code> object that is
* a darker version of this <code>Color</code>. * a darker version of this <code>Color</code>
* with the same {@code alpha} value.
* @see java.awt.Color#brighter * @see java.awt.Color#brighter
* @since JDK1.0 * @since JDK1.0
*/ */
public Color darker() { public Color darker() {
return new Color(Math.max((int)(getRed() *FACTOR), 0), return new Color(Math.max((int)(getRed() *FACTOR), 0),
Math.max((int)(getGreen()*FACTOR), 0), Math.max((int)(getGreen()*FACTOR), 0),
Math.max((int)(getBlue() *FACTOR), 0)); Math.max((int)(getBlue() *FACTOR), 0),
getAlpha());
} }
/** /**
......
...@@ -51,6 +51,7 @@ import javax.accessibility.*; ...@@ -51,6 +51,7 @@ import javax.accessibility.*;
import sun.util.logging.PlatformLogger; import sun.util.logging.PlatformLogger;
import sun.awt.AppContext; import sun.awt.AppContext;
import sun.awt.AWTAccessor;
import sun.awt.CausedFocusEvent; import sun.awt.CausedFocusEvent;
import sun.awt.PeerEvent; import sun.awt.PeerEvent;
import sun.awt.SunToolkit; import sun.awt.SunToolkit;
...@@ -247,6 +248,13 @@ public class Container extends Component { ...@@ -247,6 +248,13 @@ public class Container extends Component {
if (!GraphicsEnvironment.isHeadless()) { if (!GraphicsEnvironment.isHeadless()) {
initIDs(); initIDs();
} }
AWTAccessor.setContainerAccessor(new AWTAccessor.ContainerAccessor() {
@Override
public void validateUnconditionally(Container cont) {
cont.validateUnconditionally();
}
});
} }
/** /**
......
...@@ -1248,14 +1248,31 @@ public class Dialog extends Window { ...@@ -1248,14 +1248,31 @@ public class Dialog extends Window {
/** /**
* Disables or enables decorations for this dialog. * Disables or enables decorations for this dialog.
* This method can only be called while the dialog is not displayable. * <p>
* @param undecorated <code>true</code> if no dialog decorations are * This method can only be called while the dialog is not displayable. To
* to be enabled; * make this dialog decorated, it must be opaque and have the default shape,
* <code>false</code> if dialog decorations are to be enabled. * otherwise the {@code IllegalComponentStateException} will be thrown.
* @throws <code>IllegalComponentStateException</code> if the dialog * Refer to {@link Window#setShape}, {@link Window#setOpacity} and {@link
* is displayable. * Window#setBackground} for details
*
* @param undecorated {@code true} if no dialog decorations are to be
* enabled; {@code false} if dialog decorations are to be enabled
*
* @throws IllegalComponentStateException if the dialog is displayable
* @throws IllegalComponentStateException if {@code undecorated} is
* {@code false}, and this dialog does not have the default shape
* @throws IllegalComponentStateException if {@code undecorated} is
* {@code false}, and this dialog opacity is less than {@code 1.0f}
* @throws IllegalComponentStateException if {@code undecorated} is
* {@code false}, and the alpha value of this dialog background
* color is less than {@code 1.0f}
*
* @see #isUndecorated * @see #isUndecorated
* @see Component#isDisplayable * @see Component#isDisplayable
* @see Window#getShape
* @see Window#getOpacity
* @see Window#getBackground
*
* @since 1.4 * @since 1.4
*/ */
public void setUndecorated(boolean undecorated) { public void setUndecorated(boolean undecorated) {
...@@ -1264,6 +1281,18 @@ public class Dialog extends Window { ...@@ -1264,6 +1281,18 @@ public class Dialog extends Window {
if (isDisplayable()) { if (isDisplayable()) {
throw new IllegalComponentStateException("The dialog is displayable."); throw new IllegalComponentStateException("The dialog is displayable.");
} }
if (!undecorated) {
if (getOpacity() < 1.0f) {
throw new IllegalComponentStateException("The dialog is not opaque");
}
if (getShape() != null) {
throw new IllegalComponentStateException("The dialog does not have a default shape");
}
Color bg = getBackground();
if ((bg != null) && (bg.getAlpha() < 255)) {
throw new IllegalComponentStateException("The dialog background color is not opaque");
}
}
this.undecorated = undecorated; this.undecorated = undecorated;
} }
} }
...@@ -1280,6 +1309,45 @@ public class Dialog extends Window { ...@@ -1280,6 +1309,45 @@ public class Dialog extends Window {
return undecorated; return undecorated;
} }
/**
* {@inheritDoc}
*/
@Override
public void setOpacity(float opacity) {
synchronized (getTreeLock()) {
if ((opacity < 1.0f) && !isUndecorated()) {
throw new IllegalComponentStateException("The dialog is decorated");
}
super.setOpacity(opacity);
}
}
/**
* {@inheritDoc}
*/
@Override
public void setShape(Shape shape) {
synchronized (getTreeLock()) {
if ((shape != null) && !isUndecorated()) {
throw new IllegalComponentStateException("The dialog is decorated");
}
super.setShape(shape);
}
}
/**
* {@inheritDoc}
*/
@Override
public void setBackground(Color bgColor) {
synchronized (getTreeLock()) {
if ((bgColor != null) && (bgColor.getAlpha() < 255) && !isUndecorated()) {
throw new IllegalComponentStateException("The dialog is decorated");
}
super.setBackground(bgColor);
}
}
/** /**
* Returns a string representing the state of this dialog. This * Returns a string representing the state of this dialog. This
* method is intended to be used only for debugging purposes, and the * method is intended to be used only for debugging purposes, and the
......
...@@ -99,7 +99,7 @@ public class FileDialog extends Dialog { ...@@ -99,7 +99,7 @@ public class FileDialog extends Dialog {
* Contains the File instances for all the files that the user selects. * Contains the File instances for all the files that the user selects.
* *
* @serial * @serial
* @see getFiles * @see #getFiles
* @since 1.7 * @since 1.7
*/ */
private File[] files; private File[] files;
......
...@@ -828,6 +828,11 @@ public class Frame extends Window implements MenuContainer { ...@@ -828,6 +828,11 @@ public class Frame extends Window implements MenuContainer {
return frame.state; return frame.state;
} }
} }
public Rectangle getMaximizedBounds(Frame frame) {
synchronized(frame.getObjectLock()) {
return frame.maximizedBounds;
}
}
} }
); );
} }
...@@ -855,8 +860,10 @@ public class Frame extends Window implements MenuContainer { ...@@ -855,8 +860,10 @@ public class Frame extends Window implements MenuContainer {
* @see #getMaximizedBounds() * @see #getMaximizedBounds()
* @since 1.4 * @since 1.4
*/ */
public synchronized void setMaximizedBounds(Rectangle bounds) { public void setMaximizedBounds(Rectangle bounds) {
synchronized(getObjectLock()) {
this.maximizedBounds = bounds; this.maximizedBounds = bounds;
}
FramePeer peer = (FramePeer)this.peer; FramePeer peer = (FramePeer)this.peer;
if (peer != null) { if (peer != null) {
peer.setMaximizedBounds(bounds); peer.setMaximizedBounds(bounds);
...@@ -873,21 +880,40 @@ public class Frame extends Window implements MenuContainer { ...@@ -873,21 +880,40 @@ public class Frame extends Window implements MenuContainer {
* @since 1.4 * @since 1.4
*/ */
public Rectangle getMaximizedBounds() { public Rectangle getMaximizedBounds() {
synchronized(getObjectLock()) {
return maximizedBounds; return maximizedBounds;
} }
}
/** /**
* Disables or enables decorations for this frame. * Disables or enables decorations for this frame.
* This method can only be called while the frame is not displayable. * <p>
* @param undecorated <code>true</code> if no frame decorations are * This method can only be called while the frame is not displayable. To
* to be enabled; * make this frame decorated, it must be opaque and have the default shape,
* <code>false</code> if frame decorations are to be enabled. * otherwise the {@code IllegalComponentStateException} will be thrown.
* @throws <code>IllegalComponentStateException</code> if the frame * Refer to {@link Window#setShape}, {@link Window#setOpacity} and {@link
* is displayable. * Window#setBackground} for details
*
* @param undecorated {@code true} if no frame decorations are to be
* enabled; {@code false} if frame decorations are to be enabled
*
* @throws IllegalComponentStateException if the frame is displayable
* @throws IllegalComponentStateException if {@code undecorated} is
* {@code false}, and this frame does not have the default shape
* @throws IllegalComponentStateException if {@code undecorated} is
* {@code false}, and this frame opacity is less than {@code 1.0f}
* @throws IllegalComponentStateException if {@code undecorated} is
* {@code false}, and the alpha value of this frame background
* color is less than {@code 1.0f}
*
* @see #isUndecorated * @see #isUndecorated
* @see Component#isDisplayable * @see Component#isDisplayable
* @see Window#getShape
* @see Window#getOpacity
* @see Window#getBackground
* @see javax.swing.JFrame#setDefaultLookAndFeelDecorated(boolean) * @see javax.swing.JFrame#setDefaultLookAndFeelDecorated(boolean)
*
* @since 1.4 * @since 1.4
*/ */
public void setUndecorated(boolean undecorated) { public void setUndecorated(boolean undecorated) {
...@@ -896,6 +922,18 @@ public class Frame extends Window implements MenuContainer { ...@@ -896,6 +922,18 @@ public class Frame extends Window implements MenuContainer {
if (isDisplayable()) { if (isDisplayable()) {
throw new IllegalComponentStateException("The frame is displayable."); throw new IllegalComponentStateException("The frame is displayable.");
} }
if (!undecorated) {
if (getOpacity() < 1.0f) {
throw new IllegalComponentStateException("The frame is not opaque");
}
if (getShape() != null) {
throw new IllegalComponentStateException("The frame does not have a default shape");
}
Color bg = getBackground();
if ((bg != null) && (bg.getAlpha() < 255)) {
throw new IllegalComponentStateException("The frame background color is not opaque");
}
}
this.undecorated = undecorated; this.undecorated = undecorated;
} }
} }
...@@ -912,6 +950,45 @@ public class Frame extends Window implements MenuContainer { ...@@ -912,6 +950,45 @@ public class Frame extends Window implements MenuContainer {
return undecorated; return undecorated;
} }
/**
* {@inheritDoc}
*/
@Override
public void setOpacity(float opacity) {
synchronized (getTreeLock()) {
if ((opacity < 1.0f) && !isUndecorated()) {
throw new IllegalComponentStateException("The frame is decorated");
}
super.setOpacity(opacity);
}
}
/**
* {@inheritDoc}
*/
@Override
public void setShape(Shape shape) {
synchronized (getTreeLock()) {
if ((shape != null) && !isUndecorated()) {
throw new IllegalComponentStateException("The frame is decorated");
}
super.setShape(shape);
}
}
/**
* {@inheritDoc}
*/
@Override
public void setBackground(Color bgColor) {
synchronized (getTreeLock()) {
if ((bgColor != null) && (bgColor.getAlpha() < 255) && !isUndecorated()) {
throw new IllegalComponentStateException("The frame is decorated");
}
super.setBackground(bgColor);
}
}
/** /**
* Removes the specified menu bar from this frame. * Removes the specified menu bar from this frame.
* @param m the menu component to remove. * @param m the menu component to remove.
......
...@@ -3474,14 +3474,20 @@ public class Window extends Container implements Accessible { ...@@ -3474,14 +3474,20 @@ public class Window extends Container implements Accessible {
* level of 0 may or may not disable the mouse event handling on this * level of 0 may or may not disable the mouse event handling on this
* window. This is a platform-dependent behavior. * window. This is a platform-dependent behavior.
* <p> * <p>
* In order for this method to enable the translucency effect, the {@link * The following conditions must be met in order to set the opacity value
* GraphicsDevice#isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency)} method must indicate that * less than {@code 1.0f}:
* the {@link GraphicsDevice.WindowTranslucency#TRANSLUCENT TRANSLUCENT} * <ul>
* translucency is supported. * <li>The {@link GraphicsDevice.WindowTranslucency#TRANSLUCENT TRANSLUCENT}
* translucency must be supported by the underlying system
* <li>The window must be undecorated (see {@link Frame#setUndecorated}
* and {@link Dialog#setUndecorated})
* <li>The window must not be in full-screen mode (see {@link
* GraphicsDevice#setFullScreenWindow(Window)})
* </ul>
* <p> * <p>
* Also note that the window must not be in the full-screen mode when * If the requested opacity value is less than {@code 1.0f}, and any of the
* setting the opacity value &lt; 1.0f. Otherwise the {@code * above conditions are not met, the window opacity will not change,
* IllegalComponentStateException} is thrown. * and the {@code IllegalComponentStateException} will be thrown.
* <p> * <p>
* The translucency levels of individual pixels may also be effected by the * The translucency levels of individual pixels may also be effected by the
* alpha component of their color (see {@link Window#setBackground(Color)}) and the * alpha component of their color (see {@link Window#setBackground(Color)}) and the
...@@ -3491,15 +3497,20 @@ public class Window extends Container implements Accessible { ...@@ -3491,15 +3497,20 @@ public class Window extends Container implements Accessible {
* *
* @throws IllegalArgumentException if the opacity is out of the range * @throws IllegalArgumentException if the opacity is out of the range
* [0..1] * [0..1]
* @throws IllegalComponentStateException if the window is decorated and
* the opacity is less than {@code 1.0f}
* @throws IllegalComponentStateException if the window is in full screen * @throws IllegalComponentStateException if the window is in full screen
* mode, and the opacity is less than 1.0f * mode, and the opacity is less than {@code 1.0f}
* @throws UnsupportedOperationException if the {@code * @throws UnsupportedOperationException if the {@code
* GraphicsDevice.WindowTranslucency#TRANSLUCENT TRANSLUCENT} * GraphicsDevice.WindowTranslucency#TRANSLUCENT TRANSLUCENT}
* translucency kind is not supported and the opacity is less than 1.0f * translucency is not supported and the opacity is less than
* {@code 1.0f}
* *
* @see Window#getOpacity * @see Window#getOpacity
* @see Window#setBackground(Color) * @see Window#setBackground(Color)
* @see Window#setShape(Shape) * @see Window#setShape(Shape)
* @see Frame#isUndecorated
* @see Dialog#isUndecorated
* @see GraphicsDevice.WindowTranslucency * @see GraphicsDevice.WindowTranslucency
* @see GraphicsDevice#isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency) * @see GraphicsDevice#isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency)
* *
...@@ -3557,24 +3568,26 @@ public class Window extends Container implements Accessible { ...@@ -3557,24 +3568,26 @@ public class Window extends Container implements Accessible {
/** /**
* Sets the shape of the window. * Sets the shape of the window.
* <p> * <p>
* Setting a shape enables cutting off some parts of the window, leaving * Setting a shape cuts off some parts of the window. Only the parts that
* visible and clickable only those parts belonging to the given shape * belong to the given {@link Shape} remain visible and clickable. If
* (see {@link Shape}). If the shape argument is null, this methods * the shape argument is {@code null}, this method restores the default
* restores the default shape (making the window rectangular on most * shape, making the window rectangular on most platforms.
* platforms.)
* <p> * <p>
* The following conditions must be met in order to set a non-null shape: * The following conditions must be met to set a non-null shape:
* <ul> * <ul>
* <li>The {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSPARENT * <li>The {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSPARENT
* PERPIXEL_TRANSPARENT} translucency kind must be supported by the * PERPIXEL_TRANSPARENT} translucency must be supported by the
* underlying system * underlying system
* <i>and</i> * <li>The window must be undecorated (see {@link Frame#setUndecorated}
* <li>The window must not be in the full-screen mode (see * and {@link Dialog#setUndecorated})
* {@link GraphicsDevice#setFullScreenWindow(Window)}) * <li>The window must not be in full-screen mode (see {@link
* GraphicsDevice#setFullScreenWindow(Window)})
* </ul> * </ul>
* If a certain condition is not met, either the {@code * <p>
* UnsupportedOperationException} or {@code IllegalComponentStateException} * If the requested shape is not {@code null}, and any of the above
* is thrown. * conditions are not met, the shape of this window will not change,
* and either the {@code UnsupportedOperationException} or {@code
* IllegalComponentStateException} will be thrown.
* <p> * <p>
* The tranlucency levels of individual pixels may also be effected by the * The tranlucency levels of individual pixels may also be effected by the
* alpha component of their color (see {@link Window#setBackground(Color)}) and the * alpha component of their color (see {@link Window#setBackground(Color)}) and the
...@@ -3584,6 +3597,8 @@ public class Window extends Container implements Accessible { ...@@ -3584,6 +3597,8 @@ public class Window extends Container implements Accessible {
* @param shape the shape to set to the window * @param shape the shape to set to the window
* *
* @throws IllegalComponentStateException if the shape is not {@code * @throws IllegalComponentStateException if the shape is not {@code
* null} and the window is decorated
* @throws IllegalComponentStateException if the shape is not {@code
* null} and the window is in full-screen mode * null} and the window is in full-screen mode
* @throws UnsupportedOperationException if the shape is not {@code * @throws UnsupportedOperationException if the shape is not {@code
* null} and {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSPARENT * null} and {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSPARENT
...@@ -3592,6 +3607,8 @@ public class Window extends Container implements Accessible { ...@@ -3592,6 +3607,8 @@ public class Window extends Container implements Accessible {
* @see Window#getShape() * @see Window#getShape()
* @see Window#setBackground(Color) * @see Window#setBackground(Color)
* @see Window#setOpacity(float) * @see Window#setOpacity(float)
* @see Frame#isUndecorated
* @see Dialog#isUndecorated
* @see GraphicsDevice.WindowTranslucency * @see GraphicsDevice.WindowTranslucency
* @see GraphicsDevice#isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency) * @see GraphicsDevice#isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency)
* *
...@@ -3645,37 +3662,46 @@ public class Window extends Container implements Accessible { ...@@ -3645,37 +3662,46 @@ public class Window extends Container implements Accessible {
* GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT PERPIXEL_TRANSLUCENT} * GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT PERPIXEL_TRANSLUCENT}
* tranclucency, the alpha component of the given background color * tranclucency, the alpha component of the given background color
* may effect the mode of operation for this window: it indicates whether * may effect the mode of operation for this window: it indicates whether
* this window must be opaque (alpha == 1.0f) or per-pixel translucent * this window must be opaque (alpha equals {@code 1.0f}) or per-pixel translucent
* (alpha &lt; 1.0f). All the following conditions must be met in order * (alpha is less than {@code 1.0f}). If the given background color is
* to be able to enable the per-pixel transparency mode for this window: * {@code null}, the window is considered completely opaque.
* <p>
* All the following conditions must be met to enable the per-pixel
* transparency mode for this window:
* <ul> * <ul>
* <li>The {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT * <li>The {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT
* PERPIXEL_TRANSLUCENT} translucency must be supported * PERPIXEL_TRANSLUCENT} translucency must be supported by the graphics
* by the graphics device where this window is located <i>and</i> * device where this window is located
* <li>The window must not be in the full-screen mode (see {@link * <li>The window must be undecorated (see {@link Frame#setUndecorated}
* and {@link Dialog#setUndecorated})
* <li>The window must not be in full-screen mode (see {@link
* GraphicsDevice#setFullScreenWindow(Window)}) * GraphicsDevice#setFullScreenWindow(Window)})
* </ul> * </ul>
* If a certain condition is not met at the time of calling this method, * <p>
* the alpha component of the given background color will not effect the * If the alpha component of the requested background color is less than
* mode of operation for this window. * {@code 1.0f}, and any of the above conditions are not met, the background
* color of this window will not change, the alpha component of the given
* background color will not affect the mode of operation for this window,
* and either the {@code UnsupportedOperationException} or {@code
* IllegalComponentStateException} will be thrown.
* <p> * <p>
* When the window is per-pixel translucent, the drawing sub-system * When the window is per-pixel translucent, the drawing sub-system
* respects the alpha value of each individual pixel. If a pixel gets * respects the alpha value of each individual pixel. If a pixel gets
* painted with the alpha color component equal to zero, it becomes * painted with the alpha color component equal to zero, it becomes
* visually transparent, if the alpha of the pixel is equal to 1.0f, the * visually transparent. If the alpha of the pixel is equal to 1.0f, the
* pixel is fully opaque. Interim values of the alpha color component make * pixel is fully opaque. Interim values of the alpha color component make
* the pixel semi-transparent. In this mode the background of the window * the pixel semi-transparent. In this mode, the background of the window
* gets painted with the alpha value of the given background color (meaning * gets painted with the alpha value of the given background color. If the
* that it is not painted at all if the alpha value of the argument of this * alpha value of the argument of this method is equal to {@code 0}, the
* method is equal to zero.) * background is not painted at all.
* <p> * <p>
* The actual level of translucency of a given pixel also depends on window * The actual level of translucency of a given pixel also depends on window
* opacity (see {@link #setOpacity(float)}), as well as the current shape of * opacity (see {@link #setOpacity(float)}), as well as the current shape of
* this window (see {@link #setShape(Shape)}). * this window (see {@link #setShape(Shape)}).
* <p> * <p>
* Note that painting a pixel with the alpha value of 0 may or may not * Note that painting a pixel with the alpha value of {@code 0} may or may
* disable the mouse event handling on this pixel. This is a * not disable the mouse event handling on this pixel. This is a
* platform-dependent behavior. To make sure the mouse clicks do not get * platform-dependent behavior. To make sure the mouse events do not get
* dispatched to a particular pixel, the pixel must be excluded from the * dispatched to a particular pixel, the pixel must be excluded from the
* shape of the window. * shape of the window.
* <p> * <p>
...@@ -3685,17 +3711,21 @@ public class Window extends Container implements Accessible { ...@@ -3685,17 +3711,21 @@ public class Window extends Container implements Accessible {
* @param bgColor the color to become this window's background color. * @param bgColor the color to become this window's background color.
* *
* @throws IllegalComponentStateException if the alpha value of the given * @throws IllegalComponentStateException if the alpha value of the given
* background color is less than 1.0f and the window is in * background color is less than {@code 1.0f} and the window is decorated
* @throws IllegalComponentStateException if the alpha value of the given
* background color is less than {@code 1.0f} and the window is in
* full-screen mode * full-screen mode
* @throws UnsupportedOperationException if the alpha value of the given * @throws UnsupportedOperationException if the alpha value of the given
* background color is less than 1.0f and * background color is less than {@code 1.0f} and {@link
* {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT * GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT
* PERPIXEL_TRANSLUCENT} translucency is not supported * PERPIXEL_TRANSLUCENT} translucency is not supported
* *
* @see Window#getBackground * @see Window#getBackground
* @see Window#isOpaque * @see Window#isOpaque
* @see Window#setOpacity(float) * @see Window#setOpacity(float)
* @see Window#setShape(Shape) * @see Window#setShape(Shape)
* @see Frame#isUndecorated
* @see Dialog#isUndecorated
* @see GraphicsDevice.WindowTranslucency * @see GraphicsDevice.WindowTranslucency
* @see GraphicsDevice#isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency) * @see GraphicsDevice#isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency)
* @see GraphicsConfiguration#isTranslucencyCapable() * @see GraphicsConfiguration#isTranslucencyCapable()
...@@ -3739,7 +3769,7 @@ public class Window extends Container implements Accessible { ...@@ -3739,7 +3769,7 @@ public class Window extends Container implements Accessible {
* <p> * <p>
* The method returns {@code false} if the background color of the window * The method returns {@code false} if the background color of the window
* is not {@code null} and the alpha component of the color is less than * is not {@code null} and the alpha component of the color is less than
* 1.0f. The method returns {@code true} otherwise. * {@code 1.0f}. The method returns {@code true} otherwise.
* *
* @return {@code true} if the window is opaque, {@code false} otherwise * @return {@code true} if the window is opaque, {@code false} otherwise
* *
......
/* /*
* Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -262,7 +262,23 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -262,7 +262,23 @@ public final class NumericShaper implements java.io.Serializable {
/** /**
* The Cham range with the Cham digits. * The Cham range with the Cham digits.
*/ */
CHAM ('\uaa50', '\uaa00', '\uaa60'); CHAM ('\uaa50', '\uaa00', '\uaa60'),
/**
* The Tai Tham Hora range with the Tai Tham Hora digits.
*/
TAI_THAM_HORA ('\u1a80', '\u1a20', '\u1ab0'),
/**
* The Tai Tham Tham range with the Tai Tham Tham digits.
*/
TAI_THAM_THAM ('\u1a90', '\u1a20', '\u1ab0'),
/**
* The Javanese range with the Javanese digits.
*/
JAVANESE ('\ua9d0', '\ua980', '\ua9e0'),
/**
* The Meetei Mayek range with the Meetei Mayek digits.
*/
MEETEI_MAYEK ('\uabf0', '\uabc0', '\uac00');
private static int toRangeIndex(Range script) { private static int toRangeIndex(Range script) {
int index = script.ordinal(); int index = script.ordinal();
...@@ -592,10 +608,16 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -592,10 +608,16 @@ public final class NumericShaper implements java.io.Serializable {
0x07a6, 0x07b1, 0x07a6, 0x07b1,
0x07eb, 0x07f4, 0x07eb, 0x07f4,
0x07f6, 0x07fa, 0x07f6, 0x07fa,
0x0901, 0x0903, 0x0816, 0x081a,
0x081b, 0x0824,
0x0825, 0x0828,
0x0829, 0x0830,
0x0859, 0x085e,
0x0900, 0x0903,
0x093a, 0x093b,
0x093c, 0x093d, 0x093c, 0x093d,
0x0941, 0x0949, 0x0941, 0x0949,
0x094d, 0x0950, 0x094d, 0x094e,
0x0951, 0x0958, 0x0951, 0x0958,
0x0962, 0x0964, 0x0962, 0x0964,
0x0981, 0x0982, 0x0981, 0x0982,
...@@ -604,7 +626,7 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -604,7 +626,7 @@ public final class NumericShaper implements java.io.Serializable {
0x09cd, 0x09ce, 0x09cd, 0x09ce,
0x09e2, 0x09e6, 0x09e2, 0x09e6,
0x09f2, 0x09f4, 0x09f2, 0x09f4,
0x0a01, 0x0a03, 0x09fb, 0x0a03,
0x0a3c, 0x0a3e, 0x0a3c, 0x0a3e,
0x0a41, 0x0a59, 0x0a41, 0x0a59,
0x0a70, 0x0a72, 0x0a70, 0x0a72,
...@@ -630,9 +652,8 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -630,9 +652,8 @@ public final class NumericShaper implements java.io.Serializable {
0x0cbc, 0x0cbd, 0x0cbc, 0x0cbd,
0x0ccc, 0x0cd5, 0x0ccc, 0x0cd5,
0x0ce2, 0x0ce6, 0x0ce2, 0x0ce6,
0x0cf1, 0x0d02,
0x0d41, 0x0d46, 0x0d41, 0x0d46,
0x0d4d, 0x0d57, 0x0d4d, 0x0d4e,
0x0d62, 0x0d66, 0x0d62, 0x0d66,
0x0dca, 0x0dcf, 0x0dca, 0x0dcf,
0x0dd2, 0x0dd8, 0x0dd2, 0x0dd8,
...@@ -649,7 +670,7 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -649,7 +670,7 @@ public final class NumericShaper implements java.io.Serializable {
0x0f71, 0x0f7f, 0x0f71, 0x0f7f,
0x0f80, 0x0f85, 0x0f80, 0x0f85,
0x0f86, 0x0f88, 0x0f86, 0x0f88,
0x0f90, 0x0fbe, 0x0f8d, 0x0fbe,
0x0fc6, 0x0fc7, 0x0fc6, 0x0fc7,
0x102d, 0x1031, 0x102d, 0x1031,
0x1032, 0x1038, 0x1032, 0x1038,
...@@ -661,8 +682,10 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -661,8 +682,10 @@ public final class NumericShaper implements java.io.Serializable {
0x1082, 0x1083, 0x1082, 0x1083,
0x1085, 0x1087, 0x1085, 0x1087,
0x108d, 0x108e, 0x108d, 0x108e,
0x135f, 0x1360, 0x109d, 0x109e,
0x135d, 0x1360,
0x1390, 0x13a0, 0x1390, 0x13a0,
0x1400, 0x1401,
0x1680, 0x1681, 0x1680, 0x1681,
0x169b, 0x16a0, 0x169b, 0x16a0,
0x1712, 0x1720, 0x1712, 0x1720,
...@@ -682,6 +705,11 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -682,6 +705,11 @@ public final class NumericShaper implements java.io.Serializable {
0x1939, 0x1946, 0x1939, 0x1946,
0x19de, 0x1a00, 0x19de, 0x1a00,
0x1a17, 0x1a19, 0x1a17, 0x1a19,
0x1a56, 0x1a57,
0x1a58, 0x1a61,
0x1a62, 0x1a63,
0x1a65, 0x1a6d,
0x1a73, 0x1a80,
0x1b00, 0x1b04, 0x1b00, 0x1b04,
0x1b34, 0x1b35, 0x1b34, 0x1b35,
0x1b36, 0x1b3b, 0x1b36, 0x1b3b,
...@@ -691,8 +719,16 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -691,8 +719,16 @@ public final class NumericShaper implements java.io.Serializable {
0x1b80, 0x1b82, 0x1b80, 0x1b82,
0x1ba2, 0x1ba6, 0x1ba2, 0x1ba6,
0x1ba8, 0x1baa, 0x1ba8, 0x1baa,
0x1be6, 0x1be7,
0x1be8, 0x1bea,
0x1bed, 0x1bee,
0x1bef, 0x1bf2,
0x1c2c, 0x1c34, 0x1c2c, 0x1c34,
0x1c36, 0x1c3b, 0x1c36, 0x1c3b,
0x1cd0, 0x1cd3,
0x1cd4, 0x1ce1,
0x1ce2, 0x1ce9,
0x1ced, 0x1cee,
0x1dc0, 0x1e00, 0x1dc0, 0x1e00,
0x1fbd, 0x1fbe, 0x1fbd, 0x1fbe,
0x1fbf, 0x1fc2, 0x1fbf, 0x1fc2,
...@@ -716,14 +752,16 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -716,14 +752,16 @@ public final class NumericShaper implements java.io.Serializable {
0x213a, 0x213c, 0x213a, 0x213c,
0x2140, 0x2145, 0x2140, 0x2145,
0x214a, 0x214e, 0x214a, 0x214e,
0x2153, 0x2160, 0x2150, 0x2160,
0x2190, 0x2336, 0x2189, 0x2336,
0x237b, 0x2395, 0x237b, 0x2395,
0x2396, 0x249c, 0x2396, 0x249c,
0x24ea, 0x26ac, 0x24ea, 0x26ac,
0x26ad, 0x2800, 0x26ad, 0x2800,
0x2900, 0x2c00, 0x2900, 0x2c00,
0x2ce5, 0x2d00, 0x2ce5, 0x2ceb,
0x2cef, 0x2d00,
0x2d7f, 0x2d80,
0x2de0, 0x3005, 0x2de0, 0x3005,
0x3008, 0x3021, 0x3008, 0x3021,
0x302a, 0x3031, 0x302a, 0x3031,
...@@ -742,25 +780,40 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -742,25 +780,40 @@ public final class NumericShaper implements java.io.Serializable {
0x33de, 0x33e0, 0x33de, 0x33e0,
0x33ff, 0x3400, 0x33ff, 0x3400,
0x4dc0, 0x4e00, 0x4dc0, 0x4e00,
0xa490, 0xa500, 0xa490, 0xa4d0,
0xa60d, 0xa610, 0xa60d, 0xa610,
0xa66f, 0xa680, 0xa66f, 0xa680,
0xa6f0, 0xa6f2,
0xa700, 0xa722, 0xa700, 0xa722,
0xa788, 0xa789, 0xa788, 0xa789,
0xa802, 0xa803, 0xa802, 0xa803,
0xa806, 0xa807, 0xa806, 0xa807,
0xa80b, 0xa80c, 0xa80b, 0xa80c,
0xa825, 0xa827, 0xa825, 0xa827,
0xa828, 0xa840, 0xa828, 0xa830,
0xa838, 0xa840,
0xa874, 0xa880, 0xa874, 0xa880,
0xa8c4, 0xa8ce, 0xa8c4, 0xa8ce,
0xa8e0, 0xa8f2,
0xa926, 0xa92e, 0xa926, 0xa92e,
0xa947, 0xa952, 0xa947, 0xa952,
0xa980, 0xa983,
0xa9b3, 0xa9b4,
0xa9b6, 0xa9ba,
0xa9bc, 0xa9bd,
0xaa29, 0xaa2f, 0xaa29, 0xaa2f,
0xaa31, 0xaa33, 0xaa31, 0xaa33,
0xaa35, 0xaa40, 0xaa35, 0xaa40,
0xaa43, 0xaa44, 0xaa43, 0xaa44,
0xaa4c, 0xaa4d, 0xaa4c, 0xaa4d,
0xaab0, 0xaab1,
0xaab2, 0xaab5,
0xaab7, 0xaab9,
0xaabe, 0xaac0,
0xaac1, 0xaac2,
0xabe5, 0xabe6,
0xabe8, 0xabe9,
0xabed, 0xabf0,
0xfb1e, 0xfb1f, 0xfb1e, 0xfb1f,
0xfb29, 0xfb2a, 0xfb29, 0xfb2a,
0xfd3e, 0xfd50, 0xfd3e, 0xfd50,
...@@ -775,12 +828,28 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -775,12 +828,28 @@ public final class NumericShaper implements java.io.Serializable {
0x1091f, 0x10920, 0x1091f, 0x10920,
0x10a01, 0x10a10, 0x10a01, 0x10a10,
0x10a38, 0x10a40, 0x10a38, 0x10a40,
0x10b39, 0x10b40,
0x10e60, 0x11000,
0x11001, 0x11002,
0x11038, 0x11047,
0x11052, 0x11066,
0x11080, 0x11082,
0x110b3, 0x110b7,
0x110b9, 0x110bb,
0x1d167, 0x1d16a, 0x1d167, 0x1d16a,
0x1d173, 0x1d183, 0x1d173, 0x1d183,
0x1d185, 0x1d18c, 0x1d185, 0x1d18c,
0x1d1aa, 0x1d1ae, 0x1d1aa, 0x1d1ae,
0x1d200, 0x1d360, 0x1d200, 0x1d360,
0x1d7ce, 0x20000, 0x1d6db, 0x1d6dc,
0x1d715, 0x1d716,
0x1d74f, 0x1d750,
0x1d789, 0x1d78a,
0x1d7c3, 0x1d7c4,
0x1d7ce, 0x1f110,
0x1f300, 0x1f48c,
0x1f48d, 0x1f524,
0x1f525, 0x20000,
0xe0001, 0xf0000, 0xe0001, 0xf0000,
0x10fffe, 0x10ffff // sentinel 0x10fffe, 0x10ffff // sentinel
}; };
...@@ -947,6 +1016,14 @@ public final class NumericShaper implements java.io.Serializable { ...@@ -947,6 +1016,14 @@ public final class NumericShaper implements java.io.Serializable {
&& rangeSet.contains(Range.ARABIC)) { && rangeSet.contains(Range.ARABIC)) {
rangeSet.remove(Range.ARABIC); rangeSet.remove(Range.ARABIC);
} }
// As well as the above case, give precedance to TAI_THAM_THAM if both
// TAI_THAM_HORA and TAI_THAM_THAM are specified.
if (rangeSet.contains(Range.TAI_THAM_THAM)
&& rangeSet.contains(Range.TAI_THAM_HORA)) {
rangeSet.remove(Range.TAI_THAM_HORA);
}
rangeArray = rangeSet.toArray(new Range[rangeSet.size()]); rangeArray = rangeSet.toArray(new Range[rangeSet.size()]);
if (rangeArray.length > BSEARCH_THRESHOLD) { if (rangeArray.length > BSEARCH_THRESHOLD) {
// sort rangeArray for binary search // sort rangeArray for binary search
......
...@@ -29,6 +29,8 @@ import com.sun.beans.WeakCache; ...@@ -29,6 +29,8 @@ import com.sun.beans.WeakCache;
import com.sun.beans.finder.BeanInfoFinder; import com.sun.beans.finder.BeanInfoFinder;
import com.sun.beans.finder.ClassFinder; import com.sun.beans.finder.ClassFinder;
import java.awt.Component;
import java.lang.ref.Reference; import java.lang.ref.Reference;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
import java.lang.reflect.Method; import java.lang.reflect.Method;
...@@ -39,6 +41,7 @@ import java.util.ArrayList; ...@@ -39,6 +41,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.EventListener; import java.util.EventListener;
import java.util.EventObject;
import java.util.List; import java.util.List;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.WeakHashMap; import java.util.WeakHashMap;
...@@ -1234,7 +1237,23 @@ public class Introspector { ...@@ -1234,7 +1237,23 @@ public class Introspector {
} }
} }
// OK, fabricate a default BeanDescriptor. // OK, fabricate a default BeanDescriptor.
return (new BeanDescriptor(beanClass)); return new BeanDescriptor(this.beanClass, findCustomizerClass(this.beanClass));
}
private static Class<?> findCustomizerClass(Class<?> type) {
String name = type.getName() + "Customizer";
try {
type = ClassFinder.findClass(name, type.getClassLoader());
// Each customizer should inherit java.awt.Component and implement java.beans.Customizer
// according to the section 9.3 of JavaBeans specification
if (Component.class.isAssignableFrom(type) && Customizer.class.isAssignableFrom(type)) {
return type;
}
}
catch (Exception exception) {
// ignore any exceptions
}
return null;
} }
private boolean isEventHandler(Method m) { private boolean isEventHandler(Method m) {
...@@ -1244,10 +1263,7 @@ public class Introspector { ...@@ -1244,10 +1263,7 @@ public class Introspector {
if (argTypes.length != 1) { if (argTypes.length != 1) {
return false; return false;
} }
if (isSubclass(argTypes[0], java.util.EventObject.class)) { return isSubclass(argTypes[0], EventObject.class);
return true;
}
return false;
} }
/* /*
......
...@@ -3498,8 +3498,8 @@ public class ObjectInputStream ...@@ -3498,8 +3498,8 @@ public class ObjectInputStream
return ((int[]) array).clone(); return ((int[]) array).clone();
} else if (array instanceof long[]) { } else if (array instanceof long[]) {
return ((long[]) array).clone(); return ((long[]) array).clone();
} else if (array instanceof double[]) { } else if (array instanceof short[]) {
return ((double[]) array).clone(); return ((short[]) array).clone();
} else { } else {
throw new AssertionError(); throw new AssertionError();
} }
......
...@@ -209,7 +209,7 @@ class Thread implements Runnable { ...@@ -209,7 +209,7 @@ class Thread implements Runnable {
* initialized to indicate thread 'not yet started' * initialized to indicate thread 'not yet started'
*/ */
private int threadStatus = 0; private volatile int threadStatus = 0;
private static synchronized long nextThreadID() { private static synchronized long nextThreadID() {
......
...@@ -275,18 +275,17 @@ public abstract class Charset ...@@ -275,18 +275,17 @@ public abstract class Charset
/* -- Static methods -- */ /* -- Static methods -- */
private static String bugLevel = null; private static volatile String bugLevel = null;
static boolean atBugLevel(String bl) { // package-private static boolean atBugLevel(String bl) { // package-private
if (bugLevel == null) { String level = bugLevel;
if (level == null) {
if (!sun.misc.VM.isBooted()) if (!sun.misc.VM.isBooted())
return false; return false;
bugLevel = AccessController.doPrivileged( bugLevel = level = AccessController.doPrivileged(
new GetPropertyAction("sun.nio.cs.bugLevel")); new GetPropertyAction("sun.nio.cs.bugLevel", ""));
if (bugLevel == null)
bugLevel = "";
} }
return (bugLevel != null) && bugLevel.equals(bl); return level.equals(bl);
} }
/** /**
......
...@@ -59,10 +59,10 @@ public class FormattableFlags { ...@@ -59,10 +59,10 @@ public class FormattableFlags {
* <pre> * <pre>
* out.toUpperCase() </pre> * out.toUpperCase() </pre>
* *
* <p> This flag corresponds to <tt>'^'</tt> (<tt>'&#92;u005e'</tt>) in * <p> This flag corresponds to <tt>'S'</tt> (<tt>'&#92;u0053'</tt>) in
* the format specifier. * the format specifier.
*/ */
public static final int UPPERCASE = 1<<1; // '^' public static final int UPPERCASE = 1<<1; // 'S'
/** /**
* Requires the output to use an alternate form. The definition of the * Requires the output to use an alternate form. The definition of the
......
...@@ -25,7 +25,9 @@ ...@@ -25,7 +25,9 @@
package java.util.spi; package java.util.spi;
import java.util.Arrays;
import java.util.Currency; import java.util.Currency;
import java.util.List;
import java.util.Locale; import java.util.Locale;
/** /**
...@@ -95,6 +97,23 @@ public abstract class CurrencyNameProvider extends LocaleServiceProvider { ...@@ -95,6 +97,23 @@ public abstract class CurrencyNameProvider extends LocaleServiceProvider {
throw new NullPointerException(); throw new NullPointerException();
} }
// Check whether the currencyCode is valid
char[] charray = currencyCode.toCharArray();
if (charray.length != 3) {
throw new IllegalArgumentException("The currencyCode is not in the form of three upper-case letters.");
}
for (char c : charray) {
if (c < 'A' || c > 'Z') {
throw new IllegalArgumentException("The currencyCode is not in the form of three upper-case letters.");
}
}
// Check whether the locale is valid
List<Locale> avail = Arrays.asList(getAvailableLocales());
if (!avail.contains(locale)) {
throw new IllegalArgumentException("The locale is not available");
}
return null; return null;
} }
} }
...@@ -94,7 +94,9 @@ public abstract class LocaleNameProvider extends LocaleServiceProvider { ...@@ -94,7 +94,9 @@ public abstract class LocaleNameProvider extends LocaleServiceProvider {
* @see java.util.Locale#getDisplayScript(java.util.Locale) * @see java.util.Locale#getDisplayScript(java.util.Locale)
* @since 1.7 * @since 1.7
*/ */
public abstract String getDisplayScript(String scriptCode, Locale locale); public String getDisplayScript(String scriptCode, Locale locale) {
return null;
}
/** /**
* Returns a localized name for the given <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt"> * Returns a localized name for the given <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
......
/* /*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -166,8 +166,9 @@ public class SerialBlob implements Blob, Serializable, Cloneable { ...@@ -166,8 +166,9 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
length = (int)len; length = (int)len;
} }
if (pos < 1 || length - pos < 0 ) { if (pos < 1 || len - pos < 0 ) {
throw new SerialException("Invalid arguments: position cannot be less that 1"); throw new SerialException("Invalid arguments: position cannot be "
+ "less than 1 or greater than the length of the SerialBlob");
} }
pos--; // correct pos to array index pos--; // correct pos to array index
......
...@@ -1379,6 +1379,10 @@ public abstract class AbstractButton extends JComponent implements ItemSelectabl ...@@ -1379,6 +1379,10 @@ public abstract class AbstractButton extends JComponent implements ItemSelectabl
* If <code>true</code> and the button has a border, * If <code>true</code> and the button has a border,
* the border is painted. The default value for the * the border is painted. The default value for the
* <code>borderPainted</code> property is <code>true</code>. * <code>borderPainted</code> property is <code>true</code>.
* <p/>
* Some look and feels might not support
* the <code>borderPainted</code> property,
* in which case they ignore this.
* *
* @param b if true and border property is not <code>null</code>, * @param b if true and border property is not <code>null</code>,
* the border is painted * the border is painted
......
...@@ -273,7 +273,7 @@ public class BorderFactory ...@@ -273,7 +273,7 @@ public class BorderFactory
* @since 1.7 * @since 1.7
*/ */
public static Border createSoftBevelBorder(int type, Color highlight, Color shadow) { public static Border createSoftBevelBorder(int type, Color highlight, Color shadow) {
return new BevelBorder(type, highlight, shadow); return new SoftBevelBorder(type, highlight, shadow);
} }
/** /**
...@@ -295,7 +295,7 @@ public class BorderFactory ...@@ -295,7 +295,7 @@ public class BorderFactory
* @since 1.7 * @since 1.7
*/ */
public static Border createSoftBevelBorder(int type, Color highlightOuter, Color highlightInner, Color shadowOuter, Color shadowInner) { public static Border createSoftBevelBorder(int type, Color highlightOuter, Color highlightInner, Color shadowOuter, Color shadowInner) {
return new BevelBorder(type, highlightOuter, highlightInner, shadowOuter, shadowInner); return new SoftBevelBorder(type, highlightOuter, highlightInner, shadowOuter, shadowInner);
} }
//// EtchedBorder /////////////////////////////////////////////////////////// //// EtchedBorder ///////////////////////////////////////////////////////////
......
...@@ -322,7 +322,7 @@ public final class JLayer<V extends Component> ...@@ -322,7 +322,7 @@ public final class JLayer<V extends Component>
} }
/** /**
* A non-{@code null] border, or non-zero insets, isn't supported, to prevent the geometry * A non-{@code null} border, or non-zero insets, isn't supported, to prevent the geometry
* of this component from becoming complex enough to inhibit * of this component from becoming complex enough to inhibit
* subclassing of {@code LayerUI} class. To create a {@code JLayer} with a border, * subclassing of {@code LayerUI} class. To create a {@code JLayer} with a border,
* add it to a {@code JPanel} that has a border. * add it to a {@code JPanel} that has a border.
...@@ -373,9 +373,13 @@ public final class JLayer<V extends Component> ...@@ -373,9 +373,13 @@ public final class JLayer<V extends Component>
* {@inheritDoc} * {@inheritDoc}
*/ */
public void removeAll() { public void removeAll() {
if (view != null) {
setView(null); setView(null);
}
if (glassPane != null) {
setGlassPane(null); setGlassPane(null);
} }
}
/** /**
* Always returns {@code true} to cause painting to originate from {@code JLayer}, * Always returns {@code true} to cause painting to originate from {@code JLayer},
......
...@@ -1443,6 +1443,10 @@ public class JTabbedPane extends JComponent ...@@ -1443,6 +1443,10 @@ public class JTabbedPane extends JComponent
* which can be <code>null</code>, in which case the tab's background color * which can be <code>null</code>, in which case the tab's background color
* will default to the background color of the <code>tabbedpane</code>. * will default to the background color of the <code>tabbedpane</code>.
* An internal exception is raised if there is no tab at that index. * An internal exception is raised if there is no tab at that index.
* <p/>
* It is up to the look and feel to honor this property, some may
* choose to ignore it.
*
* @param index the tab index where the background should be set * @param index the tab index where the background should be set
* @param background the color to be displayed in the tab's background * @param background the color to be displayed in the tab's background
* @exception IndexOutOfBoundsException if index is out of range * @exception IndexOutOfBoundsException if index is out of range
...@@ -1472,6 +1476,9 @@ public class JTabbedPane extends JComponent ...@@ -1472,6 +1476,9 @@ public class JTabbedPane extends JComponent
* <code>null</code>, in which case the tab's foreground color * <code>null</code>, in which case the tab's foreground color
* will default to the foreground color of this <code>tabbedpane</code>. * will default to the foreground color of this <code>tabbedpane</code>.
* An internal exception is raised if there is no tab at that index. * An internal exception is raised if there is no tab at that index.
* <p/>
* It is up to the look and feel to honor this property, some may
* choose to ignore it.
* *
* @param index the tab index where the foreground should be set * @param index the tab index where the foreground should be set
* @param foreground the color to be displayed as the tab's foreground * @param foreground the color to be displayed as the tab's foreground
......
...@@ -234,7 +234,7 @@ public class TitledBorder extends AbstractBorder ...@@ -234,7 +234,7 @@ public class TitledBorder extends AbstractBorder
* @param height the height of the painted border * @param height the height of the painted border
*/ */
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
Border border = getBorderUI(); Border border = getBorder();
String title = getTitle(); String title = getTitle();
if ((title != null) && !title.isEmpty()) { if ((title != null) && !title.isEmpty()) {
int edge = (border instanceof TitledBorder) ? 0 : EDGE_SPACING; int edge = (border instanceof TitledBorder) ? 0 : EDGE_SPACING;
...@@ -347,7 +347,7 @@ public class TitledBorder extends AbstractBorder ...@@ -347,7 +347,7 @@ public class TitledBorder extends AbstractBorder
* @param insets the object to be reinitialized * @param insets the object to be reinitialized
*/ */
public Insets getBorderInsets(Component c, Insets insets) { public Insets getBorderInsets(Component c, Insets insets) {
Border border = getBorderUI(); Border border = getBorder();
if (border == null) { if (border == null) {
insets.set(0, 0, 0, 0); insets.set(0, 0, 0, 0);
} }
...@@ -402,22 +402,34 @@ public class TitledBorder extends AbstractBorder ...@@ -402,22 +402,34 @@ public class TitledBorder extends AbstractBorder
/** /**
* Returns whether or not the border is opaque. * Returns whether or not the border is opaque.
*/ */
public boolean isBorderOpaque() { return false; } public boolean isBorderOpaque() {
return false;
}
/** /**
* Returns the title of the titled border. * Returns the title of the titled border.
*
* @return the title of the titled border
*/ */
public String getTitle() { return title; } public String getTitle() {
return title;
}
/** /**
* Returns the border of the titled border. * Returns the border of the titled border.
*
* @return the border of the titled border
*/ */
public Border getBorder() { public Border getBorder() {
return border; return border != null
? border
: UIManager.getBorder("TitledBorder.border");
} }
/** /**
* Returns the title-position of the titled border. * Returns the title-position of the titled border.
*
* @return the title-position of the titled border
*/ */
public int getTitlePosition() { public int getTitlePosition() {
return titlePosition; return titlePosition;
...@@ -425,11 +437,17 @@ public class TitledBorder extends AbstractBorder ...@@ -425,11 +437,17 @@ public class TitledBorder extends AbstractBorder
/** /**
* Returns the title-justification of the titled border. * Returns the title-justification of the titled border.
*
* @return the title-justification of the titled border
*/ */
public int getTitleJustification() { return titleJustification; } public int getTitleJustification() {
return titleJustification;
}
/** /**
* Returns the title-font of the titled border. * Returns the title-font of the titled border.
*
* @return the title-font of the titled border
*/ */
public Font getTitleFont() { public Font getTitleFont() {
return titleFont; return titleFont;
...@@ -437,6 +455,8 @@ public class TitledBorder extends AbstractBorder ...@@ -437,6 +455,8 @@ public class TitledBorder extends AbstractBorder
/** /**
* Returns the title-color of the titled border. * Returns the title-color of the titled border.
*
* @return the title-color of the titled border
*/ */
public Color getTitleColor() { public Color getTitleColor() {
return titleColor; return titleColor;
...@@ -447,15 +467,19 @@ public class TitledBorder extends AbstractBorder ...@@ -447,15 +467,19 @@ public class TitledBorder extends AbstractBorder
/** /**
* Sets the title of the titled border. * Sets the title of the titled border.
* param title the title for the border * @param title the title for the border
*/ */
public void setTitle(String title) { this.title = title; } public void setTitle(String title) {
this.title = title;
}
/** /**
* Sets the border of the titled border. * Sets the border of the titled border.
* @param border the border * @param border the border
*/ */
public void setBorder(Border border) { this.border = border; } public void setBorder(Border border) {
this.border = border;
}
/** /**
* Sets the title-position of the titled border. * Sets the title-position of the titled border.
...@@ -518,6 +542,7 @@ public class TitledBorder extends AbstractBorder ...@@ -518,6 +542,7 @@ public class TitledBorder extends AbstractBorder
* Returns the minimum dimensions this border requires * Returns the minimum dimensions this border requires
* in order to fully display the border and title. * in order to fully display the border and title.
* @param c the component where this border will be drawn * @param c the component where this border will be drawn
* @return the {@code Dimension} object
*/ */
public Dimension getMinimumSize(Component c) { public Dimension getMinimumSize(Component c) {
Insets insets = getBorderInsets(c); Insets insets = getBorderInsets(c);
...@@ -557,7 +582,7 @@ public class TitledBorder extends AbstractBorder ...@@ -557,7 +582,7 @@ public class TitledBorder extends AbstractBorder
if (height < 0) { if (height < 0) {
throw new IllegalArgumentException("Height must be >= 0"); throw new IllegalArgumentException("Height must be >= 0");
} }
Border border = getBorderUI(); Border border = getBorder();
String title = getTitle(); String title = getTitle();
if ((title != null) && !title.isEmpty()) { if ((title != null) && !title.isEmpty()) {
int edge = (border instanceof TitledBorder) ? 0 : EDGE_SPACING; int edge = (border instanceof TitledBorder) ? 0 : EDGE_SPACING;
...@@ -616,13 +641,6 @@ public class TitledBorder extends AbstractBorder ...@@ -616,13 +641,6 @@ public class TitledBorder extends AbstractBorder
return Component.BaselineResizeBehavior.OTHER; return Component.BaselineResizeBehavior.OTHER;
} }
private Border getBorderUI() {
Border border = getBorder();
return border != null
? border
: UIManager.getBorder("TitledBorder.border");
}
private int getPosition() { private int getPosition() {
int position = getTitlePosition(); int position = getTitlePosition();
if (position != DEFAULT_POSITION) { if (position != DEFAULT_POSITION) {
......
...@@ -449,8 +449,8 @@ public class LayerUI<V extends Component> ...@@ -449,8 +449,8 @@ public class LayerUI<V extends Component>
/** /**
* Configures the {@code JLayer} this {@code LayerUI} is set to. * Configures the {@code JLayer} this {@code LayerUI} is set to.
* The default implementation registers the {@code LayerUI} * The default implementation registers the passed {@code JLayer} component
* as a property change listener for the passed {@code JLayer} component. * as a {@code PropertyChangeListener} for the property changes of this {@code LayerUI}.
* *
* @param c the {@code JLayer} component where this UI delegate is being installed * @param c the {@code JLayer} component where this UI delegate is being installed
*/ */
...@@ -461,8 +461,8 @@ public class LayerUI<V extends Component> ...@@ -461,8 +461,8 @@ public class LayerUI<V extends Component>
/** /**
* Reverses the configuration which was previously set * Reverses the configuration which was previously set
* in the {@link #installUI(JComponent)} method. * in the {@link #installUI(JComponent)} method.
* The default implementation unregisters the property change listener * The default implementation unregisters the passed {@code JLayer} component
* for the passed JLayer component. * as a {@code PropertyChangeListener} for the property changes of this {@code LayerUI}.
* *
* @param c the component from which this UI delegate is being removed. * @param c the component from which this UI delegate is being removed.
*/ */
......
...@@ -196,6 +196,10 @@ public class BasicMenuUI extends BasicMenuItemUI ...@@ -196,6 +196,10 @@ public class BasicMenuUI extends BasicMenuItemUI
return getHandler(); return getHandler();
} }
protected MenuKeyListener createMenuKeyListener(JComponent c) {
return (MenuKeyListener)getHandler();
}
public Dimension getMaximumSize(JComponent c) { public Dimension getMaximumSize(JComponent c) {
if (((JMenu)menuItem).isTopLevelMenu() == true) { if (((JMenu)menuItem).isTopLevelMenu() == true) {
Dimension d = c.getPreferredSize(); Dimension d = c.getPreferredSize();
...@@ -397,7 +401,7 @@ public class BasicMenuUI extends BasicMenuItemUI ...@@ -397,7 +401,7 @@ public class BasicMenuUI extends BasicMenuItemUI
public void stateChanged(ChangeEvent e) { } public void stateChanged(ChangeEvent e) { }
} }
private class Handler extends BasicMenuItemUI.Handler { private class Handler extends BasicMenuItemUI.Handler implements MenuKeyListener {
// //
// PropertyChangeListener // PropertyChangeListener
// //
...@@ -580,5 +584,48 @@ public class BasicMenuUI extends BasicMenuItemUI ...@@ -580,5 +584,48 @@ public class BasicMenuUI extends BasicMenuItemUI
} }
public void menuDragMouseExited(MenuDragMouseEvent e) {} public void menuDragMouseExited(MenuDragMouseEvent e) {}
public void menuDragMouseReleased(MenuDragMouseEvent e) {} public void menuDragMouseReleased(MenuDragMouseEvent e) {}
//
// MenuKeyListener
//
/**
* Open the Menu
*/
public void menuKeyTyped(MenuKeyEvent e) {
if (!crossMenuMnemonic && BasicPopupMenuUI.getLastPopup() != null) {
// when crossMenuMnemonic is not set, we don't open a toplevel
// menu if another toplevel menu is already open
return;
}
if (BasicPopupMenuUI.getPopups().size() != 0) {
//Fix 6939261: to return in case not on the main menu
//and has a pop-up.
//after return code will be handled in BasicPopupMenuUI.java
return;
}
char key = Character.toLowerCase((char)menuItem.getMnemonic());
MenuElement path[] = e.getPath();
if (key == Character.toLowerCase(e.getKeyChar())) {
JPopupMenu popupMenu = ((JMenu)menuItem).getPopupMenu();
ArrayList newList = new ArrayList(Arrays.asList(path));
newList.add(popupMenu);
MenuElement subs[] = popupMenu.getSubElements();
MenuElement sub =
BasicPopupMenuUI.findEnabledChild(subs, -1, true);
if(sub != null) {
newList.add(sub);
}
MenuSelectionManager manager = e.getMenuSelectionManager();
MenuElement newPath[] = new MenuElement[0];;
newPath = (MenuElement[]) newList.toArray(newPath);
manager.setSelectedPath(newPath);
e.consume();
}
}
public void menuKeyPressed(MenuKeyEvent e) {}
public void menuKeyReleased(MenuKeyEvent e) {}
} }
} }
...@@ -81,17 +81,26 @@ public class MetalScrollPaneUI extends BasicScrollPaneUI ...@@ -81,17 +81,26 @@ public class MetalScrollPaneUI extends BasicScrollPaneUI
} }
} }
public void installListeners(JScrollPane scrollPane) { public void installListeners(JScrollPane scrollPane) {
super.installListeners(scrollPane); super.installListeners(scrollPane);
scrollBarSwapListener = createScrollBarSwapListener(); scrollBarSwapListener = createScrollBarSwapListener();
scrollPane.addPropertyChangeListener(scrollBarSwapListener); scrollPane.addPropertyChangeListener(scrollBarSwapListener);
} }
/**
* {@inheritDoc}
*/
protected void uninstallListeners(JComponent c) {
super.uninstallListeners(c);
c.removePropertyChangeListener(scrollBarSwapListener);
}
/**
* @deprecated - Replaced by {@link #uninstallListeners(JComponent)}
*/
@Deprecated
public void uninstallListeners(JScrollPane scrollPane) { public void uninstallListeners(JScrollPane scrollPane) {
super.uninstallListeners(scrollPane); super.uninstallListeners(scrollPane);
scrollPane.removePropertyChangeListener(scrollBarSwapListener); scrollPane.removePropertyChangeListener(scrollBarSwapListener);
} }
......
...@@ -223,6 +223,16 @@ public final class AWTAccessor { ...@@ -223,6 +223,16 @@ public final class AWTAccessor {
void processEvent(Component comp, AWTEvent e); void processEvent(Component comp, AWTEvent e);
} }
/*
* An interface of accessor for the java.awt.Container class.
*/
public interface ContainerAccessor {
/**
* Validates the container unconditionally.
*/
void validateUnconditionally(Container cont);
}
/* /*
* An interface of accessor for java.awt.Window class. * An interface of accessor for java.awt.Window class.
*/ */
...@@ -334,6 +344,10 @@ public final class AWTAccessor { ...@@ -334,6 +344,10 @@ public final class AWTAccessor {
* Gets the state of this frame. * Gets the state of this frame.
*/ */
int getExtendedState(Frame frame); int getExtendedState(Frame frame);
/*
* Gets the maximized bounds of this frame.
*/
Rectangle getMaximizedBounds(Frame frame);
} }
/* /*
...@@ -440,53 +454,19 @@ public final class AWTAccessor { ...@@ -440,53 +454,19 @@ public final class AWTAccessor {
} }
/* /*
* The java.awt.Component class accessor object. * Accessor instances are initialized in the static initializers of
* corresponding AWT classes by using setters defined below.
*/ */
private static ComponentAccessor componentAccessor; private static ComponentAccessor componentAccessor;
private static ContainerAccessor containerAccessor;
/*
* The java.awt.Window class accessor object.
*/
private static WindowAccessor windowAccessor; private static WindowAccessor windowAccessor;
/*
* The java.awt.AWTEvent class accessor object.
*/
private static AWTEventAccessor awtEventAccessor; private static AWTEventAccessor awtEventAccessor;
/*
* The java.awt.event.InputEvent class accessor object.
*/
private static InputEventAccessor inputEventAccessor; private static InputEventAccessor inputEventAccessor;
/*
* The java.awt.Frame class accessor object.
*/
private static FrameAccessor frameAccessor; private static FrameAccessor frameAccessor;
/*
* The java.awt.KeyboardFocusManager class accessor object.
*/
private static KeyboardFocusManagerAccessor kfmAccessor; private static KeyboardFocusManagerAccessor kfmAccessor;
/*
* The java.awt.MenuComponent class accessor object.
*/
private static MenuComponentAccessor menuComponentAccessor; private static MenuComponentAccessor menuComponentAccessor;
/*
* The java.awt.EventQueue class accessor object.
*/
private static EventQueueAccessor eventQueueAccessor; private static EventQueueAccessor eventQueueAccessor;
/*
* The java.awt.PopupMenu class accessor object.
*/
private static PopupMenuAccessor popupMenuAccessor; private static PopupMenuAccessor popupMenuAccessor;
/*
* The java.awt.FileDialog class accessor object.
*/
private static FileDialogAccessor fileDialogAccessor; private static FileDialogAccessor fileDialogAccessor;
/* /*
...@@ -497,7 +477,7 @@ public final class AWTAccessor { ...@@ -497,7 +477,7 @@ public final class AWTAccessor {
} }
/* /*
* Retrieve the accessor object for the java.awt.Window class. * Retrieve the accessor object for the java.awt.Component class.
*/ */
public static ComponentAccessor getComponentAccessor() { public static ComponentAccessor getComponentAccessor() {
if (componentAccessor == null) { if (componentAccessor == null) {
...@@ -507,6 +487,24 @@ public final class AWTAccessor { ...@@ -507,6 +487,24 @@ public final class AWTAccessor {
return componentAccessor; return componentAccessor;
} }
/*
* Set an accessor object for the java.awt.Container class.
*/
public static void setContainerAccessor(ContainerAccessor ca) {
containerAccessor = ca;
}
/*
* Retrieve the accessor object for the java.awt.Container class.
*/
public static ContainerAccessor getContainerAccessor() {
if (containerAccessor == null) {
unsafe.ensureClassInitialized(Container.class);
}
return containerAccessor;
}
/* /*
* Set an accessor object for the java.awt.Window class. * Set an accessor object for the java.awt.Window class.
*/ */
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
package sun.misc; package sun.misc;
import static java.lang.Thread.State.*;
import java.util.Properties; import java.util.Properties;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -332,69 +333,37 @@ public class VM { ...@@ -332,69 +333,37 @@ public class VM {
} }
} }
/**
* Returns Thread.State for the given threadStatus
*/
public static Thread.State toThreadState(int threadStatus) { public static Thread.State toThreadState(int threadStatus) {
// Initialize the threadStateMap if ((threadStatus & JVMTI_THREAD_STATE_RUNNABLE) != 0) {
initThreadStateMap(); return RUNNABLE;
} else if ((threadStatus & JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) != 0) {
Thread.State s = threadStateMap.get(threadStatus); return BLOCKED;
if (s == null) { } else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_INDEFINITELY) != 0) {
// default to RUNNABLE if the threadStatus value is unknown return WAITING;
s = Thread.State.RUNNABLE; } else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT) != 0) {
} return TIMED_WAITING;
return s; } else if ((threadStatus & JVMTI_THREAD_STATE_TERMINATED) != 0) {
return TERMINATED;
} else if ((threadStatus & JVMTI_THREAD_STATE_ALIVE) == 0) {
return NEW;
} else {
return RUNNABLE;
} }
// a map of threadStatus values to the corresponding Thread.State
private static Map<Integer, Thread.State> threadStateMap = null;
private static Map<Integer, String> threadStateNames = null;
private synchronized static void initThreadStateMap() {
if (threadStateMap != null) {
return;
} }
final Thread.State[] ts = Thread.State.values(); /* The threadStatus field is set by the VM at state transition
* in the hotspot implementation. Its value is set according to
final int[][] vmThreadStateValues = new int[ts.length][]; * the JVM TI specification GetThreadState function.
final String[][] vmThreadStateNames = new String[ts.length][]; */
getThreadStateValues(vmThreadStateValues, vmThreadStateNames); private final static int JVMTI_THREAD_STATE_ALIVE = 0x0001;
private final static int JVMTI_THREAD_STATE_TERMINATED = 0x0002;
threadStateMap = new HashMap<Integer, Thread.State>(); private final static int JVMTI_THREAD_STATE_RUNNABLE = 0x0004;
threadStateNames = new HashMap<Integer, String>(); private final static int JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400;
for (int i = 0; i < ts.length; i++) { private final static int JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010;
String state = ts[i].name(); private final static int JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020;
int[] values = null;
String[] names = null;
for (int j = 0; j < ts.length; j++) {
if (vmThreadStateNames[j][0].startsWith(state)) {
values = vmThreadStateValues[j];
names = vmThreadStateNames[j];
}
}
if (values == null) {
throw new InternalError("No VM thread state mapped to " +
state);
}
if (values.length != names.length) {
throw new InternalError("VM thread state values and names " +
" mapped to " + state + ": length not matched" );
}
for (int k = 0; k < values.length; k++) {
threadStateMap.put(values[k], ts[i]);
threadStateNames.put(values[k], names[k]);
}
}
}
// Fill in vmThreadStateValues with int arrays, each of which contains
// the threadStatus values mapping to the Thread.State enum constant.
// Fill in vmThreadStateNames with String arrays, each of which contains
// the name of each threadStatus value of the format:
// <Thread.State.name()>[.<Substate name>]
// e.g. WAITING.OBJECT_WAIT
//
private native static void getThreadStateValues(int[][] vmThreadStateValues,
String[][] vmThreadStateNames);
static { static {
initialize(); initialize();
......
...@@ -129,9 +129,22 @@ class Request { ...@@ -129,9 +129,22 @@ class Request {
hdrs = new Headers(); hdrs = new Headers();
char s[] = new char[10]; char s[] = new char[10];
int len = 0;
int firstc = is.read(); int firstc = is.read();
// check for empty headers
if (firstc == CR || firstc == LF) {
int c = is.read();
if (c == CR || c == LF) {
return hdrs;
}
s[0] = (char)firstc;
len = 1;
firstc = c;
}
while (firstc != LF && firstc != CR && firstc >= 0) { while (firstc != LF && firstc != CR && firstc >= 0) {
int len = 0;
int keyend = -1; int keyend = -1;
int c; int c;
boolean inKey = firstc > ' '; boolean inKey = firstc > ' ';
...@@ -191,6 +204,7 @@ class Request { ...@@ -191,6 +204,7 @@ class Request {
else else
v = String.copyValueOf(s, keyend, len - keyend); v = String.copyValueOf(s, keyend, len - keyend);
hdrs.add (k,v); hdrs.add (k,v);
len = 0;
} }
return hdrs; return hdrs;
} }
......
...@@ -74,8 +74,8 @@ class SSLStreams { ...@@ -74,8 +74,8 @@ class SSLStreams {
private void configureEngine(HttpsConfigurator cfg, InetSocketAddress addr){ private void configureEngine(HttpsConfigurator cfg, InetSocketAddress addr){
if (cfg != null) { if (cfg != null) {
Parameters params = new Parameters (cfg, addr); Parameters params = new Parameters (cfg, addr);
cfg.configure (params);
//BEGIN_TIGER_EXCLUDE //BEGIN_TIGER_EXCLUDE
cfg.configure (params);
SSLParameters sslParams = params.getSSLParameters(); SSLParameters sslParams = params.getSSLParameters();
if (sslParams != null) { if (sslParams != null) {
engine.setSSLParameters (sslParams); engine.setSSLParameters (sslParams);
......
...@@ -42,7 +42,7 @@ class ServerConfig { ...@@ -42,7 +42,7 @@ class ServerConfig {
static final int DEFAULT_CLOCK_TICK = 10000 ; // 10 sec. static final int DEFAULT_CLOCK_TICK = 10000 ; // 10 sec.
/* These values must be a reasonable multiple of clockTick */ /* These values must be a reasonable multiple of clockTick */
static final long DEFAULT_IDLE_INTERVAL = 300 ; // 5 min static final long DEFAULT_IDLE_INTERVAL = 30 ; // 5 min
static final int DEFAULT_MAX_IDLE_CONNECTIONS = 200 ; static final int DEFAULT_MAX_IDLE_CONNECTIONS = 200 ;
static final long DEFAULT_MAX_REQ_TIME = -1; // default: forever static final long DEFAULT_MAX_REQ_TIME = -1; // default: forever
......
...@@ -144,7 +144,7 @@ class UTF_32Coder { ...@@ -144,7 +144,7 @@ class UTF_32Coder {
protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) { protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) {
int mark = src.position(); int mark = src.position();
if (!doneBOM) { if (!doneBOM && src.hasRemaining()) {
if (dst.remaining() < 4) if (dst.remaining() < 4)
return CoderResult.OVERFLOW; return CoderResult.OVERFLOW;
put(BOM_BIG, dst); put(BOM_BIG, dst);
......
...@@ -70,13 +70,12 @@ public abstract class UnicodeEncoder extends CharsetEncoder { ...@@ -70,13 +70,12 @@ public abstract class UnicodeEncoder extends CharsetEncoder {
protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) { protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) {
int mark = src.position(); int mark = src.position();
if (needsMark) { if (needsMark && src.hasRemaining()) {
if (dst.remaining() < 2) if (dst.remaining() < 2)
return CoderResult.OVERFLOW; return CoderResult.OVERFLOW;
put(BYTE_ORDER_MARK, dst); put(BYTE_ORDER_MARK, dst);
needsMark = false; needsMark = false;
} }
try { try {
while (src.hasRemaining()) { while (src.hasRemaining()) {
char c = src.get(); char c = src.get();
......
/* /*
* Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -138,13 +138,7 @@ abstract class SeedGenerator { ...@@ -138,13 +138,7 @@ abstract class SeedGenerator {
instance.getSeedBytes(result); instance.getSeedBytes(result);
} }
void getSeedBytes(byte[] result) { abstract void getSeedBytes(byte[] result);
for (int i = 0; i < result.length; i++) {
result[i] = getSeedByte();
}
}
abstract byte getSeedByte();
/** /**
* Retrieve some system information, hashed. * Retrieve some system information, hashed.
...@@ -369,6 +363,13 @@ abstract class SeedGenerator { ...@@ -369,6 +363,13 @@ abstract class SeedGenerator {
} }
} }
@Override
void getSeedBytes(byte[] result) {
for (int i = 0; i < result.length; i++) {
result[i] = getSeedByte();
}
}
byte getSeedByte() { byte getSeedByte() {
byte b = 0; byte b = 0;
...@@ -455,8 +456,7 @@ abstract class SeedGenerator { ...@@ -455,8 +456,7 @@ abstract class SeedGenerator {
static class URLSeedGenerator extends SeedGenerator { static class URLSeedGenerator extends SeedGenerator {
private String deviceName; private String deviceName;
private BufferedInputStream devRandom; private InputStream devRandom;
/** /**
* The constructor is only called once to construct the one * The constructor is only called once to construct the one
...@@ -478,41 +478,78 @@ abstract class SeedGenerator { ...@@ -478,41 +478,78 @@ abstract class SeedGenerator {
private void init() throws IOException { private void init() throws IOException {
final URL device = new URL(deviceName); final URL device = new URL(deviceName);
devRandom = java.security.AccessController.doPrivileged
(new java.security.PrivilegedAction<BufferedInputStream>() {
public BufferedInputStream run() {
try { try {
return new BufferedInputStream(device.openStream()); devRandom = java.security.AccessController.doPrivileged
} catch (IOException ioe) { (new java.security.PrivilegedExceptionAction<InputStream>() {
return null; public InputStream run() throws IOException {
/*
* return a FileInputStream for file URLs and
* avoid buffering. The openStream() call wraps
* InputStream in a BufferedInputStream which
* can buffer up to 8K bytes. This read is a
* performance issue for entropy sources which
* can be slow to replenish.
*/
if (device.getProtocol().equalsIgnoreCase("file")) {
File deviceFile = getDeviceFile(device);
return new FileInputStream(deviceFile);
} else {
return device.openStream();
} }
} }
}); });
} catch (Exception e) {
throw new IOException("Failed to open " + deviceName, e.getCause());
}
}
if (devRandom == null) { /*
throw new IOException("failed to open " + device); * Use a URI to access this File. Previous code used a URL
* which is less strict on syntax. If we encounter a
* URISyntaxException we make best efforts for backwards
* compatibility. e.g. space character in deviceName string.
*
* Method called within PrivilegedExceptionAction block.
*/
private File getDeviceFile(URL device) throws IOException {
try {
URI deviceURI = device.toURI();
if(deviceURI.isOpaque()) {
// File constructor does not accept opaque URI
URI localDir = new File(System.getProperty("user.dir")).toURI();
String uriPath = localDir.toString() +
deviceURI.toString().substring(5);
return new File(URI.create(uriPath));
} else {
return new File(deviceURI);
}
} catch (URISyntaxException use) {
/*
* Make best effort to access this File.
* We can try using the URL path.
*/
return new File(device.getPath());
} }
} }
byte getSeedByte() { @Override
byte b[] = new byte[1]; void getSeedBytes(byte[] result) {
int stat; int len = result.length;
int read = 0;
try { try {
stat = devRandom.read(b, 0, b.length); while (read < len) {
int count = devRandom.read(result, read, len - read);
// /dev/random blocks - should never have EOF
if (count < 0)
throw new InternalError("URLSeedGenerator " + deviceName +
" reached end of file");
read += count;
}
} catch (IOException ioe) { } catch (IOException ioe) {
throw new InternalError("URLSeedGenerator " + deviceName + throw new InternalError("URLSeedGenerator " + deviceName +
" generated exception: " + " generated exception: " +
ioe.getMessage()); ioe.getMessage());
} }
if (stat == b.length) {
return b[0];
} else if (stat == -1) {
throw new InternalError("URLSeedGenerator " + deviceName +
" reached end of file");
} else {
throw new InternalError("URLSeedGenerator " + deviceName +
" failed read");
}
} }
} }
......
...@@ -49,7 +49,7 @@ import javax.security.auth.x500.X500Principal; ...@@ -49,7 +49,7 @@ import javax.security.auth.x500.X500Principal;
/** /**
* PolicyTool may be used by users and administrators to configure the * PolicyTool may be used by users and administrators to configure the
* overall java security policy (currently stored in the policy file). * overall java security policy (currently stored in the policy file).
* Using PolicyTool administators may add and remove policies from * Using PolicyTool administrators may add and remove policies from
* the policy file. <p> * the policy file. <p>
* *
* @see java.security.Policy * @see java.security.Policy
...@@ -1343,11 +1343,6 @@ class ToolDialog extends Dialog { ...@@ -1343,11 +1343,6 @@ class ToolDialog extends Dialog {
PolicyTool.rb.getString PolicyTool.rb.getString
("Actions."); ("Actions.");
/* gridbag index for display OverWriteFile (OW) components */
public static final int OW_LABEL = 0;
public static final int OW_OK_BUTTON = 1;
public static final int OW_CANCEL_BUTTON = 2;
/* gridbag index for display PolicyEntry (PE) components */ /* gridbag index for display PolicyEntry (PE) components */
public static final int PE_CODEBASE_LABEL = 0; public static final int PE_CODEBASE_LABEL = 0;
public static final int PE_CODEBASE_TEXTFIELD = 1; public static final int PE_CODEBASE_TEXTFIELD = 1;
...@@ -1522,44 +1517,6 @@ class ToolDialog extends Dialog { ...@@ -1522,44 +1517,6 @@ class ToolDialog extends Dialog {
return null; return null;
} }
/**
* ask user if they want to overwrite an existing file
*/
void displayOverWriteFileDialog(String filename, int nextEvent) {
// find where the PolicyTool gui is
Point location = tw.getLocationOnScreen();
setBounds(location.x + 75, location.y + 100, 400, 150);
setLayout(new GridBagLayout());
// ask the user if they want to over write the existing file
MessageFormat form = new MessageFormat(PolicyTool.rb.getString
("OK.to.overwrite.existing.file.filename."));
Object[] source = {filename};
Label label = new Label(form.format(source));
tw.addNewComponent(this, label, OW_LABEL,
0, 0, 2, 1, 0.0, 0.0, GridBagConstraints.BOTH,
tw.TOP_PADDING);
// OK button
Button button = new Button(PolicyTool.rb.getString("OK"));
button.addActionListener(new OverWriteFileOKButtonListener
(tool, tw, this, filename, nextEvent));
tw.addNewComponent(this, button, OW_OK_BUTTON,
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
tw.TOP_PADDING);
// Cancel button
// -- if the user hits cancel, do NOT go on to the next event
button = new Button(PolicyTool.rb.getString("Cancel"));
button.addActionListener(new CancelButtonListener(this));
tw.addNewComponent(this, button, OW_CANCEL_BUTTON,
1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
tw.TOP_PADDING);
setVisible(true);
}
/** /**
* pop up a dialog so the user can enter info to add a new PolicyEntry * pop up a dialog so the user can enter info to add a new PolicyEntry
* - if edit is TRUE, then the user is editing an existing entry * - if edit is TRUE, then the user is editing an existing entry
...@@ -2339,17 +2296,10 @@ class ToolDialog extends Dialog { ...@@ -2339,17 +2296,10 @@ class ToolDialog extends Dialog {
return; return;
// get the entered filename // get the entered filename
String filename = new String(fd.getDirectory() + fd.getFile()); File saveAsFile = new File(fd.getDirectory(), fd.getFile());
String filename = saveAsFile.getPath();
fd.dispose(); fd.dispose();
// see if the file already exists
File saveAsFile = new File(filename);
if (saveAsFile.exists()) {
// display a dialog box for the user to enter policy info
ToolDialog td = new ToolDialog
(PolicyTool.rb.getString("Overwrite.File"), tool, tw, true);
td.displayOverWriteFileDialog(filename, nextEvent);
} else {
try { try {
// save the policy entries to a file // save the policy entries to a file
tool.savePolicy(filename); tool.savePolicy(filename);
...@@ -2381,7 +2331,6 @@ class ToolDialog extends Dialog { ...@@ -2381,7 +2331,6 @@ class ToolDialog extends Dialog {
tw.displayErrorDialog(null, ee); tw.displayErrorDialog(null, ee);
} }
} }
}
/** /**
* ask user if they want to save changes * ask user if they want to save changes
...@@ -2494,7 +2443,7 @@ class ToolDialog extends Dialog { ...@@ -2494,7 +2443,7 @@ class ToolDialog extends Dialog {
return; return;
// get the entered filename // get the entered filename
String policyFile = new String(fd.getDirectory() + fd.getFile()); String policyFile = new File(fd.getDirectory(), fd.getFile()).getPath();
try { try {
// open the policy file // open the policy file
...@@ -2861,67 +2810,6 @@ class MainWindowListener implements ActionListener { ...@@ -2861,67 +2810,6 @@ class MainWindowListener implements ActionListener {
} }
} }
/**
* Event handler for OverWriteFileOKButton button
*/
class OverWriteFileOKButtonListener implements ActionListener {
private PolicyTool tool;
private ToolWindow tw;
private ToolDialog td;
private String filename;
private int nextEvent;
OverWriteFileOKButtonListener(PolicyTool tool, ToolWindow tw,
ToolDialog td, String filename, int nextEvent) {
this.tool = tool;
this.tw = tw;
this.td = td;
this.filename = filename;
this.nextEvent = nextEvent;
}
public void actionPerformed(ActionEvent e) {
try {
// save the policy entries to a file
tool.savePolicy(filename);
// display status
MessageFormat form = new MessageFormat
(PolicyTool.rb.getString
("Policy.successfully.written.to.filename"));
Object[] source = {filename};
tw.displayStatusDialog(null, form.format(source));
// display the new policy filename
TextField newFilename = (TextField)tw.getComponent
(tw.MW_FILENAME_TEXTFIELD);
newFilename.setText(filename);
tw.setVisible(true);
// now continue with the originally requested command
// (QUIT, NEW, or OPEN)
td.setVisible(false);
td.dispose();
td.userSaveContinue(tool, tw, td, nextEvent);
} catch (FileNotFoundException fnfe) {
if (filename == null || filename.equals("")) {
tw.displayErrorDialog(null, new FileNotFoundException
(PolicyTool.rb.getString("null.filename")));
} else {
tw.displayErrorDialog(null, fnfe);
}
td.setVisible(false);
td.dispose();
} catch (Exception ee) {
tw.displayErrorDialog(null, ee);
td.setVisible(false);
td.dispose();
}
}
}
/** /**
* Event handler for AddEntryDoneButton button * Event handler for AddEntryDoneButton button
* *
......
...@@ -44,6 +44,16 @@ public class ManifestEntryVerifier { ...@@ -44,6 +44,16 @@ public class ManifestEntryVerifier {
private static final Debug debug = Debug.getInstance("jar"); private static final Debug debug = Debug.getInstance("jar");
/**
* Holder class to lazily load Sun provider. NOTE: if
* Providers.getSunProvider returned a cached provider, we could avoid the
* need for caching the provider with this holder class; we should try to
* revisit this in JDK 8.
*/
private static class SunProviderHolder {
private static final Provider instance = Providers.getSunProvider();
}
/** the created digest objects */ /** the created digest objects */
HashMap<String, MessageDigest> createdDigests; HashMap<String, MessageDigest> createdDigests;
...@@ -125,7 +135,7 @@ public class ManifestEntryVerifier { ...@@ -125,7 +135,7 @@ public class ManifestEntryVerifier {
try { try {
digest = MessageDigest.getInstance digest = MessageDigest.getInstance
(algorithm, Providers.getSunProvider()); (algorithm, SunProviderHolder.instance);
createdDigests.put(algorithm, digest); createdDigests.put(algorithm, digest);
} catch (NoSuchAlgorithmException nsae) { } catch (NoSuchAlgorithmException nsae) {
// ignore // ignore
......
/* /*
* Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -1472,19 +1472,9 @@ public final class NormalizerImpl { ...@@ -1472,19 +1472,9 @@ public final class NormalizerImpl {
} }
--remove; --remove;
} }
} else if(value2!=0) { } else if(value2!=0) { // for U+1109A, U+1109C, and U+110AB
/* the composition is longer than the starter,
* move the intermediate characters back one */
starterIsSupplementary=true; starterIsSupplementary=true;
/* temporarily increment for the loop boundary */ args.source[starter+1]=(char)value2;
++starter;
q=remove;
r=++remove;
while(starter<q) {
args.source[--r]=args.source[--q];
}
args.source[starter]=(char)value2;
--starter; /* undo the temporary increment */
/* } else { both are on the BMP, nothing more to do */ /* } else { both are on the BMP, nothing more to do */
} }
......
<title>Nervous Text 1.1</title> <title>Nervous Text 1.1</title>
<hr> <hr>
<applet code="NervousText.class" width=534 height=50> <applet code="NervousText.class" width=534 height=50>
<param name=text value="Java^T^M 2 SDK, Standard Edition 6.0"> <param name=text value="Java SE Development Kit (JDK) 7.0">
</applet> </applet>
<hr> <hr>
<a href="NervousText.java">The source.</a> <a href="NervousText.java">The source.</a>
...@@ -75,7 +75,8 @@ public class J2DBench { ...@@ -75,7 +75,8 @@ public class J2DBench {
static JFrame guiFrame; static JFrame guiFrame;
static final SimpleDateFormat sdf = new SimpleDateFormat("MM.dd.yyyy 'at' HH:mm aaa z"); static final SimpleDateFormat sdf =
new SimpleDateFormat("MM.dd.yyyy 'at' HH:mm aaa z");
public static void init() { public static void init() {
progoptroot = new Group("prog", "Program Options"); progoptroot = new Group("prog", "Program Options");
...@@ -176,6 +177,8 @@ public class J2DBench { ...@@ -176,6 +177,8 @@ public class J2DBench {
public static void main(String argv[]) { public static void main(String argv[]) {
init(); init();
TestEnvironment.init(); TestEnvironment.init();
Result.init();
Destinations.init(); Destinations.init();
GraphicsTests.init(); GraphicsTests.init();
RenderTests.init(); RenderTests.init();
...@@ -323,7 +326,7 @@ public class J2DBench { ...@@ -323,7 +326,7 @@ public class J2DBench {
} else if (type.equalsIgnoreCase("m")) { } else if (type.equalsIgnoreCase("m")) {
multiplyWith = 60; multiplyWith = 60;
} else { } else {
System.out.println("Invalid \"-loop\" option specified."); System.err.println("Invalid \"-loop\" option specified.");
usage(1); usage(1);
} }
...@@ -331,32 +334,20 @@ public class J2DBench { ...@@ -331,32 +334,20 @@ public class J2DBench {
try { try {
val = Integer.parseInt(argv[i].substring(0, argv[i].length() - 1)); val = Integer.parseInt(argv[i].substring(0, argv[i].length() - 1));
} catch(Exception e) { } catch(Exception e) {
System.out.println("Invalid \"-loop\" option specified."); System.err.println("Invalid \"-loop\" option specified.");
usage(1); usage(1);
} }
requiredLoopTime = val * multiplyWith * 1000; requiredLoopTime = val * multiplyWith * 1000;
} }
} else if (arg.length() > 7 && } else if (arg.length() > 8 &&
arg.substring(0, 7).equalsIgnoreCase("-report")) arg.substring(0, 8).equalsIgnoreCase("-report:"))
{ {
for (int j = 7; j < arg.length(); j++) { String error = Result.parseRateOpt(arg.substring(8));
char c = arg.charAt(j); if (error != null) {
switch (c) { System.err.println("Invalid rate: "+error);
case 'N': Result.unitScale = Result.UNITS_WHOLE; break; usage(1);
case 'M': Result.unitScale = Result.UNITS_MILLIONS; break;
case 'K': Result.unitScale = Result.UNITS_THOUSANDS; break;
case 'A': Result.unitScale = Result.UNITS_AUTO; break;
case 'U': Result.useUnits = true; break;
case 'O': Result.useUnits = false; break;
case 's': Result.timeScale = Result.SECONDS_WHOLE; break;
case 'm': Result.timeScale = Result.SECONDS_MILLIS; break;
case 'u': Result.timeScale = Result.SECONDS_MICROS; break;
case 'n': Result.timeScale = Result.SECONDS_NANOS; break;
case 'a': Result.timeScale = Result.SECONDS_AUTO; break;
case '/': Result.invertRate = !Result.invertRate; break;
}
} }
} else { } else {
String reason = Group.root.setOption(arg); String reason = Group.root.setOption(arg);
...@@ -411,7 +402,7 @@ public class J2DBench { ...@@ -411,7 +402,7 @@ public class J2DBench {
writer.flush(); writer.flush();
} catch(IOException ioe) { } catch(IOException ioe) {
ioe.printStackTrace(); ioe.printStackTrace();
System.out.println("\nERROR : Could not create Loop-Report. Exit"); System.err.println("\nERROR : Could not create Loop-Report. Exit");
System.exit(1); System.exit(1);
} }
} }
...@@ -466,7 +457,7 @@ public class J2DBench { ...@@ -466,7 +457,7 @@ public class J2DBench {
} while(J2DBench.looping); } while(J2DBench.looping);
if(J2DBench.looping) { if (J2DBench.looping) {
writer.println("</html>"); writer.println("</html>");
writer.flush(); writer.flush();
writer.close(); writer.close();
......
...@@ -170,7 +170,7 @@ public abstract class Option extends Node implements Modifier { ...@@ -170,7 +170,7 @@ public abstract class Option extends Node implements Modifier {
updateGUI(); updateGUI();
jcb.addItemListener(new ItemListener() { jcb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == e.SELECTED) { if (e.getStateChange() == ItemEvent.SELECTED) {
JComboBox jcb = (JComboBox) e.getItemSelectable(); JComboBox jcb = (JComboBox) e.getItemSelectable();
value = jcb.getSelectedIndex(); value = jcb.getSelectedIndex();
if (J2DBench.verbose.isEnabled()) { if (J2DBench.verbose.isEnabled()) {
...@@ -261,7 +261,7 @@ public abstract class Option extends Node implements Modifier { ...@@ -261,7 +261,7 @@ public abstract class Option extends Node implements Modifier {
updateGUI(); updateGUI();
jcb.addItemListener(new ItemListener() { jcb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) {
value = (e.getStateChange() == e.SELECTED); value = (e.getStateChange() == ItemEvent.SELECTED);
if (J2DBench.verbose.isEnabled()) { if (J2DBench.verbose.isEnabled()) {
System.out.println(getOptionString()); System.out.println(getOptionString());
} }
...@@ -569,8 +569,6 @@ public abstract class Option extends Node implements Modifier { ...@@ -569,8 +569,6 @@ public abstract class Option extends Node implements Modifier {
} }
public String setValueFromString(String value) { public String setValueFromString(String value) {
int prev = 0;
int next = 0;
int enabled = 0; int enabled = 0;
StringTokenizer st = new StringTokenizer(value, ","); StringTokenizer st = new StringTokenizer(value, ",");
while (st.hasMoreTokens()) { while (st.hasMoreTokens()) {
...@@ -588,7 +586,6 @@ public abstract class Option extends Node implements Modifier { ...@@ -588,7 +586,6 @@ public abstract class Option extends Node implements Modifier {
if (s != null) { if (s != null) {
return "Bad value in list ("+s+")"; return "Bad value in list ("+s+")";
} }
prev = next+1;
} }
this.enabled = enabled; this.enabled = enabled;
updateGUI(); updateGUI();
...@@ -623,6 +620,175 @@ public abstract class Option extends Node implements Modifier { ...@@ -623,6 +620,175 @@ public abstract class Option extends Node implements Modifier {
} }
} }
public static class ObjectChoice extends Option {
int size;
String optionnames[];
Object optionvalues[];
String abbrevnames[];
String descnames[];
int defaultselected;
int selected;
JPanel jp;
JComboBox jcombo;
public ObjectChoice(Group parent, String nodeName, String description,
String optionnames[],
Object optionvalues[],
String abbrevnames[],
String descnames[],
int defaultselected)
{
this(parent, nodeName, description,
Math.min(Math.min(optionnames.length,
optionvalues.length),
Math.min(abbrevnames.length,
descnames.length)),
optionnames, optionvalues,
abbrevnames, descnames, defaultselected);
}
public ObjectChoice(Group parent, String nodeName, String description,
int size,
String optionnames[],
Object optionvalues[],
String abbrevnames[],
String descnames[],
int defaultselected)
{
super(parent, nodeName, description);
this.size = size;
this.optionnames = trim(optionnames, size);
this.optionvalues = trim(optionvalues, size);
this.abbrevnames = trim(abbrevnames, size);
this.descnames = trim(descnames, size);
this.selected = this.defaultselected = defaultselected;
}
private static String[] trim(String list[], int size) {
if (list.length == size) {
return list;
}
String newlist[] = new String[size];
System.arraycopy(list, 0, newlist, 0, size);
return newlist;
}
private static Object[] trim(Object list[], int size) {
if (list.length == size) {
return list;
}
Object newlist[] = new Object[size];
System.arraycopy(list, 0, newlist, 0, size);
return newlist;
}
public void restoreDefault() {
if (selected != defaultselected) {
selected = defaultselected;
updateGUI();
}
}
public void updateGUI() {
if (jcombo != null) {
jcombo.setSelectedIndex(this.selected);
}
}
public boolean isDefault() {
return (selected == defaultselected);
}
public Modifier.Iterator getIterator(TestEnvironment env) {
return new SwitchIterator(optionvalues, 1 << selected);
}
public JComponent getJComponent() {
if (jp == null) {
jp = new JPanel();
jp.setLayout(new BorderLayout());
jp.add(new JLabel(getDescription()), BorderLayout.WEST);
jcombo = new JComboBox(descnames);
updateGUI();
jcombo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
selected = jcombo.getSelectedIndex();
if (J2DBench.verbose.isEnabled()) {
System.out.println(getOptionString());
}
}
}
});
jp.add(jcombo, BorderLayout.EAST);
}
return jp;
}
public Object getValue() {
return optionvalues[selected];
}
public int getIntValue() {
return ((Integer) optionvalues[selected]).intValue();
}
public boolean getBooleanValue() {
return ((Boolean) optionvalues[selected]).booleanValue();
}
public String getValString() {
return optionnames[selected];
}
int findValueIndex(Object value) {
for (int i = 0; i < size; i++) {
if (optionvalues[i] == value) {
return i;
}
}
return -1;
}
public String getValString(Object value) {
return optionnames[findValueIndex(value)];
}
public String getAbbreviatedModifierDescription(Object value) {
return abbrevnames[findValueIndex(value)];
}
public String setValue(int v) {
return setValue(new Integer(v));
}
public String setValue(boolean v) {
return setValue(new Boolean(v));
}
public String setValue(Object value) {
for (int i = 0; i < size; i++) {
if (optionvalues[i].equals(value)) {
this.selected = i;
updateGUI();
return null;
}
}
return "Bad value";
}
public String setValueFromString(String value) {
for (int i = 0; i < size; i++) {
if (optionnames[i].equals(value)) {
this.selected = i;
updateGUI();
return null;
}
}
return "Bad value";
}
}
public static class BooleanIterator implements Modifier.Iterator { public static class BooleanIterator implements Modifier.Iterator {
private Boolean list[]; private Boolean list[];
private int index; private int index;
......
...@@ -35,23 +35,199 @@ import java.util.Vector; ...@@ -35,23 +35,199 @@ import java.util.Vector;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Enumeration; import java.util.Enumeration;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.HashMap;
public class Result { public class Result {
public static final int UNITS_WHOLE = 0; public static final int RATE_UNKNOWN = 0;
public static final int UNITS_THOUSANDS = 1;
public static final int UNITS_MILLIONS = 2; public static final int WORK_OPS = 1;
public static final int UNITS_AUTO = 3; public static final int WORK_UNITS = 2;
public static final int WORK_THOUSANDS = 4;
public static final int SECONDS_WHOLE = 0; public static final int WORK_MILLIONS = 6;
public static final int SECONDS_MILLIS = 1; public static final int WORK_AUTO = 8;
public static final int SECONDS_MICROS = 2;
public static final int SECONDS_NANOS = 3; public static final int TIME_SECONDS = 10;
public static final int SECONDS_AUTO = 4; public static final int TIME_MILLIS = 11;
public static final int TIME_MICROS = 12;
public static int unitScale = UNITS_WHOLE; public static final int TIME_NANOS = 13;
public static int timeScale = SECONDS_WHOLE; public static final int TIME_AUTO = 14;
public static boolean useUnits = true;
public static boolean invertRate = false; static Group resultoptroot;
static Option.ObjectChoice timeOpt;
static Option.ObjectChoice workOpt;
static Option.ObjectChoice rateOpt;
public static void init() {
resultoptroot = new Group(TestEnvironment.globaloptroot,
"results", "Result Options");
String workStrings[] = {
"units",
"kilounits",
"megaunits",
"autounits",
"ops",
"kiloops",
"megaops",
"autoops",
};
String workDescriptions[] = {
"Test Units",
"Thousands of Test Units",
"Millions of Test Units",
"Auto-scaled Test Units",
"Operations",
"Thousands of Operations",
"Millions of Operations",
"Auto-scaled Operations",
};
Integer workObjects[] = {
new Integer(WORK_UNITS),
new Integer(WORK_THOUSANDS),
new Integer(WORK_MILLIONS),
new Integer(WORK_AUTO),
new Integer(WORK_OPS | WORK_UNITS),
new Integer(WORK_OPS | WORK_THOUSANDS),
new Integer(WORK_OPS | WORK_MILLIONS),
new Integer(WORK_OPS | WORK_AUTO),
};
workOpt = new Option.ObjectChoice(resultoptroot,
"workunits", "Work Units",
workStrings, workObjects,
workStrings, workDescriptions,
0);
String timeStrings[] = {
"sec",
"msec",
"usec",
"nsec",
"autosec",
};
String timeDescriptions[] = {
"Seconds",
"Milliseconds",
"Microseconds",
"Nanoseconds",
"Auto-scaled seconds",
};
Integer timeObjects[] = {
new Integer(TIME_SECONDS),
new Integer(TIME_MILLIS),
new Integer(TIME_MICROS),
new Integer(TIME_NANOS),
new Integer(TIME_AUTO),
};
timeOpt = new Option.ObjectChoice(resultoptroot,
"timeunits", "Time Units",
timeStrings, timeObjects,
timeStrings, timeDescriptions,
0);
String rateStrings[] = {
"unitspersec",
"secsperunit",
};
String rateDescriptions[] = {
"Work units per Time",
"Time units per Work",
};
Boolean rateObjects[] = {
Boolean.FALSE,
Boolean.TRUE,
};
rateOpt = new Option.ObjectChoice(resultoptroot,
"ratio", "Rate Ratio",
rateStrings, rateObjects,
rateStrings, rateDescriptions,
0);
}
public static boolean isTimeUnit(int unit) {
return (unit >= TIME_SECONDS && unit <= TIME_AUTO);
}
public static boolean isWorkUnit(int unit) {
return (unit >= WORK_OPS && unit <= (WORK_AUTO | WORK_OPS));
}
public static String parseRateOpt(String opt) {
int timeScale = timeOpt.getIntValue();
int workScale = workOpt.getIntValue();
boolean invertRate = rateOpt.getBooleanValue();
int divindex = opt.indexOf('/');
if (divindex < 0) {
int unit = parseUnit(opt);
if (isTimeUnit(unit)) {
timeScale = unit;
} else if (isWorkUnit(unit)) {
workScale = unit;
} else {
return "Bad unit: "+opt;
}
} else {
int unit1 = parseUnit(opt.substring(0,divindex));
int unit2 = parseUnit(opt.substring(divindex+1));
if (isTimeUnit(unit1)) {
if (isWorkUnit(unit2)) {
timeScale = unit1;
workScale = unit2;
invertRate = true;
} else if (isTimeUnit(unit2)) {
return "Both time units: "+opt;
} else {
return "Bad denominator: "+opt;
}
} else if (isWorkUnit(unit1)) {
if (isWorkUnit(unit2)) {
return "Both work units: "+opt;
} else if (isTimeUnit(unit2)) {
timeScale = unit2;
workScale = unit1;
invertRate = false;
} else {
return "Bad denominator: "+opt;
}
} else {
return "Bad numerator: "+opt;
}
}
timeOpt.setValue(timeScale);
workOpt.setValue(workScale);
rateOpt.setValue(invertRate);
return null;
}
private static HashMap unitMap;
static {
unitMap = new HashMap();
unitMap.put("U", new Integer(WORK_UNITS));
unitMap.put("M", new Integer(WORK_MILLIONS));
unitMap.put("K", new Integer(WORK_THOUSANDS));
unitMap.put("A", new Integer(WORK_AUTO));
unitMap.put("MU", new Integer(WORK_MILLIONS));
unitMap.put("KU", new Integer(WORK_THOUSANDS));
unitMap.put("AU", new Integer(WORK_AUTO));
unitMap.put("O", new Integer(WORK_UNITS | WORK_OPS));
unitMap.put("NO", new Integer(WORK_UNITS | WORK_OPS));
unitMap.put("MO", new Integer(WORK_MILLIONS | WORK_OPS));
unitMap.put("KO", new Integer(WORK_THOUSANDS | WORK_OPS));
unitMap.put("AO", new Integer(WORK_AUTO | WORK_OPS));
unitMap.put("s", new Integer(TIME_SECONDS));
unitMap.put("m", new Integer(TIME_MILLIS));
unitMap.put("u", new Integer(TIME_MICROS));
unitMap.put("n", new Integer(TIME_NANOS));
unitMap.put("a", new Integer(TIME_AUTO));
}
public static int parseUnit(String c) {
Integer u = (Integer) unitMap.get(c);
if (u != null) {
return u.intValue();
}
return RATE_UNKNOWN;
}
String unitname = "unit"; String unitname = "unit";
Test test; Test test;
...@@ -157,69 +333,76 @@ public class Result { ...@@ -157,69 +333,76 @@ public class Result {
} }
public String getAverageString() { public String getAverageString() {
double units = (useUnits ? getTotalUnits() : getTotalReps()); int timeScale = timeOpt.getIntValue();
int workScale = workOpt.getIntValue();
boolean invertRate = rateOpt.getBooleanValue();
double time = getTotalTime(); double time = getTotalTime();
if (invertRate) { String timeprefix = "";
double rate = time / units;
String prefix = "";
switch (timeScale) { switch (timeScale) {
case SECONDS_WHOLE: case TIME_AUTO:
rate /= 1000; case TIME_SECONDS:
time /= 1000;
break; break;
case SECONDS_MILLIS: case TIME_MILLIS:
prefix = "m"; timeprefix = "m";
break; break;
case SECONDS_MICROS: case TIME_MICROS:
rate *= 1000.0; time *= 1000.0;
prefix = "u"; timeprefix = "u";
break; break;
case SECONDS_NANOS: case TIME_NANOS:
rate *= 1000000.0; time *= 1000000.0;
prefix = "n"; timeprefix = "n";
break; break;
case SECONDS_AUTO: }
rate /= 1000.0;
String workprefix = "";
boolean isOps = (workScale & WORK_OPS) != 0;
String workname = isOps ? "op" : unitname;
double work = isOps ? getTotalReps() : getTotalUnits();
switch (workScale & (~WORK_OPS)) {
case WORK_AUTO:
case WORK_UNITS:
break;
case WORK_THOUSANDS:
work /= 1000.0;
workprefix = "K";
break;
case WORK_MILLIONS:
work /= 1000000.0;
workprefix = "M";
break;
}
if (invertRate) {
double rate = time / work;
if (timeScale == TIME_AUTO) {
if (rate < 1.0) { if (rate < 1.0) {
rate *= 1000.0; rate *= 1000.0;
prefix = "m"; timeprefix = "m";
if (rate < 1.0) { if (rate < 1.0) {
rate *= 1000.0; rate *= 1000.0;
prefix = "u"; timeprefix = "u";
if (rate < 1.0) { if (rate < 1.0) {
rate *= 1000.0; rate *= 1000.0;
prefix = "n"; timeprefix = "n";
} }
} }
} }
break;
} }
return rate+" "+prefix+"secs/"+(useUnits ? unitname : "op"); return rate+" "+timeprefix+"secs/"+workprefix+workname;
} else { } else {
double rate = units / (time / 1000.0); double rate = work / time;
String prefix = ""; if (workScale == WORK_AUTO) {
switch (unitScale) {
case UNITS_WHOLE:
break;
case UNITS_THOUSANDS:
rate /= 1000.0;
prefix = "K";
break;
case UNITS_MILLIONS:
rate /= 1000000.0;
prefix = "M";
break;
case UNITS_AUTO:
if (rate > 1000.0) { if (rate > 1000.0) {
rate /= 1000.0; rate /= 1000.0;
prefix = "K"; workprefix = "K";
if (rate > 1000.0) { if (rate > 1000.0) {
rate /= 1000.0; rate /= 1000.0;
prefix = "M"; workprefix = "M";
} }
} }
break;
} }
return rate+" "+prefix+(useUnits ? unitname : "op")+"s/sec"; return rate+" "+workprefix+workname+"s/"+timeprefix+"sec";
} }
} }
......
...@@ -61,6 +61,8 @@ public class J2DAnalyzer { ...@@ -61,6 +61,8 @@ public class J2DAnalyzer {
"the following result sets are combined into a group"); "the following result sets are combined into a group");
out.println(" -NoGroup "+ out.println(" -NoGroup "+
"the following result sets stand on their own"); "the following result sets stand on their own");
out.println(" -ShowUncontested "+
"show results even when only result set has a result");
out.println(" -Graph "+ out.println(" -Graph "+
"graph the results visually (using lines of *'s)"); "graph the results visually (using lines of *'s)");
out.println(" -Best "+ out.println(" -Best "+
...@@ -83,6 +85,7 @@ public class J2DAnalyzer { ...@@ -83,6 +85,7 @@ public class J2DAnalyzer {
public static void main(String argv[]) { public static void main(String argv[]) {
boolean gavehelp = false; boolean gavehelp = false;
boolean graph = false; boolean graph = false;
boolean ignoreuncontested = true;
if (argv.length > 0 && argv[0].equalsIgnoreCase("-html")) { if (argv.length > 0 && argv[0].equalsIgnoreCase("-html")) {
String newargs[] = new String[argv.length-1]; String newargs[] = new String[argv.length-1];
System.arraycopy(argv, 1, newargs, 0, newargs.length); System.arraycopy(argv, 1, newargs, 0, newargs.length);
...@@ -97,6 +100,8 @@ public class J2DAnalyzer { ...@@ -97,6 +100,8 @@ public class J2DAnalyzer {
results.add(groupHolder); results.add(groupHolder);
} else if (arg.equalsIgnoreCase("-NoGroup")) { } else if (arg.equalsIgnoreCase("-NoGroup")) {
groupHolder = null; groupHolder = null;
} else if (arg.equalsIgnoreCase("-ShowUncontested")) {
ignoreuncontested = false;
} else if (arg.equalsIgnoreCase("-Graph")) { } else if (arg.equalsIgnoreCase("-Graph")) {
graph = true; graph = true;
} else if (arg.equalsIgnoreCase("-Best")) { } else if (arg.equalsIgnoreCase("-Best")) {
...@@ -171,18 +176,23 @@ public class J2DAnalyzer { ...@@ -171,18 +176,23 @@ public class J2DAnalyzer {
String key = keys[k]; String key = keys[k];
ResultHolder rh = base.getResultByKey(key); ResultHolder rh = base.getResultByKey(key);
double score = rh.getScore(); double score = rh.getScore();
System.out.println(rh.getShortKey()+":");
double maxscore = score; double maxscore = score;
if (graph) { int numcontesting = 0;
for (int i = 0; i < numsets; i++) { for (int i = 0; i < numsets; i++) {
ResultSetHolder rsh = ResultSetHolder rsh =
(ResultSetHolder) results.elementAt(i); (ResultSetHolder) results.elementAt(i);
ResultHolder rh2 = rsh.getResultByKey(key); ResultHolder rh2 = rsh.getResultByKey(key);
if (rh2 != null) { if (rh2 != null) {
if (graph) {
maxscore = Math.max(maxscore, rh2.getBestScore()); maxscore = Math.max(maxscore, rh2.getBestScore());
} }
numcontesting++;
} }
} }
if (ignoreuncontested && numcontesting < 2) {
continue;
}
System.out.println(rh.getShortKey()+":");
for (int i = 0; i < numsets; i++) { for (int i = 0; i < numsets; i++) {
ResultSetHolder rsh = (ResultSetHolder) results.elementAt(i); ResultSetHolder rsh = (ResultSetHolder) results.elementAt(i);
System.out.print(rsh.getTitle()+": "); System.out.print(rsh.getTitle()+": ");
......
...@@ -38,6 +38,8 @@ import java.awt.RenderingHints; ...@@ -38,6 +38,8 @@ import java.awt.RenderingHints;
import java.awt.Polygon; import java.awt.Polygon;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.geom.Point2D;
import java.awt.geom.AffineTransform;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import j2dbench.Destinations; import j2dbench.Destinations;
...@@ -74,6 +76,7 @@ public abstract class GraphicsTests extends Test { ...@@ -74,6 +76,7 @@ public abstract class GraphicsTests extends Test {
static Option animList; static Option animList;
static Option sizeList; static Option sizeList;
static Option compRules; static Option compRules;
static Option transforms;
static Option doExtraAlpha; static Option doExtraAlpha;
static Option doXor; static Option doXor;
static Option doClipping; static Option doClipping;
...@@ -167,6 +170,29 @@ public abstract class GraphicsTests extends Test { ...@@ -167,6 +170,29 @@ public abstract class GraphicsTests extends Test {
j, rulenames, rules, rulenames, j, rulenames, rules, rulenames,
ruledescs, (1 << defrule)); ruledescs, (1 << defrule));
((Option.ObjectList) compRules).setNumRows(4); ((Option.ObjectList) compRules).setNumRows(4);
Transform xforms[] = {
Identity.instance,
FTranslate.instance,
Scale2x2.instance,
Rotate15.instance,
ShearX.instance,
ShearY.instance,
};
String xformnames[] = new String[xforms.length];
String xformdescs[] = new String[xforms.length];
for (int i = 0; i < xforms.length; i++) {
xformnames[i] = xforms[i].getShortName();
xformdescs[i] = xforms[i].getDescription();
}
transforms =
new Option.ObjectList(groptroot, "transform",
"Affine Transform",
xforms.length,
xformnames, xforms, xformnames,
xformdescs, 0x1);
((Option.ObjectList) transforms).setNumRows(3);
doExtraAlpha = doExtraAlpha =
new Option.Toggle(groptroot, "extraalpha", new Option.Toggle(groptroot, "extraalpha",
"Render with an \"extra alpha\" of 0.125", "Render with an \"extra alpha\" of 0.125",
...@@ -200,6 +226,7 @@ public abstract class GraphicsTests extends Test { ...@@ -200,6 +226,7 @@ public abstract class GraphicsTests extends Test {
int orgX, orgY; int orgX, orgY;
int initX, initY; int initX, initY;
int maxX, maxY; int maxX, maxY;
double pixscale;
} }
public GraphicsTests(Group parent, String nodeName, String description) { public GraphicsTests(Group parent, String nodeName, String description) {
...@@ -211,7 +238,7 @@ public abstract class GraphicsTests extends Test { ...@@ -211,7 +238,7 @@ public abstract class GraphicsTests extends Test {
public Object initTest(TestEnvironment env, Result result) { public Object initTest(TestEnvironment env, Result result) {
Context ctx = createContext(); Context ctx = createContext();
initContext(env, ctx); initContext(env, ctx);
result.setUnits(pixelsTouched(ctx)); result.setUnits((int) (ctx.pixscale * pixelsTouched(ctx)));
result.setUnitName("pixel"); result.setUnitName("pixel");
return ctx; return ctx;
} }
...@@ -232,6 +259,9 @@ public abstract class GraphicsTests extends Test { ...@@ -232,6 +259,9 @@ public abstract class GraphicsTests extends Test {
ctx.graphics = env.getGraphics(); ctx.graphics = env.getGraphics();
int w = env.getWidth(); int w = env.getWidth();
int h = env.getHeight(); int h = env.getHeight();
ctx.size = env.getIntValue(sizeList);
ctx.outdim = getOutputSize(ctx.size, ctx.size);
ctx.pixscale = 1.0;
if (hasGraphics2D) { if (hasGraphics2D) {
Graphics2D g2d = (Graphics2D) ctx.graphics; Graphics2D g2d = (Graphics2D) ctx.graphics;
AlphaComposite ac = (AlphaComposite) env.getModifier(compRules); AlphaComposite ac = (AlphaComposite) env.getModifier(compRules);
...@@ -251,11 +281,14 @@ public abstract class GraphicsTests extends Test { ...@@ -251,11 +281,14 @@ public abstract class GraphicsTests extends Test {
p.addPoint(0, 0); p.addPoint(0, 0);
g2d.clip(p); g2d.clip(p);
} }
Transform tx = (Transform) env.getModifier(transforms);
Dimension envdim = new Dimension(w, h);
tx.init(g2d, ctx, envdim);
w = envdim.width;
h = envdim.height;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
env.getModifier(renderHint)); env.getModifier(renderHint));
} }
ctx.size = env.getIntValue(sizeList);
ctx.outdim = getOutputSize(ctx.size, ctx.size);
switch (env.getIntValue(animList)) { switch (env.getIntValue(animList)) {
case 0: case 0:
ctx.animate = false; ctx.animate = false;
...@@ -290,4 +323,201 @@ public abstract class GraphicsTests extends Test { ...@@ -290,4 +323,201 @@ public abstract class GraphicsTests extends Test {
graphics.dispose(); graphics.dispose();
((Context) ctx).graphics = null; ((Context) ctx).graphics = null;
} }
public abstract static class Transform {
public abstract String getShortName();
public abstract String getDescription();
public abstract void init(Graphics2D g2d, Context ctx, Dimension dim);
public static double scaleForPoint(AffineTransform at,
double xorig, double yorig,
double x, double y,
int w, int h)
{
Point2D.Double ptd = new Point2D.Double(x, y);
at.transform(ptd, ptd);
x = ptd.getX();
y = ptd.getY();
double scale = 1.0;
if (x < 0) {
scale = Math.min(scale, xorig / (xorig - x));
} else if (x > w) {
scale = Math.min(scale, (w - xorig) / (x - xorig));
}
if (y < 0) {
scale = Math.min(scale, yorig / (yorig - y));
} else if (y > h) {
scale = Math.min(scale, (h - yorig) / (y - yorig));
}
return scale;
}
public static Dimension scaleForTransform(AffineTransform at,
Dimension dim)
{
int w = dim.width;
int h = dim.height;
Point2D.Double ptd = new Point2D.Double(0, 0);
at.transform(ptd, ptd);
double ox = ptd.getX();
double oy = ptd.getY();
if (ox < 0 || ox > w || oy < 0 || oy > h) {
throw new InternalError("origin outside destination");
}
double scalex = scaleForPoint(at, ox, oy, w, h, w, h);
double scaley = scalex;
scalex = Math.min(scaleForPoint(at, ox, oy, w, 0, w, h), scalex);
scaley = Math.min(scaleForPoint(at, ox, oy, 0, h, w, h), scaley);
if (scalex < 0 || scaley < 0) {
throw new InternalError("could not fit dims to transform");
}
return new Dimension((int) Math.floor(w * scalex),
(int) Math.floor(h * scaley));
}
}
public static class Identity extends Transform {
public static final Identity instance = new Identity();
private Identity() {}
public String getShortName() {
return "ident";
}
public String getDescription() {
return "Identity";
}
public void init(Graphics2D g2d, Context ctx, Dimension dim) {
}
}
public static class FTranslate extends Transform {
public static final FTranslate instance = new FTranslate();
private FTranslate() {}
public String getShortName() {
return "ftrans";
}
public String getDescription() {
return "FTranslate 1.5";
}
public void init(Graphics2D g2d, Context ctx, Dimension dim) {
int w = dim.width;
int h = dim.height;
AffineTransform at = new AffineTransform();
at.translate(1.5, 1.5);
g2d.transform(at);
dim.setSize(w-3, h-3);
}
}
public static class Scale2x2 extends Transform {
public static final Scale2x2 instance = new Scale2x2();
private Scale2x2() {}
public String getShortName() {
return "scale2x2";
}
public String getDescription() {
return "Scale 2x by 2x";
}
public void init(Graphics2D g2d, Context ctx, Dimension dim) {
int w = dim.width;
int h = dim.height;
AffineTransform at = new AffineTransform();
at.scale(2.0, 2.0);
g2d.transform(at);
dim.setSize(w/2, h/2);
ctx.pixscale = 4;
}
}
public static class Rotate15 extends Transform {
public static final Rotate15 instance = new Rotate15();
private Rotate15() {}
public String getShortName() {
return "rot15";
}
public String getDescription() {
return "Rotate 15 degrees";
}
public void init(Graphics2D g2d, Context ctx, Dimension dim) {
int w = dim.width;
int h = dim.height;
double theta = Math.toRadians(15);
double cos = Math.cos(theta);
double sin = Math.sin(theta);
double xsize = sin * h + cos * w;
double ysize = sin * w + cos * h;
double scale = Math.min(w / xsize, h / ysize);
xsize *= scale;
ysize *= scale;
AffineTransform at = new AffineTransform();
at.translate((w - xsize) / 2.0, (h - ysize) / 2.0);
at.translate(sin * h * scale, 0.0);
at.rotate(theta);
g2d.transform(at);
dim.setSize(scaleForTransform(at, dim));
}
}
public static class ShearX extends Transform {
public static final ShearX instance = new ShearX();
private ShearX() {}
public String getShortName() {
return "shearx";
}
public String getDescription() {
return "Shear X to the right";
}
public void init(Graphics2D g2d, Context ctx, Dimension dim) {
int w = dim.width;
int h = dim.height;
AffineTransform at = new AffineTransform();
at.translate(0.0, (h - (w*h)/(w + h*0.1)) / 2);
at.shear(0.1, 0.0);
g2d.transform(at);
dim.setSize(scaleForTransform(at, dim));
}
}
public static class ShearY extends Transform {
public static final ShearY instance = new ShearY();
private ShearY() {}
public String getShortName() {
return "sheary";
}
public String getDescription() {
return "Shear Y down";
}
public void init(Graphics2D g2d, Context ctx, Dimension dim) {
int w = dim.width;
int h = dim.height;
AffineTransform at = new AffineTransform();
at.translate((w - (w*h)/(h + w*0.1)) / 2, 0.0);
at.shear(0.0, 0.1);
g2d.transform(at);
dim.setSize(scaleForTransform(at, dim));
}
}
} }
...@@ -454,7 +454,7 @@ public abstract class TextTests extends Test { ...@@ -454,7 +454,7 @@ public abstract class TextTests extends Test {
taaNames, taaHints, taaNames, taaHints,
taaNames, taaNames, taaNames, taaNames,
0x1); 0x1);
((Option.ObjectList) taaList).setNumRows(2); ((Option.ObjectList) taaList).setNumRows(6);
// add special TextAAOpt for backwards compatibility with // add special TextAAOpt for backwards compatibility with
// older options files // older options files
new TextAAOpt(); new TextAAOpt();
...@@ -707,3 +707,4 @@ public abstract class TextTests extends Test { ...@@ -707,3 +707,4 @@ public abstract class TextTests extends Test {
} }
} }
} }
...@@ -45,12 +45,7 @@ import static java.nio.file.StandardCopyOption.*; ...@@ -45,12 +45,7 @@ import static java.nio.file.StandardCopyOption.*;
/* /*
* ZipFileSystem usage demo * ZipFileSystem usage demo
* *
* java [-cp .../zipfs.jar:./] Demo action ZipfileName [...] * java Demo action ZipfileName [...]
*
* To deploy the provider, either copy the zipfs.jar into JDK/JRE
* extensions directory or add
* <JDK_HOME>/demo/nio/ZipFileSystem/zipfs.jar
* into your class path as showed above.
* *
* @author Xueming Shen * @author Xueming Shen
*/ */
...@@ -153,14 +148,11 @@ public class Demo { ...@@ -153,14 +148,11 @@ public class Demo {
Action action = Action.valueOf(args[0]); Action action = Action.valueOf(args[0]);
Map<String, Object> env = env = new HashMap<>(); Map<String, Object> env = env = new HashMap<>();
if (action == Action.create) if (action == Action.create)
env.put("createNew", true); env.put("create", "true");
if (action == Action.tlist || action == Action.twalk) if (action == Action.tlist || action == Action.twalk)
env.put("buildDirTree", true); env.put("buildDirTree", true);
FileSystem fs = FileSystems.newFileSystem(Paths.get(args[1]), env, null);
FileSystem fs = FileSystems.newFileSystem(
URI.create("zip" + Paths.get(args[1]).toUri().toString().substring(4)),
env,
null);
try { try {
FileSystem fs2; FileSystem fs2;
Path path, src, dst; Path path, src, dst;
...@@ -207,19 +199,13 @@ public class Demo { ...@@ -207,19 +199,13 @@ public class Demo {
src.copyTo(dst, COPY_ATTRIBUTES); src.copyTo(dst, COPY_ATTRIBUTES);
break; break;
case zzmove: case zzmove:
fs2 = FileSystems.newFileSystem( fs2 = FileSystems.newFileSystem(Paths.get(args[2]), env, null);
URI.create("zip" + Paths.get(args[2]).toUri().toString().substring(4)),
env,
null);
//sf1.getPath(args[3]).moveTo(fs2.getPath(args[3])); //sf1.getPath(args[3]).moveTo(fs2.getPath(args[3]));
z2zmove(fs, fs2, args[3]); z2zmove(fs, fs2, args[3]);
fs2.close(); fs2.close();
break; break;
case zzcopy: case zzcopy:
fs2 = FileSystems.newFileSystem( fs2 = FileSystems.newFileSystem(Paths.get(args[2]), env, null);
URI.create("zip" + Paths.get(args[2]).toUri().toString().substring(4)),
env,
null);
//sf1.getPath(args[3]).copyTo(fs2.getPath(args[3])); //sf1.getPath(args[3]).copyTo(fs2.getPath(args[3]));
z2zcopy(fs, fs2, args[3]); z2zcopy(fs, fs2, args[3]);
fs2.close(); fs2.close();
......
ZipFileSystem is a file system provider that treats the contents of a zip or ZipFileSystem is a file system provider that treats the contents of a zip or
JAR file as a java.nio.file.FileSystem. JAR file as a java.nio.file.FileSystem.
To deploy the provider you must copy zipfs.jar into your extensions
directory or else add <JDK_HOME>/demo/nio/zipfs/zipfs.jar
to your class path.
The factory methods defined by the java.nio.file.FileSystems class can be The factory methods defined by the java.nio.file.FileSystems class can be
used to create a FileSystem, eg: used to create a FileSystem, eg:
...@@ -15,9 +11,9 @@ used to create a FileSystem, eg: ...@@ -15,9 +11,9 @@ used to create a FileSystem, eg:
-or -or
// locate file system by URI // locate file system by the legacy JAR URL syntax
Map<String,?> env = Collections.emptyMap(); Map<String,?> env = Collections.emptyMap();
URI uri = URI.create("zip:///mydir/foo.jar"); URI uri = URI.create("jar:file:/mydir/foo.jar");
FileSystem fs = FileSystems.newFileSystem(uri, env); FileSystem fs = FileSystems.newFileSystem(uri, env);
Once a FileSystem is created then classes in the java.nio.file package Once a FileSystem is created then classes in the java.nio.file package
...@@ -26,4 +22,6 @@ can be used to access files in the zip/JAR file, eg: ...@@ -26,4 +22,6 @@ can be used to access files in the zip/JAR file, eg:
Path mf = fs.getPath("/META-INF/MANIFEST.MF"); Path mf = fs.getPath("/META-INF/MANIFEST.MF");
InputStream in = mf.newInputStream(); InputStream in = mf.newInputStream();
See Demo.java for more interesting usages.
...@@ -91,11 +91,11 @@ public class ZipFileSystem extends FileSystem { ...@@ -91,11 +91,11 @@ public class ZipFileSystem extends FileSystem {
throws IOException throws IOException
{ {
// configurable env setup // configurable env setup
this.createNew = "true".equals(env.get("create"));
this.nameEncoding = env.containsKey("encoding") ?
(String)env.get("encoding") : "UTF-8";
this.buildDirTree = TRUE.equals(env.get("buildDirTreea")); this.buildDirTree = TRUE.equals(env.get("buildDirTreea"));
this.useTempFile = TRUE.equals(env.get("useTempFile")); this.useTempFile = TRUE.equals(env.get("useTempFile"));
this.createNew = TRUE.equals(env.get("createNew"));
this.nameEncoding = env.containsKey("nameEncoding") ?
(String)env.get("nameEncoding") : "UTF-8";
this.defaultDir = env.containsKey("default.dir") ? this.defaultDir = env.containsKey("default.dir") ?
(String)env.get("default.dir") : "/"; (String)env.get("default.dir") : "/";
if (this.defaultDir.charAt(0) != '/') if (this.defaultDir.charAt(0) != '/')
...@@ -1176,7 +1176,9 @@ public class ZipFileSystem extends FileSystem { ...@@ -1176,7 +1176,9 @@ public class ZipFileSystem extends FileSystem {
} else { } else {
os.write(buf, 0, LOCHDR); // write out the loc header os.write(buf, 0, LOCHDR); // write out the loc header
locoff += LOCHDR; locoff += LOCHDR;
size += LOCNAM(buf) + LOCEXT(buf) + LOCSIZ(buf); // use e.csize, LOCSIZ(buf) is zero if FLAG_DATADESCR is on
// size += LOCNAM(buf) + LOCEXT(buf) + LOCSIZ(buf);
size += LOCNAM(buf) + LOCEXT(buf) + e.csize;
written = LOCHDR + size; written = LOCHDR + size;
} }
int n; int n;
......
...@@ -63,7 +63,7 @@ public class ZipFileSystemProvider extends FileSystemProvider { ...@@ -63,7 +63,7 @@ public class ZipFileSystemProvider extends FileSystemProvider {
@Override @Override
public String getScheme() { public String getScheme() {
return "zip"; return "jar";
} }
protected Path uriToPath(URI uri) { protected Path uriToPath(URI uri) {
...@@ -72,10 +72,14 @@ public class ZipFileSystemProvider extends FileSystemProvider { ...@@ -72,10 +72,14 @@ public class ZipFileSystemProvider extends FileSystemProvider {
throw new IllegalArgumentException("URI scheme is not '" + getScheme() + "'"); throw new IllegalArgumentException("URI scheme is not '" + getScheme() + "'");
} }
try { try {
return Paths.get(new URI("file", uri.getHost(), uri.getPath(), null)) // only support legacy JAR URL syntax jar:{uri}!/{entry} for now
.toAbsolutePath(); String spec = uri.getSchemeSpecificPart();
int sep = spec.indexOf("!/");
if (sep != -1)
spec = spec.substring(0, sep);
return Paths.get(new URI(spec)).toAbsolutePath();
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
throw new AssertionError(e); //never thrown throw new IllegalArgumentException(e.getMessage(), e);
} }
} }
...@@ -119,14 +123,14 @@ public class ZipFileSystemProvider extends FileSystemProvider { ...@@ -119,14 +123,14 @@ public class ZipFileSystemProvider extends FileSystemProvider {
@Override @Override
public Path getPath(URI uri) { public Path getPath(URI uri) {
FileSystem fs = getFileSystem(uri);
String fragment = uri.getFragment(); String spec = uri.getSchemeSpecificPart();
if (fragment == null) { int sep = spec.indexOf("!/");
if (sep == -1)
throw new IllegalArgumentException("URI: " throw new IllegalArgumentException("URI: "
+ uri + uri
+ " does not contain path fragment ex. zip:///c:/foo.zip#/BAR"); + " does not contain path info ex. jar:file:/c:/foo.zip!/BAR");
} return getFileSystem(uri).getPath(spec.substring(sep + 1));
return fs.getPath(fragment);
} }
@Override @Override
......
...@@ -33,9 +33,7 @@ package com.sun.nio.zipfs; ...@@ -33,9 +33,7 @@ package com.sun.nio.zipfs;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator;
import java.util.Map; import java.util.Map;
import com.sun.nio.zipfs.ZipFileSystem.Entry;
import static com.sun.nio.zipfs.ZipConstants.*; import static com.sun.nio.zipfs.ZipConstants.*;
import static com.sun.nio.zipfs.ZipUtils.*; import static com.sun.nio.zipfs.ZipUtils.*;
...@@ -172,7 +170,7 @@ public class ZipInfo { ...@@ -172,7 +170,7 @@ public class ZipInfo {
static void printExtra(byte[] extra, int off, int len) { static void printExtra(byte[] extra, int off, int len) {
int end = off + len; int end = off + len;
while (off + 4 < end) { while (off + 4 <= end) {
int tag = SH(extra, off); int tag = SH(extra, off);
int sz = SH(extra, off + 2); int sz = SH(extra, off + 2);
print(" [tag=0x%04x, sz=%d, data= ", tag, sz); print(" [tag=0x%04x, sz=%d, data= ", tag, sz);
......
...@@ -191,13 +191,12 @@ public class ZipPath extends Path { ...@@ -191,13 +191,12 @@ public class ZipPath extends Path {
@Override @Override
public URI toUri() { public URI toUri() {
String zfPath = zfs.toString();
if (File.separatorChar == '\\') // replace all separators by '/'
zfPath = "/" + zfPath.replace("\\", "/");
try { try {
return new URI("zip", "", return new URI("jar",
zfPath, zfs.getZipFile().toUri() +
zfs.getString(toAbsolutePath().path)); "!" +
zfs.getString(toAbsolutePath().path),
null);
} catch (Exception ex) { } catch (Exception ex) {
throw new AssertionError(ex); throw new AssertionError(ex);
} }
......
此差异已折叠。
...@@ -57,9 +57,12 @@ class GtkFileDialogPeer extends XDialogPeer implements FileDialogPeer { ...@@ -57,9 +57,12 @@ class GtkFileDialogPeer extends XDialogPeer implements FileDialogPeer {
private native void run(String title, int mode, String dir, String file, private native void run(String title, int mode, String dir, String file,
FilenameFilter filter, boolean isMultipleMode); FilenameFilter filter, boolean isMultipleMode);
private native void quit(); private native void quit();
@Override
public native void toFront();
/** /**
* Called exclusively by the native C code. * Called exclusively by the native C code.
*/ */
......
...@@ -150,6 +150,8 @@ class XFramePeer extends XDecoratedPeer implements FramePeer { ...@@ -150,6 +150,8 @@ class XFramePeer extends XDecoratedPeer implements FramePeer {
void updateChildrenSizes() { void updateChildrenSizes() {
super.updateChildrenSizes(); super.updateChildrenSizes();
int height = getMenuBarHeight();
// XWindow.reshape calls XBaseWindow.xSetBounds, which acquires // XWindow.reshape calls XBaseWindow.xSetBounds, which acquires
// the AWT lock, so we have to acquire the AWT lock here // the AWT lock, so we have to acquire the AWT lock here
// before getStateLock() to avoid a deadlock with the Toolkit thread // before getStateLock() to avoid a deadlock with the Toolkit thread
...@@ -159,7 +161,7 @@ class XFramePeer extends XDecoratedPeer implements FramePeer { ...@@ -159,7 +161,7 @@ class XFramePeer extends XDecoratedPeer implements FramePeer {
synchronized(getStateLock()) { synchronized(getStateLock()) {
int width = dimensions.getClientSize().width; int width = dimensions.getClientSize().width;
if (menubarPeer != null) { if (menubarPeer != null) {
menubarPeer.reshape(0, 0, width, getMenuBarHeight()); menubarPeer.reshape(0, 0, width, height);
} }
} }
} finally { } finally {
......
...@@ -43,7 +43,7 @@ public class SctpNet { ...@@ -43,7 +43,7 @@ public class SctpNet {
/* -- Miscellaneous SCTP utilities -- */ /* -- Miscellaneous SCTP utilities -- */
static boolean bindxIPv4MappedAddresses() { private static boolean IPv4MappedAddresses() {
if ("SunOS".equals(osName)) { if ("SunOS".equals(osName)) {
/* Solaris supports IPv4Mapped Addresses with bindx */ /* Solaris supports IPv4Mapped Addresses with bindx */
return true; return true;
...@@ -87,7 +87,7 @@ public class SctpNet { ...@@ -87,7 +87,7 @@ public class SctpNet {
static void bindx(int fd, InetAddress[] addrs, int port, boolean add) static void bindx(int fd, InetAddress[] addrs, int port, boolean add)
throws IOException { throws IOException {
bindx(fd, addrs, port, addrs.length, add, bindx(fd, addrs, port, addrs.length, add,
bindxIPv4MappedAddresses()); IPv4MappedAddresses());
} }
static Set<SocketAddress> getLocalAddresses(int fd) static Set<SocketAddress> getLocalAddresses(int fd)
...@@ -145,11 +145,16 @@ public class SctpNet { ...@@ -145,11 +145,16 @@ public class SctpNet {
InetSocketAddress netAddr = (InetSocketAddress)addr; InetSocketAddress netAddr = (InetSocketAddress)addr;
if (name.equals(SCTP_PRIMARY_ADDR)) { if (name.equals(SCTP_PRIMARY_ADDR)) {
setPrimAddrOption0(fd, assocId, setPrimAddrOption0(fd,
netAddr.getAddress(), netAddr.getPort()); assocId,
netAddr.getAddress(),
netAddr.getPort());
} else { } else {
setPeerPrimAddrOption0(fd, assocId, setPeerPrimAddrOption0(fd,
netAddr.getAddress(), netAddr.getPort()); assocId,
netAddr.getAddress(),
netAddr.getPort(),
IPv4MappedAddresses());
} }
} else if (name.equals(SCTP_DISABLE_FRAGMENTS) || } else if (name.equals(SCTP_DISABLE_FRAGMENTS) ||
name.equals(SCTP_EXPLICIT_COMPLETE) || name.equals(SCTP_EXPLICIT_COMPLETE) ||
...@@ -290,7 +295,7 @@ public class SctpNet { ...@@ -290,7 +295,7 @@ public class SctpNet {
int port) throws IOException; int port) throws IOException;
static native void setPeerPrimAddrOption0(int fd, int assocId, static native void setPeerPrimAddrOption0(int fd, int assocId,
InetAddress ia, int port) throws IOException; InetAddress ia, int port, boolean preferIPv6) throws IOException;
static native SocketAddress getPrimAddrOption0(int fd, int assocId) static native SocketAddress getPrimAddrOption0(int fd, int assocId)
throws IOException; throws IOException;
......
...@@ -217,15 +217,18 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script, ...@@ -217,15 +217,18 @@ static int ParseLocale(int cat, char ** std_language, char ** std_script,
/* Normalize the language name */ /* Normalize the language name */
if (std_language != NULL) { if (std_language != NULL) {
*std_language = "en"; *std_language = "en";
if (language != NULL) { if (language != NULL && mapLookup(language_names, language, std_language) == 0) {
mapLookup(language_names, language, std_language); *std_language = malloc(strlen(language)+1);
strcpy(*std_language, language);
} }
} }
/* Normalize the country name */ /* Normalize the country name */
if (std_country != NULL && country != NULL) { if (std_country != NULL && country != NULL) {
*std_country = country; if (mapLookup(country_names, country, std_country) == 0) {
mapLookup(country_names, country, std_country); *std_country = malloc(strlen(country)+1);
strcpy(*std_country, country);
}
} }
/* Normalize the script and variant name. Note that we only use /* Normalize the script and variant name. Note that we only use
......
...@@ -607,6 +607,7 @@ gboolean gtk2_load() ...@@ -607,6 +607,7 @@ gboolean gtk2_load()
fp_gtk_tree_view_new = dl_symbol("gtk_tree_view_new"); fp_gtk_tree_view_new = dl_symbol("gtk_tree_view_new");
fp_gtk_viewport_new = dl_symbol("gtk_viewport_new"); fp_gtk_viewport_new = dl_symbol("gtk_viewport_new");
fp_gtk_window_new = dl_symbol("gtk_window_new"); fp_gtk_window_new = dl_symbol("gtk_window_new");
fp_gtk_window_present = dl_symbol("gtk_window_present");
fp_gtk_dialog_new = dl_symbol("gtk_dialog_new"); fp_gtk_dialog_new = dl_symbol("gtk_dialog_new");
fp_gtk_frame_new = dl_symbol("gtk_frame_new"); fp_gtk_frame_new = dl_symbol("gtk_frame_new");
......
...@@ -749,6 +749,7 @@ int (*fp_gdk_pixbuf_get_rowstride)(const GdkPixbuf *pixbuf); ...@@ -749,6 +749,7 @@ int (*fp_gdk_pixbuf_get_rowstride)(const GdkPixbuf *pixbuf);
int (*fp_gdk_pixbuf_get_width)(const GdkPixbuf *pixbuf); int (*fp_gdk_pixbuf_get_width)(const GdkPixbuf *pixbuf);
GdkPixbuf *(*fp_gdk_pixbuf_new_from_file)(const char *filename, GError **error); GdkPixbuf *(*fp_gdk_pixbuf_new_from_file)(const char *filename, GError **error);
void (*fp_gtk_widget_destroy)(GtkWidget *widget); void (*fp_gtk_widget_destroy)(GtkWidget *widget);
void (*fp_gtk_window_present)(GtkWindow *window);
/** /**
......
...@@ -70,7 +70,11 @@ static void EnsureJreInstallation(const char *jrepath); ...@@ -70,7 +70,11 @@ static void EnsureJreInstallation(const char *jrepath);
*/ */
#undef ENABLE_AWT_PRELOAD #undef ENABLE_AWT_PRELOAD
#ifndef JAVA_ARGS /* turn off AWT preloading for javac, jar, etc */ #ifndef JAVA_ARGS /* turn off AWT preloading for javac, jar, etc */
/* CR6999872: fastdebug crashes if awt library is loaded before JVM is
* initialized*/
#if !defined(DEBUG)
#define ENABLE_AWT_PRELOAD #define ENABLE_AWT_PRELOAD
#endif
#endif #endif
#ifdef ENABLE_AWT_PRELOAD #ifdef ENABLE_AWT_PRELOAD
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册