Merge
This commit is contained in:
commit
38b6d51bff
@ -1,49 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
# Locate this Makefile
|
||||
ifeq ($(filter /%, $(lastword $(MAKEFILE_LIST))), )
|
||||
makefile_path := $(CURDIR)/$(lastword $(MAKEFILE_LIST))
|
||||
else
|
||||
makefile_path := $(lastword $(MAKEFILE_LIST))
|
||||
endif
|
||||
repo_dir := $(patsubst %/make/Makefile, %, $(makefile_path))
|
||||
|
||||
# What is the name of this subsystem (langtools, corba, etc)?
|
||||
subsystem_name := $(notdir $(repo_dir))
|
||||
|
||||
# Try to locate top-level makefile
|
||||
top_level_makefile := $(repo_dir)/../Makefile
|
||||
ifneq ($(wildcard $(top_level_makefile)), )
|
||||
$(info Will run $(subsystem_name) target on top-level Makefile)
|
||||
$(info WARNING: This is a non-recommended way of building!)
|
||||
$(info ===================================================)
|
||||
else
|
||||
$(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?)
|
||||
$(error Build from top-level Makefile instead)
|
||||
endif
|
||||
|
||||
all:
|
||||
@$(MAKE) -f $(top_level_makefile) $(subsystem_name)
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -98,6 +98,8 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
JVMCFG_SRC := $(JDK_TOPDIR)/src/java.base/macosx/conf/$(JVMCFG_ARCH)/jvm.cfg
|
||||
else
|
||||
JVMCFG_SRC := $(JDK_TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS_TYPE)/conf/$(JVMCFG_ARCH)/jvm.cfg
|
||||
# Allow override by ALT_JVMCFG_SRC if it exists
|
||||
JVMCFG_SRC := $(if $(wildcard $(ALT_JVMCFG_SRC)),$(ALT_JVMCFG_SRC),$(JVMCFG_SRC))
|
||||
endif
|
||||
JVMCFG_DIR := $(LIB_DST_DIR)$(OPENJDK_TARGET_CPU_LIBDIR)
|
||||
JVMCFG := $(JVMCFG_DIR)/jvm.cfg
|
||||
|
@ -21,4 +21,4 @@
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
tzdata2015a
|
||||
tzdata2015b
|
||||
|
@ -1927,6 +1927,13 @@ Zone Indian/Maldives 4:54:00 - LMT 1880 # Male
|
||||
# was at the start of 2008-03-31 (the day of Steffen Thorsen's report);
|
||||
# this is almost surely wrong.
|
||||
|
||||
# From Ganbold Tsagaankhuu (2015-03-10):
|
||||
# It seems like yesterday Mongolian Government meeting has concluded to use
|
||||
# daylight saving time in Mongolia.... Starting at 2:00AM of last Saturday of
|
||||
# March 2015, daylight saving time starts. And 00:00AM of last Saturday of
|
||||
# September daylight saving time ends. Source:
|
||||
# http://zasag.mn/news/view/8969
|
||||
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
Rule Mongol 1983 1984 - Apr 1 0:00 1:00 S
|
||||
Rule Mongol 1983 only - Oct 1 0:00 0 -
|
||||
@ -1947,6 +1954,8 @@ Rule Mongol 1984 1998 - Sep lastSun 0:00 0 -
|
||||
Rule Mongol 2001 only - Apr lastSat 2:00 1:00 S
|
||||
Rule Mongol 2001 2006 - Sep lastSat 2:00 0 -
|
||||
Rule Mongol 2002 2006 - Mar lastSat 2:00 1:00 S
|
||||
Rule Mongol 2015 max - Mar lastSat 2:00 1:00 S
|
||||
Rule Mongol 2015 max - Sep lastSat 0:00 0 -
|
||||
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
# Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta
|
||||
@ -2365,13 +2374,19 @@ Zone Asia/Karachi 4:28:12 - LMT 1907
|
||||
# official source...:
|
||||
# http://www.palestinecabinet.gov.ps/ar/Views/ViewDetails.aspx?pid=1252
|
||||
|
||||
# From Paul Eggert (2013-09-24):
|
||||
# For future dates, guess the last Thursday in March at 24:00 through
|
||||
# the first Friday on or after September 21 at 00:00. This is consistent with
|
||||
# the predictions in today's editions of the following URLs,
|
||||
# which are for Gaza and Hebron respectively:
|
||||
# http://www.timeanddate.com/worldclock/timezone.html?n=702
|
||||
# http://www.timeanddate.com/worldclock/timezone.html?n=2364
|
||||
# From Steffen Thorsen (2015-03-03):
|
||||
# Sources such as http://www.alquds.com/news/article/view/id/548257
|
||||
# and http://www.raya.ps/ar/news/890705.html say Palestine areas will
|
||||
# start DST on 2015-03-28 00:00 which is one day later than expected.
|
||||
#
|
||||
# From Paul Eggert (2015-03-03):
|
||||
# http://www.timeanddate.com/time/change/west-bank/ramallah?year=2014
|
||||
# says that the fall 2014 transition was Oct 23 at 24:00.
|
||||
# For future dates, guess the last Friday in March at 24:00 through
|
||||
# the first Friday on or after October 21 at 00:00. This is consistent with
|
||||
# the predictions in today's editions of the following URLs:
|
||||
# http://www.timeanddate.com/time/change/gaza-strip/gaza
|
||||
# http://www.timeanddate.com/time/change/west-bank/hebron
|
||||
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
Rule EgyptAsia 1957 only - May 10 0:00 1:00 S
|
||||
@ -2397,9 +2412,11 @@ Rule Palestine 2011 only - Apr 1 0:01 1:00 S
|
||||
Rule Palestine 2011 only - Aug 1 0:00 0 -
|
||||
Rule Palestine 2011 only - Aug 30 0:00 1:00 S
|
||||
Rule Palestine 2011 only - Sep 30 0:00 0 -
|
||||
Rule Palestine 2012 max - Mar lastThu 24:00 1:00 S
|
||||
Rule Palestine 2012 2014 - Mar lastThu 24:00 1:00 S
|
||||
Rule Palestine 2012 only - Sep 21 1:00 0 -
|
||||
Rule Palestine 2013 max - Sep Fri>=21 0:00 0 -
|
||||
Rule Palestine 2013 only - Sep Fri>=21 0:00 0 -
|
||||
Rule Palestine 2014 max - Oct Fri>=21 0:00 0 -
|
||||
Rule Palestine 2015 max - Mar lastFri 24:00 1:00 S
|
||||
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Gaza 2:17:52 - LMT 1900 Oct
|
||||
|
@ -396,6 +396,7 @@ Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
|
||||
9:39:00 - LMT 1901 # Agana
|
||||
10:00 - GST 2000 Dec 23 # Guam
|
||||
10:00 - ChST # Chamorro Standard Time
|
||||
Link Pacific/Guam Pacific/Saipan # N Mariana Is
|
||||
|
||||
# Kiribati
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
@ -411,12 +412,7 @@ Zone Pacific/Kiritimati -10:29:20 - LMT 1901
|
||||
14:00 - LINT
|
||||
|
||||
# N Mariana Is
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Saipan -14:17:00 - LMT 1844 Dec 31
|
||||
9:43:00 - LMT 1901
|
||||
9:00 - MPT 1969 Oct # N Mariana Is Time
|
||||
10:00 - MPT 2000 Dec 23
|
||||
10:00 - ChST # Chamorro Standard Time
|
||||
# See Pacific/Guam.
|
||||
|
||||
# Marshall Is
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
@ -586,6 +582,7 @@ Zone Pacific/Pago_Pago 12:37:12 - LMT 1879 Jul 5
|
||||
-11:00 - NST 1967 Apr # N=Nome
|
||||
-11:00 - BST 1983 Nov 30 # B=Bering
|
||||
-11:00 - SST # S=Samoa
|
||||
Link Pacific/Pago_Pago Pacific/Midway # in US minor outlying islands
|
||||
|
||||
# Samoa (formerly and also known as Western Samoa)
|
||||
|
||||
@ -767,23 +764,7 @@ Zone Pacific/Funafuti 11:56:52 - LMT 1901
|
||||
# uninhabited
|
||||
|
||||
# Midway
|
||||
#
|
||||
# From Mark Brader (2005-01-23):
|
||||
# [Fallacies and Fantasies of Air Transport History, by R.E.G. Davies,
|
||||
# published 1994 by Paladwr Press, McLean, VA, USA; ISBN 0-9626483-5-3]
|
||||
# reproduced a Pan American Airways timetable from 1936, for their weekly
|
||||
# "Orient Express" flights between San Francisco and Manila, and connecting
|
||||
# flights to Chicago and the US East Coast. As it uses some time zone
|
||||
# designations that I've never seen before:....
|
||||
# Fri. 6:30A Lv. HONOLOLU (Pearl Harbor), H.I. H.L.T. Ar. 5:30P Sun.
|
||||
# " 3:00P Ar. MIDWAY ISLAND . . . . . . . . . M.L.T. Lv. 6:00A "
|
||||
#
|
||||
Zone Pacific/Midway -11:49:28 - LMT 1901
|
||||
-11:00 - NST 1956 Jun 3
|
||||
-11:00 1:00 NDT 1956 Sep 2
|
||||
-11:00 - NST 1967 Apr # N=Nome
|
||||
-11:00 - BST 1983 Nov 30 # B=Bering
|
||||
-11:00 - SST # S=Samoa
|
||||
# See Pacific/Pago_Pago.
|
||||
|
||||
# Palmyra
|
||||
# uninhabited since World War II; was probably like Pacific/Kiritimati
|
||||
|
@ -2423,7 +2423,7 @@ Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
|
||||
4:00 Russia VOL%sT 1989 Mar 26 2:00s # Volgograd T
|
||||
3:00 Russia VOL%sT 1991 Mar 31 2:00s
|
||||
4:00 - VOLT 1992 Mar 29 2:00s
|
||||
3:00 Russia MSK 2011 Mar 27 2:00s
|
||||
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
|
||||
4:00 - MSK 2014 Oct 26 2:00s
|
||||
3:00 - MSK
|
||||
|
||||
|
@ -2335,8 +2335,24 @@ Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
|
||||
# "...the new time zone will come into effect at two o'clock on the first Sunday
|
||||
# of February, when we will have to advance the clock one hour from its current
|
||||
# time..."
|
||||
#
|
||||
# Also, the new zone will not use DST.
|
||||
#
|
||||
# From Carlos Raúl Perasso (2015-02-02):
|
||||
# The decree that modifies the Mexican Hour System Law has finally
|
||||
# been published at the Diario Oficial de la Federación
|
||||
# http://www.dof.gob.mx/nota_detalle.php?codigo=5380123&fecha=31/01/2015
|
||||
# It establishes 5 zones for Mexico:
|
||||
# 1- Zona Centro (Central Zone): Corresponds to longitude 90 W,
|
||||
# includes most of Mexico, excluding what's mentioned below.
|
||||
# 2- Zona Pacífico (Pacific Zone): Longitude 105 W, includes the
|
||||
# states of Baja California Sur; Chihuahua; Nayarit (excluding Bahía
|
||||
# de Banderas which lies in Central Zone); Sinaloa and Sonora.
|
||||
# 3- Zona Noroeste (Northwest Zone): Longitude 120 W, includes the
|
||||
# state of Baja California.
|
||||
# 4- Zona Sureste (Southeast Zone): Longitude 75 W, includes the state
|
||||
# of Quintana Roo.
|
||||
# 5- The islands, reefs and keys shall take their timezone from the
|
||||
# longitude they are located at.
|
||||
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
Rule Mexico 1939 only - Feb 5 0:00 1:00 D
|
||||
@ -2531,13 +2547,8 @@ Zone America/Santa_Isabel -7:39:28 - LMT 1922 Jan 1 0:20:32
|
||||
###############################################################################
|
||||
|
||||
# Anguilla
|
||||
# See America/Port_of_Spain.
|
||||
|
||||
# Antigua and Barbuda
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Antigua -4:07:12 - LMT 1912 Mar 2
|
||||
-5:00 - EST 1951
|
||||
-4:00 - AST
|
||||
# See America/Port_of_Spain.
|
||||
|
||||
# Bahamas
|
||||
#
|
||||
@ -2604,10 +2615,7 @@ Zone Atlantic/Bermuda -4:19:18 - LMT 1930 Jan 1 2:00 # Hamilton
|
||||
-4:00 US A%sT
|
||||
|
||||
# Cayman Is
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Cayman -5:25:32 - LMT 1890 # Georgetown
|
||||
-5:07:11 - KMT 1912 Feb # Kingston Mean Time
|
||||
-5:00 - EST
|
||||
# See America/Panama.
|
||||
|
||||
# Costa Rica
|
||||
|
||||
@ -3130,6 +3138,7 @@ Zone America/Managua -5:45:08 - LMT 1890
|
||||
Zone America/Panama -5:18:08 - LMT 1890
|
||||
-5:19:36 - CMT 1908 Apr 22 # Colón Mean Time
|
||||
-5:00 - EST
|
||||
Link America/Panama America/Cayman
|
||||
|
||||
# Puerto Rico
|
||||
# There are too many San Juans elsewhere, so we'll use 'Puerto_Rico'.
|
||||
|
@ -1229,10 +1229,13 @@ Zone America/Rio_Branco -4:31:12 - LMT 1914
|
||||
# DST Start: first Saturday of September 2014 (Sun 07 Sep 2014 04:00 UTC)
|
||||
# http://www.diariooficial.interior.gob.cl//media/2014/02/19/do-20140219.pdf
|
||||
|
||||
# From Juan Correa (2015-01-28):
|
||||
# ... today the Ministry of Energy announced that Chile will drop DST, will keep
|
||||
# "summer time" (UTC -3 / UTC -5) all year round....
|
||||
# http://www.minenergia.cl/ministerio/noticias/generales/ministerio-de-energia-anuncia.html
|
||||
# From Eduardo Romero Urra (2015-03-03):
|
||||
# Today has been published officially that Chile will use the DST time
|
||||
# permanently until March 25 of 2017
|
||||
# http://www.diariooficial.interior.gob.cl/media/2015/03/03/1-large.jpg
|
||||
#
|
||||
# From Paul Eggert (2015-03-03):
|
||||
# For now, assume that the extension will persist indefinitely.
|
||||
|
||||
# NOTE: ChileAQ rules for Antarctic bases are stored separately in the
|
||||
# 'antarctica' file.
|
||||
@ -1291,7 +1294,7 @@ Zone America/Santiago -4:42:46 - LMT 1890
|
||||
-3:00 - CLT
|
||||
Zone Pacific/Easter -7:17:44 - LMT 1890
|
||||
-7:17:28 - EMT 1932 Sep # Easter Mean Time
|
||||
-7:00 Chile EAS%sT 1982 Mar 13 3:00u # Easter Time
|
||||
-7:00 Chile EAS%sT 1982 Mar 14 3:00u # Easter Time
|
||||
-6:00 Chile EAS%sT 2015 Apr 26 3:00u
|
||||
-5:00 - EAST
|
||||
#
|
||||
@ -1626,6 +1629,7 @@ Zone America/Port_of_Spain -4:06:04 - LMT 1912 Mar 2
|
||||
|
||||
# These all agree with Trinidad and Tobago since 1970.
|
||||
Link America/Port_of_Spain America/Anguilla
|
||||
Link America/Port_of_Spain America/Antigua
|
||||
Link America/Port_of_Spain America/Dominica
|
||||
Link America/Port_of_Spain America/Grenada
|
||||
Link America/Port_of_Spain America/Guadeloupe
|
||||
|
@ -236,10 +236,6 @@ ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
LIBAWT_VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/java.desktop/windows/native/libawt/windows/awt.rc
|
||||
endif
|
||||
|
||||
ifeq ($(MILESTONE), internal)
|
||||
LIBAWT_CFLAGS += -DINTERNAL_BUILD
|
||||
endif
|
||||
|
||||
LIBAWT_MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libawt/mapfile-vers
|
||||
ifeq ($(OPENJDK_TARGET_OS), linux)
|
||||
LIBAWT_MAPFILE :=
|
||||
@ -347,10 +343,6 @@ ifeq ($(findstring $(OPENJDK_TARGET_OS),windows macosx),)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(MILESTONE), internal)
|
||||
LIBAWT_XAWT_CFLAGS += -DINTERNAL_BUILD
|
||||
endif
|
||||
|
||||
LIBAWT_XAWT_LDFLAGS_SUFFIX := $(LIBM) -lawt -lXext -lX11 -lXrender $(LIBDL) -lXtst -lXi -ljava -ljvm -lc
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), linux)
|
||||
|
@ -269,7 +269,7 @@ endif
|
||||
LIBJLI_EXCLUDE_FILES += $(notdir $(LIBJLI_EXCLUDE_ERGO))
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
LIBJLI_EXCLUDE_FILES += java_md_solinux.c ergo.c
|
||||
LIBJLI_EXCLUDE_FILES += java_md_solinux.c ergo.c ergo_i586.c
|
||||
|
||||
BUILD_LIBJLI_java_md_macosx.c_CFLAGS := -x objective-c
|
||||
BUILD_LIBJLI_STATIC_java_md_macosx.c_CFLAGS := -x objective-c
|
||||
@ -317,12 +317,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJLI, \
|
||||
LANG := C, \
|
||||
OPTIMIZATION := HIGH, \
|
||||
CFLAGS := $(LIBJLI_CFLAGS), \
|
||||
DISABLED_WARNINGS_gcc := pointer-to-int-cast sign-compare format-nonliteral \
|
||||
parentheses, \
|
||||
DISABLED_WARNINGS_clang := implicit-function-declaration parentheses \
|
||||
int-conversion, \
|
||||
DISABLED_WARNINGS_solstudio := E_ASM_DISABLES_OPTIMIZATION E_NEWLINE_NOT_LAST, \
|
||||
DISABLED_WARNINGS_microsoft := 4244 4047 4267, \
|
||||
DISABLED_WARNINGS_solstudio := E_ASM_DISABLES_OPTIMIZATION, \
|
||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjli/mapfile-vers, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
@ -371,7 +366,6 @@ ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
LANG := C, \
|
||||
OPTIMIZATION := HIGH, \
|
||||
CFLAGS := $(STATIC_LIBRARY_FLAGS) $(LIBJLI_CFLAGS), \
|
||||
DISABLED_WARNINGS_microsoft := 4244 4047 4267, \
|
||||
ARFLAGS := $(ARFLAGS), \
|
||||
OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libjli_static, \
|
||||
DEBUG_SYMBOLS := $(DEBUG_ALL_BINARIES)))
|
||||
@ -392,8 +386,6 @@ else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
LANG := C, \
|
||||
OPTIMIZATION := HIGH, \
|
||||
CFLAGS := $(CFLAGS_JDKLIB) $(LIBJLI_CFLAGS), \
|
||||
DISABLED_WARNINGS_clang := implicit-function-declaration parentheses \
|
||||
int-conversion, \
|
||||
LDFLAGS := -nostdlib -r, \
|
||||
OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libjli_static, \
|
||||
DEBUG_SYMBOLS := $(DEBUG_ALL_BINARIES)))
|
||||
|
@ -1,7 +1,6 @@
|
||||
data = R0x2000;
|
||||
text = LOAD ?RXO;
|
||||
# Test Null
|
||||
text: .text%init64IO: OUTPUTDIR/UnixFileSystem_md.o;
|
||||
text: .text%JNI_OnLoad;
|
||||
text: .text%Canonicalize;
|
||||
text: .text%canonicalize;
|
||||
@ -38,10 +37,9 @@ text: .text%Java_java_lang_System_setErr0;
|
||||
text: .text%Java_java_lang_System_identityHashCode;
|
||||
text: .text%Java_sun_misc_Signal_findSignal;
|
||||
text: .text%Java_sun_misc_Signal_handle0;
|
||||
text: .text%Java_java_io_FileSystem_getFileSystem;
|
||||
text: .text%JNU_NewObjectByName;
|
||||
text: .text%Java_java_io_UnixFileSystem_initIDs;
|
||||
text: .text%Java_java_io_UnixFileSystem_canonicalize;
|
||||
text: .text%Java_java_io_UnixFileSystem_canonicalize0;
|
||||
text: .text%JNU_GetStringPlatformChars;
|
||||
text: .text%JNU_ReleaseStringPlatformChars;
|
||||
text: .text%Java_java_io_FileInputStream_open0;
|
||||
@ -52,27 +50,25 @@ text: .text%Java_java_io_FileInputStream_available;
|
||||
text: .text%Java_java_io_FileInputStream_close0;
|
||||
text: .text%Java_java_lang_System_mapLibraryName;
|
||||
text: .text%Java_java_io_UnixFileSystem_getBooleanAttributes0;
|
||||
text: .text%statMode: OUTPUTDIR/UnixFileSystem_md.o;
|
||||
text: .text%Java_java_lang_ClassLoader_00024NativeLibrary_load;
|
||||
text: .text%Java_java_lang_Compiler_registerNatives;
|
||||
text: .text%Java_java_lang_ClassLoader_00024NativeLibrary_find;
|
||||
text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2;
|
||||
text: .text%Java_java_io_UnixFileSystem_list;
|
||||
text: .text%JNU_ClassString;
|
||||
text: .text%JNU_CopyObjectArray;
|
||||
text: .text%Java_java_lang_String_intern;
|
||||
text: .text%Java_java_lang_ClassLoader_findLoadedClass;
|
||||
text: .text%Java_java_lang_ClassLoader_findLoadedClass0;
|
||||
text: .text%Java_java_lang_ClassLoader_findBootstrapClass;
|
||||
text: .text%Java_java_lang_Throwable_fillInStackTrace;
|
||||
text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2Ljava_security_AccessControlContext_2;
|
||||
text: .text%Java_java_io_UnixFileSystem_getLastModifiedTime;
|
||||
text: .text%Java_java_lang_Float_floatToIntBits;
|
||||
text: .text%Java_java_lang_Double_doubleToLongBits;
|
||||
text: .text%Java_java_lang_Float_floatToRawIntBits;
|
||||
text: .text%Java_java_lang_Double_doubleToRawLongBits;
|
||||
text: .text%Java_java_io_UnixFileSystem_getLength;
|
||||
text: .text%Java_java_lang_ClassLoader_defineClass0;
|
||||
text: .text%VerifyClassCodes;
|
||||
# Test Exit
|
||||
text: .text%Java_java_lang_Shutdown_halt;
|
||||
text: .text%Java_java_lang_Shutdown_halt0;
|
||||
# Test Hello
|
||||
text: .text%Java_java_io_FileOutputStream_writeBytes;
|
||||
text: .text%writeBytes;
|
||||
@ -91,9 +87,7 @@ text: .text%JNU_NotifyAll;
|
||||
text: .text%JNU_CallMethodByName;
|
||||
text: .text%JNU_CallMethodByNameV;
|
||||
text: .text%Java_java_io_UnixFileSystem_createDirectory;
|
||||
text: .text%Java_java_util_prefs_FileSystemPreferences_lockFile0;
|
||||
text: .text%Java_java_io_UnixFileSystem_setLastModifiedTime;
|
||||
text: .text%Java_java_util_prefs_FileSystemPreferences_unlockFile0;
|
||||
# Test LoadJFrame
|
||||
text: .text%Java_sun_reflect_NativeMethodAccessorImpl_invoke0;
|
||||
text: .text%Java_java_lang_Class_isInstance;
|
||||
|
@ -1,7 +1,6 @@
|
||||
data = R0x2000;
|
||||
text = LOAD ?RXO;
|
||||
# Test Null
|
||||
text: .text%init64IO: OUTPUTDIR/UnixFileSystem_md.o;
|
||||
text: .text%JNI_OnLoad;
|
||||
text: .text%Canonicalize;
|
||||
text: .text%canonicalize;
|
||||
@ -30,9 +29,9 @@ text: .text%Java_sun_reflect_Reflection_getCallerClass__;
|
||||
text: .text%Java_sun_reflect_Reflection_getCallerClass__I;
|
||||
text: .text%Java_java_lang_Class_forName0;
|
||||
text: .text%Java_java_lang_String_intern;
|
||||
text: .text%Java_java_lang_Float_floatToIntBits;
|
||||
text: .text%Java_java_lang_Double_doubleToLongBits;
|
||||
text: .text%Java_java_lang_ClassLoader_findLoadedClass;
|
||||
text: .text%Java_java_lang_Float_floatToRawIntBits;
|
||||
text: .text%Java_java_lang_Double_doubleToRawLongBits;
|
||||
text: .text%Java_java_lang_ClassLoader_findLoadedClass0;
|
||||
text: .text%Java_java_lang_ClassLoader_findBootstrapClass;
|
||||
text: .text%VerifyClassCodes;
|
||||
text: .text%Java_java_lang_Throwable_fillInStackTrace;
|
||||
@ -41,10 +40,9 @@ text: .text%Java_java_lang_System_setErr0;
|
||||
text: .text%Java_java_lang_System_identityHashCode;
|
||||
text: .text%Java_sun_misc_Signal_findSignal;
|
||||
text: .text%Java_sun_misc_Signal_handle0;
|
||||
text: .text%Java_java_io_FileSystem_getFileSystem;
|
||||
text: .text%JNU_NewObjectByName;
|
||||
text: .text%Java_java_io_UnixFileSystem_initIDs;
|
||||
text: .text%Java_java_io_UnixFileSystem_canonicalize;
|
||||
text: .text%Java_java_io_UnixFileSystem_canonicalize0;
|
||||
text: .text%JNU_GetStringPlatformChars;
|
||||
text: .text%JNU_ReleaseStringPlatformChars;
|
||||
text: .text%Java_java_io_FileInputStream_open0;
|
||||
@ -53,13 +51,11 @@ text: .text%Java_java_io_FileInputStream_readBytes;
|
||||
text: .text%readBytes;
|
||||
text: .text%Java_java_io_FileInputStream_available;
|
||||
text: .text%Java_java_io_FileInputStream_close0;
|
||||
text: .text%Java_java_lang_Compiler_registerNatives;
|
||||
text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2;
|
||||
text: .text%Java_java_io_UnixFileSystem_list;
|
||||
text: .text%JNU_ClassString;
|
||||
text: .text%JNU_CopyObjectArray;
|
||||
text: .text%Java_java_io_UnixFileSystem_getBooleanAttributes0;
|
||||
text: .text%statMode: OUTPUTDIR/UnixFileSystem_md.o;
|
||||
text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2Ljava_security_AccessControlContext_2;
|
||||
text: .text%Java_java_lang_System_mapLibraryName;
|
||||
text: .text%Java_java_lang_ClassLoader_00024NativeLibrary_load;
|
||||
@ -68,7 +64,7 @@ text: .text%Java_java_io_UnixFileSystem_getLength;
|
||||
text: .text%Java_java_lang_Object_getClass;
|
||||
text: .text%Java_java_lang_ClassLoader_defineClass0;
|
||||
# Test Exit
|
||||
text: .text%Java_java_lang_Shutdown_halt;
|
||||
text: .text%Java_java_lang_Shutdown_halt0;
|
||||
# Test Hello
|
||||
text: .text%Java_java_io_FileOutputStream_writeBytes;
|
||||
text: .text%writeBytes;
|
||||
@ -88,9 +84,7 @@ text: .text%JNU_CallMethodByName;
|
||||
text: .text%JNU_CallMethodByNameV;
|
||||
text: .text%Java_java_io_UnixFileSystem_createDirectory;
|
||||
text: .text%Java_java_io_UnixFileSystem_getLastModifiedTime;
|
||||
text: .text%Java_java_util_prefs_FileSystemPreferences_lockFile0;
|
||||
text: .text%Java_java_io_UnixFileSystem_setLastModifiedTime;
|
||||
text: .text%Java_java_util_prefs_FileSystemPreferences_unlockFile0;
|
||||
# Test LoadJFrame
|
||||
text: .text%Java_java_lang_Class_isAssignableFrom;
|
||||
text: .text%Java_java_lang_Class_isInstance;
|
||||
|
@ -2,7 +2,6 @@ data = R0x2000;
|
||||
text = LOAD ?RXO;
|
||||
# Test Null
|
||||
text: .text%_init;
|
||||
text: .text%init64IO: OUTPUTDIR/UnixFileSystem_md.o;
|
||||
text: .text%JNI_OnLoad;
|
||||
text: .text%Canonicalize;
|
||||
text: .text%canonicalize;
|
||||
@ -36,8 +35,6 @@ text: .text%Java_sun_reflect_NativeConstructorAccessorImpl_newInstance0;
|
||||
text: .text%Java_java_lang_Throwable_fillInStackTrace;
|
||||
text: .text%Java_java_lang_System_setOut0;
|
||||
text: .text%Java_java_lang_System_setErr0;
|
||||
text: .text%Java_java_lang_Compiler_registerNatives;
|
||||
text: .text%Java_java_io_FileSystem_getFileSystem;
|
||||
text: .text%JNU_NewObjectByName;
|
||||
text: .text%Java_java_io_UnixFileSystem_initIDs;
|
||||
text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2;
|
||||
@ -46,17 +43,17 @@ text: .text%JNU_GetStringPlatformChars;
|
||||
text: .text%JNU_ReleaseStringPlatformChars;
|
||||
text: .text%JNU_ClassString;
|
||||
text: .text%JNU_CopyObjectArray;
|
||||
text: .text%Java_java_io_UnixFileSystem_canonicalize;
|
||||
text: .text%Java_java_io_UnixFileSystem_canonicalize0;
|
||||
text: .text%Java_java_io_UnixFileSystem_getBooleanAttributes0;
|
||||
text: .text%Java_java_lang_ClassLoader_findLoadedClass;
|
||||
text: .text%Java_java_lang_ClassLoader_findLoadedClass0;
|
||||
text: .text%Java_java_lang_ClassLoader_findBootstrapClass;
|
||||
text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2Ljava_security_AccessControlContext_2;
|
||||
text: .text%Java_java_lang_System_mapLibraryName;
|
||||
text: .text%cpchars: OUTPUTDIR/System.o;
|
||||
text: .text%Java_java_lang_ClassLoader_00024NativeLibrary_load;
|
||||
text: .text%Java_java_lang_ClassLoader_00024NativeLibrary_find;
|
||||
text: .text%Java_java_lang_Float_floatToIntBits;
|
||||
text: .text%Java_java_lang_Double_doubleToLongBits;
|
||||
text: .text%Java_java_lang_Float_floatToRawIntBits;
|
||||
text: .text%Java_java_lang_Double_doubleToRawLongBits;
|
||||
text: .text%Java_java_io_FileInputStream_open0;
|
||||
text: .text%fileOpen;
|
||||
text: .text%Java_java_io_UnixFileSystem_getLength;
|
||||
@ -67,7 +64,7 @@ text: .text%Java_java_lang_Object_getClass;
|
||||
text: .text%Java_java_lang_ClassLoader_defineClass0;
|
||||
text: .text%VerifyClassCodes;
|
||||
# Test Exit
|
||||
text: .text%Java_java_lang_Shutdown_halt;
|
||||
text: .text%Java_java_lang_Shutdown_halt0;
|
||||
# Test Hello
|
||||
text: .text%Java_java_io_FileOutputStream_writeBytes;
|
||||
text: .text%writeBytes;
|
||||
@ -93,9 +90,7 @@ text: .text%Java_java_util_logging_FileHandler_lockFile;
|
||||
text: .text%Java_java_io_FileOutputStream_open0;
|
||||
text: .text%Java_java_io_UnixFileSystem_createDirectory;
|
||||
text: .text%Java_java_io_UnixFileSystem_getLastModifiedTime;
|
||||
text: .text%Java_java_util_prefs_FileSystemPreferences_lockFile0;
|
||||
text: .text%Java_java_io_UnixFileSystem_setLastModifiedTime;
|
||||
text: .text%Java_java_util_prefs_FileSystemPreferences_unlockFile0;
|
||||
text: .text%Java_java_io_FileOutputStream_close0;
|
||||
text: .text%Java_java_util_logging_FileHandler_unlockFile;
|
||||
# Test LoadJFrame
|
||||
|
@ -12,7 +12,6 @@ text: .text%addMetaName: OUTPUTDIR/zip_util.o;
|
||||
text: .text%ZIP_FindEntry;
|
||||
text: .text%ZIP_GetEntry;
|
||||
text: .text%ZIP_Lock;
|
||||
text: .text%readLOC: OUTPUTDIR/zip_util.o;
|
||||
text: .text%ZIP_Unlock;
|
||||
text: .text%ZIP_FreeEntry;
|
||||
text: .text%Java_java_util_zip_ZipFile_initIDs;
|
||||
@ -37,7 +36,6 @@ text: .text%Java_java_util_zip_Inflater_inflateBytes;
|
||||
text: .text%inflate;
|
||||
text: .text%Java_java_util_zip_ZipFile_read;
|
||||
text: .text%ZIP_Read;
|
||||
text: .text%huft_build: OUTPUTDIR/inftrees.o;
|
||||
text: .text%zcfree;
|
||||
text: .text%Java_java_util_jar_JarFile_getMetaInfEntryNames;
|
||||
text: .text%ZIP_ReadEntry;
|
||||
|
@ -13,7 +13,6 @@ text: .text%addMetaName: OUTPUTDIR/zip_util.o;
|
||||
text: .text%ZIP_FindEntry;
|
||||
text: .text%ZIP_GetEntry;
|
||||
text: .text%ZIP_Lock;
|
||||
text: .text%readLOC: OUTPUTDIR/zip_util.o;
|
||||
text: .text%ZIP_Unlock;
|
||||
text: .text%ZIP_FreeEntry;
|
||||
text: .text%Java_java_util_zip_ZipFile_initIDs;
|
||||
@ -38,7 +37,6 @@ text: .text%Java_java_util_zip_Inflater_inflateBytes;
|
||||
text: .text%inflate;
|
||||
text: .text%Java_java_util_zip_ZipFile_read;
|
||||
text: .text%ZIP_Read;
|
||||
text: .text%huft_build: OUTPUTDIR/inftrees.o;
|
||||
text: .text%zcfree;
|
||||
text: .text%Java_java_util_jar_JarFile_getMetaInfEntryNames;
|
||||
text: .text%ZIP_ReadEntry;
|
||||
|
@ -852,7 +852,7 @@ ContinueInNewThread0(int (JNICALL *continuation)(void *), jlong stack_size, void
|
||||
if (pthread_create(&tid, &attr, (void *(*)(void*))continuation, (void*)args) == 0) {
|
||||
void * tmp;
|
||||
pthread_join(tid, &tmp);
|
||||
rslt = (int)tmp;
|
||||
rslt = (int)(intptr_t)tmp;
|
||||
} else {
|
||||
/*
|
||||
* Continue execution in current thread if for some reason (e.g. out of
|
||||
|
@ -38,10 +38,10 @@ public abstract class ObjectStreamException extends IOException {
|
||||
/**
|
||||
* Create an ObjectStreamException with the specified argument.
|
||||
*
|
||||
* @param classname the detailed message for the exception
|
||||
* @param message the detailed message for the exception
|
||||
*/
|
||||
protected ObjectStreamException(String classname) {
|
||||
super(classname);
|
||||
protected ObjectStreamException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -42,10 +42,10 @@ class ProtocolException extends IOException {
|
||||
* Constructs a new {@code ProtocolException} with the
|
||||
* specified detail message.
|
||||
*
|
||||
* @param host the detail message.
|
||||
* @param message the detail message.
|
||||
*/
|
||||
public ProtocolException(String host) {
|
||||
super(host);
|
||||
public ProtocolException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -41,10 +41,10 @@ class UnknownHostException extends IOException {
|
||||
* Constructs a new {@code UnknownHostException} with the
|
||||
* specified detail message.
|
||||
*
|
||||
* @param host the detail message.
|
||||
* @param message the detail message.
|
||||
*/
|
||||
public UnknownHostException(String host) {
|
||||
super(host);
|
||||
public UnknownHostException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -478,7 +478,6 @@ public final class HijrahChronology extends AbstractChronology implements Serial
|
||||
if (prolepticYear < getMinimumYear() || prolepticYear > getMaximumYear()) {
|
||||
return false;
|
||||
}
|
||||
int epochMonth = yearToEpochMonth((int) prolepticYear);
|
||||
int len = getYearLength((int) prolepticYear);
|
||||
return (len > 354);
|
||||
}
|
||||
@ -659,7 +658,7 @@ public final class HijrahChronology extends AbstractChronology implements Serial
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the maximum supported Hijrah ear.
|
||||
* Return the maximum supported Hijrah year.
|
||||
*
|
||||
* @return the minimum
|
||||
*/
|
||||
|
@ -2083,17 +2083,33 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
|
||||
return null;
|
||||
}
|
||||
|
||||
String calendarType = getCalendarType();
|
||||
int fieldValue = get(field);
|
||||
// the standalone and narrow styles are supported only through CalendarDataProviders.
|
||||
if (isStandaloneStyle(style) || isNarrowStyle(style)) {
|
||||
return CalendarDataUtility.retrieveFieldValueName(getCalendarType(),
|
||||
field, get(field),
|
||||
style, locale);
|
||||
if (isStandaloneStyle(style) || isNarrowFormatStyle(style)) {
|
||||
String val = CalendarDataUtility.retrieveFieldValueName(calendarType,
|
||||
field, fieldValue,
|
||||
style, locale);
|
||||
// Perform fallback here to follow the CLDR rules
|
||||
if (val == null) {
|
||||
if (isNarrowFormatStyle(style)) {
|
||||
val = CalendarDataUtility.retrieveFieldValueName(calendarType,
|
||||
field, fieldValue,
|
||||
toStandaloneStyle(style),
|
||||
locale);
|
||||
} else if (isStandaloneStyle(style)) {
|
||||
val = CalendarDataUtility.retrieveFieldValueName(calendarType,
|
||||
field, fieldValue,
|
||||
getBaseStyle(style),
|
||||
locale);
|
||||
}
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
DateFormatSymbols symbols = DateFormatSymbols.getInstance(locale);
|
||||
String[] strings = getFieldStrings(field, style, symbols);
|
||||
if (strings != null) {
|
||||
int fieldValue = get(field);
|
||||
if (fieldValue < strings.length) {
|
||||
return strings[fieldValue];
|
||||
}
|
||||
@ -2155,10 +2171,26 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
|
||||
ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
|
||||
return null;
|
||||
}
|
||||
if (style == ALL_STYLES || isStandaloneStyle(style)) {
|
||||
return CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale);
|
||||
|
||||
String calendarType = getCalendarType();
|
||||
if (style == ALL_STYLES || isStandaloneStyle(style) || isNarrowFormatStyle(style)) {
|
||||
Map<String, Integer> map;
|
||||
map = CalendarDataUtility.retrieveFieldValueNames(calendarType, field, style, locale);
|
||||
|
||||
// Perform fallback here to follow the CLDR rules
|
||||
if (map == null) {
|
||||
if (isNarrowFormatStyle(style)) {
|
||||
map = CalendarDataUtility.retrieveFieldValueNames(calendarType, field,
|
||||
toStandaloneStyle(style), locale);
|
||||
} else if (style != ALL_STYLES) {
|
||||
map = CalendarDataUtility.retrieveFieldValueNames(calendarType, field,
|
||||
getBaseStyle(style), locale);
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
// SHORT, LONG, or NARROW
|
||||
|
||||
// SHORT or LONG
|
||||
return getDisplayNamesImpl(field, style, locale);
|
||||
}
|
||||
|
||||
@ -2544,14 +2576,22 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
|
||||
return style & ~STANDALONE_MASK;
|
||||
}
|
||||
|
||||
boolean isStandaloneStyle(int style) {
|
||||
private int toStandaloneStyle(int style) {
|
||||
return style | STANDALONE_MASK;
|
||||
}
|
||||
|
||||
private boolean isStandaloneStyle(int style) {
|
||||
return (style & STANDALONE_MASK) != 0;
|
||||
}
|
||||
|
||||
boolean isNarrowStyle(int style) {
|
||||
private boolean isNarrowStyle(int style) {
|
||||
return style == NARROW_FORMAT || style == NARROW_STANDALONE;
|
||||
}
|
||||
|
||||
private boolean isNarrowFormatStyle(int style) {
|
||||
return style == NARROW_FORMAT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the pseudo-time-stamp for two fields, given their
|
||||
* individual pseudo-time-stamps. If either of the fields
|
||||
|
@ -1082,6 +1082,16 @@ public class HashMap<K,V> extends AbstractMap<K,V>
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This method will, on a best-effort basis, throw a
|
||||
* {@link ConcurrentModificationException} if it is detected that the
|
||||
* mapping function modifies this map during computation.
|
||||
*
|
||||
* @throws ConcurrentModificationException if it is detected that the
|
||||
* mapping function modified this map
|
||||
*/
|
||||
@Override
|
||||
public V computeIfAbsent(K key,
|
||||
Function<? super K, ? extends V> mappingFunction) {
|
||||
@ -1115,7 +1125,9 @@ public class HashMap<K,V> extends AbstractMap<K,V>
|
||||
return oldValue;
|
||||
}
|
||||
}
|
||||
int mc = modCount;
|
||||
V v = mappingFunction.apply(key);
|
||||
if (mc != modCount) { throw new ConcurrentModificationException(); }
|
||||
if (v == null) {
|
||||
return null;
|
||||
} else if (old != null) {
|
||||
@ -1130,12 +1142,23 @@ public class HashMap<K,V> extends AbstractMap<K,V>
|
||||
if (binCount >= TREEIFY_THRESHOLD - 1)
|
||||
treeifyBin(tab, hash);
|
||||
}
|
||||
++modCount;
|
||||
modCount = mc + 1;
|
||||
++size;
|
||||
afterNodeInsertion(true);
|
||||
return v;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This method will, on a best-effort basis, throw a
|
||||
* {@link ConcurrentModificationException} if it is detected that the
|
||||
* remapping function modifies this map during computation.
|
||||
*
|
||||
* @throws ConcurrentModificationException if it is detected that the
|
||||
* remapping function modified this map
|
||||
*/
|
||||
@Override
|
||||
public V computeIfPresent(K key,
|
||||
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
|
||||
if (remappingFunction == null)
|
||||
@ -1144,7 +1167,9 @@ public class HashMap<K,V> extends AbstractMap<K,V>
|
||||
int hash = hash(key);
|
||||
if ((e = getNode(hash, key)) != null &&
|
||||
(oldValue = e.value) != null) {
|
||||
int mc = modCount;
|
||||
V v = remappingFunction.apply(key, oldValue);
|
||||
if (mc != modCount) { throw new ConcurrentModificationException(); }
|
||||
if (v != null) {
|
||||
e.value = v;
|
||||
afterNodeAccess(e);
|
||||
@ -1156,6 +1181,16 @@ public class HashMap<K,V> extends AbstractMap<K,V>
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This method will, on a best-effort basis, throw a
|
||||
* {@link ConcurrentModificationException} if it is detected that the
|
||||
* remapping function modifies this map during computation.
|
||||
*
|
||||
* @throws ConcurrentModificationException if it is detected that the
|
||||
* remapping function modified this map
|
||||
*/
|
||||
@Override
|
||||
public V compute(K key,
|
||||
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
|
||||
@ -1185,7 +1220,9 @@ public class HashMap<K,V> extends AbstractMap<K,V>
|
||||
}
|
||||
}
|
||||
V oldValue = (old == null) ? null : old.value;
|
||||
int mc = modCount;
|
||||
V v = remappingFunction.apply(key, oldValue);
|
||||
if (mc != modCount) { throw new ConcurrentModificationException(); }
|
||||
if (old != null) {
|
||||
if (v != null) {
|
||||
old.value = v;
|
||||
@ -1202,13 +1239,23 @@ public class HashMap<K,V> extends AbstractMap<K,V>
|
||||
if (binCount >= TREEIFY_THRESHOLD - 1)
|
||||
treeifyBin(tab, hash);
|
||||
}
|
||||
++modCount;
|
||||
modCount = mc + 1;
|
||||
++size;
|
||||
afterNodeInsertion(true);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This method will, on a best-effort basis, throw a
|
||||
* {@link ConcurrentModificationException} if it is detected that the
|
||||
* remapping function modifies this map during computation.
|
||||
*
|
||||
* @throws ConcurrentModificationException if it is detected that the
|
||||
* remapping function modified this map
|
||||
*/
|
||||
@Override
|
||||
public V merge(K key, V value,
|
||||
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
|
||||
@ -1241,10 +1288,15 @@ public class HashMap<K,V> extends AbstractMap<K,V>
|
||||
}
|
||||
if (old != null) {
|
||||
V v;
|
||||
if (old.value != null)
|
||||
if (old.value != null) {
|
||||
int mc = modCount;
|
||||
v = remappingFunction.apply(old.value, value);
|
||||
else
|
||||
if (mc != modCount) {
|
||||
throw new ConcurrentModificationException();
|
||||
}
|
||||
} else {
|
||||
v = value;
|
||||
}
|
||||
if (v != null) {
|
||||
old.value = v;
|
||||
afterNodeAccess(old);
|
||||
|
@ -1000,6 +1000,16 @@ public class Hashtable<K,V>
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This method will, on a best-effort basis, throw a
|
||||
* {@link java.util.ConcurrentModificationException} if the mapping
|
||||
* function modified this map during computation.
|
||||
*
|
||||
* @throws ConcurrentModificationException if it is detected that the
|
||||
* mapping function modified this map
|
||||
*/
|
||||
@Override
|
||||
public synchronized V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
|
||||
Objects.requireNonNull(mappingFunction);
|
||||
@ -1016,7 +1026,9 @@ public class Hashtable<K,V>
|
||||
}
|
||||
}
|
||||
|
||||
int mc = modCount;
|
||||
V newValue = mappingFunction.apply(key);
|
||||
if (mc != modCount) { throw new ConcurrentModificationException(); }
|
||||
if (newValue != null) {
|
||||
addEntry(hash, key, newValue, index);
|
||||
}
|
||||
@ -1024,6 +1036,16 @@ public class Hashtable<K,V>
|
||||
return newValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This method will, on a best-effort basis, throw a
|
||||
* {@link java.util.ConcurrentModificationException} if the remapping
|
||||
* function modified this map during computation.
|
||||
*
|
||||
* @throws ConcurrentModificationException if it is detected that the
|
||||
* remapping function modified this map
|
||||
*/
|
||||
@Override
|
||||
public synchronized V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
|
||||
Objects.requireNonNull(remappingFunction);
|
||||
@ -1035,14 +1057,18 @@ public class Hashtable<K,V>
|
||||
Entry<K,V> e = (Entry<K,V>)tab[index];
|
||||
for (Entry<K,V> prev = null; e != null; prev = e, e = e.next) {
|
||||
if (e.hash == hash && e.key.equals(key)) {
|
||||
int mc = modCount;
|
||||
V newValue = remappingFunction.apply(key, e.value);
|
||||
if (mc != modCount) {
|
||||
throw new ConcurrentModificationException();
|
||||
}
|
||||
if (newValue == null) {
|
||||
if (prev != null) {
|
||||
prev.next = e.next;
|
||||
} else {
|
||||
tab[index] = e.next;
|
||||
}
|
||||
modCount++;
|
||||
modCount = mc + 1;
|
||||
count--;
|
||||
} else {
|
||||
e.value = newValue;
|
||||
@ -1052,7 +1078,16 @@ public class Hashtable<K,V>
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This method will, on a best-effort basis, throw a
|
||||
* {@link java.util.ConcurrentModificationException} if the remapping
|
||||
* function modified this map during computation.
|
||||
*
|
||||
* @throws ConcurrentModificationException if it is detected that the
|
||||
* remapping function modified this map
|
||||
*/
|
||||
@Override
|
||||
public synchronized V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
|
||||
Objects.requireNonNull(remappingFunction);
|
||||
@ -1064,14 +1099,18 @@ public class Hashtable<K,V>
|
||||
Entry<K,V> e = (Entry<K,V>)tab[index];
|
||||
for (Entry<K,V> prev = null; e != null; prev = e, e = e.next) {
|
||||
if (e.hash == hash && Objects.equals(e.key, key)) {
|
||||
int mc = modCount;
|
||||
V newValue = remappingFunction.apply(key, e.value);
|
||||
if (mc != modCount) {
|
||||
throw new ConcurrentModificationException();
|
||||
}
|
||||
if (newValue == null) {
|
||||
if (prev != null) {
|
||||
prev.next = e.next;
|
||||
} else {
|
||||
tab[index] = e.next;
|
||||
}
|
||||
modCount++;
|
||||
modCount = mc + 1;
|
||||
count--;
|
||||
} else {
|
||||
e.value = newValue;
|
||||
@ -1080,7 +1119,9 @@ public class Hashtable<K,V>
|
||||
}
|
||||
}
|
||||
|
||||
int mc = modCount;
|
||||
V newValue = remappingFunction.apply(key, null);
|
||||
if (mc != modCount) { throw new ConcurrentModificationException(); }
|
||||
if (newValue != null) {
|
||||
addEntry(hash, key, newValue, index);
|
||||
}
|
||||
@ -1088,6 +1129,16 @@ public class Hashtable<K,V>
|
||||
return newValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This method will, on a best-effort basis, throw a
|
||||
* {@link java.util.ConcurrentModificationException} if the remapping
|
||||
* function modified this map during computation.
|
||||
*
|
||||
* @throws ConcurrentModificationException if it is detected that the
|
||||
* remapping function modified this map
|
||||
*/
|
||||
@Override
|
||||
public synchronized V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
|
||||
Objects.requireNonNull(remappingFunction);
|
||||
@ -1099,14 +1150,18 @@ public class Hashtable<K,V>
|
||||
Entry<K,V> e = (Entry<K,V>)tab[index];
|
||||
for (Entry<K,V> prev = null; e != null; prev = e, e = e.next) {
|
||||
if (e.hash == hash && e.key.equals(key)) {
|
||||
int mc = modCount;
|
||||
V newValue = remappingFunction.apply(e.value, value);
|
||||
if (mc != modCount) {
|
||||
throw new ConcurrentModificationException();
|
||||
}
|
||||
if (newValue == null) {
|
||||
if (prev != null) {
|
||||
prev.next = e.next;
|
||||
} else {
|
||||
tab[index] = e.next;
|
||||
}
|
||||
modCount++;
|
||||
modCount = mc + 1;
|
||||
count--;
|
||||
} else {
|
||||
e.value = newValue;
|
||||
|
@ -894,8 +894,8 @@ public interface Map<K,V> {
|
||||
* to {@code null}), attempts to compute its value using the given mapping
|
||||
* function and enters it into this map unless {@code null}.
|
||||
*
|
||||
* <p>If the function returns {@code null} no mapping is recorded. If
|
||||
* the function itself throws an (unchecked) exception, the
|
||||
* <p>If the mapping function returns {@code null}, no mapping is recorded.
|
||||
* If the mapping function itself throws an (unchecked) exception, the
|
||||
* exception is rethrown, and no mapping is recorded. The most
|
||||
* common usage is to construct a new object serving as an initial
|
||||
* mapped value or memoized result, as in:
|
||||
@ -911,6 +911,7 @@ public interface Map<K,V> {
|
||||
* map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
|
||||
* }</pre>
|
||||
*
|
||||
* <p>The mapping function should not modify this map during computation.
|
||||
*
|
||||
* @implSpec
|
||||
* The default implementation is equivalent to the following steps for this
|
||||
@ -925,16 +926,27 @@ public interface Map<K,V> {
|
||||
* }
|
||||
* }</pre>
|
||||
*
|
||||
* <p>The default implementation makes no guarantees about detecting if the
|
||||
* mapping function modifies this map during computation and, if
|
||||
* appropriate, reporting an error. Non-concurrent implementations should
|
||||
* override this method and, on a best-effort basis, throw a
|
||||
* {@code ConcurrentModificationException} if it is detected that the
|
||||
* mapping function modifies this map during computation. Concurrent
|
||||
* implementations should override this method and, on a best-effort basis,
|
||||
* throw an {@code IllegalStateException} if it is detected that the
|
||||
* mapping function modifies this map during computation and as a result
|
||||
* computation would never complete.
|
||||
*
|
||||
* <p>The default implementation makes no guarantees about synchronization
|
||||
* or atomicity properties of this method. Any implementation providing
|
||||
* atomicity guarantees must override this method and document its
|
||||
* concurrency properties. In particular, all implementations of
|
||||
* subinterface {@link java.util.concurrent.ConcurrentMap} must document
|
||||
* whether the function is applied once atomically only if the value is not
|
||||
* present.
|
||||
* whether the mapping function is applied once atomically only if the value
|
||||
* is not present.
|
||||
*
|
||||
* @param key key with which the specified value is to be associated
|
||||
* @param mappingFunction the function to compute a value
|
||||
* @param mappingFunction the mapping function to compute a value
|
||||
* @return the current (existing or computed) value associated with
|
||||
* the specified key, or null if the computed value is null
|
||||
* @throws NullPointerException if the specified key is null and
|
||||
@ -967,10 +979,12 @@ public interface Map<K,V> {
|
||||
* If the value for the specified key is present and non-null, attempts to
|
||||
* compute a new mapping given the key and its current mapped value.
|
||||
*
|
||||
* <p>If the function returns {@code null}, the mapping is removed. If the
|
||||
* function itself throws an (unchecked) exception, the exception is
|
||||
* rethrown, and the current mapping is left unchanged.
|
||||
*
|
||||
* <p>If the remapping function returns {@code null}, the mapping is removed.
|
||||
* If the remapping function itself throws an (unchecked) exception, the
|
||||
* exception is rethrown, and the current mapping is left unchanged.
|
||||
*
|
||||
* <p>The remapping function should not modify this map during computation.
|
||||
*
|
||||
* @implSpec
|
||||
* The default implementation is equivalent to performing the following
|
||||
* steps for this {@code map}, then returning the current value or
|
||||
@ -987,16 +1001,27 @@ public interface Map<K,V> {
|
||||
* }
|
||||
* }</pre>
|
||||
*
|
||||
* <p>The default implementation makes no guarantees about detecting if the
|
||||
* remapping function modifies this map during computation and, if
|
||||
* appropriate, reporting an error. Non-concurrent implementations should
|
||||
* override this method and, on a best-effort basis, throw a
|
||||
* {@code ConcurrentModificationException} if it is detected that the
|
||||
* remapping function modifies this map during computation. Concurrent
|
||||
* implementations should override this method and, on a best-effort basis,
|
||||
* throw an {@code IllegalStateException} if it is detected that the
|
||||
* remapping function modifies this map during computation and as a result
|
||||
* computation would never complete.
|
||||
*
|
||||
* <p>The default implementation makes no guarantees about synchronization
|
||||
* or atomicity properties of this method. Any implementation providing
|
||||
* atomicity guarantees must override this method and document its
|
||||
* concurrency properties. In particular, all implementations of
|
||||
* subinterface {@link java.util.concurrent.ConcurrentMap} must document
|
||||
* whether the function is applied once atomically only if the value is not
|
||||
* present.
|
||||
* whether the remapping function is applied once atomically only if the
|
||||
* value is not present.
|
||||
*
|
||||
* @param key key with which the specified value is to be associated
|
||||
* @param remappingFunction the function to compute a value
|
||||
* @param remappingFunction the remapping function to compute a value
|
||||
* @return the new value associated with the specified key, or null if none
|
||||
* @throws NullPointerException if the specified key is null and
|
||||
* this map does not support null keys, or the
|
||||
@ -1037,10 +1062,12 @@ public interface Map<K,V> {
|
||||
* map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))}</pre>
|
||||
* (Method {@link #merge merge()} is often simpler to use for such purposes.)
|
||||
*
|
||||
* <p>If the function returns {@code null}, the mapping is removed (or
|
||||
* remains absent if initially absent). If the function itself throws an
|
||||
* (unchecked) exception, the exception is rethrown, and the current mapping
|
||||
* is left unchanged.
|
||||
* <p>If the remapping function returns {@code null}, the mapping is removed
|
||||
* (or remains absent if initially absent). If the remapping function
|
||||
* itself throws an (unchecked) exception, the exception is rethrown, and
|
||||
* the current mapping is left unchanged.
|
||||
*
|
||||
* <p>The remapping function should not modify this map during computation.
|
||||
*
|
||||
* @implSpec
|
||||
* The default implementation is equivalent to performing the following
|
||||
@ -1063,16 +1090,27 @@ public interface Map<K,V> {
|
||||
* }
|
||||
* }</pre>
|
||||
*
|
||||
* <p>The default implementation makes no guarantees about detecting if the
|
||||
* remapping function modifies this map during computation and, if
|
||||
* appropriate, reporting an error. Non-concurrent implementations should
|
||||
* override this method and, on a best-effort basis, throw a
|
||||
* {@code ConcurrentModificationException} if it is detected that the
|
||||
* remapping function modifies this map during computation. Concurrent
|
||||
* implementations should override this method and, on a best-effort basis,
|
||||
* throw an {@code IllegalStateException} if it is detected that the
|
||||
* remapping function modifies this map during computation and as a result
|
||||
* computation would never complete.
|
||||
*
|
||||
* <p>The default implementation makes no guarantees about synchronization
|
||||
* or atomicity properties of this method. Any implementation providing
|
||||
* atomicity guarantees must override this method and document its
|
||||
* concurrency properties. In particular, all implementations of
|
||||
* subinterface {@link java.util.concurrent.ConcurrentMap} must document
|
||||
* whether the function is applied once atomically only if the value is not
|
||||
* present.
|
||||
* whether the remapping function is applied once atomically only if the
|
||||
* value is not present.
|
||||
*
|
||||
* @param key key with which the specified value is to be associated
|
||||
* @param remappingFunction the function to compute a value
|
||||
* @param remappingFunction the remapping function to compute a value
|
||||
* @return the new value associated with the specified key, or null if none
|
||||
* @throws NullPointerException if the specified key is null and
|
||||
* this map does not support null keys, or the
|
||||
@ -1121,9 +1159,11 @@ public interface Map<K,V> {
|
||||
* map.merge(key, msg, String::concat)
|
||||
* }</pre>
|
||||
*
|
||||
* <p>If the function returns {@code null} the mapping is removed. If the
|
||||
* function itself throws an (unchecked) exception, the exception is
|
||||
* rethrown, and the current mapping is left unchanged.
|
||||
* <p>If the remapping function returns {@code null}, the mapping is removed.
|
||||
* If the remapping function itself throws an (unchecked) exception, the
|
||||
* exception is rethrown, and the current mapping is left unchanged.
|
||||
*
|
||||
* <p>The remapping function should not modify this map during computation.
|
||||
*
|
||||
* @implSpec
|
||||
* The default implementation is equivalent to performing the following
|
||||
@ -1140,19 +1180,31 @@ public interface Map<K,V> {
|
||||
* map.put(key, newValue);
|
||||
* }</pre>
|
||||
*
|
||||
* <p>The default implementation makes no guarantees about detecting if the
|
||||
* remapping function modifies this map during computation and, if
|
||||
* appropriate, reporting an error. Non-concurrent implementations should
|
||||
* override this method and, on a best-effort basis, throw a
|
||||
* {@code ConcurrentModificationException} if it is detected that the
|
||||
* remapping function modifies this map during computation. Concurrent
|
||||
* implementations should override this method and, on a best-effort basis,
|
||||
* throw an {@code IllegalStateException} if it is detected that the
|
||||
* remapping function modifies this map during computation and as a result
|
||||
* computation would never complete.
|
||||
*
|
||||
* <p>The default implementation makes no guarantees about synchronization
|
||||
* or atomicity properties of this method. Any implementation providing
|
||||
* atomicity guarantees must override this method and document its
|
||||
* concurrency properties. In particular, all implementations of
|
||||
* subinterface {@link java.util.concurrent.ConcurrentMap} must document
|
||||
* whether the function is applied once atomically only if the value is not
|
||||
* present.
|
||||
* whether the remapping function is applied once atomically only if the
|
||||
* value is not present.
|
||||
*
|
||||
* @param key key with which the resulting value is to be associated
|
||||
* @param value the non-null value to be merged with the existing value
|
||||
* associated with the key or, if no existing value or a null value
|
||||
* is associated with the key, to be associated with the key
|
||||
* @param remappingFunction the function to recompute a value if present
|
||||
* @param remappingFunction the remapping function to recompute a value if
|
||||
* present
|
||||
* @return the new value associated with the specified key, or null if no
|
||||
* value is associated with the key
|
||||
* @throws UnsupportedOperationException if the {@code put} operation
|
||||
|
80
jdk/src/java.base/share/classes/jdk/Exported.java
Normal file
80
jdk/src/java.base/share/classes/jdk/Exported.java
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package jdk;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* Indicates whether or not a JDK specific type or package is an
|
||||
* exported part of the JDK suitable for use outside of the JDK
|
||||
* implementation itself.
|
||||
*
|
||||
* This annotation should only be applied to types and packages
|
||||
* <em>outside</em> of the Java SE namespaces of {@code java.*} and
|
||||
* {@code javax.*} packages. For example, certain portions of {@code
|
||||
* com.sun.*} are official parts of the JDK meant to be generally
|
||||
* usable while other portions of {@code com.sun.*} are not. This
|
||||
* annotation type allows those portions to be easily and
|
||||
* programmatically distinguished.
|
||||
*
|
||||
* <p>If in one release a type or package is
|
||||
* <code>@Exported(true)</code>, in a subsequent major release such a
|
||||
* type or package can transition to <code>@Exported(false)</code>.
|
||||
*
|
||||
* <p>If a type or package is <code>@Exported(false)</code> in a
|
||||
* release, it may be removed in a subsequent major release.
|
||||
*
|
||||
* <p>If a top-level type has an <code>@Exported</code> annotation,
|
||||
* any nested member types with the top-level type should have an
|
||||
* <code>@Exported</code> annotation with the same value.
|
||||
*
|
||||
* (In exceptional cases, if a nested type is going to be removed
|
||||
* before its enclosing type, the nested type's could be
|
||||
* <code>@Exported(false)</code> while its enclosing type was
|
||||
* <code>@Exported(true)</code>.)
|
||||
*
|
||||
* Likewise, if a package has an <code>@Exported</code> annotation,
|
||||
* top-level types within that package should also have an
|
||||
* <code>@Exported</code> annotation.
|
||||
*
|
||||
* Sometimes a top-level type may have a different
|
||||
* <code>@Exported</code> value than its package.
|
||||
*
|
||||
* @since 1.8
|
||||
*/
|
||||
@Documented
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.TYPE, ElementType.PACKAGE})
|
||||
@Exported
|
||||
public @interface Exported {
|
||||
/**
|
||||
* Whether or not the annotated type or package is an exported
|
||||
* part of the JDK.
|
||||
* @return whether or not the annotated type or package is an exported
|
||||
* part of the JDK
|
||||
*/
|
||||
boolean value() default true;
|
||||
}
|
@ -631,6 +631,10 @@ public final class Unsafe {
|
||||
/**
|
||||
* Atomically updates Java variable to {@code x} if it is currently
|
||||
* holding {@code expected}.
|
||||
*
|
||||
* <p>This operation has memory semantics of a {@code volatile} read
|
||||
* and write. Corresponds to C11 atomic_compare_exchange_strong.
|
||||
*
|
||||
* @return {@code true} if successful
|
||||
*/
|
||||
public final native boolean compareAndSwapObject(Object o, long offset,
|
||||
@ -640,6 +644,10 @@ public final class Unsafe {
|
||||
/**
|
||||
* Atomically updates Java variable to {@code x} if it is currently
|
||||
* holding {@code expected}.
|
||||
*
|
||||
* <p>This operation has memory semantics of a {@code volatile} read
|
||||
* and write. Corresponds to C11 atomic_compare_exchange_strong.
|
||||
*
|
||||
* @return {@code true} if successful
|
||||
*/
|
||||
public final native boolean compareAndSwapInt(Object o, long offset,
|
||||
@ -649,6 +657,10 @@ public final class Unsafe {
|
||||
/**
|
||||
* Atomically updates Java variable to {@code x} if it is currently
|
||||
* holding {@code expected}.
|
||||
*
|
||||
* <p>This operation has memory semantics of a {@code volatile} read
|
||||
* and write. Corresponds to C11 atomic_compare_exchange_strong.
|
||||
*
|
||||
* @return {@code true} if successful
|
||||
*/
|
||||
public final native boolean compareAndSwapLong(Object o, long offset,
|
||||
|
@ -45,9 +45,4 @@ public final class FieldUtil {
|
||||
ReflectUtil.checkPackageAccess(cls);
|
||||
return cls.getFields();
|
||||
}
|
||||
|
||||
public static Field[] getDeclaredFields(Class<?> cls) {
|
||||
ReflectUtil.checkPackageAccess(cls);
|
||||
return cls.getDeclaredFields();
|
||||
}
|
||||
}
|
||||
|
@ -625,6 +625,15 @@ public final class ZoneInfoFile {
|
||||
params[2] = 5;
|
||||
params[3] = 86400000;
|
||||
}
|
||||
// Additional check for startDayOfWeek=6 and starTime=86400000
|
||||
// is needed for Asia/Amman; Asia/Gasa and Asia/Hebron
|
||||
if (params[2] == 7 && params[3] == 0 &&
|
||||
(zoneId.equals("Asia/Amman") ||
|
||||
zoneId.equals("Asia/Gaza") ||
|
||||
zoneId.equals("Asia/Hebron"))) {
|
||||
params[2] = 6; // Friday
|
||||
params[3] = 86400000; // 24h
|
||||
}
|
||||
//endDayOfWeek and endTime workaround
|
||||
if (params[7] == 6 && params[8] == 0 &&
|
||||
(zoneId.equals("Africa/Cairo"))) {
|
||||
|
@ -730,7 +730,7 @@ SetJvmEnvironment(int argc, char **argv) {
|
||||
static int
|
||||
parse_size(const char *s, jlong *result) {
|
||||
jlong n = 0;
|
||||
int args_read = sscanf(s, jlong_format_specifier(), &n);
|
||||
int args_read = sscanf(s, JLONG_FORMAT_SPECIFIER, &n);
|
||||
if (args_read != 1) {
|
||||
return 0;
|
||||
}
|
||||
@ -798,7 +798,7 @@ AddOption(char *str, void *info)
|
||||
* overflow before the JVM startup code can check to make sure the stack
|
||||
* is big enough.
|
||||
*/
|
||||
if (threadStackSize < STACK_SIZE_MINIMUM) {
|
||||
if (threadStackSize < (jlong)STACK_SIZE_MINIMUM) {
|
||||
threadStackSize = STACK_SIZE_MINIMUM;
|
||||
}
|
||||
}
|
||||
|
@ -144,8 +144,6 @@ void JLI_ReportMessage(const char * message, ...);
|
||||
void JLI_ReportExceptionDescription(JNIEnv * env);
|
||||
void PrintMachineDependentOptions();
|
||||
|
||||
const char *jlong_format_specifier();
|
||||
|
||||
/*
|
||||
* Block current thread and continue execution in new thread
|
||||
*/
|
||||
|
@ -109,6 +109,8 @@
|
||||
/*
|
||||
* Macros for getting end of central directory header (END) fields
|
||||
*/
|
||||
#define ENDNMD(b) SH(b, 4) /* number of this disk */
|
||||
#define ENDDSK(b) SH(b, 6) /* disk number of start */
|
||||
#define ENDSUB(b) SH(b, 8) /* number of entries on this disk */
|
||||
#define ENDTOT(b) SH(b, 10) /* total number of entries */
|
||||
#define ENDSIZ(b) LG(b, 12) /* central directory size */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -111,52 +111,127 @@ inflate_file(int fd, zentry *entry, int *size_out)
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
static jboolean zip64_present = JNI_FALSE;
|
||||
/*
|
||||
* Implementation notes:
|
||||
*
|
||||
* This is a zip format reader for seekable files, that tolerates
|
||||
* leading and trailing garbage, and tolerates having had internal
|
||||
* offsets adjusted for leading garbage (as with Info-Zip's zip -A).
|
||||
*
|
||||
* We find the end header by scanning backwards from the end of the
|
||||
* file for the end signature. This may fail in the presence of
|
||||
* trailing garbage or a ZIP file comment that contains binary data.
|
||||
* Similarly, the ZIP64 end header may need to be located by scanning
|
||||
* backwards from the end header. It may be misidentified, but this
|
||||
* is very unlikely to happen in practice without adversarial input.
|
||||
*
|
||||
* The zip file format is documented at:
|
||||
* https://www.pkware.com/documents/casestudies/APPNOTE.TXT
|
||||
*
|
||||
* TODO: more informative error messages
|
||||
*/
|
||||
|
||||
/** Reads count bytes from fd at position pos into given buffer. */
|
||||
static jboolean
|
||||
readAt(int fd, jlong pos, unsigned int count, void *buf) {
|
||||
return (pos >= 0
|
||||
&& JLI_Lseek(fd, pos, SEEK_SET) == pos
|
||||
&& read(fd, buf, count) == (jlong) count);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Checks to see if we have ZIP64 archive, and save
|
||||
* the check for later use
|
||||
* Tells whether given header values (obtained from either ZIP64 or
|
||||
* non-ZIP64 header) appear to be correct, by checking the first LOC
|
||||
* and CEN headers.
|
||||
*/
|
||||
static jboolean
|
||||
is_valid_end_header(int fd, jlong endpos,
|
||||
jlong censiz, jlong cenoff, jlong entries) {
|
||||
Byte cenhdr[CENHDR];
|
||||
Byte lochdr[LOCHDR];
|
||||
// Expected offset of the first central directory header
|
||||
jlong censtart = endpos - censiz;
|
||||
// Expected position within the file that offsets are relative to
|
||||
jlong base_offset = endpos - (censiz + cenoff);
|
||||
return censtart >= 0 && cenoff >= 0 &&
|
||||
(censiz == 0 ||
|
||||
// Validate first CEN and LOC header signatures.
|
||||
// Central directory must come directly before the end header.
|
||||
(readAt(fd, censtart, CENHDR, cenhdr)
|
||||
&& CENSIG_AT(cenhdr)
|
||||
&& readAt(fd, base_offset + CENOFF(cenhdr), LOCHDR, lochdr)
|
||||
&& LOCSIG_AT(lochdr)
|
||||
&& CENNAM(cenhdr) == LOCNAM(lochdr)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Tells whether p appears to be pointing at a valid ZIP64 end header.
|
||||
* Values censiz, cenoff, and entries are the corresponding values
|
||||
* from the non-ZIP64 end header. We perform extra checks to avoid
|
||||
* misidentifying data from the last entry as a ZIP64 end header.
|
||||
*/
|
||||
static jboolean
|
||||
is_zip64_endhdr(int fd, const Byte *p, jlong end64pos,
|
||||
jlong censiz, jlong cenoff, jlong entries) {
|
||||
if (ZIP64_ENDSIG_AT(p)) {
|
||||
jlong censiz64 = ZIP64_ENDSIZ(p);
|
||||
jlong cenoff64 = ZIP64_ENDOFF(p);
|
||||
jlong entries64 = ZIP64_ENDTOT(p);
|
||||
return (censiz64 == censiz || censiz == ZIP64_MAGICVAL)
|
||||
&& (cenoff64 == cenoff || cenoff == ZIP64_MAGICVAL)
|
||||
&& (entries64 == entries || entries == ZIP64_MAGICCOUNT)
|
||||
&& is_valid_end_header(fd, end64pos, censiz64, cenoff64, entries64);
|
||||
}
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a non-ZIP64 end header located at endhdr and endpos, look for
|
||||
* an adjacent ZIP64 end header, finding the base offset and censtart
|
||||
* from the ZIP64 header if available, else from the non-ZIP64 header.
|
||||
* @return 0 if successful, -1 in case of failure
|
||||
*/
|
||||
static int
|
||||
haveZIP64(Byte *p) {
|
||||
jlong cenlen, cenoff, centot;
|
||||
cenlen = ENDSIZ(p);
|
||||
cenoff = ENDOFF(p);
|
||||
centot = ENDTOT(p);
|
||||
zip64_present = (cenlen == ZIP64_MAGICVAL ||
|
||||
cenoff == ZIP64_MAGICVAL ||
|
||||
centot == ZIP64_MAGICCOUNT);
|
||||
return zip64_present;
|
||||
}
|
||||
|
||||
static jlong
|
||||
find_end64(int fd, Byte *ep, jlong pos)
|
||||
find_positions64(int fd, const Byte * const endhdr, const jlong endpos,
|
||||
jlong* base_offset, jlong* censtart)
|
||||
{
|
||||
jlong censiz = ENDSIZ(endhdr);
|
||||
jlong cenoff = ENDOFF(endhdr);
|
||||
jlong entries = ENDTOT(endhdr);
|
||||
jlong end64pos;
|
||||
jlong bytes;
|
||||
if ((end64pos = JLI_Lseek(fd, pos - ZIP64_LOCHDR, SEEK_SET)) < (jlong)0)
|
||||
return -1;
|
||||
if ((bytes = read(fd, ep, ZIP64_LOCHDR)) < 0)
|
||||
return -1;
|
||||
if (ZIP64_LOCSIG_AT(ep))
|
||||
return end64pos;
|
||||
return -1;
|
||||
Byte buf[ZIP64_ENDHDR + ZIP64_LOCHDR];
|
||||
if (censiz + cenoff != endpos
|
||||
&& (end64pos = endpos - sizeof(buf)) >= (jlong)0
|
||||
&& readAt(fd, end64pos, sizeof(buf), buf)
|
||||
&& ZIP64_LOCSIG_AT(buf + ZIP64_ENDHDR)
|
||||
&& (jlong) ZIP64_LOCDSK(buf + ZIP64_ENDHDR) == ENDDSK(endhdr)
|
||||
&& (is_zip64_endhdr(fd, buf, end64pos, censiz, cenoff, entries)
|
||||
|| // A variable sized "zip64 extensible data sector" ?
|
||||
((end64pos = ZIP64_LOCOFF(buf + ZIP64_ENDHDR)) >= (jlong)0
|
||||
&& readAt(fd, end64pos, ZIP64_ENDHDR, buf)
|
||||
&& is_zip64_endhdr(fd, buf, end64pos, censiz, cenoff, entries)))
|
||||
) {
|
||||
*censtart = end64pos - ZIP64_ENDSIZ(buf);
|
||||
*base_offset = *censtart - ZIP64_ENDOFF(buf);
|
||||
} else {
|
||||
if (!is_valid_end_header(fd, endpos, censiz, cenoff, entries))
|
||||
return -1;
|
||||
*censtart = endpos - censiz;
|
||||
*base_offset = *censtart - cenoff;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* A very little used routine to handle the case that zip file has
|
||||
* a comment at the end. Believe it or not, the only way to find the
|
||||
* END record is to walk backwards, byte by bloody byte looking for
|
||||
* the END record signature.
|
||||
* Finds the base offset and censtart of the zip file.
|
||||
*
|
||||
* fd: File descriptor of the jar file.
|
||||
* eb: Pointer to a buffer to receive a copy of the END header.
|
||||
*
|
||||
* Returns the offset of the END record in the file on success,
|
||||
* -1 on failure.
|
||||
* @param fd file descriptor of the jar file
|
||||
* @param eb scratch buffer
|
||||
* @return 0 if successful, -1 in case of failure
|
||||
*/
|
||||
static jlong
|
||||
find_end(int fd, Byte *eb)
|
||||
static int
|
||||
find_positions(int fd, Byte *eb, jlong* base_offset, jlong* censtart)
|
||||
{
|
||||
jlong len;
|
||||
jlong pos;
|
||||
@ -174,10 +249,10 @@ find_end(int fd, Byte *eb)
|
||||
*/
|
||||
if ((pos = JLI_Lseek(fd, -ENDHDR, SEEK_END)) < (jlong)0)
|
||||
return (-1);
|
||||
if ((bytes = read(fd, eb, ENDHDR)) < 0)
|
||||
if (read(fd, eb, ENDHDR) < 0)
|
||||
return (-1);
|
||||
if (ENDSIG_AT(eb)) {
|
||||
return haveZIP64(eb) ? find_end64(fd, eb, pos) : pos;
|
||||
return find_positions64(fd, eb, pos, base_offset, censtart);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -193,7 +268,13 @@ find_end(int fd, Byte *eb)
|
||||
return (-1);
|
||||
if ((buffer = malloc(END_MAXLEN)) == NULL)
|
||||
return (-1);
|
||||
if ((bytes = read(fd, buffer, len)) < 0) {
|
||||
|
||||
/*
|
||||
* read() on windows takes an unsigned int for count. Casting len
|
||||
* to an unsigned int here is safe since it is guaranteed to be
|
||||
* less than END_MAXLEN.
|
||||
*/
|
||||
if ((bytes = read(fd, buffer, (unsigned int)len)) < 0) {
|
||||
free(buffer);
|
||||
return (-1);
|
||||
}
|
||||
@ -208,7 +289,7 @@ find_end(int fd, Byte *eb)
|
||||
(void) memcpy(eb, cp, ENDHDR);
|
||||
free(buffer);
|
||||
pos = flen - (endpos - cp);
|
||||
return haveZIP64(eb) ? find_end64(fd, eb, pos) : pos;
|
||||
return find_positions64(fd, eb, pos, base_offset, censtart);
|
||||
}
|
||||
free(buffer);
|
||||
return (-1);
|
||||
@ -217,82 +298,6 @@ find_end(int fd, Byte *eb)
|
||||
#define BUFSIZE (3 * 65536 + CENHDR + SIGSIZ)
|
||||
#define MINREAD 1024
|
||||
|
||||
/*
|
||||
* Computes and positions at the start of the CEN header, ie. the central
|
||||
* directory, this will also return the offset if there is a zip file comment
|
||||
* at the end of the archive, for most cases this would be 0.
|
||||
*/
|
||||
static jlong
|
||||
compute_cen(int fd, Byte *bp)
|
||||
{
|
||||
int bytes;
|
||||
Byte *p;
|
||||
jlong base_offset;
|
||||
jlong offset;
|
||||
char buffer[MINREAD];
|
||||
p = (Byte*) buffer;
|
||||
/*
|
||||
* Read the END Header, which is the starting point for ZIP files.
|
||||
* (Clearly designed to make writing a zip file easier than reading
|
||||
* one. Now isn't that precious...)
|
||||
*/
|
||||
if ((base_offset = find_end(fd, bp)) == -1) {
|
||||
return (-1);
|
||||
}
|
||||
p = bp;
|
||||
/*
|
||||
* There is a historical, but undocumented, ability to allow for
|
||||
* additional "stuff" to be prepended to the zip/jar file. It seems
|
||||
* that this has been used to prepend an actual java launcher
|
||||
* executable to the jar on Windows. Although this is just another
|
||||
* form of statically linking a small piece of the JVM to the
|
||||
* application, we choose to continue to support it. Note that no
|
||||
* guarantees have been made (or should be made) to the customer that
|
||||
* this will continue to work.
|
||||
*
|
||||
* Therefore, calculate the base offset of the zip file (within the
|
||||
* expanded file) by assuming that the central directory is followed
|
||||
* immediately by the end record.
|
||||
*/
|
||||
if (zip64_present) {
|
||||
if ((offset = ZIP64_LOCOFF(p)) < (jlong)0) {
|
||||
return -1;
|
||||
}
|
||||
if (JLI_Lseek(fd, offset, SEEK_SET) < (jlong) 0) {
|
||||
return (-1);
|
||||
}
|
||||
if ((bytes = read(fd, buffer, MINREAD)) < 0) {
|
||||
return (-1);
|
||||
}
|
||||
if (!ZIP64_ENDSIG_AT(buffer)) {
|
||||
return -1;
|
||||
}
|
||||
if ((offset = ZIP64_ENDOFF(buffer)) < (jlong)0) {
|
||||
return -1;
|
||||
}
|
||||
if (JLI_Lseek(fd, offset, SEEK_SET) < (jlong)0) {
|
||||
return (-1);
|
||||
}
|
||||
p = (Byte*) buffer;
|
||||
base_offset = base_offset - ZIP64_ENDSIZ(p) - ZIP64_ENDOFF(p) - ZIP64_ENDHDR;
|
||||
} else {
|
||||
base_offset = base_offset - ENDSIZ(p) - ENDOFF(p);
|
||||
/*
|
||||
* The END Header indicates the start of the Central Directory
|
||||
* Headers. Remember that the desired Central Directory Header (CEN)
|
||||
* will almost always be the second one and the first one is a small
|
||||
* directory entry ("META-INF/"). Keep the code optimized for
|
||||
* that case.
|
||||
*
|
||||
* Seek to the beginning of the Central Directory.
|
||||
*/
|
||||
if (JLI_Lseek(fd, base_offset + ENDOFF(p), SEEK_SET) < (jlong) 0) {
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
return base_offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* Locate the manifest file with the zip/jar file.
|
||||
*
|
||||
@ -327,7 +332,23 @@ find_file(int fd, zentry *entry, const char *file_name)
|
||||
int res;
|
||||
int entry_size;
|
||||
int read_size;
|
||||
|
||||
/*
|
||||
* The (imaginary) position within the file relative to which
|
||||
* offsets within the zip file refer. This is usually the
|
||||
* location of the first local header (the start of the zip data)
|
||||
* (which in turn is usually 0), but if the zip file has content
|
||||
* prepended, then it will be either 0 or the length of the
|
||||
* prepended content, depending on whether or not internal offsets
|
||||
* have been adjusted (via e.g. zip -A). May be negative if
|
||||
* content is prepended, zip -A is run, then the prefix is
|
||||
* detached!
|
||||
*/
|
||||
jlong base_offset;
|
||||
|
||||
/** The position within the file of the start of the central directory. */
|
||||
jlong censtart;
|
||||
|
||||
Byte *p;
|
||||
Byte *bp;
|
||||
Byte *buffer;
|
||||
@ -338,9 +359,11 @@ find_file(int fd, zentry *entry, const char *file_name)
|
||||
}
|
||||
|
||||
bp = buffer;
|
||||
base_offset = compute_cen(fd, bp);
|
||||
if (base_offset == -1) {
|
||||
free(buffer);
|
||||
|
||||
if (find_positions(fd, bp, &base_offset, &censtart) == -1) {
|
||||
return -1;
|
||||
}
|
||||
if (JLI_Lseek(fd, censtart, SEEK_SET) < (jlong) 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -574,7 +597,7 @@ JLI_ParseManifest(char *jarfile, manifest_info *info)
|
||||
info->jre_version = NULL;
|
||||
info->jre_restrict_search = 0;
|
||||
info->splashscreen_image_file_name = NULL;
|
||||
if (rc = find_file(fd, &entry, manifest_name) != 0) {
|
||||
if ((rc = find_file(fd, &entry, manifest_name)) != 0) {
|
||||
close(fd);
|
||||
return (-2);
|
||||
}
|
||||
@ -675,7 +698,7 @@ JLI_ManifestIterate(const char *jarfile, attribute_closure ac, void *user_data)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (rc = find_file(fd, &entry, manifest_name) != 0) {
|
||||
if ((rc = find_file(fd, &entry, manifest_name)) != 0) {
|
||||
close(fd);
|
||||
return (-2);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -61,11 +61,11 @@ typedef char* (*SplashGetScaledImageName_t)(const char* fileName,
|
||||
#define INVOKEV(name) _INVOKE(name, ,;)
|
||||
|
||||
int DoSplashLoadMemory(void* pdata, int size) {
|
||||
INVOKE(SplashLoadMemory, NULL)(pdata, size);
|
||||
INVOKE(SplashLoadMemory, 0)(pdata, size);
|
||||
}
|
||||
|
||||
int DoSplashLoadFile(const char* filename) {
|
||||
INVOKE(SplashLoadFile, NULL)(filename);
|
||||
INVOKE(SplashLoadFile, 0)(filename);
|
||||
}
|
||||
|
||||
void DoSplashInit(void) {
|
||||
@ -87,4 +87,4 @@ void DoSplashSetScaleFactor(float scaleFactor) {
|
||||
char* DoSplashGetScaledImageName(const char* fileName, const char* jarName,
|
||||
float* scaleFactor) {
|
||||
INVOKE(SplashGetScaledImageName, NULL)(fileName, jarName, scaleFactor);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -274,7 +274,7 @@ FileList_add(FileList fl, char *file)
|
||||
}
|
||||
|
||||
static void
|
||||
FileList_addSubstring(FileList fl, const char *beg, int len)
|
||||
FileList_addSubstring(FileList fl, const char *beg, size_t len)
|
||||
{
|
||||
char *filename = (char *) JLI_MemAlloc(len+1);
|
||||
memcpy(filename, beg, len);
|
||||
@ -310,7 +310,7 @@ static FileList
|
||||
FileList_split(const char *path, char sep)
|
||||
{
|
||||
const char *p, *q;
|
||||
int len = (int)JLI_StrLen(path);
|
||||
size_t len = JLI_StrLen(path);
|
||||
int count;
|
||||
FileList fl;
|
||||
for (count = 1, p = path; p < path + len; p++)
|
||||
|
@ -285,8 +285,6 @@ final class ProcessImpl extends Process {
|
||||
* 1 - fork(2) and exec(2)
|
||||
* 2 - posix_spawn(3P)
|
||||
* 3 - vfork(2) and exec(2)
|
||||
*
|
||||
* (4 - clone(2) and exec(2) - obsolete and currently disabled in native code)
|
||||
* </pre>
|
||||
* @param fds an array of three file descriptors.
|
||||
* Indexes 0, 1, and 2 correspond to standard input,
|
||||
|
@ -1,35 +0,0 @@
|
||||
# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# List of JVMs that can be used as an option to java, javac, etc.
|
||||
# Order is important -- first in this list is the default JVM.
|
||||
# NOTE that this both this file and its format are UNSUPPORTED and
|
||||
# WILL GO AWAY in a future release.
|
||||
#
|
||||
# You may also select a JVM in an arbitrary location with the
|
||||
# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
|
||||
# and may not be available in a future release.
|
||||
#
|
||||
-client IF_SERVER_CLASS -server
|
||||
-server KNOWN
|
||||
-minimal KNOWN
|
@ -1,35 +0,0 @@
|
||||
# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# List of JVMs that can be used as an option to java, javac, etc.
|
||||
# Order is important -- first in this list is the default JVM.
|
||||
# NOTE that this both this file and its format are UNSUPPORTED and
|
||||
# WILL GO AWAY in a future release.
|
||||
#
|
||||
# You may also select a JVM in an arbitrary location with the
|
||||
# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
|
||||
# and may not be available in a future release.
|
||||
#
|
||||
-client KNOWN
|
||||
-server KNOWN
|
||||
-minimal KNOWN
|
@ -97,8 +97,7 @@
|
||||
* address space temporarily, before launching the target command.
|
||||
*
|
||||
* Based on the above analysis, we are currently using vfork() on
|
||||
* Linux and spawn() on other Unix systems, but the code to use clone()
|
||||
* and fork() remains.
|
||||
* Linux and posix_spawn() on other Unix systems.
|
||||
*/
|
||||
|
||||
|
||||
@ -385,39 +384,13 @@ static int copystrings(char *buf, int offset, const char * const *arg) {
|
||||
}
|
||||
|
||||
/**
|
||||
* We are unusually paranoid; use of clone/vfork is
|
||||
* We are unusually paranoid; use of vfork is
|
||||
* especially likely to tickle gcc/glibc bugs.
|
||||
*/
|
||||
#ifdef __attribute_noinline__ /* See: sys/cdefs.h */
|
||||
__attribute_noinline__
|
||||
#endif
|
||||
|
||||
#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */
|
||||
|
||||
#ifdef START_CHILD_USE_CLONE
|
||||
static pid_t
|
||||
cloneChild(ChildStuff *c) {
|
||||
#ifdef __linux__
|
||||
#define START_CHILD_CLONE_STACK_SIZE (64 * 1024)
|
||||
/*
|
||||
* See clone(2).
|
||||
* Instead of worrying about which direction the stack grows, just
|
||||
* allocate twice as much and start the stack in the middle.
|
||||
*/
|
||||
if ((c->clone_stack = malloc(2 * START_CHILD_CLONE_STACK_SIZE)) == NULL)
|
||||
/* errno will be set to ENOMEM */
|
||||
return -1;
|
||||
return clone(childProcess,
|
||||
c->clone_stack + START_CHILD_CLONE_STACK_SIZE,
|
||||
CLONE_VFORK | CLONE_VM | SIGCHLD, c);
|
||||
#else
|
||||
/* not available on Solaris / Mac */
|
||||
assert(0);
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
static pid_t
|
||||
vforkChild(ChildStuff *c) {
|
||||
volatile pid_t resultPid;
|
||||
@ -590,12 +563,11 @@ Java_java_lang_ProcessImpl_forkAndExec(JNIEnv *env,
|
||||
c->argv = NULL;
|
||||
c->envv = NULL;
|
||||
c->pdir = NULL;
|
||||
c->clone_stack = NULL;
|
||||
|
||||
/* Convert prog + argBlock into a char ** argv.
|
||||
* Add one word room for expansion of argv for use by
|
||||
* execve_as_traditional_shell_script.
|
||||
* This word is also used when using spawn mode
|
||||
* This word is also used when using posix_spawn mode
|
||||
*/
|
||||
assert(prog != NULL && argBlock != NULL);
|
||||
if ((phelperpath = getBytes(env, helperpath)) == NULL) goto Catch;
|
||||
@ -654,7 +626,7 @@ Java_java_lang_ProcessImpl_forkAndExec(JNIEnv *env,
|
||||
throwIOException(env, errno, "fork failed");
|
||||
break;
|
||||
case MODE_POSIX_SPAWN:
|
||||
throwIOException(env, errno, "spawn failed");
|
||||
throwIOException(env, errno, "posix_spawn failed");
|
||||
break;
|
||||
}
|
||||
goto Catch;
|
||||
@ -677,8 +649,6 @@ Java_java_lang_ProcessImpl_forkAndExec(JNIEnv *env,
|
||||
fds[2] = (err[0] != -1) ? err[0] : -1;
|
||||
|
||||
Finally:
|
||||
free(c->clone_stack);
|
||||
|
||||
/* Always clean up the child's side of the pipes */
|
||||
closeSafely(in [0]);
|
||||
closeSafely(out[1]);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -304,7 +304,7 @@ JDK_execvpe(int mode, const char *file,
|
||||
}
|
||||
|
||||
/**
|
||||
* Child process after a successful fork() or clone().
|
||||
* Child process after a successful fork().
|
||||
* This function must not return, and must be prepared for either all
|
||||
* of its address space to be shared with its parent, or to be a copy.
|
||||
* It must not modify global variables such as "environ".
|
||||
|
@ -101,7 +101,6 @@ typedef struct _ChildStuff
|
||||
const char **envv;
|
||||
const char *pdir;
|
||||
int redirectErrorStream;
|
||||
void *clone_stack;
|
||||
} ChildStuff;
|
||||
|
||||
/* following used in addition when mode is SPAWN */
|
||||
|
@ -55,10 +55,12 @@ void buildJniFunctionName(const char *sym, const char *cname,
|
||||
size_t
|
||||
getLastErrorString(char *buf, size_t len)
|
||||
{
|
||||
char *err;
|
||||
size_t n;
|
||||
if (errno == 0 || len < 1) return 0;
|
||||
|
||||
const char *err = strerror(errno);
|
||||
size_t n = strlen(err);
|
||||
err = strerror(errno);
|
||||
n = strlen(err);
|
||||
if (n >= len)
|
||||
n = len - 1;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -43,6 +43,12 @@
|
||||
#define MAXNAMELEN PATH_MAX
|
||||
#endif
|
||||
|
||||
#ifdef _LP64
|
||||
#define JLONG_FORMAT_SPECIFIER "%ld"
|
||||
#else
|
||||
#define JLONG_FORMAT_SPECIFIER "%lld"
|
||||
#endif
|
||||
|
||||
int UnsetEnv(char *name);
|
||||
char *FindExecName(char *program);
|
||||
const char *SetExecname(char **argv);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -269,11 +269,6 @@ UnsetEnv(char *name)
|
||||
return(borrowed_unsetenv(name));
|
||||
}
|
||||
|
||||
const char *
|
||||
jlong_format_specifier() {
|
||||
return "%lld";
|
||||
}
|
||||
|
||||
jboolean
|
||||
IsJavaw()
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -888,7 +888,7 @@ ContinueInNewThread0(int (JNICALL *continuation)(void *), jlong stack_size, void
|
||||
if (pthread_create(&tid, &attr, (void *(*)(void*))continuation, (void*)args) == 0) {
|
||||
void * tmp;
|
||||
pthread_join(tid, &tmp);
|
||||
rslt = (int)tmp;
|
||||
rslt = (int)(intptr_t)tmp;
|
||||
} else {
|
||||
/*
|
||||
* Continue execution in current thread if for some reason (e.g. out of
|
||||
@ -906,7 +906,7 @@ ContinueInNewThread0(int (JNICALL *continuation)(void *), jlong stack_size, void
|
||||
if (thr_create(NULL, stack_size, (void *(*)(void *))continuation, args, flags, &tid) == 0) {
|
||||
void * tmp;
|
||||
thr_join(tid, NULL, &tmp);
|
||||
rslt = (int)tmp;
|
||||
rslt = (int)(intptr_t)tmp;
|
||||
} else {
|
||||
/* See above. Continue in current thread if thr_create() failed */
|
||||
rslt = continuation(args);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -77,7 +77,7 @@ static char* next_arg(char* cmdline, char* arg, jboolean* wildcard) {
|
||||
USHORT ch = 0;
|
||||
int i;
|
||||
jboolean done = JNI_FALSE;
|
||||
int charLength;
|
||||
ptrdiff_t charLength;
|
||||
|
||||
*wildcard = JNI_FALSE;
|
||||
while (!done) {
|
||||
@ -208,10 +208,12 @@ void JLI_CmdToArgs(char* cmdline) {
|
||||
argv = (StdArg*) JLI_MemRealloc(argv, (nargs+1) * sizeof(StdArg));
|
||||
argv[nargs].arg = JLI_StringDup(arg);
|
||||
argv[nargs].has_wildcard = wildcard;
|
||||
*arg = NULL;
|
||||
*arg = '\0';
|
||||
nargs++;
|
||||
} while (src != NULL);
|
||||
|
||||
JLI_MemFree(arg);
|
||||
|
||||
stdargc = nargs;
|
||||
stdargs = argv;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -107,7 +107,7 @@ int awtPreloadD3D = -1;
|
||||
* GetParamValue("theParam", "theParam=value") returns pointer to "value".
|
||||
*/
|
||||
const char * GetParamValue(const char *paramName, const char *arg) {
|
||||
int nameLen = JLI_StrLen(paramName);
|
||||
size_t nameLen = JLI_StrLen(paramName);
|
||||
if (JLI_StrNCmp(paramName, arg, nameLen) == 0) {
|
||||
/* arg[nameLen] is valid (may contain final NULL) */
|
||||
if (arg[nameLen] == '=') {
|
||||
@ -561,7 +561,7 @@ JLI_Snprintf(char* buffer, size_t size, const char* format, ...) {
|
||||
if (rc < 0) {
|
||||
/* apply ansi semantics */
|
||||
buffer[size - 1] = '\0';
|
||||
return size;
|
||||
return (int)size;
|
||||
} else if (rc == size) {
|
||||
/* force a null terminator */
|
||||
buffer[size - 1] = '\0';
|
||||
@ -728,11 +728,6 @@ void SplashFreeLibrary() {
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
jlong_format_specifier() {
|
||||
return "%I64d";
|
||||
}
|
||||
|
||||
/*
|
||||
* Block current thread and continue execution in a new thread
|
||||
*/
|
||||
@ -882,7 +877,7 @@ int AWTPreload(const char *funcName)
|
||||
if (hPreloadAwt == NULL) {
|
||||
/* awt.dll is not loaded yet */
|
||||
char libraryPath[MAXPATHLEN];
|
||||
int jrePathLen = 0;
|
||||
size_t jrePathLen = 0;
|
||||
HMODULE hJava = NULL;
|
||||
HMODULE hVerify = NULL;
|
||||
|
||||
@ -1004,7 +999,8 @@ ProcessPlatformOption(const char *arg)
|
||||
jobjectArray
|
||||
CreateApplicationArgs(JNIEnv *env, char **strv, int argc)
|
||||
{
|
||||
int i, j, idx, tlen;
|
||||
int i, j, idx;
|
||||
size_t tlen;
|
||||
jobjectArray outArray, inArray;
|
||||
char *ostart, *astart, **nargv;
|
||||
jboolean needs_expansion = JNI_FALSE;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -39,6 +39,7 @@
|
||||
#define MAXPATHLEN MAX_PATH
|
||||
#define MAXNAMELEN MAX_PATH
|
||||
|
||||
#define JLONG_FORMAT_SPECIFIER "%I64d"
|
||||
|
||||
/*
|
||||
* Support for doing cheap, accurate interval timing.
|
||||
|
@ -44,7 +44,6 @@ import sun.awt.util.ThreadGroupUtils;
|
||||
import sun.lwawt.macosx.*;
|
||||
|
||||
public final class CFontManager extends SunFontManager {
|
||||
private FontConfigManager fcManager = null;
|
||||
private static Hashtable<String, Font2D> genericFonts = new Hashtable<String, Font2D>();
|
||||
|
||||
@Override
|
||||
@ -231,15 +230,6 @@ public final class CFontManager extends SunFontManager {
|
||||
return font2D;
|
||||
}
|
||||
|
||||
/*
|
||||
public synchronized FontConfigManager getFontConfigManager() {
|
||||
if (fcManager == null) {
|
||||
fcManager = new FontConfigManager();
|
||||
}
|
||||
return fcManager;
|
||||
}
|
||||
*/
|
||||
|
||||
protected void registerFontsInDir(String dirName, boolean useJavaRasterizer, int fontRank, boolean defer, boolean resolveSymLinks) {
|
||||
loadNativeDirFonts(dirName);
|
||||
super.registerFontsInDir(dirName, useJavaRasterizer, fontRank, defer, resolveSymLinks);
|
||||
|
107
jdk/src/java.desktop/macosx/classes/sun/font/NativeFont.java
Normal file
107
jdk/src/java.desktop/macosx/classes/sun/font/NativeFont.java
Normal file
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.font;
|
||||
|
||||
import java.awt.FontFormatException;
|
||||
import java.awt.font.FontRenderContext;
|
||||
import java.awt.geom.GeneralPath;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
/*
|
||||
* This class should never be invoked on the windows implementation
|
||||
* So the constructor throws a FontFormatException, which is caught
|
||||
* and the font is ignored.
|
||||
*/
|
||||
|
||||
public class NativeFont extends PhysicalFont {
|
||||
|
||||
/**
|
||||
* Verifies native font is accessible.
|
||||
* @throws FontFormatException - if the font can't be located.
|
||||
*/
|
||||
public NativeFont(String platName, boolean isBitmapDelegate)
|
||||
throws FontFormatException {
|
||||
|
||||
throw new FontFormatException("NativeFont not used on OS X");
|
||||
}
|
||||
|
||||
static boolean hasExternalBitmaps(String platName) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public CharToGlyphMapper getMapper() {
|
||||
return null;
|
||||
}
|
||||
|
||||
PhysicalFont getDelegateFont() {
|
||||
return null;
|
||||
}
|
||||
|
||||
FontStrike createStrike(FontStrikeDesc desc) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Rectangle2D getMaxCharBounds(FontRenderContext frc) {
|
||||
return null;
|
||||
}
|
||||
|
||||
StrikeMetrics getFontMetrics(long pScalerContext) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public GeneralPath getGlyphOutline(long pScalerContext,
|
||||
int glyphCode,
|
||||
float x, float y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public GeneralPath getGlyphVectorOutline(long pScalerContext,
|
||||
int[] glyphs, int numGlyphs,
|
||||
float x, float y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
long getGlyphImage(long pScalerContext, int glyphCode) {
|
||||
return 0L;
|
||||
}
|
||||
|
||||
|
||||
void getGlyphMetrics(long pScalerContext, int glyphCode,
|
||||
Point2D.Float metrics) {
|
||||
}
|
||||
|
||||
|
||||
float getGlyphAdvance(long pScalerContext, int glyphCode) {
|
||||
return 0f;
|
||||
}
|
||||
|
||||
Rectangle2D.Float getGlyphOutlineBounds(long pScalerContext,
|
||||
int glyphCode) {
|
||||
return new Rectangle2D.Float(0f, 0f, 0f, 0f);
|
||||
}
|
||||
}
|
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.font;
|
||||
|
||||
import java.awt.geom.GeneralPath;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
public class NativeStrike extends PhysicalStrike {
|
||||
|
||||
NativeFont nativeFont;
|
||||
|
||||
NativeStrike(NativeFont nativeFont, FontStrikeDesc desc) {
|
||||
super(nativeFont, desc);
|
||||
|
||||
throw new RuntimeException("NativeFont not used on OS X");
|
||||
}
|
||||
|
||||
NativeStrike(NativeFont nativeFont, FontStrikeDesc desc,
|
||||
boolean nocache) {
|
||||
super(nativeFont, desc);
|
||||
|
||||
throw new RuntimeException("NativeFont not used on Windows");
|
||||
}
|
||||
|
||||
|
||||
void getGlyphImagePtrs(int[] glyphCodes, long[] images,int len) {
|
||||
}
|
||||
|
||||
long getGlyphImagePtr(int glyphCode) {
|
||||
return 0L;
|
||||
}
|
||||
|
||||
long getGlyphImagePtrNoCache(int glyphCode) {
|
||||
return 0L;
|
||||
}
|
||||
|
||||
void getGlyphImageBounds(int glyphcode,
|
||||
Point2D.Float pt,
|
||||
Rectangle result) {
|
||||
}
|
||||
|
||||
Point2D.Float getGlyphMetrics(int glyphCode) {
|
||||
return null;
|
||||
}
|
||||
|
||||
float getGlyphAdvance(int glyphCode) {
|
||||
return 0f;
|
||||
}
|
||||
|
||||
Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) {
|
||||
return null;
|
||||
}
|
||||
GeneralPath getGlyphOutline(int glyphCode, float x, float y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
GeneralPath getGlyphVectorOutline(int[] glyphs, float x, float y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -311,7 +311,10 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
}
|
||||
|
||||
- (BOOL) performKeyEquivalent: (NSEvent *) event {
|
||||
[self deliverJavaKeyEventHelper: event];
|
||||
// if IM is active key events should be ignored
|
||||
if (![self hasMarkedText] && !fInPressAndHold) {
|
||||
[self deliverJavaKeyEventHelper: event];
|
||||
}
|
||||
|
||||
// Workaround for 8020209: special case for "Cmd =" and "Cmd ."
|
||||
// because Cocoa calls performKeyEquivalent twice for these keystrokes
|
||||
|
@ -126,14 +126,28 @@ done:
|
||||
return buf;
|
||||
}
|
||||
|
||||
BOOL isSWTRunning() {
|
||||
char envVar[80];
|
||||
// If this property is present we are running SWT
|
||||
snprintf(envVar, sizeof(envVar), "JAVA_STARTED_ON_FIRST_THREAD_%d", getpid());
|
||||
return getenv(envVar) != NULL;
|
||||
}
|
||||
|
||||
char* SplashGetScaledImageName(const char* jar, const char* file,
|
||||
float *scaleFactor) {
|
||||
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
||||
*scaleFactor = 1;
|
||||
|
||||
if(isSWTRunning()){
|
||||
return nil;
|
||||
}
|
||||
|
||||
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
||||
char* scaledFile = nil;
|
||||
__block float screenScaleFactor = 1;
|
||||
|
||||
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
|
||||
// initialize NSApplication and AWT stuff
|
||||
[NSApplicationAWT sharedApplication];
|
||||
screenScaleFactor = [SplashNSScreen() backingScaleFactor];
|
||||
}];
|
||||
|
||||
@ -180,12 +194,8 @@ SplashInitPlatform(Splash * splash) {
|
||||
splash->screenFormat.byteOrder = 1 ? BYTE_ORDER_LSBFIRST : BYTE_ORDER_MSBFIRST;
|
||||
splash->screenFormat.depthBytes = 4;
|
||||
|
||||
// If this property is present we are running SWT and should not start a runLoop
|
||||
// Can't check if running SWT in webstart, so splash screen in webstart SWT
|
||||
// applications is not supported
|
||||
char envVar[80];
|
||||
snprintf(envVar, sizeof(envVar), "JAVA_STARTED_ON_FIRST_THREAD_%d", getpid());
|
||||
if (getenv(envVar) == NULL) {
|
||||
// If we are running SWT we should not start a runLoop
|
||||
if (!isSWTRunning()) {
|
||||
[JNFRunLoop performOnMainThreadWaiting:NO withBlock:^() {
|
||||
[NSApplicationAWT runAWTLoopWithApp:[NSApplicationAWT sharedApplication]];
|
||||
}];
|
||||
|
@ -225,7 +225,7 @@ public abstract class ImageInputStreamImpl implements ImageInputStream {
|
||||
}
|
||||
|
||||
public short readShort() throws IOException {
|
||||
if (read(byteBuf, 0, 2) < 0) {
|
||||
if (read(byteBuf, 0, 2) != 2) {
|
||||
throw new EOFException();
|
||||
}
|
||||
|
||||
@ -247,7 +247,7 @@ public abstract class ImageInputStreamImpl implements ImageInputStream {
|
||||
}
|
||||
|
||||
public int readInt() throws IOException {
|
||||
if (read(byteBuf, 0, 4) < 0) {
|
||||
if (read(byteBuf, 0, 4) != 4) {
|
||||
throw new EOFException();
|
||||
}
|
||||
|
||||
|
@ -308,14 +308,14 @@ public class SynthSliderUI extends BasicSliderUI
|
||||
public Dimension getPreferredSize(JComponent c) {
|
||||
recalculateIfInsetsChanged();
|
||||
Dimension d = new Dimension(contentRect.width, contentRect.height);
|
||||
Insets i = slider.getInsets();
|
||||
if (slider.getOrientation() == JSlider.VERTICAL) {
|
||||
d.height = 200;
|
||||
d.height += i.top + i.bottom;
|
||||
} else {
|
||||
d.width = 200;
|
||||
d.width += i.left + i.right;
|
||||
}
|
||||
Insets i = slider.getInsets();
|
||||
d.width += i.left + i.right;
|
||||
d.height += i.top + i.bottom;
|
||||
return d;
|
||||
}
|
||||
|
||||
|
@ -439,6 +439,26 @@ public class JTableHeader extends JComponent implements TableColumnModelListener
|
||||
return tip;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the preferred size of the table header.
|
||||
* This is the size required to display the header and requested for
|
||||
* the viewport.
|
||||
* The returned {@code Dimension} {@code width} will always be calculated by
|
||||
* the underlying TableHeaderUI, regardless of any width specified by
|
||||
* {@link JComponent#setPreferredSize(java.awt.Dimension)}
|
||||
*
|
||||
* @return the size
|
||||
*/
|
||||
@Override
|
||||
public Dimension getPreferredSize() {
|
||||
Dimension preferredSize = super.getPreferredSize();
|
||||
if (isPreferredSizeSet() && ui != null) {
|
||||
Dimension size = ui.getPreferredSize(this);
|
||||
if (size != null) preferredSize.width = size.width;
|
||||
}
|
||||
return preferredSize;
|
||||
}
|
||||
|
||||
//
|
||||
// Managing TableHeaderUI
|
||||
//
|
||||
|
@ -368,9 +368,9 @@ const char *getStrFor(JNIEnv *env, jstring val)
|
||||
if (length > CONV_BUFFER_SIZE-1)
|
||||
{
|
||||
length = CONV_BUFFER_SIZE-1;
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Note: Detail is too long: %d chars\n", length);
|
||||
#endif /* INTERNAL_BUILD */
|
||||
#endif /* DEBUG */
|
||||
}
|
||||
|
||||
(*env)->GetStringUTFRegion(env, val, 0, length, convertionBuffer);
|
||||
@ -507,9 +507,9 @@ void update_supported_actions(JNIEnv *env) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Cannot load g_vfs_get_supported_uri_schemes\n");
|
||||
#endif /* INTERNAL_BUILD */
|
||||
#endif /* DEBUG */
|
||||
}
|
||||
|
||||
}
|
||||
@ -522,23 +522,23 @@ gboolean gtk2_show_uri_load(JNIEnv *env) {
|
||||
const char *gtk_version = fp_gtk_check_version(2, 14, 0);
|
||||
if (gtk_version != NULL) {
|
||||
// The gtk_show_uri is available from GTK+ 2.14
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "The version of GTK is %s. "
|
||||
"The gtk_show_uri function is supported "
|
||||
"since GTK+ 2.14.\n", gtk_version);
|
||||
#endif /* INTERNAL_BUILD */
|
||||
#endif /* DEBUG */
|
||||
} else {
|
||||
// Loading symbols only if the GTK version is 2.14 and higher
|
||||
fp_gtk_show_uri = dl_symbol("gtk_show_uri");
|
||||
const char *dlsym_error = dlerror();
|
||||
if (dlsym_error) {
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "Cannot load symbol: %s \n", dlsym_error);
|
||||
#endif /* INTERNAL_BUILD */
|
||||
#endif /* DEBUG */
|
||||
} else if (fp_gtk_show_uri == NULL) {
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "dlsym(gtk_show_uri) returned NULL\n");
|
||||
#endif /* INTERNAL_BUILD */
|
||||
#endif /* DEBUG */
|
||||
} else {
|
||||
update_supported_actions(env);
|
||||
success = TRUE;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -49,7 +49,7 @@
|
||||
|
||||
#include <X11/XKBlib.h>
|
||||
|
||||
#if defined(DEBUG) || defined(INTERNAL_BUILD)
|
||||
#if defined(DEBUG)
|
||||
static jmethodID lockIsHeldMID = NULL;
|
||||
|
||||
static void
|
||||
@ -2346,4 +2346,3 @@ Java_sun_awt_X11_XlibWrapper_SetBitmapShape
|
||||
|
||||
(*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -42,7 +42,7 @@ gboolean gnome_load() {
|
||||
// we are trying to load the library without a version suffix
|
||||
vfs_handle = dlopen(JNI_LIB_NAME("gnomevfs-2"), RTLD_LAZY);
|
||||
if (vfs_handle == NULL) {
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "can not load libgnomevfs-2.so\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
@ -51,13 +51,13 @@ gboolean gnome_load() {
|
||||
dlerror(); /* Clear errors */
|
||||
gnome_vfs_init = (GNOME_VFS_INIT_TYPE*)dlsym(vfs_handle, "gnome_vfs_init");
|
||||
if (gnome_vfs_init == NULL){
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "dlsym( gnome_vfs_init) returned NULL\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
if ((errmsg = dlerror()) != NULL) {
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "can not find symbol gnome_vfs_init %s \n", errmsg);
|
||||
#endif
|
||||
return FALSE;
|
||||
@ -69,7 +69,7 @@ gboolean gnome_load() {
|
||||
if (gnome_handle == NULL) {
|
||||
gnome_handle = dlopen(JNI_LIB_NAME("gnome-2"), RTLD_LAZY);
|
||||
if (gnome_handle == NULL) {
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "can not load libgnome-2.so\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
@ -78,7 +78,7 @@ gboolean gnome_load() {
|
||||
dlerror(); /* Clear errors */
|
||||
gnome_url_show = (GNOME_URL_SHOW_TYPE*)dlsym(gnome_handle, "gnome_url_show");
|
||||
if ((errmsg = dlerror()) != NULL) {
|
||||
#ifdef INTERNAL_BUILD
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "can not find symble gnome_url_show\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
|
@ -228,7 +228,7 @@ extern JavaVM *jvm;
|
||||
/*
|
||||
* checks if the current thread is/isn't the toolkit thread
|
||||
*/
|
||||
#if defined(DEBUG) || defined(INTERNAL_BUILD)
|
||||
#if defined(DEBUG)
|
||||
#define CHECK_IS_TOOLKIT_THREAD() \
|
||||
if (GetCurrentThreadId() != AwtToolkit::MainThread()) \
|
||||
{ JNU_ThrowInternalError(env,"Operation is not permitted on non-toolkit thread!\n"); }
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,6 +31,7 @@ import java.util.*;
|
||||
import java.security.*;
|
||||
import java.lang.ref.ReferenceQueue;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import sun.misc.JavaAWTAccess;
|
||||
import sun.misc.SharedSecrets;
|
||||
@ -579,7 +580,8 @@ public class LogManager {
|
||||
// added in the user context.
|
||||
class LoggerContext {
|
||||
// Table of named Loggers that maps names to Loggers.
|
||||
private final Hashtable<String,LoggerWeakRef> namedLoggers = new Hashtable<>();
|
||||
private final ConcurrentHashMap<String,LoggerWeakRef> namedLoggers =
|
||||
new ConcurrentHashMap<>();
|
||||
// Tree of named Loggers
|
||||
private final LogNode root;
|
||||
private LoggerContext() {
|
||||
@ -642,21 +644,44 @@ public class LogManager {
|
||||
}
|
||||
|
||||
|
||||
synchronized Logger findLogger(String name) {
|
||||
// ensure that this context is properly initialized before
|
||||
// looking for loggers.
|
||||
ensureInitialized();
|
||||
Logger findLogger(String name) {
|
||||
// Attempt to find logger without locking.
|
||||
LoggerWeakRef ref = namedLoggers.get(name);
|
||||
if (ref == null) {
|
||||
return null;
|
||||
Logger logger = ref == null ? null : ref.get();
|
||||
|
||||
// if logger is not null, then we can return it right away.
|
||||
// if name is "" or "global" and logger is null
|
||||
// we need to fall through and check that this context is
|
||||
// initialized.
|
||||
// if ref is not null and logger is null we also need to
|
||||
// fall through.
|
||||
if (logger != null || (ref == null && !name.isEmpty()
|
||||
&& !name.equals(Logger.GLOBAL_LOGGER_NAME))) {
|
||||
return logger;
|
||||
}
|
||||
Logger logger = ref.get();
|
||||
if (logger == null) {
|
||||
// Hashtable holds stale weak reference
|
||||
// to a logger which has been GC-ed.
|
||||
ref.dispose();
|
||||
|
||||
// We either found a stale reference, or we were looking for
|
||||
// "" or "global" and didn't find them.
|
||||
// Make sure context is initialized (has the default loggers),
|
||||
// and look up again, cleaning the stale reference if it hasn't
|
||||
// been cleaned up in between. All this needs to be done inside
|
||||
// a synchronized block.
|
||||
synchronized(this) {
|
||||
// ensure that this context is properly initialized before
|
||||
// looking for loggers.
|
||||
ensureInitialized();
|
||||
ref = namedLoggers.get(name);
|
||||
if (ref == null) {
|
||||
return null;
|
||||
}
|
||||
logger = ref.get();
|
||||
if (logger == null) {
|
||||
// The namedLoggers map holds stale weak reference
|
||||
// to a logger which has been GC-ed.
|
||||
ref.dispose();
|
||||
}
|
||||
return logger;
|
||||
}
|
||||
return logger;
|
||||
}
|
||||
|
||||
// This method is called before adding a logger to the
|
||||
@ -752,7 +777,6 @@ public class LogManager {
|
||||
final LogManager owner = getOwner();
|
||||
logger.setLogManager(owner);
|
||||
ref = owner.new LoggerWeakRef(logger);
|
||||
namedLoggers.put(name, ref);
|
||||
|
||||
// Apply any initial level defined for the new logger, unless
|
||||
// the logger's level is already initialized
|
||||
@ -789,10 +813,17 @@ public class LogManager {
|
||||
node.walkAndSetParent(logger);
|
||||
// new LogNode is ready so tell the LoggerWeakRef about it
|
||||
ref.setNode(node);
|
||||
|
||||
// Do not publish 'ref' in namedLoggers before the logger tree
|
||||
// is fully updated - because the named logger will be visible as
|
||||
// soon as it is published in namedLoggers (findLogger takes
|
||||
// benefit of the ConcurrentHashMap implementation of namedLoggers
|
||||
// to avoid synchronizing on retrieval when that is possible).
|
||||
namedLoggers.put(name, ref);
|
||||
return true;
|
||||
}
|
||||
|
||||
synchronized void removeLoggerRef(String name, LoggerWeakRef ref) {
|
||||
void removeLoggerRef(String name, LoggerWeakRef ref) {
|
||||
namedLoggers.remove(name, ref);
|
||||
}
|
||||
|
||||
@ -800,7 +831,7 @@ public class LogManager {
|
||||
// ensure that this context is properly initialized before
|
||||
// returning logger names.
|
||||
ensureInitialized();
|
||||
return namedLoggers.keys();
|
||||
return Collections.enumeration(namedLoggers.keySet());
|
||||
}
|
||||
|
||||
// If logger.getUseParentHandlers() returns 'true' and any of the logger's
|
||||
@ -1379,7 +1410,19 @@ public class LogManager {
|
||||
reset();
|
||||
|
||||
// Load the properties
|
||||
props.load(ins);
|
||||
try {
|
||||
props.load(ins);
|
||||
} catch (IllegalArgumentException x) {
|
||||
// props.load may throw an IllegalArgumentException if the stream
|
||||
// contains malformed Unicode escape sequences.
|
||||
// We wrap that in an IOException as readConfiguration is
|
||||
// specified to throw IOException if there are problems reading
|
||||
// from the stream.
|
||||
// Note: new IOException(x.getMessage(), x) allow us to get a more
|
||||
// concise error message than new IOException(x);
|
||||
throw new IOException(x.getMessage(), x);
|
||||
}
|
||||
|
||||
// Instantiate new configuration objects.
|
||||
String names[] = parseClassNames("config");
|
||||
|
||||
|
@ -90,6 +90,7 @@ final class SessionManager {
|
||||
|
||||
// maximum number of active sessions during this invocation, for debugging
|
||||
private int maxActiveSessions;
|
||||
private Object maxActiveSessionsLock;
|
||||
|
||||
// flags to use in the C_OpenSession() call
|
||||
private final long openSessionFlags;
|
||||
@ -113,6 +114,9 @@ final class SessionManager {
|
||||
this.token = token;
|
||||
this.objSessions = new Pool(this);
|
||||
this.opSessions = new Pool(this);
|
||||
if (debug != null) {
|
||||
maxActiveSessionsLock = new Object();
|
||||
}
|
||||
}
|
||||
|
||||
// returns whether only a fairly low number of sessions are
|
||||
@ -212,7 +216,7 @@ final class SessionManager {
|
||||
Session session = new Session(token, id);
|
||||
activeSessions.incrementAndGet();
|
||||
if (debug != null) {
|
||||
synchronized(this) {
|
||||
synchronized(maxActiveSessionsLock) {
|
||||
if (activeSessions.get() > maxActiveSessions) {
|
||||
maxActiveSessions = activeSessions.get();
|
||||
if (maxActiveSessions % 10 == 0) {
|
||||
|
@ -184,10 +184,19 @@ class ZipConstants {
|
||||
return (LG(b, n)) | (LG(b, n + 4) << 32);
|
||||
}
|
||||
|
||||
static final long GETSIG(byte[] b) {
|
||||
return LG(b, 0);
|
||||
static long getSig(byte[] b, int n) { return LG(b, n); }
|
||||
|
||||
private static boolean pkSigAt(byte[] b, int n, int b1, int b2) {
|
||||
return b[n] == 'P' & b[n + 1] == 'K' & b[n + 2] == b1 & b[n + 3] == b2;
|
||||
}
|
||||
|
||||
static boolean cenSigAt(byte[] b, int n) { return pkSigAt(b, n, 1, 2); }
|
||||
static boolean locSigAt(byte[] b, int n) { return pkSigAt(b, n, 3, 4); }
|
||||
static boolean endSigAt(byte[] b, int n) { return pkSigAt(b, n, 5, 6); }
|
||||
static boolean extSigAt(byte[] b, int n) { return pkSigAt(b, n, 7, 8); }
|
||||
static boolean end64SigAt(byte[] b, int n) { return pkSigAt(b, n, 6, 6); }
|
||||
static boolean locator64SigAt(byte[] b, int n) { return pkSigAt(b, n, 6, 7); }
|
||||
|
||||
// local file (LOC) header fields
|
||||
static final long LOCSIG(byte[] b) { return LG(b, 0); } // signature
|
||||
static final int LOCVER(byte[] b) { return SH(b, 4); } // version needed to extract
|
||||
|
@ -1060,7 +1060,7 @@ class ZipFileSystem extends FileSystem {
|
||||
int pos = 0;
|
||||
int limit = cen.length - ENDHDR;
|
||||
while (pos < limit) {
|
||||
if (CENSIG(cen, pos) != CENSIG)
|
||||
if (!cenSigAt(cen, pos))
|
||||
zerror("invalid CEN header (bad signature)");
|
||||
int method = CENHOW(cen, pos);
|
||||
int nlen = CENNAM(cen, pos);
|
||||
@ -1894,7 +1894,7 @@ class ZipFileSystem extends FileSystem {
|
||||
throws IOException
|
||||
{
|
||||
byte[] cen = zipfs.cen;
|
||||
if (CENSIG(cen, pos) != CENSIG)
|
||||
if (!cenSigAt(cen, pos))
|
||||
zerror("invalid CEN header (bad signature)");
|
||||
versionMade = CENVEM(cen, pos);
|
||||
version = CENVER(cen, pos);
|
||||
@ -2057,9 +2057,9 @@ class ZipFileSystem extends FileSystem {
|
||||
assert (buf.length >= LOCHDR);
|
||||
if (zipfs.readFullyAt(buf, 0, LOCHDR , pos) != LOCHDR)
|
||||
throw new ZipException("loc: reading failed");
|
||||
if (LOCSIG(buf) != LOCSIG)
|
||||
if (!locSigAt(buf, 0))
|
||||
throw new ZipException("loc: wrong sig ->"
|
||||
+ Long.toString(LOCSIG(buf), 16));
|
||||
+ Long.toString(getSig(buf, 0), 16));
|
||||
//startPos = pos;
|
||||
version = LOCVER(buf);
|
||||
flag = LOCFLG(buf);
|
||||
@ -2289,9 +2289,9 @@ class ZipFileSystem extends FileSystem {
|
||||
if (zipfs.readFullyAt(buf, 0, buf.length , locoff)
|
||||
!= buf.length)
|
||||
throw new ZipException("loc: reading failed");
|
||||
if (LOCSIG(buf) != LOCSIG)
|
||||
if (!locSigAt(buf, 0))
|
||||
throw new ZipException("loc: wrong sig ->"
|
||||
+ Long.toString(LOCSIG(buf), 16));
|
||||
+ Long.toString(getSig(buf, 0), 16));
|
||||
|
||||
int locElen = LOCEXT(buf);
|
||||
if (locElen < 9) // EXTT is at lease 9 bytes
|
||||
|
@ -453,7 +453,6 @@ needs_jdk = \
|
||||
java/util/jar/JarInputStream/ExtraFileInMetaInf.java \
|
||||
java/util/logging/TestLoggerWeakRefLeak.java \
|
||||
java/util/zip/3GBZipFiles.sh \
|
||||
jdk/lambda/FDTest.java \
|
||||
jdk/lambda/separate/Compiler.java \
|
||||
sun/management/jmxremote/bootstrap/JvmstatCountersTest.java \
|
||||
sun/management/jmxremote/bootstrap/LocalManagementTest.java \
|
||||
|
@ -0,0 +1,43 @@
|
||||
<!--
|
||||
Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License version 2 only, as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
version 2 for more details (a copy is included in the LICENSE file that
|
||||
accompanied this code).
|
||||
|
||||
You should have received a copy of the GNU General Public License version
|
||||
2 along with this work; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
or visit www.oracle.com if you need additional information or have any
|
||||
questions.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<!--
|
||||
@test
|
||||
@bug 6271849
|
||||
@summary Tests that component in modal excluded Window which parent is blocked responses to mouse clicks.
|
||||
@author anton.tarasov@sun.com: area=awt.focus
|
||||
@run applet ModalExcludedWindowClickTest.html
|
||||
-->
|
||||
<head>
|
||||
<title>ModalExcludedWindowClickTest</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>ModalExcludedWindowClickTest<br>Bug ID: 6272324</h1>
|
||||
|
||||
<p> See the dialog box (usually in upper left corner) for instructions</p>
|
||||
|
||||
<APPLET CODE="ModalExcludedWindowClickTest.class" WIDTH=200 HEIGHT=200></APPLET>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,291 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
test
|
||||
@bug 6271849
|
||||
@summary Tests that component in modal excluded Window which parent is blocked responses to mouse clicks.
|
||||
@author anton.tarasov@sun.com: area=awt.focus
|
||||
@run applet ModalExcludedWindowClickTest.html
|
||||
*/
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.lang.reflect.*;
|
||||
|
||||
public class ModalExcludedWindowClickTest extends Applet {
|
||||
Robot robot;
|
||||
Frame frame = new Frame("Frame");
|
||||
Window w = new Window(frame);
|
||||
Dialog d = new Dialog ((Dialog)null, "NullParentDialog", true);
|
||||
Button button = new Button("Button");
|
||||
boolean actionPerformed = false;
|
||||
|
||||
public static void main (String args[]) {
|
||||
ModalExcludedWindowClickTest app = new ModalExcludedWindowClickTest();
|
||||
app.init();
|
||||
app.start();
|
||||
}
|
||||
|
||||
public void init() {
|
||||
try {
|
||||
robot = new Robot();
|
||||
} catch (AWTException e) {
|
||||
throw new RuntimeException("Error: unable to create robot", e);
|
||||
}
|
||||
// Create instructions for the user here, as well as set up
|
||||
// the environment -- set the layout manager, add buttons,
|
||||
// etc.
|
||||
this.setLayout (new BorderLayout ());
|
||||
Sysout.createDialogWithInstructions(new String[]
|
||||
{"This is an AUTOMATIC test", "simply wait until it is done"});
|
||||
}
|
||||
|
||||
public void start() {
|
||||
|
||||
if ("sun.awt.motif.MToolkit".equals(Toolkit.getDefaultToolkit().getClass().getName())) {
|
||||
Sysout.println("No testing on MToolkit.");
|
||||
return;
|
||||
}
|
||||
|
||||
button.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
actionPerformed = true;
|
||||
Sysout.println(e.paramString());
|
||||
}
|
||||
});
|
||||
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
frame.setSize(200, 200);
|
||||
frame.setVisible(true);
|
||||
|
||||
w.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
|
||||
w.add(button);
|
||||
w.setSize(200, 200);
|
||||
w.setLocation(230, 230);
|
||||
w.setVisible(true);
|
||||
|
||||
d.setSize(200, 200);
|
||||
d.setLocation(0, 230);
|
||||
d.setVisible(true);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
waitTillShown(d);
|
||||
|
||||
test();
|
||||
}
|
||||
|
||||
void test() {
|
||||
clickOn(button);
|
||||
waitForIdle();
|
||||
if (!actionPerformed) {
|
||||
throw new RuntimeException("Test failed!");
|
||||
}
|
||||
Sysout.println("Test passed.");
|
||||
}
|
||||
|
||||
void clickOn(Component c) {
|
||||
Point p = c.getLocationOnScreen();
|
||||
Dimension d = c.getSize();
|
||||
|
||||
Sysout.println("Clicking " + c);
|
||||
|
||||
if (c instanceof Frame) {
|
||||
robot.mouseMove(p.x + (int)(d.getWidth()/2), p.y + ((Frame)c).getInsets().top/2);
|
||||
} else {
|
||||
robot.mouseMove(p.x + (int)(d.getWidth()/2), p.y + (int)(d.getHeight()/2));
|
||||
}
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
waitForIdle();
|
||||
}
|
||||
void waitTillShown(Component c) {
|
||||
while (true) {
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
c.getLocationOnScreen();
|
||||
break;
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IllegalComponentStateException e) {}
|
||||
}
|
||||
}
|
||||
void waitForIdle() {
|
||||
try {
|
||||
robot.waitForIdle();
|
||||
EventQueue.invokeAndWait( new Runnable() {
|
||||
public void run() {} // Dummy implementation
|
||||
});
|
||||
} catch(InterruptedException ie) {
|
||||
Sysout.println("waitForIdle, non-fatal exception caught:");
|
||||
ie.printStackTrace();
|
||||
} catch(InvocationTargetException ite) {
|
||||
Sysout.println("waitForIdle, non-fatal exception caught:");
|
||||
ite.printStackTrace();
|
||||
}
|
||||
|
||||
// wait longer...
|
||||
robot.delay(200);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
Standard Test Machinery
|
||||
DO NOT modify anything below -- it's a standard
|
||||
chunk of code whose purpose is to make user
|
||||
interaction uniform, and thereby make it simpler
|
||||
to read and understand someone else's test.
|
||||
****************************************************/
|
||||
|
||||
/**
|
||||
This is part of the standard test machinery.
|
||||
It creates a dialog (with the instructions), and is the interface
|
||||
for sending text messages to the user.
|
||||
To print the instructions, send an array of strings to Sysout.createDialog
|
||||
WithInstructions method. Put one line of instructions per array entry.
|
||||
To display a message for the tester to see, simply call Sysout.println
|
||||
with the string to be displayed.
|
||||
This mimics System.out.println but works within the test harness as well
|
||||
as standalone.
|
||||
*/
|
||||
|
||||
class Sysout
|
||||
{
|
||||
static TestDialog dialog;
|
||||
|
||||
public static void createDialogWithInstructions( String[] instructions )
|
||||
{
|
||||
dialog = new TestDialog( new Frame(), "Instructions" );
|
||||
dialog.printInstructions( instructions );
|
||||
dialog.setVisible(true);
|
||||
println( "Any messages for the tester will display here." );
|
||||
}
|
||||
|
||||
public static void createDialog( )
|
||||
{
|
||||
dialog = new TestDialog( new Frame(), "Instructions" );
|
||||
String[] defInstr = { "Instructions will appear here. ", "" } ;
|
||||
dialog.printInstructions( defInstr );
|
||||
dialog.setVisible(true);
|
||||
println( "Any messages for the tester will display here." );
|
||||
}
|
||||
|
||||
|
||||
public static void printInstructions( String[] instructions )
|
||||
{
|
||||
dialog.printInstructions( instructions );
|
||||
}
|
||||
|
||||
|
||||
public static void println( String messageIn )
|
||||
{
|
||||
dialog.displayMessage( messageIn );
|
||||
}
|
||||
|
||||
}// Sysout class
|
||||
|
||||
/**
|
||||
This is part of the standard test machinery. It provides a place for the
|
||||
test instructions to be displayed, and a place for interactive messages
|
||||
to the user to be displayed.
|
||||
To have the test instructions displayed, see Sysout.
|
||||
To have a message to the user be displayed, see Sysout.
|
||||
Do not call anything in this dialog directly.
|
||||
*/
|
||||
class TestDialog extends Dialog
|
||||
{
|
||||
|
||||
TextArea instructionsText;
|
||||
TextArea messageText;
|
||||
int maxStringLength = 80;
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public TestDialog( Frame frame, String name )
|
||||
{
|
||||
super( frame, name );
|
||||
int scrollBoth = TextArea.SCROLLBARS_BOTH;
|
||||
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
|
||||
add( "North", instructionsText );
|
||||
|
||||
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
|
||||
add("Center", messageText);
|
||||
|
||||
pack();
|
||||
|
||||
setVisible(true);
|
||||
}// TestDialog()
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public void printInstructions( String[] instructions )
|
||||
{
|
||||
//Clear out any current instructions
|
||||
instructionsText.setText( "" );
|
||||
|
||||
//Go down array of instruction strings
|
||||
|
||||
String printStr, remainingStr;
|
||||
for( int i=0; i < instructions.length; i++ )
|
||||
{
|
||||
//chop up each into pieces maxSringLength long
|
||||
remainingStr = instructions[ i ];
|
||||
while( remainingStr.length() > 0 )
|
||||
{
|
||||
//if longer than max then chop off first max chars to print
|
||||
if( remainingStr.length() >= maxStringLength )
|
||||
{
|
||||
//Try to chop on a word boundary
|
||||
int posOfSpace = remainingStr.
|
||||
lastIndexOf( ' ', maxStringLength - 1 );
|
||||
|
||||
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
|
||||
|
||||
printStr = remainingStr.substring( 0, posOfSpace + 1 );
|
||||
remainingStr = remainingStr.substring( posOfSpace + 1 );
|
||||
}
|
||||
//else just print
|
||||
else
|
||||
{
|
||||
printStr = remainingStr;
|
||||
remainingStr = "";
|
||||
}
|
||||
|
||||
instructionsText.append( printStr + "\n" );
|
||||
|
||||
}// while
|
||||
|
||||
}// for
|
||||
|
||||
}//printInstructions()
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public void displayMessage( String messageIn )
|
||||
{
|
||||
messageText.append( messageIn + "\n" );
|
||||
System.out.println(messageIn);
|
||||
}
|
||||
|
||||
}// TestDialog class
|
@ -0,0 +1,43 @@
|
||||
<!--
|
||||
Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License version 2 only, as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
version 2 for more details (a copy is included in the LICENSE file that
|
||||
accompanied this code).
|
||||
|
||||
You should have received a copy of the GNU General Public License version
|
||||
2 along with this work; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
or visit www.oracle.com if you need additional information or have any
|
||||
questions.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<!--
|
||||
@test
|
||||
@bug 6272324
|
||||
@summary Modal excluded Window which decorated parent is blocked should be non-focusable.
|
||||
@author anton.tarasov@sun.com: area=awt.focus
|
||||
@run applet NonFocusableBlockedOwnerTest.html
|
||||
-->
|
||||
<head>
|
||||
<title>NonFocusableBlockedOwnerTest</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>NonFocusableBlockedOwnerTest<br>Bug ID: 6272324</h1>
|
||||
|
||||
<p> See the dialog box (usually in upper left corner) for instructions</p>
|
||||
|
||||
<APPLET CODE="NonFocusableBlockedOwnerTest.class" WIDTH=200 HEIGHT=200></APPLET>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,288 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
test
|
||||
@bug 6272324
|
||||
@summary Modal excluded Window which decorated parent is blocked should be non-focusable.
|
||||
@author anton.tarasov@sun.com: area=awt.focus
|
||||
@run applet NonFocusableBlockedOwnerTest.html
|
||||
*/
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.lang.reflect.*;
|
||||
|
||||
public class NonFocusableBlockedOwnerTest extends Applet {
|
||||
Robot robot;
|
||||
Frame frame = new Frame("Modal Blocked Frame");
|
||||
Dialog dialog = new Dialog(frame, "Modal Dialog", true);
|
||||
Window excluded = new Window(frame);
|
||||
Button button = new Button("button");
|
||||
|
||||
public static void main(String[] args) {
|
||||
NonFocusableBlockedOwnerTest app = new NonFocusableBlockedOwnerTest();
|
||||
app.init();
|
||||
app.start();
|
||||
}
|
||||
|
||||
public void init() {
|
||||
try {
|
||||
robot = new Robot();
|
||||
} catch (AWTException e) {
|
||||
throw new RuntimeException("Error: unable to create robot", e);
|
||||
}
|
||||
// Create instructions for the user here, as well as set up
|
||||
// the environment -- set the layout manager, add buttons,
|
||||
// etc.
|
||||
this.setLayout (new BorderLayout ());
|
||||
Sysout.createDialogWithInstructions(new String[]
|
||||
{"This is an AUTOMATIC test", "simply wait until it is done"});
|
||||
}
|
||||
|
||||
public void start() {
|
||||
|
||||
if ("sun.awt.motif.MToolkit".equals(Toolkit.getDefaultToolkit().getClass().getName())) {
|
||||
Sysout.println("No testing on MToolkit.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
frame.setSize(300, 200);
|
||||
frame.setVisible(true);
|
||||
|
||||
excluded.setSize(300, 200);
|
||||
excluded.setLocation(0, 400);
|
||||
excluded.setModalExclusionType(Dialog.ModalExclusionType.TOOLKIT_EXCLUDE);
|
||||
excluded.setLayout(new FlowLayout());
|
||||
excluded.add(button);
|
||||
excluded.setVisible(true);
|
||||
|
||||
dialog.setSize(200, 100);
|
||||
dialog.setLocation(0, 250);
|
||||
dialog.setVisible(true);
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
waitTillShown(dialog);
|
||||
clickOn(button);
|
||||
if (frame == KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow()) {
|
||||
throw new RuntimeException("Test failed!");
|
||||
}
|
||||
if (excluded == KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow()) {
|
||||
throw new RuntimeException("Test failed!");
|
||||
}
|
||||
if (button == KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()) {
|
||||
throw new RuntimeException("Test failed!");
|
||||
}
|
||||
Sysout.println("Test passed.");
|
||||
}
|
||||
|
||||
void clickOn(Component c) {
|
||||
Point p = c.getLocationOnScreen();
|
||||
Dimension d = c.getSize();
|
||||
|
||||
Sysout.println("Clicking " + c);
|
||||
|
||||
if (c instanceof Frame) {
|
||||
robot.mouseMove(p.x + (int)(d.getWidth()/2), p.y + ((Frame)c).getInsets().top/2);
|
||||
} else {
|
||||
robot.mouseMove(p.x + (int)(d.getWidth()/2), p.y + (int)(d.getHeight()/2));
|
||||
}
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
waitForIdle();
|
||||
}
|
||||
|
||||
void waitTillShown(Component c) {
|
||||
while (true) {
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
c.getLocationOnScreen();
|
||||
break;
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IllegalComponentStateException e) {}
|
||||
}
|
||||
}
|
||||
void waitForIdle() {
|
||||
try {
|
||||
robot.waitForIdle();
|
||||
EventQueue.invokeAndWait( new Runnable() {
|
||||
public void run() {} // Dummy implementation
|
||||
});
|
||||
} catch(InterruptedException ie) {
|
||||
Sysout.println("waitForIdle, non-fatal exception caught:");
|
||||
ie.printStackTrace();
|
||||
} catch(InvocationTargetException ite) {
|
||||
Sysout.println("waitForIdle, non-fatal exception caught:");
|
||||
ite.printStackTrace();
|
||||
}
|
||||
|
||||
// wait longer...
|
||||
robot.delay(200);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
Standard Test Machinery
|
||||
DO NOT modify anything below -- it's a standard
|
||||
chunk of code whose purpose is to make user
|
||||
interaction uniform, and thereby make it simpler
|
||||
to read and understand someone else's test.
|
||||
****************************************************/
|
||||
|
||||
/**
|
||||
This is part of the standard test machinery.
|
||||
It creates a dialog (with the instructions), and is the interface
|
||||
for sending text messages to the user.
|
||||
To print the instructions, send an array of strings to Sysout.createDialog
|
||||
WithInstructions method. Put one line of instructions per array entry.
|
||||
To display a message for the tester to see, simply call Sysout.println
|
||||
with the string to be displayed.
|
||||
This mimics System.out.println but works within the test harness as well
|
||||
as standalone.
|
||||
*/
|
||||
|
||||
class Sysout
|
||||
{
|
||||
static TestDialog dialog;
|
||||
|
||||
public static void createDialogWithInstructions( String[] instructions )
|
||||
{
|
||||
dialog = new TestDialog( new Frame(), "Instructions" );
|
||||
dialog.printInstructions( instructions );
|
||||
dialog.setVisible(true);
|
||||
println( "Any messages for the tester will display here." );
|
||||
}
|
||||
|
||||
public static void createDialog( )
|
||||
{
|
||||
dialog = new TestDialog( new Frame(), "Instructions" );
|
||||
String[] defInstr = { "Instructions will appear here. ", "" } ;
|
||||
dialog.printInstructions( defInstr );
|
||||
dialog.setVisible(true);
|
||||
println( "Any messages for the tester will display here." );
|
||||
}
|
||||
|
||||
|
||||
public static void printInstructions( String[] instructions )
|
||||
{
|
||||
dialog.printInstructions( instructions );
|
||||
}
|
||||
|
||||
|
||||
public static void println( String messageIn )
|
||||
{
|
||||
dialog.displayMessage( messageIn );
|
||||
}
|
||||
|
||||
}// Sysout class
|
||||
|
||||
/**
|
||||
This is part of the standard test machinery. It provides a place for the
|
||||
test instructions to be displayed, and a place for interactive messages
|
||||
to the user to be displayed.
|
||||
To have the test instructions displayed, see Sysout.
|
||||
To have a message to the user be displayed, see Sysout.
|
||||
Do not call anything in this dialog directly.
|
||||
*/
|
||||
class TestDialog extends Dialog
|
||||
{
|
||||
|
||||
TextArea instructionsText;
|
||||
TextArea messageText;
|
||||
int maxStringLength = 80;
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public TestDialog( Frame frame, String name )
|
||||
{
|
||||
super( frame, name );
|
||||
int scrollBoth = TextArea.SCROLLBARS_BOTH;
|
||||
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
|
||||
add( "North", instructionsText );
|
||||
|
||||
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
|
||||
add("Center", messageText);
|
||||
|
||||
pack();
|
||||
|
||||
setVisible(true);
|
||||
}// TestDialog()
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public void printInstructions( String[] instructions )
|
||||
{
|
||||
//Clear out any current instructions
|
||||
instructionsText.setText( "" );
|
||||
|
||||
//Go down array of instruction strings
|
||||
|
||||
String printStr, remainingStr;
|
||||
for( int i=0; i < instructions.length; i++ )
|
||||
{
|
||||
//chop up each into pieces maxSringLength long
|
||||
remainingStr = instructions[ i ];
|
||||
while( remainingStr.length() > 0 )
|
||||
{
|
||||
//if longer than max then chop off first max chars to print
|
||||
if( remainingStr.length() >= maxStringLength )
|
||||
{
|
||||
//Try to chop on a word boundary
|
||||
int posOfSpace = remainingStr.
|
||||
lastIndexOf( ' ', maxStringLength - 1 );
|
||||
|
||||
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
|
||||
|
||||
printStr = remainingStr.substring( 0, posOfSpace + 1 );
|
||||
remainingStr = remainingStr.substring( posOfSpace + 1 );
|
||||
}
|
||||
//else just print
|
||||
else
|
||||
{
|
||||
printStr = remainingStr;
|
||||
remainingStr = "";
|
||||
}
|
||||
|
||||
instructionsText.append( printStr + "\n" );
|
||||
|
||||
}// while
|
||||
|
||||
}// for
|
||||
|
||||
}//printInstructions()
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public void displayMessage( String messageIn )
|
||||
{
|
||||
messageText.append( messageIn + "\n" );
|
||||
System.out.println(messageIn);
|
||||
}
|
||||
|
||||
}// TestDialog class
|
@ -0,0 +1,43 @@
|
||||
<!--
|
||||
Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License version 2 only, as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
version 2 for more details (a copy is included in the LICENSE file that
|
||||
accompanied this code).
|
||||
|
||||
You should have received a copy of the GNU General Public License version
|
||||
2 along with this work; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
or visit www.oracle.com if you need additional information or have any
|
||||
questions.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<!--
|
||||
@test
|
||||
@bug 6253913
|
||||
@summary Tests that a Window shown before its owner is focusable.
|
||||
@author anton.tarasov@sun.com: area=awt-focus
|
||||
@run applet WindowUpdateFocusabilityTest.html
|
||||
-->
|
||||
<head>
|
||||
<title>WindowUpdateFocusabilityTest</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>WindowUpdateFocusabilityTest<br>Bug ID: 6253913</h1>
|
||||
|
||||
<p>See the dialog box (usually in upper left corner) for instructions</p>
|
||||
|
||||
<APPLET CODE=WindowUpdateFocusabilityTest.class WIDTH=200 HEIGHT=200></APPLET>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,325 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
test
|
||||
@bug 6253913
|
||||
@summary Tests that a Window shown before its owner is focusable.
|
||||
@author anton.tarasov@sun.com: area=awt-focus
|
||||
@run applet WindowUpdateFocusabilityTest.html
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.applet.Applet;
|
||||
import java.lang.reflect.*;
|
||||
|
||||
public class WindowUpdateFocusabilityTest extends Applet {
|
||||
Robot robot;
|
||||
boolean focusGained = false;
|
||||
final Object monitor = new Object();
|
||||
FocusListener listener = new FocusAdapter () {
|
||||
public void focusGained(FocusEvent e) {
|
||||
Sysout.println(e.toString());
|
||||
synchronized (monitor) {
|
||||
focusGained = true;
|
||||
monitor.notifyAll();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public static void main(String[] args) {
|
||||
WindowUpdateFocusabilityTest app = new WindowUpdateFocusabilityTest();
|
||||
app.init();
|
||||
app.start();
|
||||
}
|
||||
|
||||
public void init() {
|
||||
try {
|
||||
robot = new Robot();
|
||||
} catch (AWTException e) {
|
||||
throw new RuntimeException("Error: couldn't create robot");
|
||||
}
|
||||
// Create instructions for the user here, as well as set up
|
||||
// the environment -- set the layout manager, add buttons,
|
||||
// etc.
|
||||
this.setLayout (new BorderLayout ());
|
||||
Sysout.createDialogWithInstructions(new String[]
|
||||
{"This is an automatic test. Simply wait until it's done."});
|
||||
}
|
||||
|
||||
public void start() {
|
||||
if ("sun.awt.motif.MToolkit".equals(Toolkit.getDefaultToolkit().getClass().getName())) {
|
||||
Sysout.println("No testing on Motif.");
|
||||
return;
|
||||
}
|
||||
|
||||
test(new Frame("Frame owner"));
|
||||
Frame dialog_owner = new Frame("dialog's owner");
|
||||
test(new Dialog(dialog_owner));
|
||||
test(new Dialog(dialog_owner, Dialog.ModalityType.DOCUMENT_MODAL));
|
||||
test(new Dialog(dialog_owner, Dialog.ModalityType.APPLICATION_MODAL));
|
||||
test(new Dialog(dialog_owner, Dialog.ModalityType.TOOLKIT_MODAL));
|
||||
test(new Dialog((Window) null, Dialog.ModalityType.MODELESS));
|
||||
test(new Dialog((Window) null, Dialog.ModalityType.DOCUMENT_MODAL));
|
||||
test(new Dialog((Window) null, Dialog.ModalityType.APPLICATION_MODAL));
|
||||
test(new Dialog((Window) null, Dialog.ModalityType.TOOLKIT_MODAL));
|
||||
dialog_owner.dispose();
|
||||
}
|
||||
|
||||
private void test(final Window owner)
|
||||
{
|
||||
Window window0 = new Window(owner); // will not be shown
|
||||
Window window1 = new Window(window0);
|
||||
Window window2 = new Window(window1);
|
||||
Button button1 = new Button("button1");
|
||||
Button button2 = new Button("button2");
|
||||
button1.addFocusListener(listener);
|
||||
button2.addFocusListener(listener);
|
||||
|
||||
owner.setBounds(800, 0, 100, 100);
|
||||
window1.setBounds(800, 300, 100, 100);
|
||||
window2.setBounds(800, 150, 100, 100);
|
||||
|
||||
window1.add(button1);
|
||||
window2.add(button2);
|
||||
|
||||
window2.setVisible(true);
|
||||
window1.setVisible(true);
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
owner.setVisible(true);
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
EventQueue.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
// do nothing just wait until previous invokeLater will be executed
|
||||
}
|
||||
});
|
||||
} catch (InterruptedException ie) {
|
||||
throw new RuntimeException(ie);
|
||||
} catch (InvocationTargetException ite) {
|
||||
throw new RuntimeException(ite);
|
||||
}
|
||||
|
||||
robot.delay(1000);
|
||||
|
||||
clickOn(button1);
|
||||
|
||||
if (!isFocusGained()) {
|
||||
throw new RuntimeException("Test failed: window1 is not focusable!");
|
||||
}
|
||||
|
||||
focusGained = false;
|
||||
clickOn(button2);
|
||||
|
||||
if (!isFocusGained()) {
|
||||
throw new RuntimeException("Test failed: window2 is not focusable!");
|
||||
}
|
||||
|
||||
Sysout.println("Test for " + owner.getName() + " passed.");
|
||||
owner.dispose();
|
||||
}
|
||||
|
||||
void clickOn(Component c) {
|
||||
Point p = c.getLocationOnScreen();
|
||||
Dimension d = c.getSize();
|
||||
|
||||
Sysout.println("Clicking " + c);
|
||||
|
||||
robot.mouseMove(p.x + (int)(d.getWidth()/2), p.y + (int)(d.getHeight()/2));
|
||||
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
waitForIdle();
|
||||
}
|
||||
|
||||
void waitForIdle() {
|
||||
try {
|
||||
robot.waitForIdle();
|
||||
robot.delay(50);
|
||||
EventQueue.invokeAndWait( new Runnable() {
|
||||
public void run() {} // Dummy implementation
|
||||
});
|
||||
} catch(InterruptedException ie) {
|
||||
Sysout.println("waitForIdle, non-fatal exception caught:");
|
||||
ie.printStackTrace();
|
||||
} catch(InvocationTargetException ite) {
|
||||
Sysout.println("waitForIdle, non-fatal exception caught:");
|
||||
ite.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
boolean isFocusGained() {
|
||||
synchronized (monitor) {
|
||||
if (!focusGained) {
|
||||
try {
|
||||
monitor.wait(3000);
|
||||
} catch (InterruptedException e) {
|
||||
Sysout.println("Interrupted unexpectedly!");
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return focusGained;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
Standard Test Machinery
|
||||
DO NOT modify anything below -- it's a standard
|
||||
chunk of code whose purpose is to make user
|
||||
interaction uniform, and thereby make it simpler
|
||||
to read and understand someone else's test.
|
||||
****************************************************/
|
||||
|
||||
/**
|
||||
This is part of the standard test machinery.
|
||||
It creates a dialog (with the instructions), and is the interface
|
||||
for sending text messages to the user.
|
||||
To print the instructions, send an array of strings to Sysout.createDialog
|
||||
WithInstructions method. Put one line of instructions per array entry.
|
||||
To display a message for the tester to see, simply call Sysout.println
|
||||
with the string to be displayed.
|
||||
This mimics System.out.println but works within the test harness as well
|
||||
as standalone.
|
||||
*/
|
||||
|
||||
class Sysout
|
||||
{
|
||||
static TestDialog dialog;
|
||||
|
||||
public static void createDialogWithInstructions( String[] instructions )
|
||||
{
|
||||
dialog = new TestDialog( new Frame(), "Instructions" );
|
||||
dialog.printInstructions( instructions );
|
||||
dialog.setVisible(true);
|
||||
println( "Any messages for the tester will display here." );
|
||||
}
|
||||
|
||||
public static void createDialog( )
|
||||
{
|
||||
dialog = new TestDialog( new Frame(), "Instructions" );
|
||||
String[] defInstr = { "Instructions will appear here. ", "" } ;
|
||||
dialog.printInstructions( defInstr );
|
||||
dialog.setVisible(true);
|
||||
println( "Any messages for the tester will display here." );
|
||||
}
|
||||
|
||||
|
||||
public static void printInstructions( String[] instructions )
|
||||
{
|
||||
dialog.printInstructions( instructions );
|
||||
}
|
||||
|
||||
|
||||
public static void println( String messageIn )
|
||||
{
|
||||
dialog.displayMessage( messageIn );
|
||||
}
|
||||
|
||||
}// Sysout class
|
||||
|
||||
/**
|
||||
This is part of the standard test machinery. It provides a place for the
|
||||
test instructions to be displayed, and a place for interactive messages
|
||||
to the user to be displayed.
|
||||
To have the test instructions displayed, see Sysout.
|
||||
To have a message to the user be displayed, see Sysout.
|
||||
Do not call anything in this dialog directly.
|
||||
*/
|
||||
class TestDialog extends Dialog
|
||||
{
|
||||
|
||||
TextArea instructionsText;
|
||||
TextArea messageText;
|
||||
int maxStringLength = 80;
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public TestDialog( Frame frame, String name )
|
||||
{
|
||||
super( frame, name );
|
||||
int scrollBoth = TextArea.SCROLLBARS_BOTH;
|
||||
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
|
||||
add( "North", instructionsText );
|
||||
|
||||
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
|
||||
add("Center", messageText);
|
||||
|
||||
pack();
|
||||
|
||||
setVisible(true);
|
||||
}// TestDialog()
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public void printInstructions( String[] instructions )
|
||||
{
|
||||
//Clear out any current instructions
|
||||
instructionsText.setText( "" );
|
||||
|
||||
//Go down array of instruction strings
|
||||
|
||||
String printStr, remainingStr;
|
||||
for( int i=0; i < instructions.length; i++ )
|
||||
{
|
||||
//chop up each into pieces maxSringLength long
|
||||
remainingStr = instructions[ i ];
|
||||
while( remainingStr.length() > 0 )
|
||||
{
|
||||
//if longer than max then chop off first max chars to print
|
||||
if( remainingStr.length() >= maxStringLength )
|
||||
{
|
||||
//Try to chop on a word boundary
|
||||
int posOfSpace = remainingStr.
|
||||
lastIndexOf( ' ', maxStringLength - 1 );
|
||||
|
||||
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
|
||||
|
||||
printStr = remainingStr.substring( 0, posOfSpace + 1 );
|
||||
remainingStr = remainingStr.substring( posOfSpace + 1 );
|
||||
}
|
||||
//else just print
|
||||
else
|
||||
{
|
||||
printStr = remainingStr;
|
||||
remainingStr = "";
|
||||
}
|
||||
|
||||
instructionsText.append( printStr + "\n" );
|
||||
|
||||
}// while
|
||||
|
||||
}// for
|
||||
|
||||
}//printInstructions()
|
||||
|
||||
//DO NOT call this directly, go through Sysout
|
||||
public void displayMessage( String messageIn )
|
||||
{
|
||||
messageText.append( messageIn + "\n" );
|
||||
System.out.println(messageIn);
|
||||
}
|
||||
|
||||
}// TestDialog class
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -192,8 +192,7 @@ public class TestDialogTypeAhead extends Applet
|
||||
}
|
||||
private void waitForIdle() {
|
||||
try {
|
||||
Toolkit.getDefaultToolkit().sync();
|
||||
sun.awt.SunToolkit.flushPendingEvents();
|
||||
robot.waitForIdle();
|
||||
EventQueue.invokeAndWait( new Runnable() {
|
||||
public void run() {
|
||||
// dummy implementation
|
||||
|
@ -23,13 +23,16 @@
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Dialog;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Panel;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Robot;
|
||||
import java.awt.SplashScreen;
|
||||
import java.awt.TextField;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import javax.imageio.ImageIO;
|
||||
@ -37,7 +40,7 @@ import sun.java2d.SunGraphics2D;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8043869
|
||||
* @bug 8043869 8075244
|
||||
* @author Alexander Scherbatiy
|
||||
* @summary [macosx] java -splash does not honor 2x hi dpi notation for retina
|
||||
* support
|
||||
@ -45,6 +48,7 @@ import sun.java2d.SunGraphics2D;
|
||||
* @run main/othervm -splash:splash1.png MultiResolutionSplashTest TEST_SPLASH 0
|
||||
* @run main/othervm -splash:splash2 MultiResolutionSplashTest TEST_SPLASH 1
|
||||
* @run main/othervm -splash:splash3. MultiResolutionSplashTest TEST_SPLASH 2
|
||||
* @run main/othervm -splash:splash1.png MultiResolutionSplashTest TEST_FOCUS
|
||||
*/
|
||||
public class MultiResolutionSplashTest {
|
||||
|
||||
@ -69,6 +73,9 @@ public class MultiResolutionSplashTest {
|
||||
int index = Integer.parseInt(args[1]);
|
||||
testSplash(tests[index]);
|
||||
break;
|
||||
case "TEST_FOCUS":
|
||||
testFocus();
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Unknown test: " + test);
|
||||
}
|
||||
@ -92,12 +99,49 @@ public class MultiResolutionSplashTest {
|
||||
float scaleFactor = getScaleFactor();
|
||||
Color testColor = (1 < scaleFactor) ? test.color2x : test.color1x;
|
||||
|
||||
if (!testColor.equals(splashScreenColor)) {
|
||||
if (!compare(testColor, splashScreenColor)) {
|
||||
throw new RuntimeException(
|
||||
"Image with wrong resolution is used for splash screen!");
|
||||
}
|
||||
}
|
||||
|
||||
static void testFocus() throws Exception {
|
||||
|
||||
System.out.println("Focus Test!");
|
||||
Robot robot = new Robot();
|
||||
robot.setAutoDelay(50);
|
||||
|
||||
Frame frame = new Frame();
|
||||
frame.setSize(100, 100);
|
||||
String test = "123";
|
||||
TextField textField = new TextField(test);
|
||||
frame.add(textField);
|
||||
frame.setVisible(true);
|
||||
robot.waitForIdle();
|
||||
|
||||
robot.keyPress(KeyEvent.VK_A);
|
||||
robot.keyRelease(KeyEvent.VK_A);
|
||||
robot.keyPress(KeyEvent.VK_B);
|
||||
robot.keyRelease(KeyEvent.VK_B);
|
||||
robot.waitForIdle();
|
||||
|
||||
frame.dispose();
|
||||
|
||||
if(!textField.getText().equals("ab")){
|
||||
throw new RuntimeException("Focus is lost!");
|
||||
}
|
||||
}
|
||||
|
||||
static boolean compare(Color c1, Color c2){
|
||||
return compare(c1.getRed(), c2.getRed())
|
||||
&& compare(c1.getGreen(), c2.getGreen())
|
||||
&& compare(c1.getBlue(), c2.getBlue());
|
||||
}
|
||||
|
||||
static boolean compare(int n, int m){
|
||||
return Math.abs(n - m) <= 50;
|
||||
}
|
||||
|
||||
static float getScaleFactor() {
|
||||
|
||||
final Dialog dialog = new Dialog((Window) null);
|
||||
|
795
jdk/test/java/awt/Window/AlwaysOnTop/AutoTestOnTop.java
Normal file
795
jdk/test/java/awt/Window/AlwaysOnTop/AutoTestOnTop.java
Normal file
@ -0,0 +1,795 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
@test
|
||||
@bug 4632143
|
||||
@summary Unit test for the RFE window/frame/dialog always on top
|
||||
@author dom@sparc.spb.su: area=awt.toplevel
|
||||
@run main AutoTestOnTop
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.lang.reflect.*;
|
||||
import javax.swing.*;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* @author tav@sparc.spb.su
|
||||
* @author dom@sparc.spb.su
|
||||
* Tests that always-on-top windows combine correctly with different kinds of window in different styles and conditions.
|
||||
*
|
||||
* !!! WARNING !!!
|
||||
* The test fails sometimes because the toFront() method doesn't guarantee
|
||||
* that after its invocation the frame will be placed above all other windows.
|
||||
*/
|
||||
public class AutoTestOnTop {
|
||||
static Window topw;
|
||||
static Frame parentw = new Frame();
|
||||
static Window f;
|
||||
static Frame parentf = new Frame();
|
||||
|
||||
static Object uncheckedSrc = new Object(); // used when no need to check event source
|
||||
static Object eventSrc = uncheckedSrc;
|
||||
static boolean dispatchedCond;
|
||||
|
||||
static Semaphore STATE_SEMA = new Semaphore();
|
||||
static Semaphore VIS_SEMA = new Semaphore();
|
||||
static Vector errors = new Vector();
|
||||
|
||||
static boolean isUnix = false;
|
||||
|
||||
static StringBuffer msgError = new StringBuffer();
|
||||
static StringBuffer msgCase = new StringBuffer();
|
||||
static StringBuffer msgAction = new StringBuffer();
|
||||
static StringBuffer msgFunc = new StringBuffer();
|
||||
static StringBuffer msgVisibility = new StringBuffer();
|
||||
|
||||
static volatile int stageNum;
|
||||
static volatile int actNum;
|
||||
static volatile int testResult = 0;
|
||||
|
||||
static volatile boolean doCheckEvents;
|
||||
static volatile boolean eventsCheckPassed;
|
||||
static boolean[] eventsCheckInitVals = new boolean[] { // Whether events are checked for abcence or precence
|
||||
true, true, true, true, true, false, false, false, false
|
||||
};
|
||||
static String[] msgEventsChecks = new String[] {
|
||||
null, null, null, null, null,
|
||||
"expected WindowEvent.WINDOW_STATE_CHANGED hasn't been generated",
|
||||
"expected WindowEvent.WINDOW_STATE_CHANGED hasn't been generated",
|
||||
"expected WindowEvent.WINDOW_STATE_CHANGED hasn't been generated",
|
||||
"expected WindowEvent.WINDOW_STATE_CHANGED hasn't been generated",
|
||||
};
|
||||
|
||||
static final int stagesCount = 7;
|
||||
static final int actionsCount = 9;
|
||||
|
||||
static Method[] preActions = new Method[actionsCount];
|
||||
static Method[] postActions = new Method[actionsCount];
|
||||
static Method[] isActionsAllowed = new Method[actionsCount];
|
||||
static Method[] checksActionEvents = new Method[actionsCount];
|
||||
|
||||
static Robot robot;
|
||||
|
||||
static boolean doStartTest;
|
||||
static String osName = System.getProperty("os.name");
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
checkTesting();
|
||||
|
||||
}
|
||||
|
||||
public static void performTesting() {
|
||||
isUnix = osName.equals("Linux") || osName.equals("SunOS");
|
||||
|
||||
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
|
||||
public void eventDispatched(AWTEvent e) {
|
||||
if (e.getID() == MouseEvent.MOUSE_CLICKED) {
|
||||
if (eventSrc != null & eventSrc != uncheckedSrc && e.getSource() != eventSrc) {
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction + ": " + msgError);
|
||||
testResult = -1;
|
||||
}
|
||||
synchronized (eventSrc) {
|
||||
dispatchedCond = true;
|
||||
eventSrc.notify();
|
||||
}
|
||||
}
|
||||
|
||||
if (doCheckEvents && (e.getSource() == topw || e.getSource() == f)) {
|
||||
|
||||
//System.err.println("AWTEventListener: catched the event " + e);
|
||||
|
||||
try {
|
||||
checksActionEvents[actNum].invoke(null, new Object[] {e});
|
||||
} catch (InvocationTargetException ite) {
|
||||
ite.printStackTrace();
|
||||
} catch (IllegalAccessException iae) {
|
||||
iae.printStackTrace();
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}, 0xffffffffffffffffL);
|
||||
|
||||
Method[] allMethods;
|
||||
|
||||
try {
|
||||
allMethods = AutoTestOnTop.class.getDeclaredMethods();
|
||||
} catch (SecurityException se) {
|
||||
throw new RuntimeException(se);
|
||||
}
|
||||
|
||||
for (int i = 0; i < allMethods.length; i++) {
|
||||
String name = allMethods[i].getName();
|
||||
if (name.startsWith("preAction")) {
|
||||
preActions[name.charAt(name.length() - 1) - '0'] = allMethods[i];
|
||||
} else if (name.startsWith("postAction")) {
|
||||
postActions[name.charAt(name.length() - 1) - '0'] = allMethods[i];
|
||||
} else if (name.startsWith("isActionAllowed")) {
|
||||
isActionsAllowed[name.charAt(name.length() - 1) - '0'] = allMethods[i];
|
||||
} else if (name.startsWith("checkActionEvents")) {
|
||||
checksActionEvents[name.charAt(name.length() - 1) - '0'] = allMethods[i];
|
||||
}
|
||||
}
|
||||
|
||||
f = new Frame("Auxiliary Frame");
|
||||
f.setBounds(50, 0, 400, 50);
|
||||
f.setVisible(true);
|
||||
waitTillShown(f);
|
||||
|
||||
try {
|
||||
robot = new Robot();
|
||||
} catch (AWTException e) {
|
||||
throw new RuntimeException("Error: unable to create robot", e);
|
||||
}
|
||||
|
||||
mainTest();
|
||||
|
||||
if (testResult != 0) {
|
||||
System.err.println("The following errors were encountered: ");
|
||||
for (int i = 0; i < errors.size(); i++) {
|
||||
System.err.println(errors.get(i).toString());
|
||||
}
|
||||
throw new RuntimeException("Test failed.");
|
||||
} else {
|
||||
System.err.println("Test PASSED.");
|
||||
}
|
||||
}
|
||||
|
||||
public static void mainTest() {
|
||||
// stageNum = 0;
|
||||
// for (int i = 0; i < 5; i++) {
|
||||
// actNum = 2;
|
||||
// System.err.println("************************* A C T I O N " + actNum + " *************************");
|
||||
// doStage(stageNum, actNum);
|
||||
// // pause(500);
|
||||
// actNum = 3;
|
||||
// System.err.println("************************* A C T I O N " + actNum + " *************************");
|
||||
// doStage(stageNum, actNum);
|
||||
// // pause(500);
|
||||
// }
|
||||
for (stageNum = 0; stageNum < stagesCount; stageNum++) {
|
||||
System.err.println("************************* S T A G E " + stageNum + " *************************");
|
||||
for (actNum = 0; actNum < actionsCount; actNum++) {
|
||||
System.err.println("************************* A C T I O N " + actNum + " *************************");
|
||||
doStage(stageNum, actNum);
|
||||
} // for thru actNum
|
||||
} // fow thru stageNum
|
||||
|
||||
eventSrc = null;
|
||||
}
|
||||
|
||||
private static void doStage(int stageNum, int actNum) {
|
||||
try {
|
||||
|
||||
if (!((Boolean)isActionsAllowed[actNum].invoke(null, new Object[0])).booleanValue()) {
|
||||
System.err.println("Action skipped due to a platform limitations");
|
||||
return;
|
||||
}
|
||||
|
||||
STATE_SEMA.reset();
|
||||
createWindow(stageNum);
|
||||
|
||||
//*************************
|
||||
// Set window always-on-top
|
||||
//*************************
|
||||
|
||||
preActions[actNum].invoke(null, new Object[0]);
|
||||
setAlwaysOnTop(topw, true);
|
||||
waitForIdle(true);
|
||||
|
||||
if (!topw.isAlwaysOnTopSupported()) return;
|
||||
|
||||
postActions[actNum].invoke(null, new Object[0]);
|
||||
waitForIdle(false);
|
||||
|
||||
STATE_SEMA.reset();
|
||||
|
||||
testForAlwaysOnTop();
|
||||
|
||||
//*****************************
|
||||
// Set window not always-on-top
|
||||
//*****************************
|
||||
|
||||
preActions[actNum].invoke(null, new Object[0]);
|
||||
setAlwaysOnTop(topw, false);
|
||||
waitForIdle(true);
|
||||
postActions[actNum].invoke(null, new Object[0]);
|
||||
waitForIdle(false);
|
||||
STATE_SEMA.reset();
|
||||
|
||||
testForNotAlwaysOnTop();
|
||||
|
||||
} catch (InvocationTargetException ite) {
|
||||
ite.printStackTrace();
|
||||
} catch (Exception ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void checkTesting() {
|
||||
if (Toolkit.getDefaultToolkit().isAlwaysOnTopSupported()) {
|
||||
performTesting();
|
||||
}
|
||||
}
|
||||
|
||||
public static void testForAlwaysOnTop() {
|
||||
System.err.println("Checking for always-on-top " + topw);
|
||||
|
||||
ensureInitialWinPosition(topw);
|
||||
|
||||
// Check that always-on-top window is topmost.
|
||||
// - Click on always-on-top window on the windows cross area.
|
||||
clickOn(topw, f, 10, 30, "setting " + msgVisibility +
|
||||
" window (1) always-on-top didn't make it topmost");
|
||||
|
||||
// Check that we can't change z-order of always-on-top window.
|
||||
// - a) Try to put the other window on the top.
|
||||
f.toFront();
|
||||
clickOn(uncheckedSrc, f, 190, 30, ""); // coz toFront() works not always
|
||||
pause(300);
|
||||
|
||||
// - b) Click on always-on-top window on the windows cross area.
|
||||
clickOn(topw, f, 10, 30, "setting " + msgVisibility +
|
||||
" window (1) always-on-top didn't make it such");
|
||||
|
||||
// Ask for always-on-top property
|
||||
if (isAlwaysOnTop(topw) != true)
|
||||
error("Test failed: stage #" + stageNum + ", action #" + actNum + ": " + msgCase + ": " + msgAction +
|
||||
": isAlwaysOnTop() returned 'false' for window (1) set always-on-top at state "
|
||||
+ msgVisibility);
|
||||
}
|
||||
|
||||
public static void testForNotAlwaysOnTop() {
|
||||
System.err.println("Checking for non always-on-top of " + topw);
|
||||
ensureInitialWinPosition(topw);
|
||||
|
||||
if (msgVisibility.equals("visible") && actNum != 2) {
|
||||
// Check that the window remains topmost.
|
||||
// - click on the window on the windows cross area.
|
||||
clickOn(topw, f, 10, 30, "setting " + msgVisibility +
|
||||
" window (1) not always-on-top didn't keep it topmost");
|
||||
}
|
||||
|
||||
// Check that we can change z-order of not always-on-top window.
|
||||
// - a) try to put the other window on the top.
|
||||
f.toFront();
|
||||
clickOn(uncheckedSrc, f, 190, 30, ""); // coz toFront() works not always
|
||||
pause(300);
|
||||
|
||||
// - b) click on not always-on-top window on the windows cross area.
|
||||
clickOn(f, f, 10, 30, "setting " + msgVisibility +
|
||||
" window (1) not always-on-top didn't make it such");
|
||||
|
||||
// Ask for always-on-top property
|
||||
if (isAlwaysOnTop(topw) != false)
|
||||
error("Test failed: stage #" + stageNum + ", action #" + actNum + ": " + msgCase + ": " + msgAction +
|
||||
": isAlwaysOnTop() returned 'true' for window (1) set not always-on-top at state "
|
||||
+ msgVisibility);
|
||||
}
|
||||
|
||||
|
||||
private static void createWindow(int stageNum) {
|
||||
// Free native resourses
|
||||
if (topw != null && topw.isVisible()) {
|
||||
topw.dispose();
|
||||
}
|
||||
|
||||
switch (stageNum) {
|
||||
case 0:
|
||||
topw = new Frame("Top Frame");
|
||||
msgCase.replace(0, msgCase.length(), "Frame (1) over Frame (2)");
|
||||
break;
|
||||
case 1:
|
||||
topw = new JFrame("Top JFrame");
|
||||
msgCase.replace(0, msgCase.length(), "JFrame (1) over Frame (2)");
|
||||
break;
|
||||
case 2:
|
||||
topw = new Dialog(parentw, "Top Dialog");
|
||||
msgCase.replace(0, msgCase.length(), "Dialog (1) over Frame (2)");
|
||||
break;
|
||||
case 3:
|
||||
topw = new JDialog(parentw, "Top JDialog");
|
||||
msgCase.replace(0, msgCase.length(), "JDialog (1) over Frame (2)");
|
||||
break;
|
||||
case 4:
|
||||
topw = new Frame("Top Frame");
|
||||
f.dispose();
|
||||
f = new Dialog(parentf, "Auxiliary Dialog");
|
||||
f.setBounds(50, 0, 250, 50);
|
||||
f.setVisible(true);
|
||||
waitTillShown(f);
|
||||
msgCase.replace(0, msgCase.length(), "Frame (1) over Dialog (2)");
|
||||
break;
|
||||
case 5:
|
||||
topw = new Window(parentw);
|
||||
msgCase.replace(0, msgCase.length(), "Window (1) over Frame (2)");
|
||||
break;
|
||||
case 6:
|
||||
topw = new JWindow(parentw);
|
||||
msgCase.replace(0, msgCase.length(), "JWindow (1) over Frame (2)");
|
||||
break;
|
||||
}
|
||||
topw.addWindowStateListener(new WindowAdapter() {
|
||||
public void windowStateChanged(WindowEvent e) {
|
||||
System.err.println("* " + e);
|
||||
STATE_SEMA.raise();
|
||||
}
|
||||
});
|
||||
topw.setSize(200, 50);
|
||||
}
|
||||
|
||||
/**
|
||||
* 0: setting always-on-top to invisible window
|
||||
* 1: setting always-on-top to visible window
|
||||
* 2: always-on-top on visible non-focusable window
|
||||
* 3: always-on-top on visible, dragging topw after that
|
||||
* 4: always-on-top on visible, dragging f after that
|
||||
* 5: always-on-top on (visible, maximized), make normal after that
|
||||
* 6: always-on-top on (visible, iconified), make normal after that
|
||||
* 7: always-on-top on visible, iconify/deiconify after that
|
||||
* 8: always-on-top on visible, maximize/restore after that
|
||||
*/
|
||||
public static void preAction_0() {
|
||||
topw.setVisible(false);
|
||||
}
|
||||
public static void postAction_0() {
|
||||
if (topw.isShowing()) {
|
||||
error("Test failed: stage #" + stageNum + ", action #" + actNum + ": " + msgCase +
|
||||
": no actions with windows: changing always-on-top property at window (1) state 'invisible' makes window (1) visible");
|
||||
}
|
||||
setWindowVisible("no actions with windows", "invisible");
|
||||
}
|
||||
public static boolean isActionAllowed_0() {
|
||||
// Window on Linux is always always-on-top!
|
||||
return !((stageNum == 5 || stageNum == 6) && isUnix) && (stageNum < stagesCount);
|
||||
}
|
||||
public static void checkActionEvents_0(AWTEvent e) {
|
||||
System.err.println(e.toString());
|
||||
}
|
||||
|
||||
public static void preAction_1() {
|
||||
setWindowVisible("no actions with windows", "visible");
|
||||
}
|
||||
public static void postAction_1() {}
|
||||
public static boolean isActionAllowed_1() {
|
||||
return !((stageNum == 5 || stageNum == 6) && isUnix) && (stageNum < stagesCount );
|
||||
}
|
||||
public static void checkActionEvents_1(AWTEvent e) {
|
||||
System.err.println(e.toString());
|
||||
if (e instanceof PaintEvent) {
|
||||
return;
|
||||
}
|
||||
eventsCheckPassed = false;
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction + ": after call " + msgFunc +
|
||||
": unexpected event " + e + " was generated");
|
||||
}
|
||||
|
||||
public static void preAction_2() {
|
||||
setWindowVisible("when window (1) set not focusable", "visible");
|
||||
topw.setFocusableWindowState(false);
|
||||
f.toFront();
|
||||
pause(300);
|
||||
}
|
||||
public static void postAction_2() {}
|
||||
public static boolean isActionAllowed_2() {
|
||||
return !((stageNum == 5 || stageNum == 6) && isUnix) && (stageNum < stagesCount);
|
||||
}
|
||||
public static void checkActionEvents_2(AWTEvent e) {
|
||||
System.err.println(e.toString());
|
||||
if ( (e.getID() >= FocusEvent.FOCUS_FIRST && e.getID() <= FocusEvent.FOCUS_LAST) ||
|
||||
(e.getID() == WindowEvent.WINDOW_LOST_FOCUS && e.getID() == WindowEvent.WINDOW_GAINED_FOCUS)) {
|
||||
eventsCheckPassed = false;
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " +
|
||||
msgAction + ": after call " + msgFunc +
|
||||
": unexpected event " + e + " was generated");
|
||||
}
|
||||
}
|
||||
|
||||
public static void preAction_3() {
|
||||
setWindowVisible("after dragging", "visible");
|
||||
}
|
||||
public static void postAction_3() {
|
||||
Point p = topw.getLocationOnScreen();
|
||||
int x = p.x + 40, y = p.y + 5;
|
||||
|
||||
try { // Take a pause to avoid double click
|
||||
Thread.sleep(500); // when called one after another.
|
||||
} catch (InterruptedException ie) {
|
||||
ie.printStackTrace();
|
||||
} catch (IllegalComponentStateException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// Drag the window.
|
||||
robot.mouseMove(x, y);
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.mouseMove(200, 50);
|
||||
robot.mouseMove(x, y);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
}
|
||||
public static boolean isActionAllowed_3() {
|
||||
return (stageNum < 5);
|
||||
}
|
||||
public static void checkActionEvents_3(AWTEvent e) {
|
||||
System.err.println(e.toString());
|
||||
}
|
||||
|
||||
public static void preAction_4() {
|
||||
setWindowVisible("after dragging window (2)", "visible");
|
||||
}
|
||||
public static void postAction_4() {
|
||||
Point p = f.getLocationOnScreen();
|
||||
int x = p.x + 150, y = p.y + 5;
|
||||
|
||||
try { // Take a pause to avoid double click
|
||||
Thread.sleep(500); // when called one after another.
|
||||
} catch (InterruptedException ie) {
|
||||
ie.printStackTrace();
|
||||
} catch (IllegalComponentStateException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// Drag the window.
|
||||
robot.mouseMove(x, y);
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.mouseMove(200, 50);
|
||||
robot.mouseMove(x, y);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
|
||||
ensureInitialWinPosition(f);
|
||||
}
|
||||
public static boolean isActionAllowed_4() {
|
||||
return !((stageNum == 5 || stageNum == 6) && isUnix);
|
||||
}
|
||||
public static void checkActionEvents_4(AWTEvent e) {
|
||||
System.err.println(e.toString());
|
||||
}
|
||||
|
||||
// Metacity has a bug not allowing to set a window to NORMAL state!!!
|
||||
|
||||
public static void preAction_5() {
|
||||
setWindowVisible("at state 'maximized'", "visible");
|
||||
((Frame)topw).setExtendedState(Frame.MAXIMIZED_BOTH);
|
||||
waitForStateChange();
|
||||
}
|
||||
public static void postAction_5() {
|
||||
((Frame)topw).setExtendedState(Frame.NORMAL);
|
||||
waitForStateChange();
|
||||
}
|
||||
public static boolean isActionAllowed_5() {
|
||||
return (stageNum < 2);
|
||||
}
|
||||
public static void checkActionEvents_5(AWTEvent e) {
|
||||
System.err.println("=" + e.toString());
|
||||
if (e.getID() == WindowEvent.WINDOW_STATE_CHANGED) {
|
||||
eventsCheckPassed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public static void preAction_6() {
|
||||
setWindowVisible("at state 'iconified'", "visible");
|
||||
System.err.println("Iconifying " + topw);
|
||||
((Frame)topw).setExtendedState(Frame.ICONIFIED);
|
||||
if (!waitForStateChange()) {
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction + ": after call " + msgFunc +
|
||||
": state change to ICONIFIED hasn't been generated");
|
||||
}
|
||||
}
|
||||
public static void postAction_6() {
|
||||
System.err.println("Restoring " + topw);
|
||||
((Frame)topw).setExtendedState(Frame.NORMAL);
|
||||
if (!waitForStateChange()) {
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction + ": after call " + msgFunc +
|
||||
": state change to NORMAL hasn't been generated");
|
||||
}
|
||||
}
|
||||
public static boolean isActionAllowed_6() {
|
||||
return (stageNum < 2 );
|
||||
}
|
||||
public static void checkActionEvents_6(AWTEvent e) {
|
||||
System.err.println("+" + e.toString());
|
||||
if (e.getID() == WindowEvent.WINDOW_STATE_CHANGED) {
|
||||
eventsCheckPassed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public static void preAction_7() {
|
||||
setWindowVisible("before state 'iconified'", "visible");
|
||||
}
|
||||
public static void postAction_7() {
|
||||
System.err.println("Setting iconified");
|
||||
((Frame)topw).setExtendedState(Frame.ICONIFIED);
|
||||
if (!waitForStateChange()) {
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction + ": after call " + msgFunc +
|
||||
": state change to ICONIFIED hasn't been generated");
|
||||
}
|
||||
System.err.println("Setting normal");
|
||||
((Frame)topw).setExtendedState(Frame.NORMAL);
|
||||
if (!waitForStateChange()) {
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction + ": after call " + msgFunc +
|
||||
": state change to NORMAL hasn't been generated");
|
||||
}
|
||||
}
|
||||
public static boolean isActionAllowed_7() {
|
||||
return (stageNum < 2);
|
||||
}
|
||||
public static void checkActionEvents_7(AWTEvent e) {
|
||||
System.err.println(e.toString());
|
||||
if (e.getID() == WindowEvent.WINDOW_STATE_CHANGED) {
|
||||
eventsCheckPassed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public static void preAction_8() {
|
||||
setWindowVisible("before state 'maximized'", "visible");
|
||||
}
|
||||
public static void postAction_8() {
|
||||
((Frame)topw).setExtendedState(Frame.MAXIMIZED_BOTH);
|
||||
if (!waitForStateChange()) {
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction + ": after call " + msgFunc +
|
||||
": state change to MAXIMIZED hasn't been generated");
|
||||
}
|
||||
((Frame)topw).setExtendedState(Frame.NORMAL);
|
||||
if (!waitForStateChange()) {
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction + ": after call " + msgFunc +
|
||||
": state change to NORMAL hasn't been generated");
|
||||
}
|
||||
}
|
||||
public static boolean isActionAllowed_8() {
|
||||
return (stageNum < 2);
|
||||
}
|
||||
public static void checkActionEvents_8(AWTEvent e) {
|
||||
System.err.println(e.toString());
|
||||
if (e.getID() == WindowEvent.WINDOW_STATE_CHANGED) {
|
||||
eventsCheckPassed = true;
|
||||
}
|
||||
}
|
||||
|
||||
//***************************************************************************
|
||||
|
||||
private static void setWindowVisible(String mAction, String mVisibility) {
|
||||
msgAction.replace(0, msgAction.length(), mAction);
|
||||
msgVisibility.replace(0, msgVisibility.length(), mVisibility);
|
||||
|
||||
topw.setVisible(true);
|
||||
pause(100); // Needs for Sawfish
|
||||
topw.setLocation(0, 0);
|
||||
waitTillShown(topw);
|
||||
f.toFront();
|
||||
pause(300);
|
||||
}
|
||||
|
||||
private static void clickOn(Object src, Window relwin, int x, int y, String errorStr) {
|
||||
Point p = relwin.getLocationOnScreen();
|
||||
int counter = 10;
|
||||
while (--counter > 0) {
|
||||
eventSrc = src;
|
||||
msgError.replace(0, msgError.length(), errorStr);
|
||||
|
||||
robot.mouseMove(p.x + x, p.y + y);
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
|
||||
synchronized (eventSrc) {
|
||||
if (!dispatchedCond) {
|
||||
try {
|
||||
eventSrc.wait(1000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (!dispatchedCond) {
|
||||
//System.err.println("clickOn: MOUSE_CLICKED event losed, trying to generate it again...");
|
||||
continue;
|
||||
}
|
||||
dispatchedCond = false;
|
||||
}
|
||||
break;
|
||||
} // end while
|
||||
if (counter <= 0) {
|
||||
eventSrc = uncheckedSrc;
|
||||
error("Test: internal error: could't catch MOUSE_CLICKED event. Skip testing this stage");
|
||||
}
|
||||
}
|
||||
|
||||
private static void setAlwaysOnTop(Window w, boolean value) {
|
||||
System.err.println("Setting always on top on " + w + " to " + value);
|
||||
robot.mouseMove(0, 100); // Move out of the window
|
||||
msgFunc.replace(0, msgCase.length(), "setAlwaysOnTop()");
|
||||
try {
|
||||
w.setAlwaysOnTop(value);
|
||||
} catch (Exception e) {
|
||||
error("Test failed: stage#" + stageNum + "action #" + actNum + ": " + msgCase + ": " + msgAction +
|
||||
": setAlwaysOnTop(" + value + ") called at state " + msgVisibility +
|
||||
" threw exeption " + e);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isAlwaysOnTop(Window w) {
|
||||
robot.mouseMove(0, 100); // Move out of the window
|
||||
msgFunc.replace(0, msgCase.length(), "isAlwaysOnTop()");
|
||||
boolean result = false;
|
||||
try {
|
||||
result = w.isAlwaysOnTop();
|
||||
} catch (Exception e) {
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction +
|
||||
": isAlwaysOnTop() called at state " + msgVisibility +
|
||||
" threw exeption " + e);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void waitTillShown(Component c) {
|
||||
while (true) {
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
c.getLocationOnScreen();
|
||||
break;
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void waitForIdle(boolean doCheck) {
|
||||
try {
|
||||
robot.waitForIdle();
|
||||
EventQueue.invokeAndWait( new Runnable() {
|
||||
public void run() {} // Dummy implementation
|
||||
} );
|
||||
} catch(InterruptedException ite) {
|
||||
System.err.println("waitForIdle, non-fatal exception caught:");
|
||||
ite.printStackTrace();
|
||||
} catch(InvocationTargetException ine) {
|
||||
System.err.println("waitForIdle, non-fatal exception caught:");
|
||||
ine.printStackTrace();
|
||||
}
|
||||
doCheckEvents = doCheck;
|
||||
|
||||
if (doCheck) {
|
||||
eventsCheckPassed = eventsCheckInitVals[actNum]; // Initialize
|
||||
} else if (!eventsCheckPassed &&
|
||||
msgEventsChecks[actNum] != null) {
|
||||
|
||||
|
||||
// Some expected event hasn't been catched,
|
||||
// so give it one more chance...
|
||||
doCheckEvents = true;
|
||||
pause(500);
|
||||
doCheckEvents = false;
|
||||
|
||||
if (!eventsCheckPassed) {
|
||||
testResult = -1;
|
||||
error("Test failed: stage #" + stageNum + ", action # " + actNum + ": " + msgCase + ": " + msgAction + ": after call "
|
||||
+ msgFunc + ": " + msgEventsChecks[actNum]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean waitForStateChange() {
|
||||
System.err.println("------- Waiting for state change");
|
||||
try {
|
||||
STATE_SEMA.doWait(3000);
|
||||
} catch (InterruptedException ie) {
|
||||
System.err.println("Wait interrupted: " + ie);
|
||||
}
|
||||
boolean state = STATE_SEMA.getState();
|
||||
STATE_SEMA.reset();
|
||||
return state;
|
||||
}
|
||||
|
||||
private static void ensureInitialWinPosition(Window w) {
|
||||
int counter = 30;
|
||||
while (w.getLocationOnScreen().y != 0 && --counter > 0) {
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (counter <= 0) {
|
||||
w.setLocation(0, 0);
|
||||
pause(100);
|
||||
System.err.println("Test: window set to initial position forcedly");
|
||||
}
|
||||
}
|
||||
|
||||
private static void pause(int mls) {
|
||||
try {
|
||||
Thread.sleep(mls);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static void error(String msg) {
|
||||
errors.add(msg);
|
||||
System.err.println(msg);
|
||||
}
|
||||
}
|
||||
|
||||
class Semaphore {
|
||||
boolean state = false;
|
||||
int waiting = 0;
|
||||
public Semaphore() {
|
||||
}
|
||||
public synchronized void doWait() throws InterruptedException {
|
||||
if (state) {
|
||||
return;
|
||||
}
|
||||
waiting++;
|
||||
wait();
|
||||
waiting--;
|
||||
}
|
||||
public synchronized void doWait(int timeout) throws InterruptedException {
|
||||
if (state) {
|
||||
return;
|
||||
}
|
||||
waiting++;
|
||||
wait(timeout);
|
||||
waiting--;
|
||||
}
|
||||
public synchronized void raise() {
|
||||
state = true;
|
||||
if (waiting > 0) {
|
||||
notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void doNotify() {
|
||||
notifyAll();
|
||||
}
|
||||
public synchronized boolean getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public synchronized void reset() {
|
||||
state = false;
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
<!--
|
||||
Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License version 2 only, as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
version 2 for more details (a copy is included in the LICENSE file that
|
||||
accompanied this code).
|
||||
|
||||
You should have received a copy of the GNU General Public License version
|
||||
2 along with this work; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
or visit www.oracle.com if you need additional information or have any
|
||||
questions.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<!--
|
||||
@test
|
||||
@bug 4985250
|
||||
@summary COMPONENT_MOVED/RESIZED tardy events shouldn't be generated.
|
||||
@author tav@sparc.spb.su
|
||||
@run applet MovedResizedTardyEventTest.html
|
||||
-->
|
||||
<head>
|
||||
<title>MovedResizedTardyEventTest</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>MovedResizedTardyEventTest<br>Bug ID: 4985250</h1>
|
||||
|
||||
<p> See the dialog box (usually in upper left corner) for instructions</p>
|
||||
|
||||
<APPLET CODE="MovedResizedTardyEventTest.class" WIDTH=200 HEIGHT=200></APPLET>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
test
|
||||
@bug 4985250
|
||||
@summary COMPONENT_MOVED/RESIZED tardy events shouldn't be generated.
|
||||
@author tav@sparc.spb.su
|
||||
@run applet MovedResizedTardyEventTest.html
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.applet.Applet;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public class MovedResizedTardyEventTest extends Applet {
|
||||
Frame f1 = new Frame("F-1");
|
||||
Frame f2 = new Frame("F-2");
|
||||
|
||||
boolean eventFlag = false;
|
||||
|
||||
public static void main(String[] args) {
|
||||
Applet a = new MovedResizedTardyEventTest();
|
||||
a.start();
|
||||
}
|
||||
|
||||
public void start() {
|
||||
f1.setVisible(true);
|
||||
f2.setVisible(true);
|
||||
|
||||
try {
|
||||
Thread.sleep(500);
|
||||
} catch (InterruptedException e) {}
|
||||
|
||||
f1.addComponentListener(new ComponentAdapter() {
|
||||
public void componentMoved(ComponentEvent e) {
|
||||
MovedResizedTardyEventTest.this.eventFlag = true;
|
||||
System.err.println(e);
|
||||
}
|
||||
public void componentResized(ComponentEvent e) {
|
||||
MovedResizedTardyEventTest.this.eventFlag = true;
|
||||
System.err.println(e);
|
||||
}
|
||||
});
|
||||
|
||||
f1.toFront();
|
||||
|
||||
waitForIdle();
|
||||
|
||||
try { // wait more...
|
||||
Thread.sleep(500);
|
||||
} catch (InterruptedException e) {}
|
||||
|
||||
if (eventFlag) {
|
||||
throw new RuntimeException("Test failed!");
|
||||
}
|
||||
}
|
||||
|
||||
void waitForIdle() {
|
||||
try {
|
||||
(new Robot()).waitForIdle();
|
||||
EventQueue.invokeAndWait( new Runnable() {
|
||||
public void run() {} // Dummy implementation
|
||||
});
|
||||
} catch(InterruptedException ie) {
|
||||
System.err.println("waitForIdle, non-fatal exception caught:");
|
||||
ie.printStackTrace();
|
||||
} catch(InvocationTargetException ite) {
|
||||
System.err.println("waitForIdle, non-fatal exception caught:");
|
||||
ite.printStackTrace();
|
||||
} catch(AWTException rex) {
|
||||
rex.printStackTrace();
|
||||
throw new RuntimeException("unexpected exception");
|
||||
}
|
||||
}
|
||||
}
|
@ -29,8 +29,6 @@
|
||||
@run main AltCharAcceleratorTest
|
||||
*/
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
@ -103,12 +101,11 @@ public class AltCharAcceleratorTest {
|
||||
}
|
||||
|
||||
void test() throws Exception {
|
||||
((SunToolkit) Toolkit.getDefaultToolkit()).realSync();
|
||||
|
||||
focusLatch.await(5, TimeUnit.SECONDS);
|
||||
|
||||
Robot robot = new Robot();
|
||||
robot.setAutoDelay(100);
|
||||
robot.waitForIdle();
|
||||
|
||||
focusLatch.await(5, TimeUnit.SECONDS);
|
||||
|
||||
robot.keyPress(KeyEvent.VK_ALT);
|
||||
robot.keyPress(KeyEvent.VK_T);
|
||||
@ -133,4 +130,4 @@ public class AltCharAcceleratorTest {
|
||||
AltCharAcceleratorTest t = new AltCharAcceleratorTest();
|
||||
t.test();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,18 +24,14 @@
|
||||
/*
|
||||
@test
|
||||
@bug 6799551
|
||||
@library ../../regtesthelpers
|
||||
@build Util Sysout
|
||||
@summary Extended key codes for small letters undefined
|
||||
@author Andrei Dmitriev: area=awt.keyboard
|
||||
@run main EqualKeyCode
|
||||
*/
|
||||
|
||||
|
||||
import sun.awt.*;
|
||||
import java.awt.*;
|
||||
import test.java.awt.regtesthelpers.Util;
|
||||
import test.java.awt.regtesthelpers.Sysout;
|
||||
import java.awt.event.KeyEvent;
|
||||
|
||||
public class EqualKeyCode {
|
||||
|
||||
@ -46,13 +42,13 @@ public class EqualKeyCode {
|
||||
char cSmall = LETTERS.charAt(i);
|
||||
char cLarge = Character.toUpperCase(cSmall);
|
||||
|
||||
int iSmall = ExtendedKeyCodes.getExtendedKeyCodeForChar(cSmall);
|
||||
int iLarge = ExtendedKeyCodes.getExtendedKeyCodeForChar(cLarge);
|
||||
int iSmall = KeyEvent.getExtendedKeyCodeForChar(cSmall);
|
||||
int iLarge = KeyEvent.getExtendedKeyCodeForChar(cLarge);
|
||||
|
||||
System.out.print(" " + cSmall + ":" + iSmall + " ---- ");
|
||||
System.out.println(" " + cLarge + " : " + iLarge);
|
||||
if (ExtendedKeyCodes.getExtendedKeyCodeForChar(cSmall) !=
|
||||
ExtendedKeyCodes.getExtendedKeyCodeForChar(cLarge))
|
||||
if (KeyEvent.getExtendedKeyCodeForChar(cSmall) !=
|
||||
KeyEvent.getExtendedKeyCodeForChar(cLarge))
|
||||
{
|
||||
throw new RuntimeException("ExtendedKeyCode doesn't exist or doesn't match between capital and small letters.");
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ public class MulticastSendReceiveTests {
|
||||
// no datagram received
|
||||
if (sa == null) {
|
||||
if (expectedSender != null) {
|
||||
throw new RuntimeException("Expected message not recieved");
|
||||
throw new RuntimeException("Expected message not received");
|
||||
}
|
||||
System.out.println("No message received (correct)");
|
||||
return;
|
||||
@ -109,10 +109,15 @@ public class MulticastSendReceiveTests {
|
||||
buf.flip();
|
||||
byte[] bytes = new byte[buf.remaining()];
|
||||
buf.get(bytes);
|
||||
int receivedId = Integer.parseInt(new String(bytes));
|
||||
|
||||
System.out.format("Received message from %s (id=0x%x)\n",
|
||||
sender, receivedId);
|
||||
String s = new String(bytes, "UTF-8");
|
||||
int receivedId = -1;
|
||||
try {
|
||||
receivedId = Integer.parseInt(s);
|
||||
System.out.format("Received message from %s (id=0x%x)\n",
|
||||
sender, receivedId);
|
||||
} catch (NumberFormatException x) {
|
||||
System.out.format("Received message from %s (msg=%s)\n", sender, s);
|
||||
}
|
||||
|
||||
if (expectedSender == null) {
|
||||
if (receivedId == id)
|
||||
|
108
jdk/test/java/util/Calendar/Bug8075548.java
Normal file
108
jdk/test/java/util/Calendar/Bug8075548.java
Normal file
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8075548
|
||||
* @summary Make sure that the format form of month names are produced when there are
|
||||
* no stand-alone ones available.
|
||||
*/
|
||||
|
||||
import java.text.*;
|
||||
import java.util.*;
|
||||
import static java.util.Calendar.*;
|
||||
|
||||
public class Bug8075548 {
|
||||
static int errors = 0;
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
Date date = new SimpleDateFormat("yyyy-MM-dd", Locale.US).parse("2010-09-15");
|
||||
String[][] FORMAT_PAIRS = {
|
||||
{ "LLLL", "MMMM" },
|
||||
{ "LLL", "MMM" }
|
||||
};
|
||||
Locale[] LOCALES = {
|
||||
Locale.ENGLISH, Locale.FRENCH, Locale.GERMAN, Locale.JAPANESE
|
||||
};
|
||||
|
||||
for (Locale locale : LOCALES) {
|
||||
for (String[] formats : FORMAT_PAIRS) {
|
||||
String el = new SimpleDateFormat(formats[0], locale).format(date);
|
||||
String em = new SimpleDateFormat(formats[1], locale).format(date);
|
||||
if (!el.equals(em)) {
|
||||
errors++;
|
||||
System.err.println(locale + ": " +
|
||||
formats[0] + " -> " + el + ", " +
|
||||
formats[1] + " -> " + em);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Test Calendar.getDisplayName() and .getDisplayNames().
|
||||
for (Locale locale : LOCALES) {
|
||||
testDisplayNames(locale, LONG_FORMAT, LONG_STANDALONE);
|
||||
testDisplayNames(locale, SHORT_FORMAT, SHORT_STANDALONE);
|
||||
testDisplayNames(locale, NARROW_FORMAT, NARROW_STANDALONE);
|
||||
}
|
||||
|
||||
if (errors > 0) {
|
||||
throw new RuntimeException("Failed");
|
||||
}
|
||||
}
|
||||
|
||||
private static void testDisplayNames(Locale locale, int formatStyle, int standaloneStyle) {
|
||||
Map<String, Integer> map = new HashMap<>();
|
||||
for (int month = JANUARY; month <= DECEMBER; month++) {
|
||||
Calendar cal = new GregorianCalendar(2015, month, 1);
|
||||
String format = cal.getDisplayName(MONTH, formatStyle, locale);
|
||||
String standalone = cal.getDisplayName(MONTH, standaloneStyle, locale);
|
||||
if (!format.equals(standalone)) {
|
||||
System.err.println("Calendar.getDisplayName: " + (month+1) +
|
||||
", locale=" + locale +
|
||||
", format=" + format + ", standalone=" + standalone);
|
||||
errors++;
|
||||
}
|
||||
if (standalone != null) {
|
||||
map.put(standalone, month);
|
||||
}
|
||||
}
|
||||
if (formatStyle == NARROW_FORMAT) {
|
||||
// Narrow styles don't support unique names.
|
||||
// (e.g., "J" for JANUARY, JUNE, and JULY)
|
||||
return;
|
||||
}
|
||||
Calendar cal = new GregorianCalendar(2015, JANUARY, 1);
|
||||
Map<String, Integer> mapStandalone = cal.getDisplayNames(MONTH, standaloneStyle, locale);
|
||||
if (!map.equals(mapStandalone)) {
|
||||
System.err.printf("Calendar.getDisplayNames: locale=%s%n map=%s%n mapStandalone=%s%n",
|
||||
locale, map, mapStandalone);
|
||||
errors++;
|
||||
}
|
||||
Map<String, Integer> mapAll = cal.getDisplayNames(MONTH, ALL_STYLES, locale);
|
||||
if (!mapAll.entrySet().containsAll(map.entrySet())) {
|
||||
System.err.printf("Calendar.getDisplayNames: locale=%s%n map=%s%n mapAll=%s%n",
|
||||
locale, map, mapAll);
|
||||
errors++;
|
||||
}
|
||||
}
|
||||
}
|
@ -86,7 +86,19 @@ public class NarrowNamesTest {
|
||||
"\u6728",
|
||||
"\u91d1",
|
||||
"\u571f");
|
||||
testMap(THTH, MONTH, NARROW_FORMAT); // expect null
|
||||
testMap(THTH, MONTH, NARROW_FORMAT,
|
||||
"\u0e21.\u0e04.",
|
||||
"\u0e01.\u0e1e.",
|
||||
"\u0e21\u0e35.\u0e04.",
|
||||
"\u0e40\u0e21.\u0e22.",
|
||||
"\u0e1e.\u0e04.",
|
||||
"\u0e21\u0e34.\u0e22", // no last dot
|
||||
"\u0e01.\u0e04.",
|
||||
"\u0e2a.\u0e04.",
|
||||
"\u0e01.\u0e22.",
|
||||
"\u0e15.\u0e04.",
|
||||
"\u0e1e.\u0e22.",
|
||||
"\u0e18.\u0e04.");
|
||||
testMap(THTH, MONTH, NARROW_STANDALONE,
|
||||
"\u0e21.\u0e04.",
|
||||
"\u0e01.\u0e1e.",
|
||||
@ -146,7 +158,7 @@ public class NarrowNamesTest {
|
||||
Calendar cal = Calendar.getInstance(locale);
|
||||
Map<String, Integer> got = cal.getDisplayNames(field, style, locale);
|
||||
if (!(expectedMap == null && got == null)
|
||||
&& !expectedMap.equals(got)) {
|
||||
&& !(expectedMap != null && expectedMap.equals(got))) {
|
||||
System.err.printf("testMap: locale=%s, field=%d, style=%d, expected=%s, got=%s%n",
|
||||
locale, field, style, expectedMap, got);
|
||||
errors++;
|
||||
|
147
jdk/test/java/util/Map/FunctionalCMEs.java
Normal file
147
jdk/test/java/util/Map/FunctionalCMEs.java
Normal file
@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
import java.util.Arrays;
|
||||
import java.util.ConcurrentModificationException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import org.testng.annotations.DataProvider;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8071667
|
||||
* @summary Ensure that ConcurrentModificationExceptions are thrown as specified from Map methods that accept Functions
|
||||
* @author bchristi
|
||||
* @build Defaults
|
||||
* @run testng FunctionalCMEs
|
||||
*/
|
||||
public class FunctionalCMEs {
|
||||
final static String KEY = "key";
|
||||
|
||||
@DataProvider(name = "Maps", parallel = true)
|
||||
private static Iterator<Object[]> makeMaps() {
|
||||
return Arrays.asList(
|
||||
// Test maps that CME
|
||||
new Object[]{new HashMap<>(), true},
|
||||
new Object[]{new Hashtable<>(), true},
|
||||
new Object[]{new LinkedHashMap<>(), true},
|
||||
// Test default Map methods - no CME
|
||||
new Object[]{new Defaults.ExtendsAbstractMap<>(), false}
|
||||
).iterator();
|
||||
}
|
||||
|
||||
@Test(dataProvider = "Maps")
|
||||
public void testComputeIfAbsent(Map<String,String> map, boolean expectCME) {
|
||||
checkCME(() -> {
|
||||
map.computeIfAbsent(KEY, k -> {
|
||||
putToForceRehash(map);
|
||||
return "computedValue";
|
||||
});
|
||||
}, expectCME);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "Maps")
|
||||
public void testCompute(Map<String,String> map, boolean expectCME) {
|
||||
checkCME(() -> {
|
||||
map.compute(KEY, mkBiFunc(map));
|
||||
}, expectCME);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "Maps")
|
||||
public void testComputeWithKeyMapped(Map<String,String> map, boolean expectCME) {
|
||||
map.put(KEY, "firstValue");
|
||||
checkCME(() -> {
|
||||
map.compute(KEY, mkBiFunc(map));
|
||||
}, expectCME);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "Maps")
|
||||
public void testComputeIfPresent(Map<String,String> map, boolean expectCME) {
|
||||
map.put(KEY, "firstValue");
|
||||
checkCME(() -> {
|
||||
map.computeIfPresent(KEY, mkBiFunc(map));
|
||||
}, expectCME);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "Maps")
|
||||
public void testMerge(Map<String,String> map, boolean expectCME) {
|
||||
map.put(KEY, "firstValue");
|
||||
checkCME(() -> {
|
||||
map.merge(KEY, "nextValue", mkBiFunc(map));
|
||||
}, expectCME);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "Maps")
|
||||
public void testForEach(Map<String,String> map, boolean ignored) {
|
||||
checkCME(() -> {
|
||||
map.put(KEY, "firstValue");
|
||||
putToForceRehash(map);
|
||||
map.forEach((k,v) -> {
|
||||
map.remove(KEY);
|
||||
});
|
||||
}, true);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "Maps")
|
||||
public void testReplaceAll(Map<String,String> map, boolean ignored) {
|
||||
checkCME(() -> {
|
||||
map.put(KEY, "firstValue");
|
||||
putToForceRehash(map);
|
||||
map.replaceAll((k,v) -> {
|
||||
map.remove(KEY);
|
||||
return "computedValue";
|
||||
});
|
||||
},true);
|
||||
}
|
||||
|
||||
private static void checkCME(Runnable code, boolean expectCME) {
|
||||
try {
|
||||
code.run();
|
||||
} catch (ConcurrentModificationException cme) {
|
||||
if (expectCME) { return; } else { throw cme; }
|
||||
}
|
||||
if (expectCME) {
|
||||
throw new RuntimeException("Expected CME, but wasn't thrown");
|
||||
}
|
||||
}
|
||||
|
||||
private static BiFunction<String,String,String> mkBiFunc(Map<String,String> map) {
|
||||
return (k,v) -> {
|
||||
putToForceRehash(map);
|
||||
return "computedValue";
|
||||
};
|
||||
}
|
||||
|
||||
private static void putToForceRehash(Map<String,String> map) {
|
||||
for (int i = 0; i < 64; ++i) {
|
||||
map.put(i + "", "value");
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,164 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Properties;
|
||||
import java.util.logging.LogManager;
|
||||
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8075810
|
||||
* @run main/othervm InvalidEscapeConfigurationTest
|
||||
* @author danielfuchs
|
||||
*/
|
||||
public class InvalidEscapeConfigurationTest {
|
||||
|
||||
public static void main(String[] args)
|
||||
throws UnsupportedEncodingException, IOException {
|
||||
String[] validEscapes = {
|
||||
"com.f\\u006fo.level = INF\\u004f",
|
||||
"com.f\\u006fo.level = INFO",
|
||||
"com.foo.level = INF\\u004f"
|
||||
};
|
||||
String[] invalidEscapes = {
|
||||
"com.fo\\u0O6f.level = INF\\u0O4f",
|
||||
"com.fo\\u0O6f.level = INFO",
|
||||
"com.foo.level = INF\\u0O4f"
|
||||
};
|
||||
for (String line : validEscapes) {
|
||||
test(line, true);
|
||||
}
|
||||
for (String line : invalidEscapes) {
|
||||
test(line, false);
|
||||
}
|
||||
try {
|
||||
Properties props = new Properties();
|
||||
props.load((InputStream)null);
|
||||
throw new RuntimeException("Properties.load(null): "
|
||||
+ "NullPointerException exception not raised");
|
||||
} catch (NullPointerException x) {
|
||||
System.out.println("Properties.load(null): "
|
||||
+ "got expected exception: " + x);
|
||||
}
|
||||
try {
|
||||
LogManager.getLogManager().readConfiguration(null);
|
||||
throw new RuntimeException("LogManager.readConfiguration(null): "
|
||||
+ "NullPointerException exception not raised");
|
||||
} catch (NullPointerException x) {
|
||||
System.out.println("LogManager.readConfiguration(null): "
|
||||
+ "got expected exception: " + x);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void test(String line, boolean valid) throws IOException {
|
||||
String test = (valid ? "valid" : "invalid")
|
||||
+ " line \"" +line + "\"";
|
||||
System.out.println("Testing " + test);
|
||||
|
||||
// First verify that we get the expected result from Properties.load()
|
||||
try {
|
||||
ByteArrayInputStream bais =
|
||||
new ByteArrayInputStream(line.getBytes("UTF-8"));
|
||||
Properties props = new Properties();
|
||||
props.load(bais);
|
||||
if (!valid) {
|
||||
throw new RuntimeException(test
|
||||
+ "\n\tProperties.load: expected exception not raised");
|
||||
} else {
|
||||
System.out.println("Properties.load passed for " + test);
|
||||
}
|
||||
} catch(IllegalArgumentException x) {
|
||||
if (!valid) {
|
||||
System.out.println(
|
||||
"Properties.load: Got expected exception: "
|
||||
+ x + "\n\tfor " + test);
|
||||
} else {
|
||||
throw x;
|
||||
}
|
||||
}
|
||||
|
||||
// Then verify that we get the expected result from
|
||||
// LogManager.readConfiguration
|
||||
try {
|
||||
String content = defaultConfiguration() + '\n' + line + '\n';
|
||||
ByteArrayInputStream bais =
|
||||
new ByteArrayInputStream(content.getBytes("UTF-8"));
|
||||
LogManager.getLogManager().readConfiguration(bais);
|
||||
if (!valid) {
|
||||
throw new RuntimeException(test
|
||||
+ "\n\tLogManager.readConfiguration: "
|
||||
+ "expected exception not raised");
|
||||
} else {
|
||||
System.out.println("LogManager.readConfiguration passed for "
|
||||
+ test);
|
||||
}
|
||||
} catch(IOException x) {
|
||||
if (!valid) {
|
||||
System.out.println(
|
||||
"LogManager.readConfiguration: Got expected exception: "
|
||||
+ x + "\n\tfor " + test);
|
||||
} else {
|
||||
throw x;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static String getConfigurationFileName() {
|
||||
String fname = System.getProperty("java.util.logging.config.file");
|
||||
if (fname == null) {
|
||||
fname = System.getProperty("java.home");
|
||||
if (fname == null) {
|
||||
throw new Error("Can't find java.home ??");
|
||||
}
|
||||
fname = Paths.get(fname, "conf", "logging.properties")
|
||||
.toAbsolutePath().normalize().toString();
|
||||
}
|
||||
return fname;
|
||||
}
|
||||
|
||||
static String defaultConfiguration() throws IOException {
|
||||
Properties props = new Properties();
|
||||
String fileName = getConfigurationFileName();
|
||||
if (Files.exists(Paths.get(fileName))) {
|
||||
try (InputStream is = new FileInputStream(fileName);) {
|
||||
props.load(is);
|
||||
} catch(IOException x) {
|
||||
throw new UncheckedIOException(x);
|
||||
}
|
||||
}
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
props.store(bos, null);
|
||||
return bos.toString();
|
||||
}
|
||||
|
||||
}
|
239
jdk/test/java/util/logging/LogManager/TestLoggerNames.java
Normal file
239
jdk/test/java/util/logging/LogManager/TestLoggerNames.java
Normal file
@ -0,0 +1,239 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.Phaser;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.logging.Handler;
|
||||
import java.util.logging.LogManager;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 7113878
|
||||
* @summary This is not a test that will check that 7113878 is fixed, but
|
||||
* rather a test that will invoke the modified code & try to verify
|
||||
* that fixing 7113878 has not introduced some big regression.
|
||||
* This test should pass, whether 7113878 is there or not.
|
||||
* @run main/othervm TestLoggerNames
|
||||
* @author danielfuchs
|
||||
*/
|
||||
public class TestLoggerNames {
|
||||
|
||||
static final class TestLogger extends java.util.logging.Logger {
|
||||
|
||||
final Semaphore sem = new Semaphore(0);
|
||||
final Semaphore wait = new Semaphore(0);
|
||||
|
||||
public TestLogger(String name, String resourceBundleName) {
|
||||
super(name, resourceBundleName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Handler[] getHandlers() {
|
||||
boolean found = false;
|
||||
try {
|
||||
System.out.println("Entering "+getName()+" getHandlers()");
|
||||
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
|
||||
if (LogManager.class.getName().equals(ste.getClassName())
|
||||
&& "reset".equals(ste.getMethodName())) {
|
||||
found = true;
|
||||
System.out.println(getName()+" getHandlers() called by " + ste);
|
||||
}
|
||||
}
|
||||
sem.release();
|
||||
try {
|
||||
System.out.println("TestLogger: Acquiring wait for "+getName());
|
||||
wait.acquire();
|
||||
try {
|
||||
System.out.println("TestLogger: Acquired wait for "+getName());
|
||||
return super.getHandlers();
|
||||
} finally {
|
||||
System.out.println("TestLogger: Releasing wait for "+getName());
|
||||
wait.release();
|
||||
}
|
||||
} finally {
|
||||
System.out.println("Unblocking "+getName());
|
||||
sem.acquire();
|
||||
System.out.println("Unblocked "+getName());
|
||||
if (found) {
|
||||
System.out.println("Reset will proceed...");
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException x) {
|
||||
throw new IllegalStateException(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static volatile boolean stop;
|
||||
static volatile Throwable resetFailed;
|
||||
static volatile Throwable checkLoggerNamesFailed;
|
||||
static volatile Phaser phaser = new Phaser(2);
|
||||
|
||||
|
||||
static void checkLoggerNames(List<Logger> loggers) {
|
||||
Enumeration<String> names = LogManager.getLogManager().getLoggerNames();
|
||||
if (names instanceof Iterator) {
|
||||
for (Iterator<?> it = Iterator.class.cast(names); it.hasNext(); ) {
|
||||
try {
|
||||
it.remove();
|
||||
throw new RuntimeException("Iterator supports remove!");
|
||||
} catch (UnsupportedOperationException x) {
|
||||
System.out.println("OK: Iterator doesn't support remove.");
|
||||
}
|
||||
}
|
||||
}
|
||||
List<String> loggerNames = Collections.list(names);
|
||||
if (!loggerNames.contains("")) {
|
||||
throw new RuntimeException("\"\"" +
|
||||
" not found in " + loggerNames);
|
||||
}
|
||||
if (!loggerNames.contains("global")) {
|
||||
throw new RuntimeException("global" +
|
||||
" not found in " + loggerNames);
|
||||
}
|
||||
for (Logger l : loggers) {
|
||||
if (!loggerNames.contains(l.getName())) {
|
||||
throw new RuntimeException(l.getName() +
|
||||
" not found in " + loggerNames);
|
||||
}
|
||||
}
|
||||
System.out.println("Got all expected logger names");
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
LogManager.getLogManager().addLogger(new TestLogger("com.foo.bar.zzz", null));
|
||||
try {
|
||||
Logger.getLogger(null);
|
||||
throw new RuntimeException("Logger.getLogger(null) didn't throw expected NPE");
|
||||
} catch (NullPointerException x) {
|
||||
System.out.println("Got expected NullPointerException for Logger.getLogger(null)");
|
||||
}
|
||||
List<Logger> loggers = new CopyOnWriteArrayList<>();
|
||||
loggers.add(Logger.getLogger("one.two.addMeAChild"));
|
||||
loggers.add(Logger.getLogger("aaa.bbb.replaceMe"));
|
||||
loggers.add(Logger.getLogger("bbb.aaa.addMeAChild"));
|
||||
TestLogger test = (TestLogger)Logger.getLogger("com.foo.bar.zzz");
|
||||
loggers.add(Logger.getLogger("ddd.aaa.addMeAChild"));
|
||||
|
||||
checkLoggerNames(loggers);
|
||||
|
||||
Thread loggerNamesThread = new Thread(() -> {
|
||||
try {
|
||||
while (!stop) {
|
||||
checkLoggerNames(loggers);
|
||||
Thread.sleep(10);
|
||||
if (!stop) {
|
||||
phaser.arriveAndAwaitAdvance();
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace(System.err);
|
||||
checkLoggerNamesFailed = t;
|
||||
}
|
||||
}, "loggerNames");
|
||||
|
||||
Thread resetThread = new Thread(() -> {
|
||||
try {
|
||||
System.out.println("Calling reset...");
|
||||
LogManager.getLogManager().reset();
|
||||
System.out.println("Reset done...");
|
||||
System.out.println("Reset again...");
|
||||
LogManager.getLogManager().reset();
|
||||
System.out.println("Reset done...");
|
||||
} catch(Throwable t) {
|
||||
resetFailed = t;
|
||||
System.err.println("Unexpected exception or error in reset Thread");
|
||||
t.printStackTrace(System.err);
|
||||
}
|
||||
}, "reset");
|
||||
|
||||
resetThread.setDaemon(true);
|
||||
resetThread.start();
|
||||
|
||||
System.out.println("Waiting for reset to get handlers");
|
||||
test.sem.acquire();
|
||||
try {
|
||||
loggerNamesThread.start();
|
||||
System.out.println("Reset has called getHandlers on " + test.getName());
|
||||
int i = 0;
|
||||
for (Enumeration<String> e = LogManager.getLogManager().getLoggerNames();
|
||||
e.hasMoreElements();) {
|
||||
String name = e.nextElement();
|
||||
if (name.isEmpty()) continue;
|
||||
if (name.endsWith(".addMeAChild")) {
|
||||
Logger l = Logger.getLogger(name+".child");
|
||||
loggers.add(l);
|
||||
System.out.println("*** Added " + l.getName());
|
||||
i++;
|
||||
} else if (name.endsWith("replaceMe")) {
|
||||
Logger l = Logger.getLogger(name);
|
||||
loggers.remove(l);
|
||||
l = Logger.getLogger(name.replace("replaceMe", "meReplaced"));
|
||||
loggers.add(l);
|
||||
System.gc();
|
||||
if (LogManager.getLogManager().getLogger(name) == null) {
|
||||
System.out.println("*** "+ name + " successfully replaced with " + l.getName());
|
||||
}
|
||||
i++;
|
||||
} else {
|
||||
System.out.println("Nothing to do for logger: " + name);
|
||||
}
|
||||
phaser.arriveAndAwaitAdvance();
|
||||
if (i >= 3 && i++ == 3) {
|
||||
System.out.println("Loggers are now: " +
|
||||
Collections.list(LogManager.getLogManager().getLoggerNames()));
|
||||
test.wait.release();
|
||||
test.sem.release();
|
||||
System.out.println("Joining " + resetThread);
|
||||
resetThread.join();
|
||||
}
|
||||
}
|
||||
} catch (RuntimeException | InterruptedException | Error x) {
|
||||
test.wait.release();
|
||||
test.sem.release();
|
||||
throw x;
|
||||
} finally {
|
||||
stop = true;
|
||||
phaser.arriveAndDeregister();
|
||||
loggerNamesThread.join();
|
||||
loggers.clear();
|
||||
}
|
||||
|
||||
|
||||
if (resetFailed != null || checkLoggerNamesFailed != null) {
|
||||
RuntimeException r = new RuntimeException("Some of the concurrent threads failed");
|
||||
if (resetFailed != null) r.addSuppressed(resetFailed);
|
||||
if (checkLoggerNamesFailed != null) r.addSuppressed(checkLoggerNamesFailed);
|
||||
throw r;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -24,33 +24,76 @@
|
||||
/**
|
||||
* @test
|
||||
* @summary Test java.util.zip behavior with ~64k entries
|
||||
* @library /lib/testlibrary
|
||||
* @run main/othervm EntryCount64k
|
||||
* @run main/othervm -Djdk.util.zip.inhibitZip64=true EntryCount64k
|
||||
* @run main/othervm -Djdk.util.zip.inhibitZip64=false EntryCount64k
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.zip.*;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Enumeration;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
import java.util.zip.ZipInputStream;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
import jdk.testlibrary.OutputAnalyzer;
|
||||
import jdk.testlibrary.ProcessTools;
|
||||
|
||||
public class EntryCount64k {
|
||||
public static class Main {
|
||||
public static void main(String[] args) {
|
||||
System.out.print("Main");
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
for (int i = (1 << 16) - 2; i < (1 << 16) + 2; i++)
|
||||
static final String MAIN_CLASS = "EntryCount64k$Main";
|
||||
static final String THIS_CLASS = "EntryCount64k";
|
||||
static final String[] SPECIAL_CLASSES = { MAIN_CLASS, THIS_CLASS };
|
||||
// static final String[] SPECIAL_CLASSES = { MAIN_CLASS };
|
||||
static final int SPECIAL_COUNT = 1 + SPECIAL_CLASSES.length;
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
for (int i = (1 << 16) - 3; i < (1 << 16) + 2; i++)
|
||||
test(i);
|
||||
}
|
||||
|
||||
static void test(int entryCount) throws Exception {
|
||||
static void test(int entryCount) throws Throwable {
|
||||
File zipFile = new File("EntryCount64k-tmp.zip");
|
||||
zipFile.delete();
|
||||
|
||||
try (ZipOutputStream zos =
|
||||
new ZipOutputStream(
|
||||
new BufferedOutputStream(
|
||||
new FileOutputStream(zipFile)))) {
|
||||
for (int i = 0; i < entryCount; i++) {
|
||||
ZipEntry e = new ZipEntry(Integer.toString(i));
|
||||
zos.putNextEntry(e);
|
||||
try (FileOutputStream fos = new FileOutputStream(zipFile);
|
||||
BufferedOutputStream bos = new BufferedOutputStream(fos);
|
||||
ZipOutputStream zos = new ZipOutputStream(bos)) {
|
||||
|
||||
// Add entries to allow the zip file to be used with "java -jar"
|
||||
zos.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
|
||||
for (String line : new String[] {
|
||||
"Manifest-Version: 1.0",
|
||||
"Main-Class: " + MAIN_CLASS,
|
||||
})
|
||||
zos.write((line + "\n").getBytes("US-ASCII"));
|
||||
zos.closeEntry();
|
||||
|
||||
String testClasses = System.getProperty("test.classes");
|
||||
for (String className : SPECIAL_CLASSES) {
|
||||
String baseName = className + ".class";
|
||||
ZipEntry ze = new ZipEntry(baseName);
|
||||
File file = new File(testClasses, baseName);
|
||||
zos.putNextEntry(ze);
|
||||
Files.copy(file.toPath(), zos);
|
||||
zos.closeEntry();
|
||||
}
|
||||
|
||||
for (int i = SPECIAL_COUNT; i < entryCount; i++) {
|
||||
zos.putNextEntry(new ZipEntry(Integer.toString(i)));
|
||||
zos.closeEntry();
|
||||
}
|
||||
}
|
||||
@ -86,16 +129,16 @@ public class EntryCount64k {
|
||||
return false;
|
||||
}
|
||||
|
||||
static void checkCanRead(File zipFile, int entryCount) throws Exception {
|
||||
static void checkCanRead(File zipFile, int entryCount) throws Throwable {
|
||||
// Check ZipInputStream API
|
||||
try (ZipInputStream zis =
|
||||
new ZipInputStream(
|
||||
new BufferedInputStream(
|
||||
new FileInputStream(zipFile)))) {
|
||||
try (FileInputStream fis = new FileInputStream(zipFile);
|
||||
BufferedInputStream bis = new BufferedInputStream(fis);
|
||||
ZipInputStream zis = new ZipInputStream(bis)) {
|
||||
for (int i = 0; i < entryCount; i++) {
|
||||
ZipEntry e = zis.getNextEntry();
|
||||
if (Integer.parseInt(e.getName()) != i)
|
||||
throw new AssertionError();
|
||||
if (i >= SPECIAL_COUNT) // skip special entries
|
||||
if (Integer.parseInt(e.getName()) != i)
|
||||
throw new AssertionError(e.getName());
|
||||
}
|
||||
if (zis.getNextEntry() != null)
|
||||
throw new AssertionError();
|
||||
@ -106,8 +149,9 @@ public class EntryCount64k {
|
||||
Enumeration<? extends ZipEntry> en = zf.entries();
|
||||
for (int i = 0; i < entryCount; i++) {
|
||||
ZipEntry e = en.nextElement();
|
||||
if (Integer.parseInt(e.getName()) != i)
|
||||
throw new AssertionError();
|
||||
if (i >= SPECIAL_COUNT) // skip special entries
|
||||
if (Integer.parseInt(e.getName()) != i)
|
||||
throw new AssertionError();
|
||||
}
|
||||
if (en.hasMoreElements()
|
||||
|| (zf.size() != entryCount)
|
||||
@ -115,5 +159,15 @@ public class EntryCount64k {
|
||||
|| (zf.getEntry(Integer.toString(entryCount)) != null))
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
// Check java -jar
|
||||
String javaHome = System.getProperty("java.home");
|
||||
String java = Paths.get(javaHome, "bin", "java").toString();
|
||||
String[] cmd = { java, "-jar", zipFile.getName() };
|
||||
ProcessBuilder pb = new ProcessBuilder(cmd);
|
||||
OutputAnalyzer a = ProcessTools.executeProcess(pb);
|
||||
a.shouldHaveExitValue(0);
|
||||
a.stdoutShouldMatch("\\AMain\\Z");
|
||||
a.stderrShouldMatch("\\A\\Z");
|
||||
}
|
||||
}
|
||||
|
127
jdk/test/javax/imageio/stream/ShortStreamTest.java
Normal file
127
jdk/test/javax/imageio/stream/ShortStreamTest.java
Normal file
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8074954
|
||||
* @summary Test verifies that an IOException is triggered if input stream
|
||||
* does not contain enough data to read a multi-byte type.
|
||||
*
|
||||
* @run main ShortStreamTest
|
||||
*/
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.imageio.stream.ImageInputStream;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
public class ShortStreamTest {
|
||||
public static void main(String[] args) throws IOException {
|
||||
TestCase[] tests = createTests();
|
||||
|
||||
for (TestCase t : tests) {
|
||||
t.test();
|
||||
}
|
||||
}
|
||||
|
||||
private static abstract class TestCase {
|
||||
abstract void testRead(ImageInputStream iis) throws IOException;
|
||||
|
||||
public void test() {
|
||||
boolean gotException = false;
|
||||
|
||||
ImageInputStream iis = createShortStream();
|
||||
|
||||
try {
|
||||
testRead(iis);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace(System.out);
|
||||
gotException = true;
|
||||
}
|
||||
|
||||
if (!gotException) {
|
||||
throw new RuntimeException("Test failed.");
|
||||
}
|
||||
System.out.println("Test PASSED");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static ImageInputStream createShortStream() {
|
||||
try {
|
||||
byte[] integerTestArray = new byte[] { 80 };
|
||||
ByteArrayInputStream bais = new ByteArrayInputStream(integerTestArray);
|
||||
|
||||
return ImageIO.createImageInputStream(bais);
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static TestCase[] createTests() {
|
||||
return new TestCase[]{
|
||||
new TestCase() {
|
||||
@Override
|
||||
void testRead(ImageInputStream iis) throws IOException {
|
||||
iis.readInt();
|
||||
}
|
||||
},
|
||||
new TestCase() {
|
||||
@Override
|
||||
void testRead(ImageInputStream iis) throws IOException {
|
||||
iis.readShort();
|
||||
}
|
||||
},
|
||||
new TestCase() {
|
||||
@Override
|
||||
void testRead(ImageInputStream iis) throws IOException {
|
||||
iis.readDouble();
|
||||
}
|
||||
},
|
||||
new TestCase() {
|
||||
@Override
|
||||
void testRead(ImageInputStream iis) throws IOException {
|
||||
iis.readFloat();
|
||||
}
|
||||
},
|
||||
new TestCase() {
|
||||
@Override
|
||||
void testRead(ImageInputStream iis) throws IOException {
|
||||
iis.readLong();
|
||||
}
|
||||
},
|
||||
new TestCase() {
|
||||
@Override
|
||||
void testRead(ImageInputStream iis) throws IOException {
|
||||
iis.readUnsignedInt();
|
||||
}
|
||||
},
|
||||
new TestCase() {
|
||||
@Override
|
||||
void testRead(ImageInputStream iis) throws IOException {
|
||||
iis.readUnsignedShort();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
106
jdk/test/javax/swing/JTableHeader/4473075/bug4473075.java
Normal file
106
jdk/test/javax/swing/JTableHeader/4473075/bug4473075.java
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/* @test
|
||||
@bug 4473075
|
||||
@summary JTable header rendering problem (after setting preferred size)
|
||||
@author Semyon Sadetsky
|
||||
*/
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.table.DefaultTableModel;
|
||||
import java.awt.*;
|
||||
import java.awt.event.InputEvent;
|
||||
|
||||
public class bug4473075 {
|
||||
public static final int USER_HEADER_HEIGHT = 40;
|
||||
private static JTable table;
|
||||
private static JScrollPane scpScroll;
|
||||
private static Point point;
|
||||
private static JFrame frame;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Robot robot = new Robot();
|
||||
robot.setAutoDelay(20);
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
frame = new JFrame();
|
||||
frame.setUndecorated(true);
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
table = new JTable();
|
||||
String t = "a cell text";
|
||||
table.setModel(new DefaultTableModel(
|
||||
new Object[][]{new Object[]{t, t, t, t, t}},
|
||||
new Object[]{t, t, t, t, t}));
|
||||
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
|
||||
scpScroll = new JScrollPane(table);
|
||||
|
||||
// Manually set preferred size of header...
|
||||
Dimension preferredSize = new Dimension(table.getSize().width,
|
||||
USER_HEADER_HEIGHT);
|
||||
table.getTableHeader().setPreferredSize(preferredSize);
|
||||
|
||||
frame.setContentPane(scpScroll);
|
||||
frame.setSize(250, 480);
|
||||
frame.setLocationRelativeTo(null);
|
||||
frame.setVisible(true);
|
||||
point = scpScroll.getHorizontalScrollBar()
|
||||
.getLocationOnScreen();
|
||||
}
|
||||
});
|
||||
robot.waitForIdle();
|
||||
|
||||
robot.mouseMove(point.x + 100, point.y + 5);
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.mouseMove(point.x + 150, point.y + 5);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
|
||||
int headerH = table.getTableHeader().getHeight();
|
||||
if (headerH != USER_HEADER_HEIGHT) {
|
||||
throw new RuntimeException("TableHeader height was not set: "
|
||||
+ headerH + " !=" + USER_HEADER_HEIGHT);
|
||||
}
|
||||
|
||||
double tableX = table.getX();
|
||||
int headerX = table.getTableHeader().getX();
|
||||
if (tableX != headerX) {
|
||||
throw new RuntimeException("TableHeader X position is wrong: "
|
||||
+ tableX + " !=" + headerX);
|
||||
}
|
||||
|
||||
double tableW = table.getWidth();
|
||||
int headerW = table.getTableHeader().getWidth();
|
||||
if (tableW != headerW) {
|
||||
throw new RuntimeException("TableHeader width is wrong: "
|
||||
+ tableW + " !=" + headerW);
|
||||
}
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
frame.dispose();
|
||||
}
|
||||
});
|
||||
System.out.println("ok");
|
||||
}
|
||||
}
|
@ -28,8 +28,6 @@
|
||||
@run main bug7123767
|
||||
*/
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.plaf.metal.MetalLookAndFeel;
|
||||
import java.awt.*;
|
||||
@ -160,8 +158,10 @@ public class bug7123767 extends JFrame {
|
||||
|
||||
// Moves mouse pointer to the corners of every GraphicsConfiguration
|
||||
private static void testToolTip() throws AWTException {
|
||||
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
|
||||
toolkit.realSync();
|
||||
|
||||
robot = new Robot();
|
||||
robot.setAutoDelay(20);
|
||||
robot.waitForIdle();
|
||||
|
||||
GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
GraphicsDevice[] devices = environment.getScreenDevices();
|
||||
@ -169,28 +169,28 @@ public class bug7123767 extends JFrame {
|
||||
GraphicsConfiguration[] configs = device.getConfigurations();
|
||||
for (GraphicsConfiguration config : configs) {
|
||||
Rectangle rect = config.getBounds();
|
||||
Insets insets = toolkit.getScreenInsets(config);
|
||||
Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(config);
|
||||
adjustInsets(rect, insets);
|
||||
|
||||
// Upper left
|
||||
glide(rect.x + rect.width / 2, rect.y + rect.height / 2,
|
||||
rect.x + MARGIN, rect.y + MARGIN);
|
||||
toolkit.realSync();
|
||||
robot.waitForIdle();
|
||||
|
||||
// Lower left
|
||||
glide(rect.x + rect.width / 2, rect.y + rect.height / 2,
|
||||
rect.x + MARGIN, rect.y + rect.height - MARGIN);
|
||||
toolkit.realSync();
|
||||
robot.waitForIdle();
|
||||
|
||||
// Upper right
|
||||
glide(rect.x + rect.width / 2, rect.y + rect.height / 2,
|
||||
rect.x + rect.width - MARGIN, rect.y + MARGIN);
|
||||
toolkit.realSync();
|
||||
robot.waitForIdle();
|
||||
|
||||
// Lower right
|
||||
glide(rect.x + rect.width / 2, rect.y + rect.height / 2,
|
||||
rect.x + rect.width - MARGIN, rect.y + rect.height - MARGIN);
|
||||
toolkit.realSync();
|
||||
robot.waitForIdle();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
98
jdk/test/javax/swing/plaf/synth/8040328/bug8040328.java
Normal file
98
jdk/test/javax/swing/plaf/synth/8040328/bug8040328.java
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/* @test
|
||||
@bug 8040328
|
||||
@summary JSlider has wrong preferred size with Synth LAF
|
||||
@author Semyon Sadetsky
|
||||
*/
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.plaf.synth.SynthLookAndFeel;
|
||||
import java.awt.*;
|
||||
import java.io.ByteArrayInputStream;
|
||||
|
||||
public class bug8040328 {
|
||||
private static String synthXml = "<synth>" +
|
||||
" <style id=\"all\">" +
|
||||
" <font name=\"Segoe UI\" size=\"12\"/>" +
|
||||
" </style>" +
|
||||
" <bind style=\"all\" type=\"REGION\" key=\".*\"/>" +
|
||||
" <style id=\"slider\">" +
|
||||
" <insets top=\"10\" left=\"5\" bottom=\"10\" right=\"5\"/>" +
|
||||
" </style>" +
|
||||
" <bind style=\"slider\" type=\"region\" key=\"Slider\"/>" +
|
||||
"</synth>";
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
SynthLookAndFeel lookAndFeel = new SynthLookAndFeel();
|
||||
lookAndFeel.load(new ByteArrayInputStream(synthXml.getBytes("UTF8")),
|
||||
bug8040328.class);
|
||||
UIManager.setLookAndFeel(lookAndFeel);
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
final JFrame frame = new JFrame();
|
||||
try {
|
||||
frame.setUndecorated(true);
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.setVisible(true);
|
||||
test(frame);
|
||||
} finally {
|
||||
frame.dispose();
|
||||
}
|
||||
}
|
||||
});
|
||||
System.out.println("ok");
|
||||
}
|
||||
|
||||
static void test(JFrame frame) {
|
||||
JSlider hslider = new JSlider(JSlider.HORIZONTAL);
|
||||
hslider.setBackground(Color.DARK_GRAY);
|
||||
frame.getContentPane().add(hslider, BorderLayout.CENTER);
|
||||
frame.getContentPane().setBackground(Color.CYAN);
|
||||
frame.pack();
|
||||
Insets insets = hslider.getInsets();
|
||||
if (hslider.getWidth() != 200 + insets.left + insets.right) {
|
||||
throw new RuntimeException(
|
||||
"Horizontal slider width is wrong " + hslider.getWidth());
|
||||
}
|
||||
if (hslider.getHeight() != hslider.getMinimumSize().height) {
|
||||
throw new RuntimeException(
|
||||
"Horizontal slider height is wrong " + hslider.getHeight());
|
||||
}
|
||||
frame.getContentPane().remove(hslider);
|
||||
|
||||
JSlider vslider = new JSlider(JSlider.VERTICAL);
|
||||
frame.getContentPane().add(vslider);
|
||||
frame.pack();
|
||||
insets = vslider.getInsets();
|
||||
if (vslider.getWidth() != vslider.getMinimumSize().width) {
|
||||
throw new RuntimeException(
|
||||
"Verical slider width is wrong " + vslider.getWidth());
|
||||
}
|
||||
if (vslider.getHeight() != 200 + insets.top + insets.bottom) {
|
||||
throw new RuntimeException(
|
||||
"Verical slider height is wrong " + vslider.getHeight());
|
||||
}
|
||||
}
|
||||
}
|
@ -23,10 +23,11 @@
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8062923 8062924
|
||||
* @bug 8062923 8062924 8074297 8076290
|
||||
* @run testng XslSubstringTest
|
||||
* @summary Test xsl substring function with negative, Inf and
|
||||
* NaN length and few other use cases
|
||||
* NaN length and few other use cases. Also test proper
|
||||
* processing of supplementary characters by substring function.
|
||||
*/
|
||||
|
||||
import java.io.StringReader;
|
||||
@ -39,6 +40,7 @@ import javax.xml.transform.stream.StreamResult;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
public class XslSubstringTest {
|
||||
@ -50,6 +52,36 @@ public class XslSubstringTest {
|
||||
+ "<xsl:template match='/'><t>";
|
||||
final String xslPost = "</t></xsl:template></xsl:stylesheet>";
|
||||
|
||||
@DataProvider(name = "GeneralTestsData")
|
||||
private Object[][] xmls() {
|
||||
return new Object[][] {
|
||||
{ "|<xsl:value-of select=\"substring('asdf',2, 1)\"/>|", "<t>|s|</t>"},
|
||||
{ "|<xsl:value-of select=\"substring('asdf',2, 1 div 0)\"/>|", "<t>|sdf|</t>"},
|
||||
{ "|<xsl:value-of select=\"substring('asdf',2, -0 div 0)\"/>|", "<t>||</t>" },
|
||||
{ "|<xsl:value-of select=\"substring('asdf',2, 1 div 0)\"/>|", "<t>|sdf|</t>" },
|
||||
// 8076290 bug test case
|
||||
{ "|<xsl:value-of select=\"substring('123', 0, 3)\"/>|", "<t>|12|</t>"},
|
||||
};
|
||||
}
|
||||
|
||||
@DataProvider(name = "SupplementaryCharactersTestData")
|
||||
private Object[][] dataSupplementaryCharacters() {
|
||||
return new Object[][] {
|
||||
// 8074297 bug test cases
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', 3)\"/>|", "<t>|BC|</t>"},
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', 3, 1)\"/>|", "<t>|B|</t>" },
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', 2, 2)\"/>|", "<t>|AB|</t>"},
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', 3, 2)\"/>|", "<t>|BC|</t>"},
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', 3, 4)\"/>|", "<t>|BC|</t>"},
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', 1, 1)\"/>|", "<t>|𠀋|</t>"},
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', 2, 1)\"/>|", "<t>|A|</t>"},
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', 1, 1 div 0)\"/>|", "<t>|𠀋ABC|</t>"},
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', -10, 1 div 0)\"/>|", "<t>|𠀋ABC|</t>"},
|
||||
// 8076290 bug test case
|
||||
{ "|<xsl:value-of select=\"substring('𠀋ABC', 0, 2)\"/>|", "<t>|𠀋|</t>"},
|
||||
};
|
||||
}
|
||||
|
||||
private String testTransform(String xsl) throws Exception {
|
||||
//Prepare sources for transormation
|
||||
Source src = new StreamSource(new StringReader(xml));
|
||||
@ -78,27 +110,14 @@ public class XslSubstringTest {
|
||||
"<t>||</t>");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGeneral1() throws Exception {
|
||||
assertEquals(testTransform("|<xsl:value-of select=\"substring('asdf',2, 1)\"/>|"),
|
||||
"<t>|s|</t>");
|
||||
@Test(dataProvider = "GeneralTestsData")
|
||||
public void testGeneralAll(String xsl, String result) throws Exception {
|
||||
assertEquals(testTransform(xsl), result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGeneral2() throws Exception {
|
||||
assertEquals(testTransform("|<xsl:value-of select=\"substring('asdf',2, 1 div 0)\"/>|"),
|
||||
"<t>|sdf|</t>");
|
||||
@Test(dataProvider = "SupplementaryCharactersTestData")
|
||||
public void testSupplementCharacters(String xsl, String result) throws Exception {
|
||||
assertEquals(testTransform(xsl), result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGeneral3() throws Exception {
|
||||
assertEquals(testTransform("|<xsl:value-of select=\"substring('asdf',2, -0 div 0)\"/>|"),
|
||||
"<t>||</t>");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGeneral4() throws Exception {
|
||||
assertEquals(testTransform("|<xsl:value-of select=\"substring('asdf',2, 0 div 0)\"/>|"),
|
||||
"<t>||</t>");
|
||||
}
|
||||
}
|
||||
|
@ -1,192 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
import shapegen.*;
|
||||
|
||||
import com.sun.source.util.JavacTask;
|
||||
import com.sun.tools.javac.util.Pair;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import javax.tools.Diagnostic;
|
||||
import javax.tools.JavaCompiler;
|
||||
import javax.tools.JavaFileObject;
|
||||
import javax.tools.SimpleJavaFileObject;
|
||||
import javax.tools.StandardJavaFileManager;
|
||||
import javax.tools.ToolProvider;
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import org.testng.annotations.BeforeSuite;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import static org.testng.Assert.*;
|
||||
|
||||
public class FDTest {
|
||||
|
||||
public enum TestKind {
|
||||
POSITIVE,
|
||||
NEGATIVE;
|
||||
|
||||
Collection<Hierarchy> getHierarchy(HierarchyGenerator hg) {
|
||||
return this == POSITIVE ?
|
||||
hg.getOK() : hg.getErr();
|
||||
}
|
||||
}
|
||||
|
||||
public static JavaCompiler comp;
|
||||
public static StandardJavaFileManager fm;
|
||||
|
||||
@BeforeSuite
|
||||
static void init() {
|
||||
// create default shared JavaCompiler - reused across multiple
|
||||
// compilations
|
||||
|
||||
comp = ToolProvider.getSystemJavaCompiler();
|
||||
fm = comp.getStandardFileManager(null, null, null);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
init();
|
||||
|
||||
for (Pair<TestKind,Hierarchy> fdtest : generateCases()) {
|
||||
runTest(fdtest.fst, fdtest.snd, comp, fm);
|
||||
}
|
||||
}
|
||||
|
||||
@Test(dataProvider = "fdCases")
|
||||
public void testOneCase(TestKind tk, Hierarchy hs)
|
||||
throws Exception {
|
||||
FDTest.runTest(tk, hs, comp, fm);
|
||||
}
|
||||
|
||||
@DataProvider(name = "fdCases")
|
||||
public Object[][] caseGenerator() {
|
||||
List<Pair<TestKind, Hierarchy>> cases = generateCases();
|
||||
Object[][] fdCases = new Object[cases.size()][];
|
||||
for (int i = 0; i < cases.size(); ++i) {
|
||||
fdCases[i] = new Object[2];
|
||||
fdCases[i][0] = cases.get(i).fst;
|
||||
fdCases[i][1] = cases.get(i).snd;
|
||||
}
|
||||
return fdCases;
|
||||
}
|
||||
|
||||
public static List<Pair<TestKind, Hierarchy>> generateCases() {
|
||||
ArrayList<Pair<TestKind,Hierarchy>> list = new ArrayList<>();
|
||||
HierarchyGenerator hg = new HierarchyGenerator();
|
||||
for (TestKind tk : TestKind.values()) {
|
||||
for (Hierarchy hs : tk.getHierarchy(hg)) {
|
||||
list.add(new Pair<>(tk, hs));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public static void runTest(TestKind tk, Hierarchy hs,
|
||||
JavaCompiler comp, StandardJavaFileManager fm) throws Exception {
|
||||
new FDTest(tk, hs).run(comp, fm);
|
||||
}
|
||||
|
||||
TestKind tk;
|
||||
Hierarchy hs;
|
||||
DefenderTestSource source;
|
||||
DiagnosticChecker diagChecker;
|
||||
|
||||
public FDTest() {}
|
||||
|
||||
FDTest(TestKind tk, Hierarchy hs) {
|
||||
this.tk = tk;
|
||||
this.hs = hs;
|
||||
this.source = new DefenderTestSource();
|
||||
this.diagChecker = new DiagnosticChecker();
|
||||
}
|
||||
|
||||
void run(JavaCompiler tool, StandardJavaFileManager fm) throws Exception {
|
||||
JavacTask ct = (JavacTask)tool.getTask(null, fm, diagChecker,
|
||||
null, null, Arrays.asList(source));
|
||||
try {
|
||||
ct.analyze();
|
||||
} catch (Throwable ex) {
|
||||
fail("Error thrown when analyzing the following source:\n" + source.getCharContent(true));
|
||||
}
|
||||
check();
|
||||
}
|
||||
|
||||
void check() {
|
||||
boolean errorExpected = tk == TestKind.NEGATIVE;
|
||||
if (errorExpected != diagChecker.errorFound) {
|
||||
fail("problem in source: \n" +
|
||||
"\nerror found = " + diagChecker.errorFound +
|
||||
"\nerror expected = " + errorExpected +
|
||||
"\n" + dumpHierarchy() +
|
||||
"\n" + source.getCharContent(true));
|
||||
}
|
||||
}
|
||||
|
||||
String dumpHierarchy() {
|
||||
StringBuilder buf = new StringBuilder();
|
||||
buf.append("root = " + hs.root + "\n");
|
||||
for (ClassCase cc : hs.all) {
|
||||
buf.append(" class name = " + cc.getName() + "\n");
|
||||
buf.append(" class OK = " + cc.get_OK() + "\n");
|
||||
buf.append(" prov = " + cc.get_mprov() + "\n");
|
||||
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
class DefenderTestSource extends SimpleJavaFileObject {
|
||||
|
||||
String source;
|
||||
|
||||
public DefenderTestSource() {
|
||||
super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
|
||||
StringBuilder buf = new StringBuilder();
|
||||
List<ClassCase> defaultRef = new ArrayList<>();
|
||||
for (ClassCase cc : hs.all) {
|
||||
Hierarchy.genClassDef(buf, cc, null, defaultRef);
|
||||
}
|
||||
source = buf.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
|
||||
return source;
|
||||
}
|
||||
}
|
||||
|
||||
static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
|
||||
|
||||
boolean errorFound;
|
||||
|
||||
public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
|
||||
if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
|
||||
errorFound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
interface LTII {
|
||||
|
||||
interface ILsp1 {
|
||||
String m();
|
||||
}
|
||||
|
||||
interface ILsp2 {
|
||||
String m(String x);
|
||||
}
|
||||
|
||||
default ILsp1 t1() {
|
||||
return () -> { return "yo"; };
|
||||
}
|
||||
|
||||
default ILsp2 t2() {
|
||||
return (x) -> { return "snur" + x; };
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public class LambdaTranslationInInterface implements LTII {
|
||||
|
||||
public void testLambdaInDefaultMethod() {
|
||||
assertEquals(t1().m(), "yo");
|
||||
assertEquals(t2().m("p"), "snurp");
|
||||
}
|
||||
|
||||
}
|
@ -1,70 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
@Test
|
||||
public class LambdaTranslationInnerConstructor {
|
||||
|
||||
public void testLambdaWithInnerConstructor() {
|
||||
assertEquals(seq1().m().toString(), "Cbl:nada");
|
||||
assertEquals(seq2().m("rats").toString(), "Cbl:rats");
|
||||
}
|
||||
|
||||
Ib1 seq1() {
|
||||
return () -> { return new Cbl(); };
|
||||
}
|
||||
|
||||
Ib2 seq2() {
|
||||
return (x) -> { return new Cbl(x); };
|
||||
}
|
||||
|
||||
class Cbl {
|
||||
String val;
|
||||
|
||||
Cbl() {
|
||||
this.val = "nada";
|
||||
}
|
||||
|
||||
Cbl(String z) {
|
||||
this.val = z;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "Cbl:" + val;
|
||||
}
|
||||
}
|
||||
|
||||
interface Ib1 {
|
||||
Object m();
|
||||
}
|
||||
|
||||
interface Ib2 {
|
||||
Object m(String x);
|
||||
}
|
||||
}
|
@ -1,146 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import java.lang.reflect.Array;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertTrue;
|
||||
import static org.testng.Assert.fail;
|
||||
|
||||
/**
|
||||
* Method references and raw types.
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public class MethodReferenceTestFDCCE {
|
||||
|
||||
static void assertCCE(Throwable t) {
|
||||
assertEquals(t.getClass().getName(), "java.lang.ClassCastException");
|
||||
}
|
||||
|
||||
interface Pred<T> { boolean accept(T x); }
|
||||
|
||||
interface Ps { boolean accept(short x); }
|
||||
|
||||
interface Oo { Object too(int x); }
|
||||
|
||||
interface Reto<T> { T m(); }
|
||||
|
||||
class A {}
|
||||
class B extends A {}
|
||||
|
||||
static boolean isMinor(int x) {
|
||||
return x < 18;
|
||||
}
|
||||
|
||||
static boolean tst(A x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
static Object otst(Object x) {
|
||||
return x;
|
||||
}
|
||||
|
||||
static boolean stst(Short x) {
|
||||
return x < 18;
|
||||
}
|
||||
|
||||
static short ritst() {
|
||||
return 123;
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDPrim1() {
|
||||
Pred<Byte> p = MethodReferenceTestFDCCE::isMinor;
|
||||
Pred p2 = p;
|
||||
assertTrue(p2.accept((Byte)(byte)15));
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDPrim2() {
|
||||
Pred<Byte> p = MethodReferenceTestFDCCE::isMinor;
|
||||
Pred p2 = p;
|
||||
assertTrue(p2.accept((byte)15));
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDPrimICCE() {
|
||||
Pred<Byte> p = MethodReferenceTestFDCCE::isMinor;
|
||||
Pred p2 = p;
|
||||
try {
|
||||
p2.accept(15); // should throw CCE
|
||||
fail("Exception should have been thrown");
|
||||
} catch (Throwable t) {
|
||||
assertCCE(t);
|
||||
}
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDPrimOCCE() {
|
||||
Pred<Byte> p = MethodReferenceTestFDCCE::isMinor;
|
||||
Pred p2 = p;
|
||||
try {
|
||||
p2.accept(new Object()); // should throw CCE
|
||||
fail("Exception should have been thrown");
|
||||
} catch (Throwable t) {
|
||||
assertCCE(t);
|
||||
}
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDRef() {
|
||||
Pred<B> p = MethodReferenceTestFDCCE::tst;
|
||||
Pred p2 = p;
|
||||
assertTrue(p2.accept(new B()));
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDRefCCE() {
|
||||
Pred<B> p = MethodReferenceTestFDCCE::tst;
|
||||
Pred p2 = p;
|
||||
try {
|
||||
p2.accept(new A()); // should throw CCE
|
||||
fail("Exception should have been thrown");
|
||||
} catch (Throwable t) {
|
||||
assertCCE(t);
|
||||
}
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDPrimPrim() {
|
||||
Ps p = MethodReferenceTestFDCCE::isMinor;
|
||||
assertTrue(p.accept((byte)15));
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDPrimBoxed() {
|
||||
Ps p = MethodReferenceTestFDCCE::stst;
|
||||
assertTrue(p.accept((byte)15));
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDPrimRef() {
|
||||
Oo p = MethodReferenceTestFDCCE::otst;
|
||||
assertEquals(p.too(15).getClass().getName(), "java.lang.Integer");
|
||||
}
|
||||
|
||||
public void testMethodReferenceFDRet1() {
|
||||
Reto<Short> p = MethodReferenceTestFDCCE::ritst;
|
||||
assertEquals(p.m(), (Short)(short)123);
|
||||
}
|
||||
|
||||
}
|
@ -1,79 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
interface IDSs { String m(String a); }
|
||||
|
||||
interface InDefA {
|
||||
default String xsA__(String s) {
|
||||
return "A__xsA:" + s;
|
||||
}
|
||||
|
||||
default String xsAB_(String s) {
|
||||
return "AB_xsA:" + s;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
interface InDefB extends InDefA {
|
||||
|
||||
default String xsAB_(String s) {
|
||||
return "AB_xsB:" + s;
|
||||
}
|
||||
|
||||
default String xs_B_(String s) {
|
||||
return "_B_xsB:" + s;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public class MethodReferenceTestInnerDefault implements InDefB {
|
||||
|
||||
public void testMethodReferenceInnerDefault() {
|
||||
(new In()).testMethodReferenceInnerDefault();
|
||||
}
|
||||
|
||||
class In {
|
||||
|
||||
public void testMethodReferenceInnerDefault() {
|
||||
IDSs q;
|
||||
|
||||
q = MethodReferenceTestInnerDefault.this::xsA__;
|
||||
assertEquals(q.m("*"), "A__xsA:*");
|
||||
|
||||
q = MethodReferenceTestInnerDefault.this::xsAB_;
|
||||
assertEquals(q.m("*"), "AB_xsB:*");
|
||||
|
||||
q = MethodReferenceTestInnerDefault.this::xs_B_;
|
||||
assertEquals(q.m("*"), "_B_xsB:*");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,86 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
@Test
|
||||
public class MethodReferenceTestInnerInstance {
|
||||
|
||||
public void testMethodReferenceInnerInstance() {
|
||||
cia().cib().testMethodReferenceInstance();
|
||||
}
|
||||
|
||||
public void testMethodReferenceInnerExternal() {
|
||||
cia().cib().testMethodReferenceExternal();
|
||||
}
|
||||
|
||||
interface SI {
|
||||
String m(Integer a);
|
||||
}
|
||||
|
||||
class CIA {
|
||||
|
||||
String xI(Integer i) {
|
||||
return "xI:" + i;
|
||||
}
|
||||
|
||||
public class CIB {
|
||||
|
||||
public void testMethodReferenceInstance() {
|
||||
SI q;
|
||||
|
||||
q = CIA.this::xI;
|
||||
assertEquals(q.m(55), "xI:55");
|
||||
}
|
||||
|
||||
public void testMethodReferenceExternal() {
|
||||
SI q;
|
||||
|
||||
q = (new E())::xI;
|
||||
assertEquals(q.m(77), "ExI:77");
|
||||
}
|
||||
}
|
||||
|
||||
CIB cib() {
|
||||
return new CIB();
|
||||
}
|
||||
|
||||
class E {
|
||||
|
||||
String xI(Integer i) {
|
||||
return "ExI:" + i;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
CIA cia() {
|
||||
return new CIA();
|
||||
}
|
||||
}
|
@ -1,241 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import java.lang.reflect.Array;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
@Test
|
||||
public class MethodReferenceTestInnerVarArgsThis {
|
||||
|
||||
interface NsII {
|
||||
|
||||
String m(Integer a, Integer b);
|
||||
}
|
||||
|
||||
interface Nsiii {
|
||||
|
||||
String m(int a, int b, int c);
|
||||
}
|
||||
|
||||
interface Nsi {
|
||||
|
||||
String m(int a);
|
||||
}
|
||||
|
||||
interface NsaO {
|
||||
|
||||
String m(Object[] a);
|
||||
}
|
||||
|
||||
interface Nsai {
|
||||
|
||||
String m(int[] a);
|
||||
}
|
||||
|
||||
interface Nsvi {
|
||||
|
||||
String m(int... va);
|
||||
}
|
||||
|
||||
class CIA {
|
||||
|
||||
String xvI(Integer... vi) {
|
||||
StringBuilder sb = new StringBuilder("xvI:");
|
||||
for (Integer i : vi) {
|
||||
sb.append(i);
|
||||
sb.append("-");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
String xIvI(Integer f, Integer... vi) {
|
||||
StringBuilder sb = new StringBuilder("xIvI:");
|
||||
sb.append(f);
|
||||
for (Integer i : vi) {
|
||||
sb.append(i);
|
||||
sb.append("-");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
String xvi(int... vi) {
|
||||
int sum = 0;
|
||||
for (int i : vi) {
|
||||
sum += i;
|
||||
}
|
||||
return "xvi:" + sum;
|
||||
}
|
||||
|
||||
String xIvi(Integer f, int... vi) {
|
||||
int sum = 0;
|
||||
for (int i : vi) {
|
||||
sum += i;
|
||||
}
|
||||
return "xIvi:(" + f + ")" + sum;
|
||||
}
|
||||
|
||||
String xvO(Object... vi) {
|
||||
StringBuilder sb = new StringBuilder("xvO:");
|
||||
for (Object i : vi) {
|
||||
if (i.getClass().isArray()) {
|
||||
sb.append("[");
|
||||
int len = Array.getLength(i);
|
||||
for (int x = 0; x < len; ++x) {
|
||||
sb.append(Array.get(i, x));
|
||||
sb.append(",");
|
||||
}
|
||||
sb.append("]");
|
||||
|
||||
} else {
|
||||
sb.append(i);
|
||||
}
|
||||
sb.append("*");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public class CIB {
|
||||
|
||||
// These should be processed as var args
|
||||
public void testVarArgsNsSuperclass() {
|
||||
NsII q;
|
||||
|
||||
q = CIA.this::xvO;
|
||||
assertEquals(q.m(55, 66), "xvO:55*66*");
|
||||
}
|
||||
|
||||
public void testVarArgsNsArray() {
|
||||
Nsai q;
|
||||
|
||||
q = CIA.this::xvO;
|
||||
assertEquals(q.m(new int[]{55, 66}), "xvO:[55,66,]*");
|
||||
}
|
||||
|
||||
public void testVarArgsNsII() {
|
||||
NsII q;
|
||||
|
||||
q = CIA.this::xvI;
|
||||
assertEquals(q.m(33, 7), "xvI:33-7-");
|
||||
|
||||
q = CIA.this::xIvI;
|
||||
assertEquals(q.m(50, 40), "xIvI:5040-");
|
||||
|
||||
q = CIA.this::xvi;
|
||||
assertEquals(q.m(100, 23), "xvi:123");
|
||||
|
||||
q = CIA.this::xIvi;
|
||||
assertEquals(q.m(9, 21), "xIvi:(9)21");
|
||||
}
|
||||
|
||||
public void testVarArgsNsiii() {
|
||||
Nsiii q;
|
||||
|
||||
q = CIA.this::xvI;
|
||||
assertEquals(q.m(3, 2, 1), "xvI:3-2-1-");
|
||||
|
||||
q = CIA.this::xIvI;
|
||||
assertEquals(q.m(888, 99, 2), "xIvI:88899-2-");
|
||||
|
||||
q = CIA.this::xvi;
|
||||
assertEquals(q.m(900, 80, 7), "xvi:987");
|
||||
|
||||
q = CIA.this::xIvi;
|
||||
assertEquals(q.m(333, 27, 72), "xIvi:(333)99");
|
||||
}
|
||||
|
||||
public void testVarArgsNsi() {
|
||||
Nsi q;
|
||||
|
||||
q = CIA.this::xvI;
|
||||
assertEquals(q.m(3), "xvI:3-");
|
||||
|
||||
q = CIA.this::xIvI;
|
||||
assertEquals(q.m(888), "xIvI:888");
|
||||
|
||||
q = CIA.this::xvi;
|
||||
assertEquals(q.m(900), "xvi:900");
|
||||
|
||||
q = CIA.this::xIvi;
|
||||
assertEquals(q.m(333), "xIvi:(333)0");
|
||||
}
|
||||
|
||||
// These should NOT be processed as var args
|
||||
public void testVarArgsNsaO() {
|
||||
NsaO q;
|
||||
|
||||
q = CIA.this::xvO;
|
||||
assertEquals(q.m(new String[]{"yo", "there", "dude"}), "xvO:yo*there*dude*");
|
||||
}
|
||||
}
|
||||
|
||||
CIB cib() {
|
||||
return new CIB();
|
||||
}
|
||||
|
||||
class E {
|
||||
|
||||
String xI(Integer i) {
|
||||
return "ExI:" + i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CIA cia() {
|
||||
return new CIA();
|
||||
}
|
||||
|
||||
// These should be processed as var args
|
||||
public void testVarArgsNsSuperclass() {
|
||||
cia().cib().testVarArgsNsSuperclass();
|
||||
}
|
||||
|
||||
public void testVarArgsNsArray() {
|
||||
cia().cib().testVarArgsNsArray();
|
||||
}
|
||||
|
||||
public void testVarArgsNsII() {
|
||||
cia().cib().testVarArgsNsII();
|
||||
}
|
||||
|
||||
public void testVarArgsNsiii() {
|
||||
cia().cib().testVarArgsNsiii();
|
||||
}
|
||||
|
||||
public void testVarArgsNsi() {
|
||||
cia().cib().testVarArgsNsi();
|
||||
}
|
||||
|
||||
// These should NOT be processed as var args
|
||||
|
||||
public void testVarArgsNsaO() {
|
||||
cia().cib().testVarArgsNsaO();
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,61 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
class MethodReferenceTestInstance_E {
|
||||
String xI(Integer i) {
|
||||
return "ExI:" + i;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public class MethodReferenceTestInstance {
|
||||
|
||||
interface SI { String m(Integer a); }
|
||||
|
||||
String xI(Integer i) {
|
||||
return "xI:" + i;
|
||||
}
|
||||
|
||||
public void testMethodReferenceInstance() {
|
||||
SI q;
|
||||
|
||||
q = this::xI;
|
||||
assertEquals(q.m(55), "xI:55");
|
||||
}
|
||||
|
||||
public void testMethodReferenceExternal() {
|
||||
SI q;
|
||||
|
||||
q = (new MethodReferenceTestInstance_E())::xI;
|
||||
assertEquals(q.m(77), "ExI:77");
|
||||
}
|
||||
|
||||
}
|
@ -1,173 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
@Test
|
||||
public class MethodReferenceTestKinds extends MethodReferenceTestKindsSup {
|
||||
|
||||
interface S0 { String get(); }
|
||||
interface S1 { String get(MethodReferenceTestKinds x); }
|
||||
interface S2 { String get(MethodReferenceTestKinds x, MethodReferenceTestKinds y); }
|
||||
|
||||
interface SXN0 { MethodReferenceTestKindsBase make(MethodReferenceTestKinds x); }
|
||||
interface SXN1 { MethodReferenceTestKindsBase make(MethodReferenceTestKinds x, String str); }
|
||||
|
||||
interface SN0 { MethodReferenceTestKindsBase make(); }
|
||||
interface SN1 { MethodReferenceTestKindsBase make(String x); }
|
||||
|
||||
class In extends MethodReferenceTestKindsBase {
|
||||
In(String val) {
|
||||
this.val = val;
|
||||
}
|
||||
|
||||
In() {
|
||||
this("blank");
|
||||
}
|
||||
}
|
||||
|
||||
String instanceMethod0() { return "IM:0-" + this; }
|
||||
String instanceMethod1(MethodReferenceTestKinds x) { return "IM:1-" + this + x; }
|
||||
|
||||
static String staticMethod0() { return "SM:0"; }
|
||||
static String staticMethod1(MethodReferenceTestKinds x) { return "SM:1-" + x; }
|
||||
|
||||
MethodReferenceTestKinds(String val) {
|
||||
super(val);
|
||||
}
|
||||
|
||||
MethodReferenceTestKinds() {
|
||||
super("blank");
|
||||
}
|
||||
|
||||
MethodReferenceTestKinds inst(String val) {
|
||||
return new MethodReferenceTestKinds(val);
|
||||
}
|
||||
|
||||
public void testMRBound() {
|
||||
S0 var = this::instanceMethod0;
|
||||
assertEquals(var.get(), "IM:0-MethodReferenceTestKinds(blank)");
|
||||
}
|
||||
|
||||
public void testMRBoundArg() {
|
||||
S1 var = this::instanceMethod1;
|
||||
assertEquals(var.get(inst("arg")), "IM:1-MethodReferenceTestKinds(blank)MethodReferenceTestKinds(arg)");
|
||||
}
|
||||
|
||||
public void testMRUnbound() {
|
||||
S1 var = MethodReferenceTestKinds::instanceMethod0;
|
||||
assertEquals(var.get(inst("rcvr")), "IM:0-MethodReferenceTestKinds(rcvr)");
|
||||
}
|
||||
|
||||
public void testMRUnboundArg() {
|
||||
S2 var = MethodReferenceTestKinds::instanceMethod1;
|
||||
assertEquals(var.get(inst("rcvr"), inst("arg")), "IM:1-MethodReferenceTestKinds(rcvr)MethodReferenceTestKinds(arg)");
|
||||
}
|
||||
|
||||
public void testMRSuper() {
|
||||
S0 var = super::instanceMethod0;
|
||||
assertEquals(var.get(), "SIM:0-MethodReferenceTestKinds(blank)");
|
||||
}
|
||||
|
||||
public void testMRSuperArg() {
|
||||
S1 var = super::instanceMethod1;
|
||||
assertEquals(var.get(inst("arg")), "SIM:1-MethodReferenceTestKinds(blank)MethodReferenceTestKinds(arg)");
|
||||
}
|
||||
|
||||
public void testMRStatic() {
|
||||
S0 var = MethodReferenceTestKinds::staticMethod0;
|
||||
assertEquals(var.get(), "SM:0");
|
||||
}
|
||||
|
||||
public void testMRStaticArg() {
|
||||
S1 var = MethodReferenceTestKinds::staticMethod1;
|
||||
assertEquals(var.get(inst("arg")), "SM:1-MethodReferenceTestKinds(arg)");
|
||||
}
|
||||
|
||||
public void testMRTopLevel() {
|
||||
SN0 var = MethodReferenceTestKindsBase::new;
|
||||
assertEquals(var.make().toString(), "MethodReferenceTestKindsBase(blank)");
|
||||
}
|
||||
|
||||
public void testMRTopLevelArg() {
|
||||
SN1 var = MethodReferenceTestKindsBase::new;
|
||||
assertEquals(var.make("name").toString(), "MethodReferenceTestKindsBase(name)");
|
||||
}
|
||||
/* unbound inner case not supported anymore (dropped by EG)
|
||||
public void testMRUnboundInner() {
|
||||
SXN0 var = MethodReferenceTestKinds.In::new;
|
||||
assertEquals(var.make(inst("out")).toString(), "In(blank)");
|
||||
}
|
||||
|
||||
public void testMRUnboundInnerArg() {
|
||||
SXN1 var = MethodReferenceTestKinds.In::new;
|
||||
assertEquals(var.make(inst("out"), "name").toString(), "In(name)");
|
||||
}
|
||||
*/
|
||||
public void testMRImplicitInner() {
|
||||
SN0 var = MethodReferenceTestKinds.In::new;
|
||||
assertEquals(var.make().toString(), "In(blank)");
|
||||
}
|
||||
|
||||
public void testMRImplicitInnerArg() {
|
||||
SN1 var = MethodReferenceTestKinds.In::new;
|
||||
assertEquals(var.make("name").toString(), "In(name)");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class MethodReferenceTestKindsBase {
|
||||
String val = "unset";
|
||||
|
||||
public String toString() {
|
||||
return getClass().getSimpleName() + "(" + val + ")";
|
||||
}
|
||||
|
||||
MethodReferenceTestKindsBase(String val) {
|
||||
this.val = val;
|
||||
}
|
||||
|
||||
MethodReferenceTestKindsBase() {
|
||||
this("blank");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class MethodReferenceTestKindsSup extends MethodReferenceTestKindsBase {
|
||||
String instanceMethod0() { return "SIM:0-" + this; }
|
||||
String instanceMethod1(MethodReferenceTestKinds x) { return "SIM:1-" + this + x; }
|
||||
|
||||
MethodReferenceTestKindsSup(String val) {
|
||||
super(val);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,130 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
@Test
|
||||
public class MethodReferenceTestNew {
|
||||
|
||||
interface M0<T> {
|
||||
|
||||
T m();
|
||||
}
|
||||
|
||||
static class N0 {
|
||||
|
||||
N0() {
|
||||
}
|
||||
}
|
||||
|
||||
interface M1<T> {
|
||||
|
||||
T m(Integer a);
|
||||
}
|
||||
|
||||
static class N1 {
|
||||
|
||||
int i;
|
||||
|
||||
N1(int i) {
|
||||
this.i = i;
|
||||
}
|
||||
}
|
||||
|
||||
interface M2<T> {
|
||||
|
||||
T m(Integer n, String o);
|
||||
}
|
||||
|
||||
static class N2 {
|
||||
|
||||
Number n;
|
||||
Object o;
|
||||
|
||||
N2(Number n, Object o) {
|
||||
this.n = n;
|
||||
this.o = o;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "N2(" + n + "," + o + ")";
|
||||
}
|
||||
}
|
||||
|
||||
interface MV {
|
||||
|
||||
NV m(Integer ai, int i);
|
||||
}
|
||||
|
||||
static class NV {
|
||||
|
||||
int i;
|
||||
|
||||
NV(int... v) {
|
||||
i = 0;
|
||||
for (int x : v) {
|
||||
i += x;
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "NV(" + i + ")";
|
||||
}
|
||||
}
|
||||
|
||||
public void testConstructorReference0() {
|
||||
M0<N0> q;
|
||||
|
||||
q = N0::new;
|
||||
assertEquals(q.m().getClass().getSimpleName(), "N0");
|
||||
}
|
||||
|
||||
public void testConstructorReference1() {
|
||||
M1<N1> q;
|
||||
|
||||
q = N1::new;
|
||||
assertEquals(q.m(14).getClass().getSimpleName(), "N1");
|
||||
}
|
||||
|
||||
public void testConstructorReference2() {
|
||||
M2<N2> q;
|
||||
|
||||
q = N2::new;
|
||||
assertEquals(q.m(7, "hi").toString(), "N2(7,hi)");
|
||||
}
|
||||
|
||||
public void testConstructorReferenceVarArgs() {
|
||||
MV q;
|
||||
|
||||
q = NV::new;
|
||||
assertEquals(q.m(5, 45).toString(), "NV(50)");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,150 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Robert Field
|
||||
*/
|
||||
|
||||
@Test
|
||||
public class MethodReferenceTestNewInner {
|
||||
|
||||
String note = "NO NOTE";
|
||||
|
||||
interface M0<T> {
|
||||
|
||||
T m();
|
||||
}
|
||||
|
||||
interface MP<T> {
|
||||
|
||||
T m(MethodReferenceTestNewInner m);
|
||||
}
|
||||
|
||||
class N0 {
|
||||
|
||||
N0() {
|
||||
}
|
||||
}
|
||||
|
||||
interface M1<T> {
|
||||
|
||||
T m(Integer a);
|
||||
}
|
||||
|
||||
class N1 {
|
||||
|
||||
int i;
|
||||
|
||||
N1(int i) {
|
||||
this.i = i;
|
||||
}
|
||||
}
|
||||
|
||||
interface M2<T> {
|
||||
|
||||
T m(Integer n, String o);
|
||||
}
|
||||
|
||||
class N2 {
|
||||
|
||||
Number n;
|
||||
Object o;
|
||||
|
||||
N2(Number n, Object o) {
|
||||
this.n = n;
|
||||
this.o = o;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return note + ":N2(" + n + "," + o + ")";
|
||||
}
|
||||
}
|
||||
|
||||
interface MV {
|
||||
|
||||
NV m(Integer ai, int i);
|
||||
}
|
||||
|
||||
class NV {
|
||||
|
||||
int i;
|
||||
|
||||
NV(int... v) {
|
||||
i = 0;
|
||||
for (int x : v) {
|
||||
i += x;
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return note + ":NV(" + i + ")";
|
||||
}
|
||||
}
|
||||
|
||||
/* unbound constructor case not supported anymore (dropped by EG)
|
||||
public static void testConstructorReferenceP() {
|
||||
MP<N0> q;
|
||||
|
||||
q = N0::new;
|
||||
assertEquals(q.m(new MethodReferenceTestNewInner()).getClass().getSimpleName(), "N0");
|
||||
}
|
||||
*/
|
||||
public void testConstructorReference0() {
|
||||
M0<N0> q;
|
||||
|
||||
q = N0::new;
|
||||
assertEquals(q.m().getClass().getSimpleName(), "N0");
|
||||
}
|
||||
|
||||
public void testConstructorReference1() {
|
||||
M1<N1> q;
|
||||
|
||||
q = N1::new;
|
||||
assertEquals(q.m(14).getClass().getSimpleName(), "N1");
|
||||
}
|
||||
|
||||
public void testConstructorReference2() {
|
||||
M2<N2> q;
|
||||
|
||||
note = "T2";
|
||||
q = N2::new;
|
||||
assertEquals(q.m(7, "hi").toString(), "T2:N2(7,hi)");
|
||||
}
|
||||
|
||||
/***
|
||||
public void testConstructorReferenceVarArgs() {
|
||||
MV q;
|
||||
|
||||
note = "TVA";
|
||||
q = NV::new;
|
||||
assertEquals(q.m(5, 45).toString(), "TNV:NV(50)");
|
||||
}
|
||||
***/
|
||||
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user