This commit is contained in:
Xiaobin Lu 2009-04-22 11:47:26 -07:00
commit ee78b15d5a
442 changed files with 41369 additions and 8704 deletions

View File

@ -28,3 +28,5 @@ caf58ffa084568990cbb3441f9ae188e36b31770 jdk7-b42
a25c5ec5e40e07733d1ff9898a0abe36159288ff jdk7-b51
7a90e89e36d103038f8667f6a7daae34ecfa1ad8 jdk7-b52
d52186ee770dac57950536cd00ccbfdef360b04c jdk7-b53
15096652c4d48dfb9fc0b2cb135304db94c65ba0 jdk7-b54
c8b275d62d6b0a980c510e839b70292245863e85 jdk7-b55

View File

@ -28,3 +28,5 @@ aee93a8992d2389121eb610c00a86196f3e2b9b0 jdk7-b49
0f0189d55ce4a1f7840da7582ac7d970b3b7ab15 jdk7-b51
4264c2fe66493e57c411045a1b61377796641e45 jdk7-b52
c235f4a8559d196879c56af80159f67ee5d0e720 jdk7-b53
2ef382b1bbd58a68e668391c6145a4b2066c5b96 jdk7-b54
aea0ace7a1e43619800931d42bbf69c579361c2d jdk7-b55

View File

@ -28,3 +28,5 @@ d70978bc64bc7a04be7797ab0dcd9b7b1b3a6bff jdk7-b49
3eb8f1047a7402a9a79937d1c39560e931e91da2 jdk7-b51
bec82237d694f9802b820fa11bbb4f7fa9bf8e77 jdk7-b52
3c4d73194f6f89f040ae3b2d257335dfa8a1b2b5 jdk7-b53
8130ac858d6789d5853d23044ba4a992afda574a jdk7-b54
7a869f16ba83060c34b77620406cfa89d1cd7084 jdk7-b55

View File

@ -28,3 +28,5 @@ dae503d9f04c1a11e182dbf7f770509c28dc0609 jdk7-b50
2581d90c6c9b2012da930eb4742add94a03069a0 jdk7-b51
1b1e8f1a4fe8cebc01c022484f78148e17b62a0d jdk7-b52
032c6af894dae8d939b3dd31d82042549e7793e0 jdk7-b53
fafab5d5349c7c066d677538db67a1ee0fb33bd2 jdk7-b54
f8e839c086152da70d6ec5913ba6f9f509282e8d jdk7-b55

View File

@ -28,3 +28,5 @@ e8514e2be76d90889ebdb90d627aca2db5c150c6 jdk7-b50
ae890d80d5dffcd4dc77a1f17d768e192d1852c7 jdk7-b51
69ad87dc25cbcaaaded4727199395ad0c78bc427 jdk7-b52
e8837366d3fd72f7c7a47ebfdbd5106c16156f12 jdk7-b53
946a9f0c493261fa6a010dc33e61b9b535ba80c1 jdk7-b54
039945fba683ee6773a721e2bd4e449f6133769a jdk7-b55

View File

@ -28,3 +28,5 @@ af4a3eeb7812a5d09a241c50b51b3c648a9d45c1 jdk7-b46
41a66a42791ba90bff489af72cbfea71be9b40a5 jdk7-b51
e646890d18b770f625f14ed4ad5c50554d8d3d8b jdk7-b52
b250218eb2e534384667ec73e3713e684667fd4c jdk7-b53
50ea00dc5f143fe00025233e704903c37f8464aa jdk7-b54
e0eebd978b830c09e7862cff3f77a914c15651c9 jdk7-b55

View File

@ -28,3 +28,5 @@ b4ac413b1f129eeef0acab3f31081c1b7dfe3b27 jdk7-b47
fea0898259ae41c73620b1815aa48f036216155c jdk7-b51
bcbeadb4a5d759b29e876ee2c83401e91ff22f60 jdk7-b52
a2033addca678f9e4c0d92ffa1e389171cc9321d jdk7-b53
d1c43d1f5676a24ba86221ac7cad5694f3a9afda jdk7-b54
522bb5aa17e0c0cff00b1ed7d1b51bc4db2cfef9 jdk7-b55

View File

@ -41,7 +41,7 @@ endif
# Omit mirror since it's built with the apt tool.
SUBDIRS = $(SCRIPT_SUBDIR) image security crypto/provider jndi jmx \
java inputmethods org xml rowset net/httpserver net/ssl demo \
tools jarsigner tracing servicetag
tools jarsigner tracing servicetag nio
all build clean clobber::
$(SUBDIRS-loop)

View File

@ -0,0 +1,38 @@
#
# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
#
# Makefile for com.sun.nio packages.
#
BUILDDIR = ../../..
include $(BUILDDIR)/common/Defs.gmk
SUBDIRS = sctp
all build clean clobber::
$(SUBDIRS-loop)
clean clobber::
$(RM) -r $(CLASSDESTDIR)/com/sun/nio

View File

@ -0,0 +1,39 @@
#
# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
#
# These are the names of Java classes for which we will make .h files.
#
ifneq ($(PLATFORM), windows)
FILES_export = \
sun/nio/ch/SctpAssocChange.java \
sun/nio/ch/SctpChannelImpl.java \
sun/nio/ch/SctpNet.java \
sun/nio/ch/SctpPeerAddrChange.java \
sun/nio/ch/SctpResultContainer.java \
sun/nio/ch/SctpServerChannelImpl.java \
sun/nio/ch/SctpStdSocketOption.java
endif

View File

@ -0,0 +1,31 @@
#
# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
ifneq ($(PLATFORM),windows)
FILES_c = \
SctpNet.c \
SctpChannelImpl.c \
SctpServerChannelImpl.c
endif

View File

@ -0,0 +1,67 @@
#
# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
FILES_java = \
com/sun/nio/sctp/AbstractNotificationHandler.java \
com/sun/nio/sctp/Association.java \
com/sun/nio/sctp/AssociationChangeNotification.java \
com/sun/nio/sctp/HandlerResult.java \
com/sun/nio/sctp/IllegalReceiveException.java \
com/sun/nio/sctp/IllegalUnbindException.java \
com/sun/nio/sctp/InvalidStreamException.java \
com/sun/nio/sctp/MessageInfo.java \
com/sun/nio/sctp/Notification.java \
com/sun/nio/sctp/NotificationHandler.java \
com/sun/nio/sctp/PeerAddressChangeNotification.java \
com/sun/nio/sctp/SctpChannel.java \
com/sun/nio/sctp/SctpMultiChannel.java \
com/sun/nio/sctp/SctpServerChannel.java \
com/sun/nio/sctp/SctpSocketOption.java \
com/sun/nio/sctp/SctpStandardSocketOption.java \
com/sun/nio/sctp/SendFailedNotification.java \
com/sun/nio/sctp/ShutdownNotification.java \
\
sun/nio/ch/SctpMessageInfoImpl.java \
sun/nio/ch/SctpStdSocketOption.java
ifneq ($(PLATFORM), windows)
FILES_java += \
sun/nio/ch/SctpAssocChange.java \
sun/nio/ch/SctpAssociationImpl.java \
sun/nio/ch/SctpChannelImpl.java \
sun/nio/ch/SctpMultiChannelImpl.java \
sun/nio/ch/SctpNet.java \
sun/nio/ch/SctpNotification.java \
sun/nio/ch/SctpPeerAddrChange.java \
sun/nio/ch/SctpResultContainer.java \
sun/nio/ch/SctpSendFailed.java \
sun/nio/ch/SctpServerChannelImpl.java \
sun/nio/ch/SctpShutdown.java \
sun/nio/ch/SctpSocketDispatcher.java
else
FILES_java += \
sun/nio/ch/SctpChannelImpl.java \
sun/nio/ch/SctpMultiChannelImpl.java \
sun/nio/ch/SctpServerChannelImpl.java
endif

View File

@ -0,0 +1,80 @@
#
# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
#
# Makefile for com.sun.nio.sctp
#
BUILDDIR = ../../../..
PACKAGE = com.sun.nio.sctp
LIBRARY = sctp
PRODUCT = sun
#OTHER_JAVACFLAGS += -Xmaxwarns 1000 -Xlint
include $(BUILDDIR)/common/Defs.gmk
#
# Files to compile
#
include FILES_c.gmk
include FILES_java.gmk
include Exportedfiles.gmk
ifneq ($(PLATFORM), windows)
include $(BUILDDIR)/common/Mapfile-vers.gmk
include $(BUILDDIR)/common/Library.gmk
#
# Find platform-specific C source files
#
vpath %.c $(PLATFORM_SRC)/native/sun/nio/ch
#
# Include nio.h, net_util.h, sun_nio_ch_IOStatus.h, etc
#
OTHER_INCLUDES += \
-I$(SHARE_SRC)/native/sun/nio/ch \
-I$(SHARE_SRC)/native/java/net \
-I$(PLATFORM_SRC)/native/java/net \
-I$(CLASSHDRDIR)/../../../../java/java.nio/nio/CClassHeaders
ifeq ($(PLATFORM), linux)
COMPILER_WARNINGS_FATAL=true
#OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread -ldl
OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -lnio -lnet -lpthread -ldl
endif
ifeq ($(PLATFORM), solaris)
#LIBSCTP = -lsctp
OTHER_LDLIBS += $(LIBSOCKET) -L$(LIBDIR)/$(LIBARCH) -lnet -lnio
endif # PLATFORM
else # windows
include $(BUILDDIR)/common/Classes.gmk
endif # ifneq windows
clean clobber::
$(RM) -r $(CLASSDESTDIR)/com/sun/nio/sctp
$(RM) -r $(CLASSDESTDIR)/sun/nio/ch

View File

@ -0,0 +1,49 @@
#
# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
SUNWprivate_1.1 {
global:
Java_sun_nio_ch_SctpNet_socket0;
Java_sun_nio_ch_SctpNet_bindx;
Java_sun_nio_ch_SctpNet_getLocalAddresses0;
Java_sun_nio_ch_SctpNet_getRemoteAddresses0;
Java_sun_nio_ch_SctpNet_getPrimAddrOption0;
Java_sun_nio_ch_SctpNet_setPrimAddrOption0;
Java_sun_nio_ch_SctpNet_setPeerPrimAddrOption0;
Java_sun_nio_ch_SctpNet_getInitMsgOption0;
Java_sun_nio_ch_SctpNet_setInitMsgOption0;
Java_sun_nio_ch_SctpNet_getIntOption0;
Java_sun_nio_ch_SctpNet_setIntOption0;
Java_sun_nio_ch_SctpNet_shutdown0;
Java_sun_nio_ch_SctpChannelImpl_initIDs;
Java_sun_nio_ch_SctpChannelImpl_checkConnect;
Java_sun_nio_ch_SctpChannelImpl_receive0;
Java_sun_nio_ch_SctpChannelImpl_send0;
Java_sun_nio_ch_SctpServerChannelImpl_initIDs;
Java_sun_nio_ch_SctpServerChannelImpl_accept0;
JNI_OnLoad;
local:
*;
};

View File

@ -86,6 +86,8 @@ TREEAPI_PKGS = com.sun.source.tree \
SMARTCARDIO_PKGS = javax.smartcardio
SCTPAPI_PKGS = com.sun.nio.sctp
TRACING_PKGS = com.sun.tracing \
com.sun.tracing.dtrace
@ -98,4 +100,6 @@ NON_CORE_PKGS = $(DOMAPI_PKGS) \
$(OLD_JSSE_PKGS) \
$(HTTPSERVER_PKGS) \
$(SMARTCARDIO_PKGS) \
$(TRACING_PKGS)
$(TRACING_PKGS) \
$(SCTPAPI_PKGS)

View File

@ -1,5 +1,5 @@
#
# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -135,7 +135,8 @@ SUNWprivate_1.1 {
Java_java_lang_ClassLoader_00024NativeLibrary_find;
Java_java_lang_ClassLoader_00024NativeLibrary_load;
Java_java_lang_ClassLoader_00024NativeLibrary_unload;
Java_java_lang_ClassLoader_registerNatives;
Java_java_lang_ClassLoader_getCaller;
Java_java_lang_ClassLoader_registerNatives;
Java_java_lang_Compiler_registerNatives;
Java_java_lang_Double_longBitsToDouble;
Java_java_lang_Double_doubleToRawLongBits;

View File

@ -39,6 +39,10 @@ FILES_c = \
ResolverConfigurationImpl.c \
DefaultProxySelector.c
ifeq ($(PLATFORM), solaris)
FILES_c += SdpProvider.c
endif
ifeq ($(PLATFORM), linux)
FILES_c += linux_close.c
endif

View File

@ -108,11 +108,24 @@ CLASSES.export += java.lang.Integer java.io.FileDescriptor java.net.InetAddressI
#
LOCALE_SET_DEFINITION = jre
properties: $(LIBDIR) $(LIBDIR)/net.properties
MISC_FILES = $(LIBDIR) $(LIBDIR)/net.properties
$(LIBDIR)/net.properties: $(SHARE_SRC)/lib/net.properties
@$(RM) $@
$(CP) $< $@
build: properties
#
# SDP configuration template
#
ifeq ($(PLATFORM), solaris)
SDP_PATH = sdp/sdp.conf.template
SDP_CONF = $(LIBDIR)/$(SDP_PATH)
$(SDP_CONF): $(PLATFORM_SRC)/lib/$(SDP_PATH)
@$(RM) $*
$(install-file)
MISC_FILES += $(SDP_CONF)
endif
build: $(MISC_FILES)

View File

@ -90,6 +90,7 @@ SUNWprivate_1.1 {
Java_sun_net_dns_ResolverConfigurationImpl_fallbackDomain0;
Java_sun_net_spi_DefaultProxySelector_init;
Java_sun_net_spi_DefaultProxySelector_getSystemProxy;
Java_sun_net_spi_SdpProvider_convert;
NET_AllocSockaddr;
NET_SockaddrToInetAddress;
NET_SockaddrEqualsInetAddress;

View File

@ -189,6 +189,7 @@ SUNWprivate_1.1 {
Java_sun_nio_fs_UnixNativeDispatcher_getgrnam0;
Java_sun_nio_fs_UnixNativeDispatcher_getextmntent;
Java_sun_nio_fs_UnixCopyFile_transfer;
handleSocketError;
local:
*;

View File

@ -175,6 +175,7 @@ SUNWprivate_1.1 {
Java_sun_nio_fs_SolarisWatchService_portDissociate;
Java_sun_nio_fs_SolarisWatchService_portSend;
Java_sun_nio_fs_SolarisWatchService_portGetn;
handleSocketError;
local:
*;

View File

@ -92,11 +92,11 @@ FILES_java = \
sun/text/normalizer/SymbolTable.java \
sun/text/normalizer/Trie.java \
sun/text/normalizer/TrieIterator.java \
sun/text/normalizer/UBiDiProps.java \
sun/text/normalizer/UCharacter.java \
sun/text/normalizer/UCharacterIterator.java \
sun/text/normalizer/UCharacterProperty.java \
sun/text/normalizer/UCharacterPropertyReader.java \
sun/text/normalizer/UProperty.java \
sun/text/normalizer/UTF16.java \
sun/text/normalizer/UnicodeMatcher.java \
sun/text/normalizer/UnicodeSet.java \

View File

@ -64,7 +64,8 @@ BIFILES = $(TEXT_CLASSDIR)/CharacterBreakIteratorData \
$(TEXT_CLASSDIR)/SentenceBreakIteratorData
ICU_FILES = $(TEXT_CLASSDIR)/unorm.icu \
$(TEXT_CLASSDIR)/uprops.icu
$(TEXT_CLASSDIR)/uprops.icu \
$(TEXT_CLASSDIR)/ubidi.icu
# builder
GENERATEBREAKITERATORDATA_JARFILE = \
@ -89,7 +90,7 @@ $(BIFILES): $(GENERATEBREAKITERATORDATA_JARFILE) \
build: $(BIFILES) $(ICU_FILES)
#
# Extra rules to copy unorm.icu and uprops.icu
# Extra rules to copy unorm.icu, uprops.icu, and ubidi.icu
#
$(TEXT_CLASSDIR)/unorm.icu: $(TEXT_SRCDIR)/unorm.icu
$(install-file)
@ -97,6 +98,9 @@ $(TEXT_CLASSDIR)/unorm.icu: $(TEXT_SRCDIR)/unorm.icu
$(TEXT_CLASSDIR)/uprops.icu: $(TEXT_SRCDIR)/uprops.icu
$(install-file)
$(TEXT_CLASSDIR)/ubidi.icu: $(TEXT_SRCDIR)/ubidi.icu
$(install-file)
clean clobber::
$(RM) -r $(TEXT_CLASSES)
$(RM) -r $(BIFILES)

View File

@ -71,6 +71,7 @@ STUBFILES = \
$(STUBDIR)/Ole2.h \
$(STUBDIR)/Zmouse.h \
$(STUBDIR)/cderr.h \
$(STUBDIR)/commctrl.h \
$(STUBDIR)/commdlg.h \
$(STUBDIR)/direct.h \
$(STUBDIR)/d3dcom.h \

View File

@ -1,5 +1,5 @@
#
# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -104,7 +104,8 @@ FILES_c = \
OGLVertexCache.c \
WGLGraphicsConfig.c \
WGLSurfaceData.c \
AccelGlyphCache.c
AccelGlyphCache.c \
rect.c
FILES_cpp = \
CmdIDList.cpp \
@ -199,5 +200,6 @@ FILES_cpp = \
ShellFolder2.cpp \
ThemeReader.cpp \
ComCtl32Util.cpp \
DllUtil.cpp \
initIDs.cpp \
MouseInfo.cpp

View File

@ -1,5 +1,5 @@
#
# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -107,7 +107,8 @@ FILES_export = \
sun/java2d/x11/X11Renderer.java \
sun/java2d/x11/X11SurfaceData.java \
com/sun/java/swing/plaf/gtk/GTKEngine.java \
com/sun/java/swing/plaf/gtk/GTKStyle.java
com/sun/java/swing/plaf/gtk/GTKStyle.java \
sun/awt/ExtendedKeyCodes.java
FILES_export2 = \

View File

@ -1,5 +1,5 @@
#
# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -154,7 +154,7 @@ FILES_export2 = \
sun/awt/datatransfer/DataTransferer.java \
sun/awt/datatransfer/SunClipboard.java \
sun/awt/dnd/SunDragSourceContextPeer.java \
sun/awt/windows/WToolkitThreadBlockedHandler.java
sun/awt/windows/WToolkitThreadBlockedHandler.java
FILES_export3 = \
java/awt/CheckboxMenuItem.java \
@ -214,6 +214,7 @@ FILES_export3 = \
sun/awt/windows/WBufferStrategy.java \
sun/awt/windows/WTrayIconPeer.java \
sun/awt/image/ImagingLib.java \
sun/awt/ExtendedKeyCodes.java \
sun/java2d/pipe/hw/AccelSurface.java \
sun/java2d/pipe/hw/AccelDeviceEventNotifier.java \
sun/java2d/pipe/hw/ContextCapabilities.java \

View File

@ -1,5 +1,5 @@
#
# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -219,6 +219,7 @@ vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/image/cvutils
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/shell
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/medialib
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/debug
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/utility
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/loops
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/pipe

View File

@ -6,11 +6,9 @@ runtime, it will probably work with other versions of that compiler.
Included in this project is a generated file, make.depend, which lists
all interdependencies of the source files. This file is generated *on
Solaris* with the following commands:
Solaris or Linux* with the following command:
% sccs edit make.depend
% gnumake -f Depend.mak
% sccs delget make.depend
This step only needs to be run when new files are added to the project,
or include statements are changed.

File diff suppressed because one or more lines are too long

View File

@ -291,6 +291,7 @@ SUNWprivate_1.1 {
Java_sun_awt_X11GraphicsConfig_createBackBuffer;
Java_sun_awt_X11GraphicsConfig_destroyBackBuffer;
Java_sun_awt_X11GraphicsConfig_swapBuffers;
Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable;
Java_sun_awt_X11GraphicsDevice_isDBESupported;
Java_sun_awt_X11GraphicsDevice_getDisplay;
Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals;

View File

@ -407,6 +407,7 @@ SUNWprivate_1.1 {
Java_sun_awt_X11GraphicsConfig_getNumColors;
Java_sun_awt_X11GraphicsConfig_getXResolution;
Java_sun_awt_X11GraphicsConfig_getYResolution;
Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable;
Java_sun_awt_X11GraphicsDevice_isDBESupported;
Java_sun_awt_X11GraphicsDevice_getDisplay;
Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals;

View File

@ -39,6 +39,7 @@ FILES_java = \
sun/net/TransferProtocolClient.java \
sun/net/ConnectionResetException.java \
sun/net/NetProperties.java \
sun/net/NetHooks.java \
sun/net/util/IPAddressUtil.java \
sun/net/dns/ResolverConfiguration.java \
sun/net/dns/ResolverConfigurationImpl.java \
@ -123,3 +124,7 @@ FILES_java = \
ifeq ($(PLATFORM), windows)
FILES_java += sun/net/www/protocol/http/NTLMAuthSequence.java
endif
ifeq ($(PLATFORM), solaris)
FILES_java += sun/net/spi/SdpProvider.java
endif

View File

@ -78,4 +78,5 @@ FILES_c = \
awt_Plugin.c \
gtk2_interface.c \
swing_GTKEngine.c \
swing_GTKStyle.c
swing_GTKStyle.c \
rect.c

View File

@ -79,6 +79,7 @@ vpath %.c $(SHARE_SRC)/native/sun/java2d
vpath %.c $(SHARE_SRC)/native/sun/java2d/loops
vpath %.c $(SHARE_SRC)/native/sun/java2d/pipe
vpath %.c $(SHARE_SRC)/native/sun/awt/medialib
vpath %.c $(SHARE_SRC)/native/sun/awt/utility
vpath %.cpp $(SHARE_SRC)/native/sun/image
vpath %.c $(SHARE_SRC)/native/sun/font
vpath %.c $(PLATFORM_SRC)/native/sun/awt/robot_child
@ -274,6 +275,23 @@ ICONS = \
$(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon32.png \
$(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon48.png
ICONPATH=$(PLATFORM_SRC)/classes/sun/awt/X11
ICONS += \
$(ICONPATH)/security-icon-bw16.png \
$(ICONPATH)/security-icon-interim16.png \
$(ICONPATH)/security-icon-yellow16.png \
$(ICONPATH)/security-icon-bw24.png \
$(ICONPATH)/security-icon-interim24.png \
$(ICONPATH)/security-icon-yellow24.png \
$(ICONPATH)/security-icon-bw32.png \
$(ICONPATH)/security-icon-interim32.png \
$(ICONPATH)/security-icon-yellow32.png \
$(ICONPATH)/security-icon-bw48.png \
$(ICONPATH)/security-icon-interim48.png \
$(ICONPATH)/security-icon-yellow48.png
TEMPDIR_CLASSES = $(TEMPDIR)/classes
$(TEMPDIR_CLASSES)/sun/awt/X11/ToBin.class: ToBin.java

View File

@ -1,5 +1,5 @@
#
# Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 2002-2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -93,6 +93,9 @@ SUNWprivate_1.1 {
Java_sun_awt_X11_XlibWrapper_XGetWMHints;
Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension;
Java_sun_awt_X11_XlibWrapper_SetRectangularShape;
Java_sun_awt_X11_XlibWrapper_SetBitmapShape;
Java_sun_awt_X11_XlibWrapper_XConfigureWindow;
Java_sun_awt_X11_XlibWrapper_SetZOrder;
Java_sun_awt_X11_XToolkit_initIDs;
Java_sun_awt_X11_XWindow_getNativeColor;
Java_sun_awt_X11_XWindow_getWMInsets;
@ -217,6 +220,7 @@ SUNWprivate_1.1 {
Java_sun_awt_X11GraphicsConfig_createBackBuffer;
Java_sun_awt_X11GraphicsConfig_destroyBackBuffer;
Java_sun_awt_X11GraphicsConfig_swapBuffers;
Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable;
Java_java_awt_Insets_initIDs;
Java_java_awt_KeyboardFocusManager_initIDs;
Java_java_awt_Font_initIDs;
@ -289,16 +293,26 @@ SUNWprivate_1.1 {
Java_sun_awt_X11_XlibWrapper_XGetIconSizes;
Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym;
Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode;
Java_sun_awt_X11_XlibWrapper_XQueryKeymap;
Java_sun_awt_X11_XlibWrapper_XQueryKeymap;
Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup;
Java_sun_awt_X11_XlibWrapper_XkbSelectEvents;
Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails;
Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym;
Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion;
Java_sun_awt_X11_XlibWrapper_XkbQueryExtension;
Java_sun_awt_X11_XlibWrapper_XkbGetMap;
Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap;
Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard;
Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode;
Java_sun_awt_X11_XlibWrapper_XGetModifierMapping;
Java_sun_awt_X11_XlibWrapper_XFreeModifiermap;
Java_sun_awt_X11_XlibWrapper_XFreeModifiermap;
Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab;
Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent;
Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop;
Java_sun_awt_X11_XlibWrapper_XTextPropertyToStringList;
Java_sun_awt_X11_XlibWrapper_XGrabServer;
Java_sun_awt_X11_XlibWrapper_XUngrabServer;
Java_sun_awt_X11_XlibWrapper_XPutBackEvent;
Java_sun_awt_X11_XlibWrapper_XPutBackEvent;
Java_sun_awt_X11_XlibWrapper_XConvertCase;
Java_sun_awt_X11_XlibWrapper_XSynchronize;
Java_java_awt_FileDialog_initIDs;

View File

@ -144,6 +144,55 @@ class CharacterData00 extends CharacterData {
case 0x1FBC : mapChar = 0x1FB3; break;
case 0x1FCC : mapChar = 0x1FC3; break;
case 0x1FFC : mapChar = 0x1FF3; break;
case 0x023A : mapChar = 0x2C65; break;
case 0x023E : mapChar = 0x2C66; break;
case 0x10A0 : mapChar = 0x2D00; break;
case 0x10A1 : mapChar = 0x2D01; break;
case 0x10A2 : mapChar = 0x2D02; break;
case 0x10A3 : mapChar = 0x2D03; break;
case 0x10A4 : mapChar = 0x2D04; break;
case 0x10A5 : mapChar = 0x2D05; break;
case 0x10A6 : mapChar = 0x2D06; break;
case 0x10A7 : mapChar = 0x2D07; break;
case 0x10A8 : mapChar = 0x2D08; break;
case 0x10A9 : mapChar = 0x2D09; break;
case 0x10AA : mapChar = 0x2D0A; break;
case 0x10AB : mapChar = 0x2D0B; break;
case 0x10AC : mapChar = 0x2D0C; break;
case 0x10AD : mapChar = 0x2D0D; break;
case 0x10AE : mapChar = 0x2D0E; break;
case 0x10AF : mapChar = 0x2D0F; break;
case 0x10B0 : mapChar = 0x2D10; break;
case 0x10B1 : mapChar = 0x2D11; break;
case 0x10B2 : mapChar = 0x2D12; break;
case 0x10B3 : mapChar = 0x2D13; break;
case 0x10B4 : mapChar = 0x2D14; break;
case 0x10B5 : mapChar = 0x2D15; break;
case 0x10B6 : mapChar = 0x2D16; break;
case 0x10B7 : mapChar = 0x2D17; break;
case 0x10B8 : mapChar = 0x2D18; break;
case 0x10B9 : mapChar = 0x2D19; break;
case 0x10BA : mapChar = 0x2D1A; break;
case 0x10BB : mapChar = 0x2D1B; break;
case 0x10BC : mapChar = 0x2D1C; break;
case 0x10BD : mapChar = 0x2D1D; break;
case 0x10BE : mapChar = 0x2D1E; break;
case 0x10BF : mapChar = 0x2D1F; break;
case 0x10C0 : mapChar = 0x2D20; break;
case 0x10C1 : mapChar = 0x2D21; break;
case 0x10C2 : mapChar = 0x2D22; break;
case 0x10C3 : mapChar = 0x2D23; break;
case 0x10C4 : mapChar = 0x2D24; break;
case 0x10C5 : mapChar = 0x2D25; break;
case 0x1E9E : mapChar = 0x00DF; break;
case 0x2C62 : mapChar = 0x026B; break;
case 0x2C63 : mapChar = 0x1D7D; break;
case 0x2C64 : mapChar = 0x027D; break;
case 0x2C6D : mapChar = 0x0251; break;
case 0x2C6E : mapChar = 0x0271; break;
case 0x2C6F : mapChar = 0x0250; break;
case 0xA77D : mapChar = 0x1D79; break;
// default mapChar is already set, so no
// need to redo it here.
// default : mapChar = ch;
@ -196,6 +245,54 @@ class CharacterData00 extends CharacterData {
case 0x1FB3 : mapChar = 0x1FBC; break;
case 0x1FC3 : mapChar = 0x1FCC; break;
case 0x1FF3 : mapChar = 0x1FFC; break;
case 0x0250 : mapChar = 0x2C6F; break;
case 0x0251 : mapChar = 0x2C6D; break;
case 0x026B : mapChar = 0x2C62; break;
case 0x0271 : mapChar = 0x2C6E; break;
case 0x027D : mapChar = 0x2C64; break;
case 0x1D79 : mapChar = 0xA77D; break;
case 0x1D7D : mapChar = 0x2C63; break;
case 0x2C65 : mapChar = 0x023A; break;
case 0x2C66 : mapChar = 0x023E; break;
case 0x2D00 : mapChar = 0x10A0; break;
case 0x2D01 : mapChar = 0x10A1; break;
case 0x2D02 : mapChar = 0x10A2; break;
case 0x2D03 : mapChar = 0x10A3; break;
case 0x2D04 : mapChar = 0x10A4; break;
case 0x2D05 : mapChar = 0x10A5; break;
case 0x2D06 : mapChar = 0x10A6; break;
case 0x2D07 : mapChar = 0x10A7; break;
case 0x2D08 : mapChar = 0x10A8; break;
case 0x2D09 : mapChar = 0x10A9; break;
case 0x2D0A : mapChar = 0x10AA; break;
case 0x2D0B : mapChar = 0x10AB; break;
case 0x2D0C : mapChar = 0x10AC; break;
case 0x2D0D : mapChar = 0x10AD; break;
case 0x2D0E : mapChar = 0x10AE; break;
case 0x2D0F : mapChar = 0x10AF; break;
case 0x2D10 : mapChar = 0x10B0; break;
case 0x2D11 : mapChar = 0x10B1; break;
case 0x2D12 : mapChar = 0x10B2; break;
case 0x2D13 : mapChar = 0x10B3; break;
case 0x2D14 : mapChar = 0x10B4; break;
case 0x2D15 : mapChar = 0x10B5; break;
case 0x2D16 : mapChar = 0x10B6; break;
case 0x2D17 : mapChar = 0x10B7; break;
case 0x2D18 : mapChar = 0x10B8; break;
case 0x2D19 : mapChar = 0x10B9; break;
case 0x2D1A : mapChar = 0x10BA; break;
case 0x2D1B : mapChar = 0x10BB; break;
case 0x2D1C : mapChar = 0x10BC; break;
case 0x2D1D : mapChar = 0x10BD; break;
case 0x2D1E : mapChar = 0x10BE; break;
case 0x2D1F : mapChar = 0x10BF; break;
case 0x2D20 : mapChar = 0x10C0; break;
case 0x2D21 : mapChar = 0x10C1; break;
case 0x2D22 : mapChar = 0x10C2; break;
case 0x2D23 : mapChar = 0x10C3; break;
case 0x2D24 : mapChar = 0x10C4; break;
case 0x2D25 : mapChar = 0x10C5; break;
// ch must have a 1:M case mapping, but we
// can't handle it here. Return ch.
// since mapChar is already set, no need
@ -315,6 +412,12 @@ class CharacterData00 extends CharacterData {
case 0x32BE: retval = 49; break; // CIRCLED NUMBER FORTY NINE
case 0x32BF: retval = 50; break; // CIRCLED NUMBER FIFTY
case 0x0D71: retval = 100; break; // MALAYALAM NUMBER ONE HUNDRED
case 0x0D72: retval = 1000; break; // MALAYALAM NUMBER ONE THOUSAND
case 0x2186: retval = 50; break; // ROMAN NUMERAL FIFTY EARLY FORM
case 0x2187: retval = 50000; break; // ROMAN NUMERAL FIFTY THOUSAND
case 0x2188: retval = 100000; break; // ROMAN NUMERAL ONE HUNDRED THOUSAND
default: retval = -2; break;
}
break;
@ -383,6 +486,54 @@ class CharacterData00 extends CharacterData {
case 0x00B5 : mapChar = 0x039C; break;
case 0x017F : mapChar = 0x0053; break;
case 0x1FBE : mapChar = 0x0399; break;
case 0x0250 : mapChar = 0x2C6F; break;
case 0x0251 : mapChar = 0x2C6D; break;
case 0x026B : mapChar = 0x2C62; break;
case 0x0271 : mapChar = 0x2C6E; break;
case 0x027D : mapChar = 0x2C64; break;
case 0x1D79 : mapChar = 0xA77D; break;
case 0x1D7D : mapChar = 0x2C63; break;
case 0x2C65 : mapChar = 0x023A; break;
case 0x2C66 : mapChar = 0x023E; break;
case 0x2D00 : mapChar = 0x10A0; break;
case 0x2D01 : mapChar = 0x10A1; break;
case 0x2D02 : mapChar = 0x10A2; break;
case 0x2D03 : mapChar = 0x10A3; break;
case 0x2D04 : mapChar = 0x10A4; break;
case 0x2D05 : mapChar = 0x10A5; break;
case 0x2D06 : mapChar = 0x10A6; break;
case 0x2D07 : mapChar = 0x10A7; break;
case 0x2D08 : mapChar = 0x10A8; break;
case 0x2D09 : mapChar = 0x10A9; break;
case 0x2D0A : mapChar = 0x10AA; break;
case 0x2D0B : mapChar = 0x10AB; break;
case 0x2D0C : mapChar = 0x10AC; break;
case 0x2D0D : mapChar = 0x10AD; break;
case 0x2D0E : mapChar = 0x10AE; break;
case 0x2D0F : mapChar = 0x10AF; break;
case 0x2D10 : mapChar = 0x10B0; break;
case 0x2D11 : mapChar = 0x10B1; break;
case 0x2D12 : mapChar = 0x10B2; break;
case 0x2D13 : mapChar = 0x10B3; break;
case 0x2D14 : mapChar = 0x10B4; break;
case 0x2D15 : mapChar = 0x10B5; break;
case 0x2D16 : mapChar = 0x10B6; break;
case 0x2D17 : mapChar = 0x10B7; break;
case 0x2D18 : mapChar = 0x10B8; break;
case 0x2D19 : mapChar = 0x10B9; break;
case 0x2D1A : mapChar = 0x10BA; break;
case 0x2D1B : mapChar = 0x10BB; break;
case 0x2D1C : mapChar = 0x10BC; break;
case 0x2D1D : mapChar = 0x10BD; break;
case 0x2D1E : mapChar = 0x10BE; break;
case 0x2D1F : mapChar = 0x10BF; break;
case 0x2D20 : mapChar = 0x10C0; break;
case 0x2D21 : mapChar = 0x10C1; break;
case 0x2D22 : mapChar = 0x10C2; break;
case 0x2D23 : mapChar = 0x10C3; break;
case 0x2D24 : mapChar = 0x10C4; break;
case 0x2D25 : mapChar = 0x10C5; break;
default : mapChar = Character.ERROR; break;
}
}

View File

@ -218,6 +218,48 @@ class CharacterData01 extends CharacterData {
case 0x10132: retval = 80000; break; // AEGEAN NUMBER EIGHTY THOUSAND
case 0x10133: retval = 90000; break; // AEGEAN NUMBER NINETY THOUSAND
case 0x10323: retval = 50; break; // OLD ITALIC NUMERAL FIFTY
case 0x010144: retval = 50; break; // ACROPHONIC ATTIC FIFTY
case 0x010145: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED
case 0x010146: retval = 5000; break; // ACROPHONIC ATTIC FIVE THOUSAND
case 0x010147: retval = 50000; break; // ACROPHONIC ATTIC FIFTY THOUSAND
case 0x01014A: retval = 50; break; // ACROPHONIC ATTIC FIFTY TALENTS
case 0x01014B: retval = 100; break; // ACROPHONIC ATTIC ONE HUNDRED TALENTS
case 0x01014C: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED TALENTS
case 0x01014D: retval = 1000; break; // ACROPHONIC ATTIC ONE THOUSAND TALENTS
case 0x01014E: retval = 5000; break; // ACROPHONIC ATTIC FIVE THOUSAND TALENTS
case 0x010151: retval = 50; break; // ACROPHONIC ATTIC FIFTY STATERS
case 0x010152: retval = 100; break; // ACROPHONIC ATTIC ONE HUNDRED STATERS
case 0x010153: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED STATERS
case 0x010154: retval = 1000; break; // ACROPHONIC ATTIC ONE THOUSAND STATERS
case 0x010155: retval = 10000; break; // ACROPHONIC ATTIC TEN THOUSAND STATERS
case 0x010156: retval = 50000; break; // ACROPHONIC ATTIC FIFTY THOUSAND STATERS
case 0x010166: retval = 50; break; // ACROPHONIC TROEZENIAN FIFTY
case 0x010167: retval = 50; break; // ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
case 0x010168: retval = 50; break; // ACROPHONIC HERMIONIAN FIFTY
case 0x010169: retval = 50; break; // ACROPHONIC THESPIAN FIFTY
case 0x01016A: retval = 100; break; // ACROPHONIC THESPIAN ONE HUNDRED
case 0x01016B: retval = 300; break; // ACROPHONIC THESPIAN THREE HUNDRED
case 0x01016C: retval = 500; break; // ACROPHONIC EPIDAUREAN FIVE HUNDRED
case 0x01016D: retval = 500; break; // ACROPHONIC TROEZENIAN FIVE HUNDRED
case 0x01016E: retval = 500; break; // ACROPHONIC THESPIAN FIVE HUNDRED
case 0x01016F: retval = 500; break; // ACROPHONIC CARYSTIAN FIVE HUNDRED
case 0x010170: retval = 500; break; // ACROPHONIC NAXIAN FIVE HUNDRED
case 0x010171: retval = 1000; break; // ACROPHONIC THESPIAN ONE THOUSAND
case 0x010172: retval = 5000; break; // ACROPHONIC THESPIAN FIVE THOUSAND
case 0x010174: retval = 50; break; // ACROPHONIC STRATIAN FIFTY MNAS
case 0x010341: retval = 90; break; // GOTHIC LETTER NINETY
case 0x01034A: retval = 900; break; // GOTHIC LETTER NINE HUNDRED
case 0x0103D5: retval = 100; break; // OLD PERSIAN NUMBER HUNDRED
case 0x010919: retval = 100; break; // PHOENICIAN NUMBER ONE HUNDRED
case 0x010A46: retval = 100; break; // KHAROSHTHI NUMBER ONE HUNDRED
case 0x010A47: retval = 1000; break; // KHAROSHTHI NUMBER ONE THOUSAND
case 0x01D36C: retval = 40; break; // COUNTING ROD TENS DIGIT FOUR
case 0x01D36D: retval = 50; break; // COUNTING ROD TENS DIGIT FIVE
case 0x01D36E: retval = 60; break; // COUNTING ROD TENS DIGIT SIX
case 0x01D36F: retval = 70; break; // COUNTING ROD TENS DIGIT SEVEN
case 0x01D370: retval = 80; break; // COUNTING ROD TENS DIGIT EIGHT
case 0x01D371: retval = 90; break; // COUNTING ROD TENS DIGIT NINE
default: retval = -2; break;
}

View File

@ -1,12 +1,17 @@
# SpecialCasing-4.0.0.txt
# Date: 2003-03-14, 20:22:04 GMT [MD]
# SpecialCasing-5.1.0.txt
# Date: 2008-03-03, 21:58:10 GMT [MD]
#
# Unicode Character Database
# Copyright (c) 1991-2008 Unicode, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
# For documentation, see UCD.html
#
# Special Casing Properties
#
# This file is a supplement to the UnicodeData file.
# It contains additional information about the casing of Unicode characters.
# (For compatibility, the UnicodeData.txt file only contains case mappings for
# characters where they are 1-1, and does not have locale-specific mappings.)
# characters where they are 1-1, and independent of context and language.
# For more information, see the discussion of Case Mappings in the Unicode Standard.
#
# All code points not listed in this file that do not have a simple case mappings
@ -18,31 +23,31 @@
#
# <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)? # <comment>
#
# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more than
# one character, they are separated by spaces. Other than as used to separate elements,
# spaces are to be ignored.
# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more
# than one character, they are separated by spaces. Other than as used to separate
# elements, spaces are to be ignored.
#
# The <condition_list> is optional. Where present, it consists of one or more locales or contexts,
# separated by spaces. In these conditions:
# The <condition_list> is optional. Where present, it consists of one or more language IDs
# or contexts, separated by spaces. In these conditions:
# - A condition list overrides the normal behavior if all of the listed conditions are true.
# - The context is always the context of the characters in the original string,
# NOT in the resulting string.
# - Case distinctions in the condition list are not significant.
# - Conditions preceded by "Not_" represent the negation of the condition.
# The condition list is not represented in the UCD as a formal property.
#
# A locale is defined as:
# <locale> := <ISO_639_code> ( "_" <ISO_3166_code> ( "_" <variant> )? )?
# <ISO_3166_code> := 2-letter ISO country code,
# <ISO_639_code> := 2-letter ISO language code
# A language ID is defined by BCP 47, with '-' and '_' treated equivalently.
#
# A context is one of the following, as defined in the Unicode Standard:
# Final_Sigma, After_Soft_Dotted, More_Above, Before_Dot, Not_Before_Dot, After_I
# A context for a character C is defined by Section 3.13 Default Case
# Operations, of The Unicode Standard, Version 5.0.
# (This is identical to the context defined by Unicode 4.1.0,
# as specified in http://www.unicode.org/versions/Unicode4.1.0/)
#
# Parsers of this file must be prepared to deal with future additions to this format:
# * Additional contexts
# * Additional fields
# ================================================================================
# @missing 0000..10FFFF; <slc>; <stc>; <suc>
# ================================================================================
# Unconditional mappings
# ================================================================================
@ -170,7 +175,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
# Some characters with YPOGEGRAMMENI are also have no corresponding titlecases
# Some characters with YPOGEGRAMMENI also have no corresponding titlecases
1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
@ -184,7 +189,14 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
# ================================================================================
# Conditional mappings
# Conditional Mappings
# The remainder of this file provides conditional casing data used to produce
# full case mappings.
# ================================================================================
# Language-Insensitive Mappings
# These are characters whose full case mappings do not depend on language, but do
# depend on context (which characters come before or after). For more information
# see the header of this file and the Unicode Standard.
# ================================================================================
# Special case for final form of sigma
@ -203,7 +215,10 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA
# ================================================================================
# Locale-sensitive mappings
# Language-Sensitive Mappings
# These are characters whose full case mappings depend on language and perhaps also
# context (which characters come before or after). For more information
# see the header of this file and the Unicode Standard.
# ================================================================================
# Lithuanian
@ -254,3 +269,6 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
# Note: the following case is already in the UnicodeData file.
# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I
# EOF

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
5.1.0

View File

@ -1,5 +1,5 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2008-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -26,17 +26,37 @@
package com.sun.awt;
import java.awt.*;
import sun.awt.AWTAccessor;
import sun.awt.AWTAccessor;
import sun.awt.SunToolkit;
/**
* A collection of utility methods for AWT.
*
* The functionality provided by the static methods of the class includes:
* <ul>
* <li>Setting shapes on top-level windows
* <li>Setting a constant alpha value for each pixel of a top-level window
* <li>Making a window non-opaque, after that it paints only explicitly
* painted pixels on the screen, with arbitrary alpha values for every pixel.
* <li>Setting a 'mixing-cutout' shape for a component.
* </ul>
* <p>
* A "top-level window" is an instance of the {@code Window} class (or its
* descendant, such as {@code JFrame}).
* <p>
* Some of the mentioned features may not be supported by the native platform.
* To determine whether a particular feature is supported, the user must use
* the {@code isTranslucencySupported()} method of the class passing a desired
* translucency kind (a member of the {@code Translucency} enum) as an
* argument.
* <p>
* The per-pixel alpha feature also requires the user to create her/his
* windows using a translucency-capable graphics configuration.
* The {@code isTranslucencyCapable()} method must
* be used to verify whether any given GraphicsConfiguration supports
* the trasnlcency effects.
* <p>
* <b>WARNING</b>: This class is an implementation detail and only meant
* for limited use outside of the core platform. This API may change
* drastically between update release, and it may even be
@ -50,6 +70,344 @@ public final class AWTUtilities {
private AWTUtilities() {
}
/** Kinds of translucency supported by the underlying system.
* @see #isTranslucencySupported
*/
public static enum Translucency {
/**
* Represents support in the underlying system for windows each pixel
* of which is guaranteed to be either completely opaque, with
* an alpha value of 1.0, or completely transparent, with an alpha
* value of 0.0.
*/
PERPIXEL_TRANSPARENT,
/**
* Represents support in the underlying system for windows all of
* the pixels of which have the same alpha value between or including
* 0.0 and 1.0.
*/
TRANSLUCENT,
/**
* Represents support in the underlying system for windows that
* contain or might contain pixels with arbitrary alpha values
* between and including 0.0 and 1.0.
*/
PERPIXEL_TRANSLUCENT;
}
/**
* Returns whether the given level of translucency is supported by
* the underlying system.
*
* Note that this method may sometimes return the value
* indicating that the particular level is supported, but
* the native windowing system may still not support the
* given level of translucency (due to the bugs in
* the windowing system).
*
* @param translucencyKind a kind of translucency support
* (either PERPIXEL_TRANSPARENT,
* TRANSLUCENT, or PERPIXEL_TRANSLUCENT)
* @return whether the given translucency kind is supported
*/
public static boolean isTranslucencySupported(Translucency translucencyKind) {
switch (translucencyKind) {
case PERPIXEL_TRANSPARENT:
return isWindowShapingSupported();
case TRANSLUCENT:
return isWindowOpacitySupported();
case PERPIXEL_TRANSLUCENT:
return isWindowTranslucencySupported();
}
return false;
}
/**
* Returns whether the windowing system supports changing the opacity
* value of top-level windows.
* Note that this method may sometimes return true, but the native
* windowing system may still not support the concept of
* translucency (due to the bugs in the windowing system).
*/
private static boolean isWindowOpacitySupported() {
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isWindowOpacitySupported();
}
/**
* Set the opacity of the window. The opacity is at the range [0..1].
* Note that setting the opacity level of 0 may or may not disable
* the mouse event handling on this window. This is
* a platform-dependent behavior.
*
* In order for this method to enable the translucency effect,
* the isTranslucencySupported() method should indicate that the
* TRANSLUCENT level of translucency is supported.
*
* <p>Also note that the window must not be in the full-screen mode
* when setting the opacity value &lt; 1.0f. Otherwise
* the IllegalArgumentException is thrown.
*
* @param window the window to set the opacity level to
* @param opacity the opacity level to set to the window
* @throws NullPointerException if the window argument is null
* @throws IllegalArgumentException if the opacity is out of
* the range [0..1]
* @throws IllegalArgumentException if the window is in full screen mode,
* and the opacity is less than 1.0f
* @throws UnsupportedOperationException if the TRANSLUCENT translucency
* kind is not supported
*/
public static void setWindowOpacity(Window window, float opacity) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
AWTAccessor.getWindowAccessor().setOpacity(window, opacity);
}
/**
* Get the opacity of the window. If the opacity has not
* yet being set, this method returns 1.0.
*
* @param window the window to get the opacity level from
* @throws NullPointerException if the window argument is null
*/
public static float getWindowOpacity(Window window) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
return AWTAccessor.getWindowAccessor().getOpacity(window);
}
/**
* Returns whether the windowing system supports changing the shape
* of top-level windows.
* Note that this method may sometimes return true, but the native
* windowing system may still not support the concept of
* shaping (due to the bugs in the windowing system).
*/
public static boolean isWindowShapingSupported() {
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isWindowShapingSupported();
}
/**
* Returns an object that implements the Shape interface and represents
* the shape previously set with the call to the setWindowShape() method.
* If no shape has been set yet, or the shape has been reset to null,
* this method returns null.
*
* @param window the window to get the shape from
* @return the current shape of the window
* @throws NullPointerException if the window argument is null
*/
public static Shape getWindowShape(Window window) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
return AWTAccessor.getWindowAccessor().getShape(window);
}
/**
* Sets a shape for the given window.
* If the shape argument is null, this methods restores
* the default shape making the window rectangular.
* <p>Note that in order to set a shape, the window must be undecorated.
* If the window is decorated, this method ignores the {@code shape}
* argument and resets the shape to null.
* <p>Also note that the window must not be in the full-screen mode
* when setting a non-null shape. Otherwise the IllegalArgumentException
* is thrown.
* <p>Depending on the platform, the method may return without
* effecting the shape of the window if the window has a non-null warning
* string ({@link Window#getWarningString()}). In this case the passed
* shape object is ignored.
*
* @param window the window to set the shape to
* @param shape the shape to set to the window
* @throws NullPointerException if the window argument is null
* @throws IllegalArgumentException if the window is in full screen mode,
* and the shape is not null
* @throws UnsupportedOperationException if the PERPIXEL_TRANSPARENT
* translucency kind is not supported
*/
public static void setWindowShape(Window window, Shape shape) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
AWTAccessor.getWindowAccessor().setShape(window, shape);
}
private static boolean isWindowTranslucencySupported() {
/*
* Per-pixel alpha is supported if all the conditions are TRUE:
* 1. The toolkit is a sort of SunToolkit
* 2. The toolkit supports translucency in general
* (isWindowTranslucencySupported())
* 3. There's at least one translucency-capable
* GraphicsConfiguration
*/
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) {
return false;
}
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
// If the default GC supports translucency return true.
// It is important to optimize the verification this way,
// see CR 6661196 for more details.
if (isTranslucencyCapable(env.getDefaultScreenDevice()
.getDefaultConfiguration()))
{
return true;
}
// ... otherwise iterate through all the GCs.
GraphicsDevice[] devices = env.getScreenDevices();
for (int i = 0; i < devices.length; i++) {
GraphicsConfiguration[] configs = devices[i].getConfigurations();
for (int j = 0; j < configs.length; j++) {
if (isTranslucencyCapable(configs[j])) {
return true;
}
}
}
return false;
}
/**
* Enables the per-pixel alpha support for the given window.
* Once the window becomes non-opaque (the isOpaque is set to false),
* the drawing sub-system is starting to respect the alpha value of each
* separate pixel. If a pixel gets painted with alpha color component
* equal to zero, it becomes visually transparent, if the alpha of the
* pixel is equal to 255, the pixel is fully opaque. Interim values
* of the alpha color component make the pixel semi-transparent (i.e.
* translucent).
* <p>Note that in order for the window to support the per-pixel alpha
* mode, the window must be created using the GraphicsConfiguration
* for which the {@link #isTranslucencyCapable}
* method returns true.
* <p>Also note that some native systems enable the per-pixel translucency
* mode for any window created using the translucency-compatible
* graphics configuration. However, it is highly recommended to always
* invoke the setWindowOpaque() method for these windows, at least for
* the sake of cross-platform compatibility reasons.
* <p>Also note that the window must not be in the full-screen mode
* when making it non-opaque. Otherwise the IllegalArgumentException
* is thrown.
* <p>If the window is a {@code Frame} or a {@code Dialog}, the window must
* be undecorated prior to enabling the per-pixel translucency effect (see
* {@link Frame#setUndecorated()} and/or {@link Dialog#setUndecorated()}).
* If the window becomes decorated through a subsequent call to the
* corresponding {@code setUndecorated()} method, the per-pixel
* translucency effect will be disabled and the opaque property reset to
* {@code true}.
* <p>Depending on the platform, the method may return without
* effecting the opaque property of the window if the window has a non-null
* warning string ({@link Window#getWarningString()}). In this case
* the passed 'isOpaque' value is ignored.
*
* @param window the window to set the shape to
* @param isOpaque whether the window must be opaque (true),
* or translucent (false)
* @throws NullPointerException if the window argument is null
* @throws IllegalArgumentException if the window uses
* a GraphicsConfiguration for which the
* {@code isTranslucencyCapable()}
* method returns false
* @throws IllegalArgumentException if the window is in full screen mode,
* and the isOpaque is false
* @throws IllegalArgumentException if the window is decorated and the
* isOpaque argument is {@code false}.
* @throws UnsupportedOperationException if the PERPIXEL_TRANSLUCENT
* translucency kind is not supported
*/
public static void setWindowOpaque(Window window, boolean isOpaque) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
if (!isOpaque && !isTranslucencySupported(Translucency.PERPIXEL_TRANSLUCENT)) {
throw new UnsupportedOperationException(
"The PERPIXEL_TRANSLUCENT translucency kind is not supported");
}
AWTAccessor.getWindowAccessor().setOpaque(window, isOpaque);
}
/**
* Returns whether the window is opaque or translucent.
*
* @param window the window to set the shape to
* @return whether the window is currently opaque (true)
* or translucent (false)
* @throws NullPointerException if the window argument is null
*/
public static boolean isWindowOpaque(Window window) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
return AWTAccessor.getWindowAccessor().isOpaque(window);
}
/**
* Verifies whether a given GraphicsConfiguration supports
* the PERPIXEL_TRANSLUCENT kind of translucency.
* All windows that are intended to be used with the {@link #setWindowOpaque}
* method must be created using a GraphicsConfiguration for which this method
* returns true.
* <p>Note that some native systems enable the per-pixel translucency
* mode for any window created using a translucency-capable
* graphics configuration. However, it is highly recommended to always
* invoke the setWindowOpaque() method for these windows, at least
* for the sake of cross-platform compatibility reasons.
*
* @param gc GraphicsConfiguration
* @throws NullPointerException if the gc argument is null
* @return whether the given GraphicsConfiguration supports
* the translucency effects.
*/
public static boolean isTranslucencyCapable(GraphicsConfiguration gc) {
if (gc == null) {
throw new NullPointerException("The gc argument should not be null");
}
/*
return gc.isTranslucencyCapable();
*/
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isTranslucencyCapable(gc);
}
/**
* Sets a 'mixing-cutout' shape for the given component.
*

View File

@ -0,0 +1,169 @@
/*
* Copyright 2008-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.awt;
import java.awt.*;
import java.awt.geom.*;
import sun.awt.AWTAccessor;
/**
* Security Warning control interface.
*
* This class provides a couple of methods that help a developer relocate
* the AWT security warning to an appropriate position relative to the current
* window size. A "top-level window" is an instance of the {@code Window}
* class (or its descendant, such as {@code JFrame}). The security warning
* is applied to all windows created by an untrusted code. All such windows
* have a non-null "warning string" (see {@link Window#getWarningString()}).
* <p>
* <b>WARNING</b>: This class is an implementation detail and only meant
* for limited use outside of the core platform. This API may change
* drastically between update release, and it may even be
* removed or be moved to some other packages or classes.
*/
public final class SecurityWarning {
/**
* The SecurityWarning class should not be instantiated
*/
private SecurityWarning() {
}
/**
* Gets the size of the security warning.
*
* The returned value is not valid until the peer has been created. Before
* invoking this method a developer must call the {@link Window#pack()},
* {@link Window#setVisible()}, or some other method that creates the peer.
*
* @param window the window to get the security warning size for
*
* @throws NullPointerException if the window argument is null
* @throws IllegalArgumentException if the window is trusted (i.e.
* the {@code getWarningString()} returns null)
*/
public static Dimension getSize(Window window) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
if (window.getWarningString() == null) {
throw new IllegalArgumentException(
"The window must have a non-null warning string.");
}
// We don't check for a non-null peer since it may be destroyed
// after assigning a valid value to the security warning size.
return AWTAccessor.getWindowAccessor().getSecurityWarningSize(window);
}
/**
* Sets the position of the security warning.
* <p>
* The {@code alignmentX} and {@code alignmentY} arguments specify the
* origin of the coordinate system used to calculate the position of the
* security warning. The values must be in the range [0.0f...1.0f]. The
* {@code 0.0f} value represents the left (top) edge of the rectangular
* bounds of the window. The {@code 1.0f} value represents the right
* (bottom) edge of the bounds. Whenever the size of the window changes,
* the origin of the coordinate system gets relocated accordingly. For
* convenience a developer may use the {@code Component.*_ALIGNMENT}
* constants to pass predefined values for these arguments.
* <p>
* The {@code point} argument specifies the location of the security
* warning in the coordinate system described above. If both {@code x} and
* {@code y} coordinates of the point are equal to zero, the warning will
* be located right in the origin of the coordinate system. On the other
* hand, if both {@code alignmentX} and {@code alignmentY} are equal to
* zero (i.e. the origin of the coordinate system is placed at the top-left
* corner of the window), then the {@code point} argument represents the
* absolute location of the security warning relative to the location of
* the window. The "absolute" in this case means that the position of the
* security warning is not effected by resizing of the window.
* <p>
* Note that the security warning managment code guarantees that:
* <ul>
* <li>The security warning cannot be located farther than two pixels from
* the rectangular bounds of the window (see {@link Window#getBounds}), and
* <li>The security warning is always visible on the screen.
* </ul>
* If either of the conditions is violated, the calculated position of the
* security warning is adjusted by the system to meet both these
* conditions.
* <p>
* The default position of the security warning is in the upper-right
* corner of the window, two pixels to the right from the right edge. This
* corresponds to the following arguments passed to this method:
* <ul>
* <li>{@code alignmentX = Component.RIGHT_ALIGNMENT}
* <li>{@code alignmentY = Component.TOP_ALIGNMENT}
* <li>{@code point = (2, 0)}
* </ul>
*
* @param window the window to set the position of the security warning for
* @param alignmentX the horizontal origin of the coordinate system
* @param alignmentY the vertical origin of the coordinate system
* @param point the position of the security warning in the specified
* coordinate system
*
* @throws NullPointerException if the window argument is null
* @throws NullPointerException if the point argument is null
* @throws IllegalArgumentException if the window is trusted (i.e.
* the {@code getWarningString()} returns null
* @throws IllegalArgumentException if the alignmentX or alignmentY
* arguments are not within the range [0.0f ... 1.0f]
*/
public static void setPosition(Window window, Point2D point,
float alignmentX, float alignmentY)
{
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
if (window.getWarningString() == null) {
throw new IllegalArgumentException(
"The window must have a non-null warning string.");
}
if (point == null) {
throw new NullPointerException(
"The point argument must not be null");
}
if (alignmentX < 0.0f || alignmentX > 1.0f) {
throw new IllegalArgumentException(
"alignmentX must be in the range [0.0f ... 1.0f].");
}
if (alignmentY < 0.0f || alignmentY > 1.0f) {
throw new IllegalArgumentException(
"alignmentY must be in the range [0.0f ... 1.0f].");
}
AWTAccessor.getWindowAccessor().setSecurityWarningPosition(window,
point, alignmentX, alignmentY);
}
}

View File

@ -279,20 +279,22 @@ class GTKIconFactory {
public void paintIcon(SynthContext context, Graphics g, int x, int y,
int w, int h) {
JToolBar toolbar = (JToolBar)context.getComponent();
Orientation orientation =
(toolbar.getOrientation() == JToolBar.HORIZONTAL ?
Orientation.HORIZONTAL : Orientation.VERTICAL);
if (context != null) {
JToolBar toolbar = (JToolBar)context.getComponent();
Orientation orientation =
(toolbar.getOrientation() == JToolBar.HORIZONTAL ?
Orientation.HORIZONTAL : Orientation.VERTICAL);
if (style == null) {
style = SynthLookAndFeel.getStyleFactory().getStyle(
context.getComponent(), GTKRegion.HANDLE_BOX);
if (style == null) {
style = SynthLookAndFeel.getStyleFactory().getStyle(
context.getComponent(), GTKRegion.HANDLE_BOX);
}
context = new SynthContext(toolbar, GTKRegion.HANDLE_BOX,
style, SynthConstants.ENABLED);
GTKPainter.INSTANCE.paintIcon(context, g,
getMethod(), x, y, w, h, orientation);
}
context = new SynthContext(toolbar, GTKRegion.HANDLE_BOX,
style, SynthConstants.ENABLED);
GTKPainter.INSTANCE.paintIcon(context, g,
getMethod(), x, y, w, h, orientation);
}
public int getIconWidth(SynthContext context) {
@ -336,12 +338,14 @@ class GTKIconFactory {
public void paintIcon(SynthContext context, Graphics g, int x, int y,
int w, int h) {
ArrowType arrowDir = ArrowType.RIGHT;
if (!context.getComponent().getComponentOrientation().isLeftToRight()) {
arrowDir = ArrowType.LEFT;
if (context != null) {
ArrowType arrowDir = ArrowType.RIGHT;
if (!context.getComponent().getComponentOrientation().isLeftToRight()) {
arrowDir = ArrowType.LEFT;
}
GTKPainter.INSTANCE.paintIcon(context, g,
getMethod(), x, y, w, h, arrowDir);
}
GTKPainter.INSTANCE.paintIcon(context, g,
getMethod(), x, y, w, h, arrowDir);
}
}
}

View File

@ -39,6 +39,8 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.shell.ShellFolder;
import sun.awt.OSInfo;
@ -1143,7 +1145,11 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
File[] baseFolders;
if (useShellFolder) {
baseFolders = (File[])ShellFolder.get("fileChooserComboBoxFolders");
baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() {
public File[] run() {
return (File[]) ShellFolder.get("fileChooserComboBoxFolders");
}
});
} else {
baseFolders = fsv.getRoots();
}

View File

@ -0,0 +1,140 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* A skeletal handler that consumes notifications and continues.
*
* <P> This class trivially implements the {@code handleNotification} methods to
* return {@link HandlerResult#CONTINUE CONTINUE} so that all notifications are
* consumed and the channel continues to try and receive a message.
*
* <P> It also provides overloaded versions of the {@code handleNotification}
* methods, one for each of the required supported notification types, {@link
* AssociationChangeNotification}, {@link PeerAddressChangeNotification},
* {@link SendFailedNotification}, and {@link ShutdownNotification}. The
* appropriate method will be invoked when the notification is received.
*
* @since 1.7
*/
public class AbstractNotificationHandler<T>
implements NotificationHandler<T>
{
/**
* Initializes a new instance of this class.
*/
protected AbstractNotificationHandler() {}
/**
* Invoked when an implementation specific notification is received from the
* SCTP stack.
*
* @param notification
* The notification
*
* @param attachment
* The object attached to the {@code receive} operation when it was
* initiated.
*
* @return The handler result
*/
@Override
public HandlerResult handleNotification(Notification notification,
T attachment) {
return HandlerResult.CONTINUE;
}
/**
* Invoked when an {@link AssociationChangeNotification} is received from
* the SCTP stack.
*
* @param notification
* The notification
*
* @param attachment
* The object attached to the {@code receive} operation when it was
* initiated.
*
* @return The handler result
*/
public HandlerResult handleNotification(AssociationChangeNotification notification,
T attachment) {
return HandlerResult.CONTINUE;
}
/**
* Invoked when an {@link PeerAddressChangeNotification} is received from
* the SCTP stack.
*
* @param notification
* The notification
*
* @param attachment
* The object attached to the {@code receive} operation when it was
* initiated.
*
* @return The handler result
*/
public HandlerResult handleNotification(PeerAddressChangeNotification notification,
T attachment) {
return HandlerResult.CONTINUE;
}
/**
* Invoked when an {@link SendFailedNotification} is received from
* the SCTP stack.
*
* @param notification
* The notification
*
* @param attachment
* The object attached to the {@code receive} operation when it was
* initiated.
*
* @return The handler result
*/
public HandlerResult handleNotification(SendFailedNotification notification,
T attachment) {
return HandlerResult.CONTINUE;
}
/**
* Invoked when an {@link ShutdownNotification} is received from
* the SCTP stack.
*
* @param notification
* The notification
*
* @param attachment
* The object attached to the {@code receive} operation when it was
* initiated.
*
* @return The handler result
*/
public HandlerResult handleNotification(ShutdownNotification notification,
T attachment) {
return HandlerResult.CONTINUE;
}
}

View File

@ -0,0 +1,104 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* A class that represents an SCTP association.
*
* <P> An association exists between two SCTP endpoints. Each endpoint is
* represented by a list of transport addresses through which that endpoint can
* be reached and from which it will originate SCTP messages. The association
* spans over all of the possible source/destination combinations which may be
* generated from each endpoint's lists of addresses.
*
* <P> Associations are identified by their Association ID.
* Association ID's are guaranteed to be unique for the lifetime of the
* association. An association ID may be reused after the association has been
* shutdown. An association ID is not unique across multiple SCTP channels.
* An Association's local and remote addresses may change if the SCTP
* implementation supports <I>Dynamic Address Reconfiguration</I> as defined by
* <A HREF="http://tools.ietf.org/html/rfc5061">RFC5061</A>, see the
* {@code bindAddress} and {@code unbindAddress} methods of {@link SctpChannel},
* {@link SctpServerChannel}, and {@link SctpMultiChannel}.
*
* <P> An {@code Association} is returned from an {@link
* SctpChannel#association SctpChannel} or an {@link
* SctpMultiChannel#associations SctpMultiChannel}, as well
* as being given as a parameter to {@link NotificationHandler
* NotificationHandler} methods.
*
* @since 1.7
*/
public class Association {
private final int associationID;
private final int maxInStreams;
private final int maxOutStreams;
/**
* Initializes a new instance of this class.
*/
protected Association(int associationID,
int maxInStreams,
int maxOutStreams) {
this.associationID = associationID;
this.maxInStreams = maxInStreams;
this.maxOutStreams = maxOutStreams;
}
/**
* Returns the associationID.
*
* @return The association ID
*/
public final int associationID() {
return associationID;
};
/**
* Returns the maximum number of inbound streams that this association
* supports.
*
* <P> Data received on this association will be on stream number
* {@code s}, where {@code 0 <= s < maxInboundStreams()}.
*
* @return The maximum number of inbound streams
*/
public final int maxInboundStreams() {
return maxInStreams;
};
/**
* Returns the maximum number of outbound streams that this association
* supports.
*
* <P> Data sent on this association must be on stream number
* {@code s}, where {@code 0 <= s < maxOutboundStreams()}.
*
* @return The maximum number of outbound streams
*/
public final int maxOutboundStreams() {
return maxOutStreams;
};
}

View File

@ -0,0 +1,92 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* Notification emitted when an association has either opened or closed.
*
* @since 1.7
*/
public abstract class AssociationChangeNotification
implements Notification
{
/**
* Defines the type of change event that happened to the association.
*
* @since 1.7
*/
public enum AssocChangeEvent
{
/**
* A new association is now ready and data may be exchanged with this peer.
*/
COMM_UP,
/**
* The association has failed. A series of SCTP send failed notifications
* will follow this notification, one for each outstanding message.
*/
COMM_LOST,
/**
* SCTP has detected that the peer has restarted.
*/
RESTART,
/**
* The association has gracefully closed.
*/
SHUTDOWN,
/**
* The association failed to setup. If a message was sent on a {@link
* SctpMultiChannel} in non-blocking mode, an
* SCTP send failed notification will follow this notification for the
* outstanding message.
*/
CANT_START
}
/**
* Initializes a new instance of this class.
*/
protected AssociationChangeNotification() {}
/**
* Returns the association that this notification is applicable to.
*
* @return The association whose state has changed, or {@code null} if
* there is no association, that is {@linkplain
* AssocChangeEvent#CANT_START CANT_START}
*/
public abstract Association association();
/**
* Returns the type of change event.
*
* @return The event
*/
public abstract AssocChangeEvent event();
}

View File

@ -0,0 +1,47 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* Defines notification handler results.
*
* <P> The {@code HandlerResult} is used to determine the behavior of the
* channel after it handles a notification from the SCTP stack. Essentially its
* value determines if the channel should try to receive another notificaiton or
* a message before returning.
*
* @since 1.7
*/
public enum HandlerResult {
/**
* Try to receieve another message or notification.
*/
CONTINUE,
/**
* Return without trying to receive any more data.
*/
RETURN;
}

View File

@ -0,0 +1,49 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* Unchecked exception thrown when an attempt is made to invoke the
* {@code receive} method of {@link SctpChannel} or {@link SctpMultiChannel}
* from a notification handler.
*
* @since 1.7
*/
public class IllegalReceiveException extends IllegalStateException {
private static final long serialVersionUID = 2296619040988576224L;
/**
* Constructs an instance of this class.
*/
public IllegalReceiveException() { }
/**
* Constructs an instance of this class with the specified message.
*/
public IllegalReceiveException(String msg) {
super(msg);
}
}

View File

@ -0,0 +1,49 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* Unchecked exception thrown when an attempt is made to remove an
* address that is not bound to the channel, or remove an address from a
* channel that has only one address bound to it.
*
* @since 1.7
*/
public class IllegalUnbindException extends IllegalStateException {
private static final long serialVersionUID = -310540883995532224L;
/**
* Constructs an instance of this class.
*/
public IllegalUnbindException() { }
/**
* Constructs an instance of this class with the specified detailed message.
*/
public IllegalUnbindException(String msg) {
super(msg);
}
}

View File

@ -0,0 +1,48 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* Unchecked exception thrown when an attempt is made to send a
* message to an invalid stream.
*
* @since 1.7
*/
public class InvalidStreamException extends IllegalArgumentException {
private static final long serialVersionUID = -9172703378046665558L;
/**
* Constructs an instance of this class.
*/
public InvalidStreamException() { }
/**
* Constructs an instance of this class with the specified detailed message.
*/
public InvalidStreamException(String msg) {
super(msg);
}
}

View File

@ -0,0 +1,303 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
import java.net.SocketAddress;
/**
* The {@code MessageInfo} class provides additional ancillary information about
* messages.
*
* <P> Received SCTP messages, returned by
* {@link SctpChannel#receive SctpChannel.receive} and {@link
* SctpMultiChannel#receive SctpMultiChannel.receive},
* return a {@code MessageInfo} instance that can be queried to determine
* ancillary information about the received message. Messages being sent should
* use one of the {@link #createOutgoing(java.net.SocketAddress,int)
* createOutgoing} methods to provide ancillary data for the message being
* sent, and may use the appropriate setter methods to override the default
* values provided for {@link #isUnordered() unordered}, {@link #timeToLive()
* timeToLive}, {@link #isComplete() complete} and {@link #payloadProtocolID()
* payloadProtocolID}, before sending the message.
*
* <P> For out going messages the {@code timeToLive} parameter is a time period
* that the sending side SCTP stack may expire the message if it has not been
* sent. This time period is an indication to the stack that the message is no
* longer required to be sent after the time period expires. It is not a hard
* timeout and may be influenced by whether the association supports the partial
* reliability extension, <a href=http://www.ietf.org/rfc/rfc3758.txt>RFC 3758
* <a>
*
* <P> {@code MessageInfo} instances are not safe for use by multiple concurrent
* threads. If a MessageInfo is to be used by more than one thread then access
* to the MessageInfo should be controlled by appropriate synchronization.
*
* @since 1.7
*/
public abstract class MessageInfo {
/**
* Initializes a new instance of this class.
*/
protected MessageInfo() {}
/**
* Creates a {@code MessageInfo} instance suitable for use when
* sending a message.
*
* <P> The returned instance will have its {@link #isUnordered() unordered}
* value set to {@code false}, its {@link #timeToLive() timeToLive} value
* set to {@code 0}, its {@link #isComplete() complete} value set
* to {@code true}, and its {@link #payloadProtocolID() payloadProtocolID}
* value set to {@code 0}. These values, if required, can be set through
* the appropriate setter method before sending the message.
*
* @param address
* For a connected {@code SctpChannel} the address is the
* preferred peer address of the association to send the message
* to, or {@code null} to use the peer primary address. For an
* {@code SctpMultiChannel} the address is used to determine
* the association, or if no association exists with a peer of that
* address then one is setup.
*
* @param streamNumber
* The stream number that the message will be sent on
*
* @return The outgoing message info
*
* @throws IllegalArgumentException
* If the streamNumber is negative or greater than {@code 65536}
*/
public static MessageInfo createOutgoing(SocketAddress address,
int streamNumber) {
if (streamNumber < 0 || streamNumber > 65536)
throw new IllegalArgumentException("Invalid stream number");
return new sun.nio.ch.SctpMessageInfoImpl(null, address, streamNumber);
}
/**
* Creates a {@code MessageInfo} instance suitable for use when
* sending a message to a given association. Typically used for
* {@code SctpMultiChannel} when an association has already been setup.
*
* <P> The returned instance will have its {@link #isUnordered() unordered}
* value set to {@code false}, its {@link #timeToLive() timeToLive} value
* set to {@code 0}, its {@link #isComplete() complete} value set
* to {@code true}, and its {@link #payloadProtocolID() payloadProtocolID}
* value set to {@code 0}. These values, if required, can be set through
* the appropriate setter method before sending the message.
*
* @param association
* The association to send the message on
*
* @param address
* The preferred peer address of the association to send the message
* to, or {@code null} to use the peer primary address
*
* @param streamNumber
* The stream number that the message will be sent on.
*
* @return The outgoing message info
*
* @throws IllegalArgumentException
* If {@code association} is {@code null}, or the streamNumber is
* negative or greater than {@code 65536}
*/
public static MessageInfo createOutgoing(Association association,
SocketAddress address,
int streamNumber) {
if (association == null)
throw new IllegalArgumentException("association cannot be null");
if (streamNumber < 0 || streamNumber > 65536)
throw new IllegalArgumentException("Invalid stream number");
return new sun.nio.ch.SctpMessageInfoImpl(association, address,
streamNumber);
}
/**
* Returns the source socket address if the message has been received,
* otherwise the preferred destination of the message to be sent.
*
* @return The socket address, or {@code null} if this instance is to be
* used for sending a message and has been construced without
* specifying a preferred destination address
*
*/
public abstract SocketAddress address();
/**
* Returns the association that the message was received on, if the message
* has been received, otherwise the association that the message is to be
* sent on.
*
* @return The association, or {@code null} if this instance is to be
* used for sending a message and has been construced using the
* the {@link #createOutgoing(SocketAddress,int)
* createOutgoing(SocketAddress,int)} static factory method
*/
public abstract Association association();
/**
* Returns the number of bytes read for the received message.
*
* <P> This method is only appicable for received messages, it has no
* meaning for messages being sent.
*
* @return The number of bytes read, {@code -1} if the channel is an {@link
* SctpChannel} that has reached end-of-stream, otherwise
* {@code 0}
*/
public abstract int bytes();
/**
* Tells whether or not the message is complete.
*
* <P> For received messages {@code true} indicates that the message was
* completely received. For messages being sent {@code true} indicates that
* the message is complete, {@code false} indicates that the message is not
* complete. How the send channel interprets this value depends on the value
* of its {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} socket option.
*
* @return {@code true} if, and only if, the message is complete
*/
public abstract boolean isComplete();
/**
* Sets whether or not the message is complete.
*
* <P> For messages being sent {@code true} indicates that
* the message is complete, {@code false} indicates that the message is not
* complete. How the send channel interprets this value depends on the value
* of its {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} socket option.
*
* @param complete
* {@code true} if, and only if, the message is complete
*
* @return This MessageInfo
*
* @see MessageInfo#isComplete()
*/
public abstract MessageInfo complete(boolean complete);
/**
* Tells whether or not the message is unordered. For received messages
* {@code true} indicates that the message was sent non-ordered. For
* messages being sent {@code true} requests the un-ordered delivery of the
* message, {@code false} indicates that the message is ordered.
*
* @return {@code true} if the message is unordered, otherwise
* {@code false}
*/
public abstract boolean isUnordered();
/**
* Sets whether or not the message is unordered.
*
* @param unordered
* {@code true} requests the un-ordered delivery of the message,
* {@code false} indicates that the message is ordered.
*
* @return This MessageInfo
*
* @see MessageInfo#isUnordered()
*/
public abstract MessageInfo unordered(boolean unordered);
/**
* Returns the payload protocol Identifier.
*
* <P> A value indicating the type of payload protocol data being
* transmitted/received. This value is passed as opaque data by SCTP.
* {@code 0} indicates an unspecified payload protocol identifier.
*
* @return The Payload Protocol Identifier
*/
public abstract int payloadProtocolID();
/**
* Sets the payload protocol Identifier.
*
* <P> A value indicating the type of payload protocol data being
* transmitted. This value is passed as opaque data by SCTP.
*
* @param ppid
* The Payload Protocol Identifier, or {@code 0} indicate an
* unspecified payload protocol identifier.
*
* @return This MessageInfo
*
* @see MessageInfo#payloadProtocolID()
*/
public abstract MessageInfo payloadProtocolID(int ppid);
/**
* Returns the stream number that the message was received on, if the
* message has been received, otherwise the stream number that the message
* is to be sent on.
*
* @return The stream number
*/
public abstract int streamNumber();
/**
* Sets the stream number that the message is to be sent on.
*
* @param streamNumber
* The stream number
*
* @throws IllegalArgumentException
* If the streamNumber is negative or greater than {@code 65536}
*
* @return This MessageInfo
*/
public abstract MessageInfo streamNumber(int streamNumber);
/**
* The time period that the sending side may expire the message if it has
* not been sent, or {@code 0} to indicate that no timeout should occur. This
* value is only applicable for messages being sent, it has no meaning for
* received messages.
*
* @return The time period in milliseconds, or {@code 0}
*/
public abstract long timeToLive();
/**
* Sets the time period that the sending side may expire the message if it
* has not been sent.
*
* @param millis
* The time period in milliseconds, or {@code 0} to indicate that no
* timeout should occur
*
* @return This MessageInfo
*
* @see MessageInfo#timeToLive()
*/
public abstract MessageInfo timeToLive(long millis);
}

View File

@ -0,0 +1,45 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* A notification from the SCTP stack.
*
* <P> Objects of this type are passed to the {@link NotificationHandler} when
* a notification is received.
*
* <P> An SCTP channel supports the following notifications: {@link
* AssociationChangeNotification}, {@link PeerAddressChangeNotification},
* {@link SendFailedNotification}, {@link ShutdownNotification}, and may support
* additional implementation specific notifications.
*
* @since 1.7
*/
public interface Notification {
/**
* Returns the association that this notification is applicable to.
*/
public Association association();
}

View File

@ -0,0 +1,65 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* A handler for consuming notifications from the SCTP stack.
*
* <P> The SCTP channels defined in this package allow a notification handler to
* be specified to consume notifications from the SCTP stack. When a
* notification is received the {@linkplain #handleNotification
* handleNotification} method of the handler is invoked to handle that
* notification.
*
* <P> Additionally, an attachment object can be attached to the {@code receive}
* operation to provide context when consuming the notification. The
* attachment is important for cases where a <i>state-less</i> {@code
* NotificationHandler} is used to consume the result of many {@code receive}
* operations.
*
* <P> Handler implementations are encouraged to extend the {@link
* AbstractNotificationHandler} class which implements this interface and
* provide notification specific methods. However, an API should generally use
* this handler interface as the type for parameters, return type, etc. rather
* than the abstract class.
*
* @param T The type of the object attached to the receive operation
*
* @since 1.7
*/
public interface NotificationHandler<T> {
/**
* Invoked when a notification is received from the SCTP stack.
*
* @param notification
* The notification
*
* @param attachment
* The object attached to the receive operation when it was initiated.
*
* @return The handler result
*/
HandlerResult handleNotification(Notification notification, T attachment);
}

View File

@ -0,0 +1,107 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
import java.net.SocketAddress;
/**
* Notification emitted when a destination address on a multi-homed peer
* encounters a change.
*
* @since 1.7
*/
public abstract class PeerAddressChangeNotification
implements Notification
{
/**
* Defines the type of address change event that occurred to the destination
* address on a multi-homed peer when it encounters a change of interface
* details.
*
* <P> Some of these events types are only generated when the association
* supports dynamic address reconfiguration, e.g. {@code SCTP_ADDR_ADDED},
* {@code SCTP_ADDR_REMOVED}, etc.
*
* @since 1.7
*/
public enum AddressChangeEvent {
/**
* This address is now reachable.
*/
ADDR_AVAILABLE,
/**
* The address specified can no longer be reached. Any data sent to this
* address is rerouted to an alternate until this address becomes reachable.
*/
ADDR_UNREACHABLE,
/**
* The address is no longer part of the association.
*/
ADDR_REMOVED,
/**
* The address is now part of the association.
*/
ADDR_ADDED,
/**
* This address has now been made to be the primary destination address.
*/
ADDR_MADE_PRIMARY,
/**
* This address has now been confirmed as a valid address.
*/
ADDR_CONFIRMED;
}
/**
* Initializes a new instance of this class.
*/
protected PeerAddressChangeNotification() {}
/**
* Returns the peer address.
*
* @return The peer address
*/
public abstract SocketAddress address();
/**
* Returns the association that this notification is applicable to.
*
* @return The association whose peer address changed
*/
public abstract Association association();
/**
* Returns the type of change event.
*
* @return The event
*/
public abstract AddressChangeEvent event();
}

View File

@ -0,0 +1,859 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
import java.net.SocketAddress;
import java.net.InetAddress;
import java.io.IOException;
import java.util.Set;
import java.nio.ByteBuffer;
import java.nio.channels.spi.AbstractSelectableChannel;
import java.nio.channels.spi.SelectorProvider;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
/**
* A selectable channel for message-oriented connected SCTP sockets.
*
* <P> An SCTP channel can only control one SCTP association.
* An {@code SCTPChannel} is created by invoking one of the
* {@link #open open} methods of this class. A newly-created channel is open but
* not yet connected, that is, there is no association setup with a remote peer.
* An attempt to invoke an I/O operation upon an unconnected
* channel will cause a {@link java.nio.channels.NotYetConnectedException} to be
* thrown. An association can be setup by connecting the channel using one of
* its {@link #connect connect} methods. Once connected, the channel remains
* connected until it is closed. Whether or not a channel is connected may be
* determined by invoking {@link #getRemoteAddresses getRemoteAddresses}.
*
* <p> SCTP channels support <i>non-blocking connection:</i>&nbsp;A
* channel may be created and the process of establishing the link to
* the remote socket may be initiated via the {@link #connect connect} method
* for later completion by the {@link #finishConnect finishConnect} method.
* Whether or not a connection operation is in progress may be determined by
* invoking the {@link #isConnectionPending isConnectionPending} method.
*
* <p> Socket options are configured using the
* {@link #setOption(SctpSocketOption,Object) setOption} method. An SCTP
* channel support the following options:
* <blockquote>
* <table border>
* <tr>
* <th>Option Name</th>
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS
* SCTP_DISABLE_FRAGMENTS} </td>
* <td> Enables or disables message fragmentation </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} </td>
* <td> Enables or disables explicit message completion </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} </td>
* <td> Controls how the presentation of messages occur for the message
* receiver </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS
* SCTP_INIT_MAXSTREAMS} </td>
* <td> The maximum number of streams requested by the local endpoint during
* association initialization </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_NODELAY SCTP_NODELAY} </td>
* <td> Enables or disable a Nagle-like algorithm </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR
* SCTP_PRIMARY_ADDR} </td>
* <td> Requests that the local SCTP stack use the given peer address as the
* association primary </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR
* SCTP_SET_PEER_PRIMARY_ADDR} </td>
* <td> Requests that the peer mark the enclosed address as the association
* primary </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_SNDBUF
* SO_SNDBUF} </td>
* <td> The size of the socket send buffer </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_RCVBUF
* SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_LINGER
* SO_LINGER} </td>
* <td> Linger on close if data is present (when configured in blocking mode
* only) </td>
* </tr>
* </table>
* </blockquote>
* Additional (implementation specific) options may also be supported. The list
* of options supported is obtained by invoking the {@link #supportedOptions()
* supportedOptions} method.
*
* <p> SCTP channels are safe for use by multiple concurrent threads.
* They support concurrent reading and writing, though at most one thread may be
* reading and at most one thread may be writing at any given time. The
* {@link #connect connect} and {@link #finishConnect
* finishConnect} methods are mutually synchronized against each other, and
* an attempt to initiate a send or receive operation while an invocation of one
* of these methods is in progress will block until that invocation is complete.
*
* @since 1.7
*/
public abstract class SctpChannel
extends AbstractSelectableChannel
{
/**
* Initializes a new instance of this class.
*
* @param provider
* The selector provider for this channel
*/
protected SctpChannel(SelectorProvider provider) {
super(provider);
}
/**
* Opens an SCTP channel.
*
* <P> The new channel is unbound and unconnected.
*
* @return A new SCTP channel
*
* @throws UnsupportedOperationException
* If the SCTP protocol is not supported
*
* @throws IOException
* If an I/O error occurs
*/
public static SctpChannel open() throws
IOException {
return new sun.nio.ch.SctpChannelImpl((SelectorProvider)null);
}
/**
* Opens an SCTP channel and connects it to a remote address.
*
* <P> This is a convenience method and is equivalent to evaluating the
* following expression:
* <blockquote><pre>
* open().connect(remote, maxOutStreams, maxInStreams);
* </pre></blockquote>
*
* @param remote
* The remote address to which the new channel is to be connected
*
* @param maxOutStreams
* The number of streams that the application wishes to be able
* to send to. Must be non negative and no larger than {@code 65536}.
* {@code 0} to use the endpoints default value.
*
* @param maxInStreams
* The maximum number of inbound streams the application is prepared
* to support. Must be non negative and no larger than {@code 65536}.
* {@code 0} to use the endpoints default value.
*
* @return A new SCTP channel connected to the given address
*
* @throws java.nio.channels.AsynchronousCloseException
* If another thread closes this channel
* while the connect operation is in progress
*
* @throws java.nio.channels.ClosedByInterruptException
* If another thread interrupts the current thread
* while the connect operation is in progress, thereby
* closing the channel and setting the current thread's
* interrupt status
*
* @throws java.nio.channels.UnresolvedAddressException
* If the given remote address is not fully resolved
*
* @throws java.nio.channels.UnsupportedAddressTypeException
* If the type of the given remote address is not supported
*
* @throws SecurityException
* If a security manager has been installed
* and it does not permit access to the given remote peer
*
* @throws UnsupportedOperationException
* If the SCTP protocol is not supported
*
* @throws IOException
* If some other I/O error occurs
*/
public static SctpChannel open(SocketAddress remote, int maxOutStreams,
int maxInStreams) throws IOException {
SctpChannel ssc = SctpChannel.open();
ssc.connect(remote, maxOutStreams, maxInStreams);
return ssc;
}
/**
* Returns the association on this channel's socket.
*
* @return the association, or {@code null} if the channel's socket is not
* connected.
*
* @throws ClosedChannelException
* If the channel is closed
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract Association association() throws IOException;
/**
* Binds the channel's socket to a local address.
*
* <P> This method is used to establish a relationship between the socket
* and the local addresses. Once a relationship is established then
* the socket remains bound until the channel is closed. This relationship
* may not necesssarily be with the address {@code local} as it may be removed
* by {@link #unbindAddress unbindAddress}, but there will always be at least
* one local address bound to the channel's socket once an invocation of
* this method successfully completes.
*
* <P> Once the channel's socket has been successfully bound to a specific
* address, that is not automatically assigned, more addresses
* may be bound to it using {@link #bindAddress bindAddress}, or removed
* using {@link #unbindAddress unbindAddress}.
*
* @param local
* The local address to bind the socket, or {@code null} to
* bind the socket to an automatically assigned socket address
*
* @return This channel
*
* @throws java.nio.channels.AlreadyConnectedException
* If this channel is already connected
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.ConnectionPendingException
* If a non-blocking connection operation is already in progress on this channel
*
* @throws java.nio.channels.AlreadyBoundException
* If this channel is already bound
*
* @throws java.nio.channels.UnsupportedAddressTypeException
* If the type of the given address is not supported
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpChannel bind(SocketAddress local)
throws IOException;
/**
* Adds the given address to the bound addresses for the channel's
* socket.
*
* <P> The given address must not be the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address.
* The channel must be first bound using {@link #bind bind} before
* invoking this method, otherwise {@link
* java.nio.channels.NotYetBoundException} is thrown. The {@link #bind bind}
* method takes a {@code SocketAddress} as its argument which typically
* contains a port number as well as an address. Addresses subquently bound
* using this method are simply addresses as the SCTP port number remains
* the same for the lifetime of the channel.
*
* <P> Adding addresses to a connected association is optional functionality.
* If the endpoint supports dynamic address reconfiguration then it may
* send the appropriate message to the peer to change the peers address
* lists.
*
* @param address
* The address to add to the bound addresses for the socket
*
* @return This channel
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.ConnectionPendingException
* If a non-blocking connection operation is already in progress on
* this channel
*
* @throws java.nio.channels.NotYetBoundException
* If this channel is not yet bound
*
* @throws java.nio.channels.AlreadyBoundException
* If this channel is already bound to the given address
*
* @throws IllegalArgumentException
* If address is {@code null} or the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpChannel bindAddress(InetAddress address)
throws IOException;
/**
* Removes the given address from the bound addresses for the channel's
* socket.
*
* <P> The given address must not be the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address.
* The channel must be first bound using {@link #bind bind} before
* invoking this method, otherwise {@link java.nio.channels.NotYetBoundException}
* is thrown. If this method is invoked on a channel that does not have
* {@code address} as one of its bound addresses or that has only one
* local address bound to it, then this method throws
* {@link IllegalUnbindException}.
* The initial address that the channel's socket is bound to using {@link
* #bind bind} may be removed from the bound addresses for the channel's socket.
*
* <P> Removing addresses from a connected association is optional
* functionality. If the endpoint supports dynamic address reconfiguration
* then it may send the appropriate message to the peer to change the peers
* address lists.
*
* @param address
* The address to remove from the bound addresses for the socket
*
* @return This channel
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.ConnectionPendingException
* If a non-blocking connection operation is already in progress on
* this channel
*
* @throws java.nio.channels.NotYetBoundException
* If this channel is not yet bound
*
* @throws IllegalArgumentException
* If address is {@code null} or the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address
*
* @throws IllegalUnbindException
* If {@code address} is not bound to the channel's socket. or
* the channel has only one address bound to it
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpChannel unbindAddress(InetAddress address)
throws IOException;
/**
* Connects this channel's socket.
*
* <P> If this channel is in non-blocking mode then an invocation of this
* method initiates a non-blocking connection operation. If the connection
* is established immediately, as can happen with a local connection, then
* this method returns {@code true}. Otherwise this method returns
* {@code false} and the connection operation must later be completed by
* invoking the {@link #finishConnect finishConnect} method.
*
* <P> If this channel is in blocking mode then an invocation of this
* method will block until the connection is established or an I/O error
* occurs.
*
* <P> If a security manager has been installed then this method verifies
* that its {@link java.lang.SecurityManager#checkConnect checkConnect}
* method permits connecting to the address and port number of the given
* remote peer.
*
* <p> This method may be invoked at any time. If a {@link #send send} or
* {@link #receive receive} operation upon this channel is invoked while an
* invocation of this method is in progress then that operation will first
* block until this invocation is complete. If a connection attempt is
* initiated but fails, that is, if an invocation of this method throws a
* checked exception, then the channel will be closed.
*
* @param remote
* The remote peer to which this channel is to be connected
*
* @return {@code true} if a connection was established, {@code false} if
* this channel is in non-blocking mode and the connection
* operation is in progress
*
* @throws java.nio.channels.AlreadyConnectedException
* If this channel is already connected
*
* @throws java.nio.channels.ConnectionPendingException
* If a non-blocking connection operation is already in progress on
* this channel
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AsynchronousCloseException
* If another thread closes this channel
* while the connect operation is in progress
*
* @throws java.nio.channels.ClosedByInterruptException
* If another thread interrupts the current thread
* while the connect operation is in progress, thereby
* closing the channel and setting the current thread's
* interrupt status
*
* @throws java.nio.channels.UnresolvedAddressException
* If the given remote address is not fully resolved
*
* @throws java.nio.channels.UnsupportedAddressTypeException
* If the type of the given remote address is not supported
*
* @throws SecurityException
* If a security manager has been installed
* and it does not permit access to the given remote peer
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract boolean connect(SocketAddress remote) throws IOException;
/**
* Connects this channel's socket.
*
* <P> This is a convience method and is equivalent to evaluating the
* following expression:
* <blockquote><pre>
* setOption(SctpStandardSocketOption.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams))
* .connect(remote);
* </pre></blockquote>
*
* <P> The {@code maxOutStreams} and {@code maxInStreams} parameters
* represent the maximum number of streams that the application wishes to be
* able to send to and receive from. They are negotiated with the remote
* peer and may be limited by the operating system.
*
* @param remote
* The remote peer to which this channel is to be connected
*
* @param maxOutStreams
* Must be non negative and no larger than {@code 65536}.
* {@code 0} to use the endpoints default value.
*
* @param maxInStreams
* Must be non negative and no larger than {@code 65536}.
* {@code 0} to use the endpoints default value.
*
* @return {@code true} if a connection was established, {@code false} if
* this channel is in non-blocking mode and the connection operation
* is in progress
*
* @throws java.nio.channels.AlreadyConnectedException
* If this channel is already connected
*
* @throws java.nio.channels.ConnectionPendingException
* If a non-blocking connection operation is already in progress on
* this channel
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AsynchronousCloseException
* If another thread closes this channel
* while the connect operation is in progress
*
* @throws java.nio.channels.ClosedByInterruptException
* If another thread interrupts the current thread
* while the connect operation is in progress, thereby
* closing the channel and setting the current thread's
* interrupt status
*
* @throws java.nio.channels.UnresolvedAddressException
* If the given remote address is not fully resolved
*
* @throws java.nio.channels.UnsupportedAddressTypeException
* If the type of the given remote address is not supported
*
* @throws SecurityException
* If a security manager has been installed
* and it does not permit access to the given remote peer
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract boolean connect(SocketAddress remote,
int maxOutStreams,
int maxInStreams)
throws IOException;
/**
* Tells whether or not a connection operation is in progress on this channel.
*
* @return {@code true} if, and only if, a connection operation has been initiated
* on this channel but not yet completed by invoking the
* {@link #finishConnect} method
*/
public abstract boolean isConnectionPending();
/**
* Finishes the process of connecting an SCTP channel.
*
* <P> A non-blocking connection operation is initiated by placing a socket
* channel in non-blocking mode and then invoking one of its {@link #connect
* connect} methods. Once the connection is established, or the attempt has
* failed, the channel will become connectable and this method may
* be invoked to complete the connection sequence. If the connection
* operation failed then invoking this method will cause an appropriate
* {@link java.io.IOException} to be thrown.
*
* <P> If this channel is already connected then this method will not block
* and will immediately return <tt>true</tt>. If this channel is in
* non-blocking mode then this method will return <tt>false</tt> if the
* connection process is not yet complete. If this channel is in blocking
* mode then this method will block until the connection either completes
* or fails, and will always either return <tt>true</tt> or throw a checked
* exception describing the failure.
*
* <P> This method may be invoked at any time. If a {@link #send send} or {@link #receive receive}
* operation upon this channel is invoked while an invocation of this
* method is in progress then that operation will first block until this
* invocation is complete. If a connection attempt fails, that is, if an
* invocation of this method throws a checked exception, then the channel
* will be closed.
*
* @return {@code true} if, and only if, this channel's socket is now
* connected
*
* @throws java.nio.channels.NoConnectionPendingException
* If this channel is not connected and a connection operation
* has not been initiated
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AsynchronousCloseException
* If another thread closes this channel
* while the connect operation is in progress
*
* @throws java.nio.channels.ClosedByInterruptException
* If another thread interrupts the current thread
* while the connect operation is in progress, thereby
* closing the channel and setting the current thread's
* interrupt status
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract boolean finishConnect() throws IOException;
/**
* Returns all of the socket addresses to which this channel's socket is
* bound.
*
* @return All the socket addresses that this channel's socket is
* bound to, or an empty {@code Set} if the channel's socket is not
* bound
*
* @throws ClosedChannelException
* If the channel is closed
*
* @throws IOException
* If an I/O error occurs
*/
public abstract Set<SocketAddress> getAllLocalAddresses()
throws IOException;
/**
* Returns all of the remote addresses to which this channel's socket
* is connected.
*
* <P> If the channel is connected to a remote peer that is bound to
* multiple addresses then it is these addresses that the channel's socket
* is connected.
*
* @return All of the remote addresses to which this channel's socket
* is connected, or an empty {@code Set} if the channel's socket is
* not connected
*
* @throws ClosedChannelException
* If the channel is closed
*
* @throws IOException
* If an I/O error occurs
*/
public abstract Set<SocketAddress> getRemoteAddresses()
throws IOException;
/**
* Shutdown a connection without closing the channel.
*
* <P> Sends a shutdown command to the remote peer, effectively preventing
* any new data from being written to the socket by either peer. Further
* sends will throw {@link java.nio.channels.ClosedChannelException}. The
* channel remains open to allow the for any data (and notifications) to be
* received that may have been sent by the peer before it received the
* shutdown command. If the channel is already shutdown then invoking this
* method has no effect.
*
* @return This channel
*
* @throws java.nio.channels.NotYetConnectedException
* If this channel is not yet connected
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpChannel shutdown() throws IOException;
/**
* Returns the value of a socket option.
*
* @param name
* The socket option
*
* @return The value of the socket option. A value of {@code null} may be
* a valid value for some socket options.
*
* @throws UnsupportedOperationException
* If the socket option is not supported by this channel
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
*/
public abstract <T> T getOption(SctpSocketOption<T> name)
throws IOException;
/**
* Sets the value of a socket option.
*
* @param name
* The socket option
*
* @param value
* The value of the socket option. A value of {@code null} may be
* a valid value for some socket options.
*
* @return This channel
*
* @throws UnsupportedOperationException
* If the socket option is not supported by this channel
*
* @throws IllegalArgumentException
* If the value is not a valid value for this socket option
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
*/
public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value)
throws IOException;
/**
* Returns a set of the socket options supported by this channel.
*
* <P> This method will continue to return the set of options even after the
* channel has been closed.
*
* @return A set of the socket options supported by this channel
*/
public abstract Set<SctpSocketOption<?>> supportedOptions();
/**
* Returns an operation set identifying this channel's supported operations.
*
* <P> SCTP channels support connecting, reading, and writing, so this
* method returns <tt>(</tt>{@link SelectionKey#OP_CONNECT}
* <tt>|</tt>&nbsp;{@link SelectionKey#OP_READ} <tt>|</tt>&nbsp;{@link
* SelectionKey#OP_WRITE}<tt>)</tt>. </p>
*
* @return The valid-operation set
*/
@Override
public final int validOps() {
return (SelectionKey.OP_READ |
SelectionKey.OP_WRITE |
SelectionKey.OP_CONNECT);
}
/**
* Receives a message into the given buffer and/or handles a notification.
*
* <P> If a message or notification is immediately available, or if this
* channel is in blocking mode and one eventually becomes available, then
* the message or notification is returned or handled, respectively. If this
* channel is in non-blocking mode and a message or notification is not
* immediately available then this method immediately returns {@code null}.
*
* <P> If this method receives a message it is copied into the given byte
* buffer. The message is transferred into the given byte buffer starting at
* its current position and the buffers position is incremented by the
* number of bytes read. If there are fewer bytes remaining in the buffer
* than are required to hold the message, or the underlying input buffer
* does not contain the complete message, then an invocation of {@link
* MessageInfo#isComplete isComplete} on the returned {@code
* MessageInfo} will return {@code false}, and more invocations of this
* method will be necessary to completely consume the messgae. Only
* one message at a time will be partially delivered in any stream. The
* socket option {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of
* messages occurs.
*
* <P> If this method receives a notification then the appropriate method of
* the given handler, if there is one, is invoked. If the handler returns
* {@link HandlerResult#CONTINUE CONTINUE} then this method will try to
* receive another message/notification, otherwise, if {@link
* HandlerResult#RETURN RETURN} is returned this method will return {@code
* null}. If an uncaught exception is thrown by the handler it will be
* propagated up the stack through this method.
*
* <P> This method may be invoked at any time. If another thread has
* already initiated a receive operation upon this channel, then an
* invocation of this method will block until the first operation is
* complete. The given handler is invoked without holding any locks used
* to enforce the above synchronization policy, that way handlers
* will not stall other threads from receiving. A handler should not invoke
* the {@code receive} method of this channel, if it does an
* {@link IllegalReceiveException} will be thrown.
*
* @param dst
* The buffer into which message bytes are to be transferred
*
* @param attachment
* The object to attach to the receive operation; can be
* {@code null}
*
* @param handler
* A handler to handle notifications from the SCTP stack, or {@code
* null} to ignore any notifications.
*
* @return The {@code MessageInfo}, {@code null} if this channel is in
* non-blocking mode and no messages are immediately available or
* the notification handler returns {@link HandlerResult#RETURN
* RETURN} after handling a notification
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AsynchronousCloseException
* If another thread closes this channel
* while the read operation is in progress
*
* @throws java.nio.channels.ClosedByInterruptException
* If another thread interrupts the current thread
* while the read operation is in progress, thereby
* closing the channel and setting the current thread's
* interrupt status
*
* @throws java.nio.channels.NotYetConnectedException
* If this channel is not yet connected
*
* @throws IllegalReceiveException
* If the given handler invokes the {@code receive} method of this
* channel
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract <T> MessageInfo receive(ByteBuffer dst,
T attachment,
NotificationHandler<T> handler)
throws IOException;
/**
* Sends a message via this channel.
*
* <P> If this channel is in non-blocking mode and there is sufficient room
* in the underlying output buffer, or if this channel is in blocking mode
* and sufficient room becomes available, then the remaining bytes in the
* given byte buffer are transmitted as a single message. Sending a message
* is atomic unless explicit message completion {@link
* SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}
* socket option is enabled on this channel's socket.
*
* <P> The message is transferred from the byte buffer as if by a regular
* {@link java.nio.channels.WritableByteChannel#write(java.nio.ByteBuffer)
* write} operation.
*
* <P> The bytes will be written to the stream number that is specified by
* {@link MessageInfo#streamNumber streamNumber} in the given {@code
* messageInfo}.
*
* <P> This method may be invoked at any time. If another thread has already
* initiated a send operation upon this channel, then an invocation of
* this method will block until the first operation is complete.
*
* @param src
* The buffer containing the message to be sent
*
* @param messageInfo
* Ancillary data about the message to be sent
*
* @return The number of bytes sent, which will be either the number of
* bytes that were remaining in the messages buffer when this method
* was invoked or, if this channel is non-blocking, may be zero if
* there was insufficient room for the message in the underlying
* output buffer
*
* @throws InvalidStreamExcepton
* If {@code streamNumner} is negative or greater than or equal to
* the maximum number of outgoing streams
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AsynchronousCloseException
* If another thread closes this channel
* while the read operation is in progress
*
* @throws java.nio.channels.ClosedByInterruptException
* If another thread interrupts the current thread
* while the read operation is in progress, thereby
* closing the channel and setting the current thread's
* interrupt status
*
* @throws java.nio.channels.NotYetConnectedException
* If this channel is not yet connected
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract int send(ByteBuffer src, MessageInfo messageInfo)
throws IOException;
}

View File

@ -0,0 +1,731 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
import java.net.SocketAddress;
import java.net.InetAddress;
import java.io.IOException;
import java.util.Set;
import java.nio.ByteBuffer;
import java.nio.channels.spi.AbstractSelectableChannel;
import java.nio.channels.spi.SelectorProvider;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.NotYetBoundException;
import java.nio.channels.SelectionKey;
/**
* A selectable channel for message-oriented SCTP sockets.
*
* <P> An SCTP multi channel supports many associations on a single socket.
* An {@code SctpMultiChannel} is created by invoking the
* {@link #open open} method of this class. A newly-created channel is open but
* not yet bound. An attempt to invoke the {@link #receive receive} method of an
* unbound channel will cause the {@link NotYetBoundException}
* to be thrown. An attempt to invoke the {@link #send send} method of an
* unbound channel will cause it to first invoke the {@link #bind bind} method.
* The address(es) that the channel's socket is bound to can be retrieved by
* calling {@link #getAllLocalAddresses getAllLocalAddresses}.
*
* <P> Messages may be sent and received without explicitly setting up an
* association with the remote peer. The channel will implicitly setup
* a new association whenever it sends or receives a message from a remote
* peer if there is not already an association with that peer. Upon successful
* association setup, an {@link AssociationChangeNotification
* association changed} notification will be put to the SCTP stack with its
* {@code event} parameter set to {@link
* AssociationChangeNotification.AssocChangeEvent#COMM_UP
* COMM_UP}. This notification can be received by invoking {@link #receive
* receive}.
*
* <P> Socket options are configured using the
* {@link #setOption(SctpSocketOption,Object,Association) setOption} method. An
* {@code SctpMultiChannel} supports the following options:
* <blockquote>
* <table border>
* <tr>
* <th>Option Name</th>
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS
* SCTP_DISABLE_FRAGMENTS} </td>
* <td> Enables or disables message fragmentation </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} </td>
* <td> Enables or disables explicit message completion </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} </td>
* <td> Controls how the presentation of messages occur for the message
* receiver </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS
* SCTP_INIT_MAXSTREAMS} </td>
* <td> The maximum number of streams requested by the local endpoint during
* association initialization </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_NODELAY SCTP_NODELAY} </td>
* <td> Enables or disable a Nagle-like algorithm </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR
* SCTP_PRIMARY_ADDR} </td>
* <td> Requests that the local SCTP stack use the given peer address as the
* association primary </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR
* SCTP_SET_PEER_PRIMARY_ADDR} </td>
* <td> Requests that the peer mark the enclosed address as the association
* primary </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_SNDBUF
* SO_SNDBUF} </td>
* <td> The size of the socket send buffer </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_RCVBUF
* SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_LINGER
* SO_LINGER} </td>
* <td> Linger on close if data is present (when configured in blocking mode
* only) </td>
* </tr>
* </table>
* </blockquote>
* Additional (implementation specific) options may also be supported. The list
* of options supported is obtained by invoking the {@link #supportedOptions()
* supportedOptions} method.
*
* <p> SCTP multi channels are safe for use by multiple concurrent threads.
* They support concurrent sending and receiving, though at most one thread may be
* sending and at most one thread may be receiving at any given time.
*
* @since 1.7
*/
public abstract class SctpMultiChannel
extends AbstractSelectableChannel
{
/**
* Initializes a new instance of this class.
*
* @param provider
* The selector provider for this channel
*/
protected SctpMultiChannel(SelectorProvider provider) {
super(provider);
}
/**
* Opens an SCTP multi channel.
*
* <P> The new channel is unbound.
*
* @return A new SCTP multi channel
*
* @throws UnsupportedOperationException
* If the SCTP protocol is not supported
*
* @throws IOException
* If an I/O error occurs
*/
public static SctpMultiChannel open() throws
IOException {
return new sun.nio.ch.SctpMultiChannelImpl((SelectorProvider)null);
}
/**
* Returns the open associations on this channel's socket.
*
* <P> Only associations whose {@link AssociationChangeNotification.AssocChangeEvent#COMM_UP
* COMM_UP} association change event has been received are included
* in the returned set of associations. Associations for which a
* {@link AssociationChangeNotification.AssocChangeEvent#COMM_LOST COMM_LOST} or {@link
* AssociationChangeNotification.AssocChangeEvent#SHUTDOWN SHUTDOWN} association change
* event have been receive are removed from the set of associations.
*
* <P> The returned set of associations is a snapshot of the open
* associations at the time that this method is invoked.
*
* @return A {@code Set} containing the open associations, or an empty
* {@code Set} if there are none.
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract Set<Association> associations()
throws IOException;
/**
* Binds the channel's socket to a local address and configures the socket
* to listen for connections.
*
* <P> This method is used to establish a relationship between the socket
* and the local address. Once a relationship is established then
* the socket remains bound until the channel is closed. This relationship
* may not necesssarily be with the address {@code local} as it may be removed
* by {@link #unbindAddress unbindAddress}, but there will always be at least one local
* address bound to the channel's socket once an invocation of this method
* successfully completes.
*
* <P> Once the channel's socket has been successfully bound to a specific
* address, that is not automatically assigned, more addresses
* may be bound to it using {@link #bindAddress bindAddress}, or removed
* using {@link #unbindAddress unbindAddress}.
*
* <P> The backlog parameter is the maximum number of pending connections on
* the socket. Its exact semantics are implementation specific. An implementation
* may impose an implementation specific maximum length or may choose to ignore
* the parameter. If the backlog parameter has the value {@code 0}, or a negative
* value, then an implementation specific default is used.
*
* @param local
* The local address to bind the socket, or {@code null} to
* bind the socket to an automatically assigned socket address
*
* @param backlog
* The maximum number number of pending connections
*
* @return This channel
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AlreadyBoundException
* If this channel is already bound
*
* @throws java.nio.channels.UnsupportedAddressTypeException
* If the type of the given address is not supported
*
* @throws SecurityException
* If a security manager has been installed and its {@link
* java.lang.SecurityManager#checkListen(int) checkListen} method
* denies the operation
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpMultiChannel bind(SocketAddress local,
int backlog)
throws IOException;
/**
* Binds the channel's socket to a local address and configures the socket
* to listen for connections.
*
* <P> This method works as if invoking it were equivalent to evaluating the
* expression:
* <blockquote><pre>
* bind(local, 0);
* </pre></blockquote>
*
* @param local
* The local address to bind the socket, or {@code null} to
* bind the socket to an automatically assigned socket address
*
* @return This channel
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AlreadyBoundException
* If this channel is already bound
*
* @throws java.nio.channels.UnsupportedAddressTypeException
* If the type of the given address is not supported
*
* @throws SecurityException
* If a security manager has been installed and its {@link
* java.lang.SecurityManager#checkListen(int) checkListen} method
* denies the operation
*
* @throws IOException
* If some other I/O error occurs
*/
public final SctpMultiChannel bind(SocketAddress local)
throws IOException {
return bind(local, 0);
}
/**
* Adds the given address to the bound addresses for the channel's
* socket.
*
* <P> The given address must not be the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address.
* The channel must be first bound using {@link #bind bind} before
* invoking this method, otherwise {@link NotYetBoundException} is thrown.
* The {@link #bind bind} method takes a {@code SocketAddress} as its
* argument which typically contains a port number as well as an address.
* Addresses subquently bound using this method are simply addresses as the
* SCTP port number remains the same for the lifetime of the channel.
*
* <P> New associations setup after this method successfully completes
* will be associated with the given address. Adding addresses to existing
* associations is optional functionality. If the endpoint supports
* dynamic address reconfiguration then it may send the appropriate message
* to the peer to change the peers address lists.
*
* @param address
* The address to add to the bound addresses for the socket
*
* @return This channel
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws NotYetBoundException
* If this channel is not yet bound
*
* @throws java.nio.channels.AlreadyBoundException
* If this channel is already bound to the given address
*
* @throws IllegalArgumentException
* If address is {@code null} or the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpMultiChannel bindAddress(InetAddress address)
throws IOException;
/**
* Removes the given address from the bound addresses for the channel's
* socket.
*
* <P> The given address must not be the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address.
* The channel must be first bound using {@link #bind bind} before
* invoking this method, otherwise {@link NotYetBoundException} is thrown.
*
* <P> If this method is invoked on a channel that does
* not have {@code address} as one of its bound addresses, or that has only
* one local address bound to it, then this method throws
* {@link IllegalUnbindException}.
*
* <P> The initial address that the channel's socket is bound to using
* {@link #bind bind} may be removed from the bound addresses for the
* channel's socket.
*
* <P> New associations setup after this method successfully completes
* will not be associated with the given address. Removing addresses from
* existing associations is optional functionality. If the endpoint supports
* dynamic address reconfiguration then it may send the appropriate message
* to the peer to change the peers address lists.
*
* @param address
* The address to remove from the bound addresses for the socket
*
* @return This channel
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws NotYetBoundException
* If this channel is not yet bound
*
* @throws IllegalUnbindException
* {@code address} is not bound to the channel's socket, or the
* channel has only one address bound to it
*
* @throws IllegalArgumentException
* If address is {@code null} or the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpMultiChannel unbindAddress(InetAddress address)
throws IOException;
/**
* Returns all of the socket addresses to which this channel's socket is
* bound.
*
* @return All the socket addresses that this channel's socket is
* bound to, or an empty {@code Set} if the channel's socket is not
* bound
*
* @throws ClosedChannelException
* If the channel is closed
*
* @throws IOException
* If an I/O error occurs
*/
public abstract Set<SocketAddress> getAllLocalAddresses()
throws IOException;
/**
* Returns all of the remote addresses to which the given association on
* this channel's socket is connected.
*
* @return All of the remote addresses for the given association, or
* an empty {@code Set} if the association has been shutdown
*
* @throws ClosedChannelException
* If the channel is closed
*
* @throws IOException
* If an I/O error occurs
*/
public abstract Set<SocketAddress> getRemoteAddresses(Association association)
throws IOException;
/**
* Shutdown an association without closing the channel.
*
* @param association
* The association to shutdown
*
* @return This channel
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpMultiChannel shutdown(Association association)
throws IOException;
/**
* Returns the value of a socket option.
*
* <P> Note that some options are retrieved on the channel's socket,
* therefore the {@code association} parameter is not applicable and will be
* ignored if given. However, if the option is association specific then the
* association must be given.
*
* @param name
* The socket option
*
* @param association
* The association whose option should be retrieved, or {@code null}
* if this option should be retrieved at the channel's socket level.
*
* @return The value of the socket option. A value of {@code null} may be
* a valid value for some socket options.
*
* @throws UnsupportedOperationException
* If the socket option is not supported by this channel
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
*/
public abstract <T> T getOption(SctpSocketOption<T> name,
Association association)
throws IOException;
/**
* Sets the value of a socket option.
*
* <P> Note that some options are retrieved on the channel's socket,
* therefore the {@code association} parameter is not applicable and will be
* ignored if given. However, if the option is association specific then the
* association must be given.
*
* @param name
* The socket option
*
* @param association
* The association whose option should be set, or {@code null}
* if this option should be set at the channel's socket level.
*
* @param value
* The value of the socket option. A value of {@code null} may be
* a valid value for some socket options.
*
* @return This channel
*
* @throws UnsupportedOperationException
* If the socket option is not supported by this channel
*
* @throws IllegalArgumentException
* If the value is not a valid value for this socket option
*
* @throws ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
*/
public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name,
T value,
Association association)
throws IOException;
/**
* Returns a set of the socket options supported by this channel.
*
* <P> This method will continue to return the set of options even after the
* channel has been closed.
*
* @return A set of the socket options supported by this channel
*/
public abstract Set<SctpSocketOption<?>> supportedOptions();
/**
* Returns an operation set identifying this channel's supported operations.
*
* <P> SCTP multi channels support reading, and writing, so this
* method returns
* {@code (}{@link SelectionKey#OP_READ} {@code |}&nbsp;{@link
* SelectionKey#OP_WRITE}{@code )}. </p>
*
* @return The valid-operation set
*/
@Override
public final int validOps() {
return (SelectionKey.OP_READ |
SelectionKey.OP_WRITE );
}
/**
* Receives a message and/or handles a notification via this channel.
*
* <P> If a message or notification is immediately available, or if this
* channel is in blocking mode and one eventually becomes available, then
* the message or notification is returned or handled, respectively. If this
* channel is in non-blocking mode and a message or notification is not
* immediately available then this method immediately returns {@code null}.
*
* <P> If this method receives a message it is copied into the given byte
* buffer and an {@link MessageInfo} is returned.
* The message is transferred into the given byte buffer starting at its
* current position and the buffers position is incremented by the number of
* bytes read. If there are fewer bytes remaining in the buffer than are
* required to hold the message, or the underlying input buffer does not
* contain the complete message, then an invocation of {@link
* MessageInfo#isComplete isComplete} on the returned {@code
* MessageInfo} will return {@code false}, and more invocations of this
* method will be necessary to completely consume the messgae. Only
* one message at a time will be partially delivered in any stream. The
* socket option {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of
* messages occurs.
*
* <P> If this method receives a notification then the appropriate method of
* the given handler, if there is one, is invoked. If the handler returns {@link
* HandlerResult#CONTINUE CONTINUE} then this method will try to receive another
* message/notification, otherwise, if {@link HandlerResult#RETURN RETURN} is returned
* this method will return {@code null}. If an uncaught exception is thrown by the
* handler it will be propagated up the stack through this method.
*
* <P> If a security manager has been installed then for each new association
* setup this method verifies that the associations source address and port
* number are permitted by the security manager's {@link
* java.lang.SecurityManager#checkAccept(String,int) checkAccept} method.
*
* <P> This method may be invoked at any time. If another thread has
* already initiated a receive operation upon this channel, then an
* invocation of this method will block until the first operation is
* complete. The given handler is invoked without holding any locks used
* to enforce the above synchronization policy, that way handlers
* will not stall other threads from receiving. A handler should not invoke
* the {@code receive} method of this channel, if it does an
* {@link IllegalReceiveException} will be thrown.
*
* @param buffer
* The buffer into which bytes are to be transferred
*
* @param attachment
* The object to attach to the receive operation; can be
* {@code null}
*
* @param handler
* A handler to handle notifications from the SCTP stack, or
* {@code null} to ignore any notifications.
*
* @return The {@code MessageInfo}, {@code null} if this channel is in
* non-blocking mode and no messages are immediately available or
* the notification handler returns {@code RETURN} after handling
* a notification
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AsynchronousCloseException
* If another thread closes this channel
* while the read operation is in progress
*
* @throws java.nio.channels.ClosedByInterruptException
* If another thread interrupts the current thread
* while the read operation is in progress, thereby
* closing the channel and setting the current thread's
* interrupt status
*
* @throws NotYetBoundException
* If this channel is not yet bound
*
* @throws IllegalReceiveException
* If the given handler invokes the {@code receive} method of this
* channel
*
* @throws SecurityException
* If a security manager has been installed and it does not permit
* new associations to be accepted from the message's sender
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract <T> MessageInfo receive(ByteBuffer buffer,
T attachment,
NotificationHandler<T> handler)
throws IOException;
/**
* Sends a message via this channel.
*
* <P> If this channel is unbound then this method will invoke {@link
* #bind(SocketAddress, int) bind(null, 0)} before sending any data.
*
* <P> If there is no association existing between this channel's socket
* and the intended receiver, identified by the address in the given messageInfo, then one
* will be automatically setup to the intended receiver. This is considered
* to be Implicit Association Setup. Upon successful association setup, an
* {@link AssociationChangeNotification association changed}
* notification will be put to the SCTP stack with its {@code event} parameter set
* to {@link AssociationChangeNotification.AssocChangeEvent#COMM_UP COMM_UP}
* . This notification can be received by invoking {@link #receive
* receive}.
*
* <P> If this channel is in blocking mode, there is sufficient room in the
* underlying output buffer, then the remaining bytes in the given byte
* buffer are transmitted as a single message. Sending a message
* is atomic unless explicit message completion {@link
* SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}
* socket option is enabled on this channel's socket.
*
* <P> If this channel is in non-blocking mode, there is sufficient room
* in the underlying output buffer, and an implicit association setup is
* required, then the remaining bytes in the given byte buffer are
* transmitted as a single message, subject to {@link
* SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}.
* If for any reason the message cannot
* be delivered an {@link AssociationChangeNotification association
* changed} notification is put on the SCTP stack with its {@code event} parameter set
* to {@link AssociationChangeNotification.AssocChangeEvent#CANT_START CANT_START}.
*
* <P> The message is transferred from the byte buffer as if by a regular
* {@link java.nio.channels.WritableByteChannel#write(java.nio.ByteBuffer)
* write} operation.
*
* <P> If a security manager has been installed then for each new association
* setup this method verifies that the given remote peers address and port
* number are permitted by the security manager's {@link
* java.lang.SecurityManager#checkConnect(String,int) checkConnect} method.
*
* <P> This method may be invoked at any time. If another thread has already
* initiated a send operation upon this channel, then an invocation of
* this method will block until the first operation is complete.
*
* @param buffer
* The buffer containing the message to be sent
*
* @param messageInfo
* Ancillary data about the message to be sent
*
* @return The number of bytes sent, which will be either the number of
* bytes that were remaining in the messages buffer when this method
* was invoked or, if this channel is non-blocking, may be zero if
* there was insufficient room for the message in the underlying
* output buffer
*
* @throws InvalidStreamExcepton
* If {@code streamNumber} is negative, or if an association already
* exists and {@code streamNumber} is greater than the maximum number
* of outgoing streams
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AsynchronousCloseException
* If another thread closes this channel
* while the read operation is in progress
*
* @throws java.nio.channels.ClosedByInterruptException
* If another thread interrupts the current thread
* while the read operation is in progress, thereby
* closing the channel and setting the current thread's
* interrupt status
*
* @throws SecurityException
* If a security manager has been installed and it does not permit
* new associations to be setup with the the messages's address
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract int send(ByteBuffer buffer, MessageInfo messageInfo)
throws IOException;
/**
* Branches off an association.
*
* <P> An application can invoke this method to branch off an association
* into a separate channel. The new bound and connected {@link SctpChannel}
* will be created for the association. The branched off association will no
* longer be part of this channel.
*
* <P> This is particularly useful when, for instance, the application
* wishes to have a number of sporadic message senders/receivers remain
* under the original SCTP multi channel but branch off those
* associations carrying high volume data traffic into their own
* separate SCTP channels.
*
* @param association
* The association to branch off
*
* @return The {@code SctpChannel}
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpChannel branch(Association association)
throws IOException;
}

View File

@ -0,0 +1,421 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
import java.net.SocketAddress;
import java.net.InetAddress;
import java.io.IOException;
import java.util.Set;
import java.nio.channels.SelectionKey;
import java.nio.channels.spi.SelectorProvider;
import java.nio.channels.spi.AbstractSelectableChannel;
/**
* A selectable channel for message-oriented listening SCTP sockets.
*
* <p> An {@code SCTPServerChannel} is created by invoking the
* {@link #open open} method of this class. A newly-created SCTP server
* channel is open but not yet bound. An attempt to invoke the
* {@link #accept accept} method of an unbound channel will cause the
* {@link java.nio.channels.NotYetBoundException} to be thrown. An SCTP server
* channel can be bound by invoking one of the
* {@link #bind(java.net.SocketAddress,int) bind} methods defined by this class.
*
* <p> Socket options are configured using the
* {@link #setOption(SctpSocketOption,Object) setOption} method. SCTP server socket
* channels support the following options:
* <blockquote>
* <table border>
* <tr>
* <th>Option Name</th>
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS
* SCTP_INIT_MAXSTREAMS} </td>
* <td> The maximum number of streams requested by the local endpoint during
* association initialization </td>
* </tr>
* </table>
* </blockquote>
* Additional (implementation specific) options may also be supported. The list
* of options supported is obtained by invoking the {@link #supportedOptions()
* supportedOptions} method.
*
* <p>SCTP server channels are safe for use by multiple concurrent threads.
*
* @since 1.7
*/
public abstract class SctpServerChannel
extends AbstractSelectableChannel
{
/**
* Initializes a new instance of this class.
*
* @param provider
* The selector provider for this channel
*/
protected SctpServerChannel(SelectorProvider provider) {
super(provider);
}
/**
* Opens an SCTP server channel.
*
* <P> The new channel's socket is initially unbound; it must be bound
* to a specific address via one of its socket's {@link #bind bind}
* methods before associations can be accepted.
*
* @return A new SCTP server channel
*
* @throws UnsupportedOperationException
* If the SCTP protocol is not supported
*
* @throws IOException
* If an I/O error occurs
*/
public static SctpServerChannel open() throws
IOException {
return new sun.nio.ch.SctpServerChannelImpl((SelectorProvider)null);
}
/**
* Accepts an association on this channel's socket.
*
* <P> If this channel is in non-blocking mode then this method will
* immediately return {@code null} if there are no pending associations.
* Otherwise it will block indefinitely until a new association is
* available or an I/O error occurs.
*
* <P> The {@code SCTPChannel} returned by this method, if any, will be in
* blocking mode regardless of the blocking mode of this channel.
*
* <P> If a security manager has been installed then for each new
* association this method verifies that the address and port number of the
* assocaitions's remote peer are permitted by the security manager's {@link
* java.lang.SecurityManager#checkAccept(String,int) checkAccept} method.
*
* @return The SCTP channel for the new association, or {@code null}
* if this channel is in non-blocking mode and no association is
* available to be accepted
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AsynchronousCloseException
* If another thread closes this channel
* while the accept operation is in progress
*
* @throws java.nio.channels.ClosedByInterruptException
* If another thread interrupts the current thread
* while the accept operation is in progress, thereby
* closing the channel and setting the current thread's
* interrupt status
*
* @throws java.nio.channels.NotYetBoundException
* If this channel's socket has not yet been bound
*
* @throws SecurityException
* If a security manager has been installed and it does not permit
* access to the remote peer of the new association
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpChannel accept() throws IOException;
/**
* Binds the channel's socket to a local address and configures the socket
* to listen for associations.
*
* <P> This method works as if invoking it were equivalent to evaluating the
* expression:
* <blockquote><pre>
* bind(local, 0);
* </pre></blockquote>
*
* @param local
* The local address to bind the socket, or {@code null} to
* bind the socket to an automatically assigned socket address
*
* @return This channel
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AlreadyBoundException
* If this channel is already bound
*
* @throws java.nio.channels.UnsupportedAddressTypeException
* If the type of the given address is not supported
*
* @throws SecurityException
* If a security manager has been installed and its {@link
* java.lang.SecurityManager#checkListen(int) checkListen} method
* denies the operation
*
* @throws IOException
* If some other I/O error occurs
*/
public final SctpServerChannel bind(SocketAddress local)
throws IOException {
return bind(local, 0);
}
/**
* Binds the channel's socket to a local address and configures the socket
* to listen for associations.
*
* <P> This method is used to establish a relationship between the socket
* and the local address. Once a relationship is established then
* the socket remains bound until the channel is closed. This relationship
* may not necesssarily be with the address {@code local} as it may be
* removed by {@link #unbindAddress unbindAddress}, but there will always be
* at least one local address bound to the channel's socket once an
* invocation of this method successfully completes.
*
* <P> Once the channel's socket has been successfully bound to a specific
* address, that is not automatically assigned, more addresses
* may be bound to it using {@link #bindAddress bindAddress}, or removed
* using {@link #unbindAddress unbindAddress}.
*
* <P> The backlog parameter is the maximum number of pending associations
* on the socket. Its exact semantics are implementation specific. An
* implementation may impose an implementation specific maximum length or
* may choose to ignore the parameter. If the backlog parameter has the
* value {@code 0}, or a negative value, then an implementation specific
* default is used.
*
* @param local
* The local address to bind the socket, or {@code null} to
* bind the socket to an automatically assigned socket address
*
* @param backlog
* The maximum number number of pending associations
*
* @return This channel
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.AlreadyBoundException
* If this channel is already bound
*
* @throws java.nio.channels.UnsupportedAddressTypeException
* If the type of the given address is not supported
*
* @throws SecurityException
* If a security manager has been installed and its {@link
* java.lang.SecurityManager#checkListen(int) checkListen} method
* denies the operation
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpServerChannel bind(SocketAddress local,
int backlog)
throws IOException;
/**
* Adds the given address to the bound addresses for the channel's
* socket.
*
* <P> The given address must not be the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address.
* The channel must be first bound using {@link #bind bind} before
* invoking this method, otherwise {@link
* java.nio.channels.NotYetBoundException} is thrown. The {@link #bind bind}
* method takes a {@code SocketAddress} as its argument which typically
* contains a port number as well as an address. Addresses subquently bound
* using this method are simply addresses as the SCTP port number remains
* the same for the lifetime of the channel.
*
* <P> New associations accepted after this method successfully completes
* will be associated with the given address.
*
* @param address
* The address to add to the bound addresses for the socket
*
* @return This channel
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.NotYetBoundException
* If this channel is not yet bound
*
* @throws java.nio.channels.AlreadyBoundException
* If this channel is already bound to the given address
*
* @throws IllegalArgumentException
* If address is {@code null} or the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpServerChannel bindAddress(InetAddress address)
throws IOException;
/**
* Removes the given address from the bound addresses for the channel's
* socket.
*
* <P> The given address must not be the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address.
* The channel must be first bound using {@link #bind bind} before
* invoking this method, otherwise
* {@link java.nio.channels.NotYetBoundException} is thrown.
* If this method is invoked on a channel that does not have
* {@code address} as one of its bound addresses, or that has only one
* local address bound to it, then this method throws {@link
* IllegalUnbindException}.
* The initial address that the channel's socket is bound to using
* {@link #bind bind} may be removed from the bound addresses for the
* channel's socket.
*
* <P> New associations accepted after this method successfully completes
* will not be associated with the given address.
*
* @param address
* The address to remove from the bound addresses for the socket
*
* @return This channel
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws java.nio.channels.NotYetBoundException
* If this channel is not yet bound
*
* @throws IllegalArgumentException
* If address is {@code null} or the {@link
* java.net.InetAddress#isAnyLocalAddress wildcard} address
*
* @throws IllegalUnbindException
* If the implementation does not support removing addresses from a
* listening socket, {@code address} is not bound to the channel's
* socket, or the channel has only one address bound to it
*
* @throws IOException
* If some other I/O error occurs
*/
public abstract SctpServerChannel unbindAddress(InetAddress address)
throws IOException;
/**
* Returns all of the socket addresses to which this channel's socket is
* bound.
*
* @return All the socket addresses that this channel's socket is
* bound to, or an empty {@code Set} if the channel's socket is not
* bound
*
* @throws java.nio.channels.ClosedChannelException
* If the channel is closed
*
* @throws IOException
* If an I/O error occurs
*/
public abstract Set<SocketAddress> getAllLocalAddresses()
throws IOException;
/**
* Returns the value of a socket option.
*
* @param name
* The socket option
*
* @return The value of the socket option. A value of {@code null} may be
* a valid value for some socket options.
*
* @throws UnsupportedOperationException
* If the socket option is not supported by this channel
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
*/
public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException;
/**
* Sets the value of a socket option.
*
* @param name
* The socket option
*
* @param value
* The value of the socket option. A value of {@code null} may be
* a valid value for some socket options.
*
* @return This channel
*
* @throws UnsupportedOperationException
* If the socket option is not supported by this channel
*
* @throws IllegalArgumentException
* If the value is not a valid value for this socket option
*
* @throws java.nio.channels.ClosedChannelException
* If this channel is closed
*
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
*/
public abstract <T> SctpServerChannel setOption(SctpSocketOption<T> name,
T value)
throws IOException;
/**
* Returns a set of the socket options supported by this channel.
*
* <P> This method will continue to return the set of options even after the
* channel has been closed.
*
* @return A set of the socket options supported by this channel
*/
public abstract Set<SctpSocketOption<?>> supportedOptions();
/**
* Returns an operation set identifying this channel's supported
* operations.
*
* <P> SCTP server channels only support the accepting of new
* associations, so this method returns
* {@link java.nio.channels.SelectionKey#OP_ACCEPT}.
*
* @return The valid-operation set
*/
@Override
public final int validOps() {
return SelectionKey.OP_ACCEPT;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2001-2002 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -22,22 +22,17 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
#ifndef AWT_KEYBOARDFOCUSMANAGER_H
#define AWT_KEYBOARDFOCUSMANAGER_H
import java.net.SocketOption;
#include <jni.h>
class AwtKeyboardFocusManager {
public:
static jclass keyboardFocusManagerCls;
static jmethodID shouldNativelyFocusHeavyweightMID;
static jmethodID heavyweightButtonDownMID;
static jmethodID markClearGlobalFocusOwnerMID;
static jmethodID removeLastFocusRequestMID;
static jfieldID isProxyActive;
static jmethodID processSynchronousTransfer;
};
#endif // AWT_KEYBOARDFOCUSMANAGER_H
/**
* A socket option associated with an SCTP channel.
*
* @param <T> The type of the socket option value.
*
* @since 1.7
*
* @see SctpStandardSocketOption
*/
public interface SctpSocketOption<T> extends SocketOption<T> { }

View File

@ -0,0 +1,419 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
import java.net.SocketAddress;
import sun.nio.ch.SctpStdSocketOption;
/**
* SCTP channels supports the socket options defined by this class
* (as well as those listed in the particular channel class) and may support
* additional Implementation specific socket options.
*
* @since 1.7
*/
public class SctpStandardSocketOption {
private SctpStandardSocketOption() {}
/**
* Enables or disables message fragmentation.
*
* <P> The value of this socket option is a {@code Boolean} that represents
* whether the option is enabled or disabled. If enabled no SCTP message
* fragmentation will be performed. Instead if a message being sent
* exceeds the current PMTU size, the message will NOT be sent and
* an error will be indicated to the user.
*
* <P> It is implementation specific whether or not this option is
* supported.
*/
public static final SctpSocketOption<Boolean> SCTP_DISABLE_FRAGMENTS = new
SctpStdSocketOption<Boolean>("SCTP_DISABLE_FRAGMENTS", Boolean.class,
sun.nio.ch.SctpStdSocketOption.SCTP_DISABLE_FRAGMENTS);
/**
* Enables or disables explicit message completion.
*
* <p> The value of this socket option is a {@code Boolean} that represents
* whether the option is enabled or disabled. When this option is enabled,
* the {@code send} method may be invoked multiple times to a send message.
* The {@code isComplete} parameter of the {@link MessageInfo} must only
* be set to {@code true} for the final send to indicate that the message is
* complete. If this option is disabled then each individual {@code send}
* invocation is considered complete.
*
* <P> The default value of the option is {@code false} indicating that the
* option is disabled. It is implementation specific whether or not this
* option is supported.
*/
public static final SctpSocketOption<Boolean> SCTP_EXPLICIT_COMPLETE = new
SctpStdSocketOption<Boolean>("SCTP_EXPLICIT_COMPLETE", Boolean.class,
sun.nio.ch.SctpStdSocketOption.SCTP_EXPLICIT_COMPLETE);
/**
* Fragmented interleave controls how the presentation of messages occur
* for the message receiver. There are three levels of fragment interleave
* defined. Two of the levels effect {@link SctpChannel}, while
* {@link SctpMultiChannel} is effected by all three levels.
*
* <P> This option takes an {@code Integer} value. It can be set to a value
* of {@code 0}, {@code 1} or {@code 2}.
*
* <P> Setting the three levels provides the following receiver
* interactions:
*
* <P> {@code level 0} - Prevents the interleaving of any messages. This
* means that when a partial delivery begins, no other messages will be
* received except the message being partially delivered. If another message
* arrives on a different stream (or association) that could be delivered,
* it will be blocked waiting for the user to read all of the partially
* delivered message.
*
* <P> {@code level 1} - Allows interleaving of messages that are from
* different associations. For {@code SctpChannel}, level 0 and
* level 1 have the same meaning since an {@code SctpChannel} always
* receives messages from the same association. Note that setting an {@code
* SctpMultiChannel} to this level may cause multiple partial
* delivers from different associations but for any given association, only
* one message will be delivered until all parts of a message have been
* delivered. This means that one large message, being read with an
* association identification of "X", will block other messages from
* association "X" from being delivered.
*
* <P> {@code level 2} - Allows complete interleaving of messages. This
* level requires that the sender carefully observe not only the peer
* {@code Association} but also must pay careful attention to the stream
* number. With this option enabled a partially delivered message may begin
* being delivered for association "X" stream "Y" and the next subsequent
* receive may return a message from association "X" stream "Z". Note that
* no other messages would be delivered for association "X" stream "Y"
* until all of stream "Y"'s partially delivered message was read.
* Note that this option effects both channel types. Also note that
* for an {@code SctpMultiChannel} not only may another streams
* message from the same association be delivered from the next receive,
* some other associations message may be delivered upon the next receive.
*
* <P> It is implementation specific whether or not this option is
* supported.
*/
public static final SctpSocketOption<Integer> SCTP_FRAGMENT_INTERLEAVE =
new SctpStdSocketOption<Integer>("SCTP_FRAGMENT_INTERLEAVE",
Integer.class,
sun.nio.ch.SctpStdSocketOption.SCTP_FRAGMENT_INTERLEAVE);
/**
* The maximum number of streams requested by the local endpoint during
* association initialization.
*
* <P> The value of this socket option is an {@link
* SctpStandardSocketOption.InitMaxStreams InitMaxStreams}, that represents
* the maximum number of inbound and outbound streams that an association
* on the channel is prepared to support.
*
* <P> For an {@link SctpChannel} this option may only be used to
* change the number of inbound/outbound streams prior to connecting.
*
* <P> For an {@link SctpMultiChannel} this option determines
* the maximum number of inbound/outbound streams new associations setup
* on the channel will be prepared to support.
*
* <P> For an {@link SctpServerChannel} this option determines the
* maximum number of inbound/outbound streams accepted sockets will
* negotiate with their connecting peer.
*
* <P> In all cases the value set by this option is used in the negotiation
* of new associations setup on the channel's socket and the actual
* maximum number of inbound/outbound streams that have been negotiated
* with the peer can be retrieved from the appropriate {@link
* Association}. The {@code Association} can be retrieved from the
* {@link AssociationChangeNotification.AssocChangeEvent#COMM_UP COMM_UP}
* {@link AssociationChangeNotification} belonging to that association.
*
* <p> This value is bounded by the actual implementation. In other
* words the user may be able to support more streams than the Operating
* System. In such a case, the Operating System limit may override the
* value requested by the user. The default value of 0 indicates to use
* the endpoints default value.
*/
public static final SctpSocketOption
<SctpStandardSocketOption.InitMaxStreams> SCTP_INIT_MAXSTREAMS =
new SctpStdSocketOption<SctpStandardSocketOption.InitMaxStreams>(
"SCTP_INIT_MAXSTREAMS", SctpStandardSocketOption.InitMaxStreams.class);
/**
* Enables or disables a Nagle-like algorithm.
*
* <P> The value of this socket option is a {@code Boolean} that represents
* whether the option is enabled or disabled. SCTP uses an algorithm like
* <em>The Nagle Algorithm</em> to coalesce short segments and
* improve network efficiency.
*/
public static final SctpSocketOption<Boolean> SCTP_NODELAY =
new SctpStdSocketOption<Boolean>("SCTP_NODELAY", Boolean.class,
sun.nio.ch.SctpStdSocketOption.SCTP_NODELAY);
/**
* Requests that the local SCTP stack use the given peer address as
* the association primary.
*
* <P> The value of this socket option is a {@code SocketAddress}
* that represents the peer address that the local SCTP stack should use as
* the association primary. The address must be one of the association
* peer's addresses.
*
* <P> An {@code SctpMultiChannel} can control more than one
* association, the association parameter must be given when setting or
* retrieving this option.
*
* <P> Since {@code SctpChannel} only controls one association,
* the association parameter is not required and this option can be
* set or queried directly.
*/
public static final SctpSocketOption<SocketAddress> SCTP_PRIMARY_ADDR =
new SctpStdSocketOption<SocketAddress>
("SCTP_PRIMARY_ADDR", SocketAddress.class);
/**
* Requests that the peer mark the enclosed address as the association
* primary.
*
* <P> The value of this socket option is a {@code SocketAddress}
* that represents the local address that the peer should use as its
* primary address. The given address must be one of the association's
* locally bound addresses.
*
* <P> An {@code SctpMultiChannel} can control more than one
* association, the association parameter must be given when setting or
* retrieving this option.
*
* <P> Since {@code SctpChannel} only controls one association,
* the association parameter is not required and this option can be
* queried directly.
*
* <P> Note, this is a set only option and cannot be retrieved by {@code
* getOption}. It is implementation specific whether or not this
* option is supported.
*/
public static final SctpSocketOption<SocketAddress> SCTP_SET_PEER_PRIMARY_ADDR =
new SctpStdSocketOption<SocketAddress>
("SCTP_SET_PEER_PRIMARY_ADDR", SocketAddress.class);
/**
* The size of the socket send buffer.
*
* <p> The value of this socket option is an {@code Integer} that is the
* size of the socket send buffer in bytes. The socket send buffer is an
* output buffer used by the networking implementation. It may need to be
* increased for high-volume connections. The value of the socket option is
* a <em>hint</em> to the implementation to size the buffer and the actual
* size may differ. The socket option can be queried to retrieve the actual
* size.
*
* <p> For {@code SctpChannel}, this controls the amount of data
* the SCTP stack may have waiting in internal buffers to be sent. This
* option therefore bounds the maximum size of data that can be sent in a
* single send call.
*
* <P> For {@code SctpMultiChannel}, the effect is the same as for {@code
* SctpChannel}, except that it applies to all associations. The option
* applies to each association's window size separately.
*
* <p> An implementation allows this socket option to be set before the
* socket is bound or connected. Whether an implementation allows the
* socket send buffer to be changed after the socket is bound is system
* dependent.
*/
public static final SctpSocketOption<Integer> SO_SNDBUF =
new SctpStdSocketOption<Integer>("SO_SNDBUF", Integer.class,
sun.nio.ch.SctpStdSocketOption.SO_SNDBUF);
/**
* The size of the socket receive buffer.
*
* <P> The value of this socket option is an {@code Integer} that is the
* size of the socket receive buffer in bytes. The socket receive buffer is
* an input buffer used by the networking implementation. It may need to be
* increased for high-volume connections or decreased to limit the possible
* backlog of incoming data. The value of the socket option is a
* <em>hint</em> to the implementation to size the buffer and the actual
* size may differ.
*
* <P> For {@code SctpChannel}, this controls the receiver window size.
*
* <P> For {@code SctpMultiChannel}, the meaning is implementation
* dependent. It might control the receive buffer for each association bound
* to the socket descriptor or it might control the receive buffer for the
* whole socket.
*
* <p> An implementation allows this socket option to be set before the
* socket is bound or connected. Whether an implementation allows the
* socket receive buffer to be changed after the socket is bound is system
* dependent.
*/
public static final SctpSocketOption<Integer> SO_RCVBUF =
new SctpStdSocketOption<Integer>("SO_RCVBUF", Integer.class,
sun.nio.ch.SctpStdSocketOption.SO_RCVBUF);
/**
* Linger on close if data is present.
*
* <p> The value of this socket option is an {@code Integer} that controls
* the action taken when unsent data is queued on the socket and a method
* to close the socket is invoked. If the value of the socket option is zero
* or greater, then it represents a timeout value, in seconds, known as the
* <em>linger interval</em>. The linger interval is the timeout for the
* {@code close} method to block while the operating system attempts to
* transmit the unsent data or it decides that it is unable to transmit the
* data. If the value of the socket option is less than zero then the option
* is disabled. In that case the {@code close} method does not wait until
* unsent data is transmitted; if possible the operating system will transmit
* any unsent data before the connection is closed.
*
* <p> This socket option is intended for use with sockets that are configured
* in {@link java.nio.channels.SelectableChannel#isBlocking() blocking} mode
* only. The behavior of the {@code close} method when this option is
* enabled on a non-blocking socket is not defined.
*
* <p> The initial value of this socket option is a negative value, meaning
* that the option is disabled. The option may be enabled, or the linger
* interval changed, at any time. The maximum value of the linger interval
* is system dependent. Setting the linger interval to a value that is
* greater than its maximum value causes the linger interval to be set to
* its maximum value.
*/
public static final SctpSocketOption<Integer> SO_LINGER =
new SctpStdSocketOption<Integer>("SO_LINGER", Integer.class,
sun.nio.ch.SctpStdSocketOption.SO_LINGER);
/**
* This class is used to set the maximum number of inbound/outbound streams
* used by the local endpoint during association initialization. An
* instance of this class is used to set the {@link
* SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS SCTP_INIT_MAXSTREAMS}
* socket option.
*
* @since 1.7
*/
public static class InitMaxStreams {
private int maxInStreams;
private int maxOutStreams;
private InitMaxStreams(int maxInStreams, int maxOutStreams) {
this.maxInStreams = maxInStreams;
this.maxOutStreams = maxOutStreams;
}
/**
* Creates an InitMaxStreams instance.
*
* @param maxInStreams
* The maximum number of inbound streams, where
* {@code 0 <= maxInStreams <= 65536}
*
* @param maxOutStreams
* The maximum number of outbound streams, where
* {@code 0 <= maxOutStreams <= 65536}
*
* @return An {@code InitMaxStreams} instance
*
* @throws IllegalArgumentException
* If an argument is outside of specified bounds
*/
public static InitMaxStreams create
(int maxInStreams, int maxOutStreams) {
if (maxOutStreams < 0 || maxOutStreams > 65535)
throw new IllegalArgumentException(
"Invalid maxOutStreams value");
if (maxInStreams < 0 || maxInStreams > 65535)
throw new IllegalArgumentException(
"Invalid maxInStreams value");
return new InitMaxStreams(maxInStreams, maxOutStreams);
}
/**
* Returns the maximum number of inbound streams.
*
* @return Maximum inbound streams
*/
public int maxInStreams() {
return maxInStreams;
}
/**
* Returns the maximum number of outbound streams.
*
* @return Maximum outbound streams
*/
public int maxOutStreams() {
return maxOutStreams;
}
/**
* Returns a string representation of this init max streams, including
* the maximum in and out bound streams.
*
* @return A string representation of this init max streams
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(super.toString()).append(" [");
sb.append("maxInStreams:").append(maxInStreams);
sb.append("maxOutStreams:").append(maxOutStreams).append("]");
return sb.toString();
}
/**
* Returns true if the specified object is another {@code InitMaxStreams}
* instance with the same number of in and out bound streams.
*
* @param obj
* The object to be compared with this init max streams
*
* @return true if the specified object is another
* {@code InitMaxStreams} instance with the same number of in
* and out bound streams
*/
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof InitMaxStreams) {
InitMaxStreams that = (InitMaxStreams) obj;
if (this.maxInStreams == that.maxInStreams &&
this.maxOutStreams == that.maxOutStreams)
return true;
}
return false;
}
/**
* Returns a hash code value for this init max streams.
*/
@Override
public int hashCode() {
int hash = 7 ^ maxInStreams ^ maxOutStreams;
return hash;
}
}
}

View File

@ -0,0 +1,89 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
import java.nio.ByteBuffer;
import java.net.SocketAddress;
/**
* Notification emitted when a send failed notification has been received.
*
* <P> A send failed notification indicates that a message cannot be delivered.
* Typically this is because the association has been shutdown with unsent data
* in the socket output buffer, or in the case of a {@link SctpMultiChannel}
* the association failed to setup.
*
* @since 1.7
*/
public abstract class SendFailedNotification implements Notification {
/**
* Initializes a new instance of this class.
*/
protected SendFailedNotification() {}
/**
* Returns the association that this notification is applicable to.
*
* @return The association that failed to send, or {@code null} if
* there is no association, that is, the notification follows a
* {@linkplain
* com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent#CANT_START}
*/
@Override
public abstract Association association();
/**
* Returns the address.
*
* @return The peer primary address of the association or the address that
* the message was sent to
*/
public abstract SocketAddress address();
/**
* Returns the data that was to be sent.
*
* @return The user data. The buffers position will be {@code 0} and its
* limit will be set to the end of the data.
*/
public abstract ByteBuffer buffer();
/**
* Returns the error code.
*
* <P> The errorCode gives the reason why the send failed, and if set, will
* be a SCTP protocol error code as defined in RFC2960 section 3.3.10
*
* @return The error code
*/
public abstract int errorCode();
/**
* Returns the stream number that the messge was to be sent on.
*
* @return The stream number
*/
public abstract int streamNumber();
}

View File

@ -0,0 +1,47 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.nio.sctp;
/**
* Notification emitted when a peers shutdowns an the association.
*
* <P> When a peer sends a <i>SHUTDOWN</i>, the SCTP stack delivers this
* notification to inform the application that it should cease sending data.
*
* @since 1.7
*/
public abstract class ShutdownNotification implements Notification {
/**
* Initializes a new instance of this class.
*/
protected ShutdownNotification() {}
/**
* Returns the association that this notification is applicable to.
*
* @return The association that received the shutdown
*/
public abstract Association association();
}

View File

@ -0,0 +1,75 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/**
* A Java API for Stream Control Transport Protocol.
*
* <P> The Stream Control Transport Protocol (SCTP) is a reliable,
* message-oriented, transport protocol existing at an equivalent level with UDP
* (User Datagram Protocol) and TCP (Transmission Control Protocol). SCTP is
* session oriented and an association between the endpoints must be established
* before any data can be transmitted.
*
* <P> SCTP has direct support for multi-homing, meaning than an endpoint may be
* represented by more than one address and each address may be used for sending
* and receiving data, thus providing network redundancy. The connection between
* two endpoints is referred to as an association between those endpoints.
* Endpoints can exchange a list of addresses during association setup. One
* address is designated as the primary address, this is the default address that
* the peer will use for sending data. A single port number is used across the
* entire address list at an endpoint for a specific session.
*
* <P> SCTP is message based. I/O operations operate upon messages and message
* boundaries are preserved. Each association may support multiple independant
* logical streams. Each stream represents a sequence of messages within a single
* association and streams are independant of one another, meaning that stream
* identifiers and sequence numbers are included in the data packet to allow
* sequencing of messages on a per-stream basis.
*
* <P> This package provides two programming model styles. The one-to-one style
* supported by {@link com.sun.nio.sctp.SctpChannel} and {@link
* com.sun.nio.sctp.SctpServerChannel}, and the one-to-many
* style supported by {@link com.sun.nio.sctp.SctpMultiChannel}.
* The semantics of the one-to-one style interface are very similar to TCP.
* An {@code SctpChannel} can only control one SCTP association. The
* semantics of the one-to-many style interface are very similar to UDP. An
* {@code SctpMutliChannel} can control multiple SCTP associations.
*
* <P> Applications can send and receive per-message ancillary information through
* {@link com.sun.nio.sctp.MessageInfo}. For example, the stream number that
* the message it is to be sent or received from. The SCTP stack is event driven
* and applications can receive notifications of certain SCTP events by invoking
* the {@code receive} method of the SCTP channel with an appropriate {@link
* com.sun.nio.sctp.NotificationHandler notification handler}.
*
* <P> The SCTP protocol is defined by
* <A HREF="http://tools.ietf.org/html/rfc4960">RFC4960</A>, and the optional
* extension for <I>Dynamic Address Reconfiguration</I> is defined by
* <A HREF="http://tools.ietf.org/html/rfc5061">RFC5061</A>.
*
* @since 1.7
*/
package com.sun.nio.sctp;

View File

@ -1,5 +1,5 @@
/*
* Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -329,6 +329,9 @@ public class AWTKeyStroke implements Serializable {
* <li><code>java.awt.event.KeyEvent.VK_TAB</code>
* <li><code>java.awt.event.KeyEvent.VK_SPACE</code>
* </ul>
* Alternatively, the key code may be obtained by calling
* <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
*
* The modifiers consist of any combination of:<ul>
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK

View File

@ -25,6 +25,7 @@
package java.awt;
import java.awt.image.BufferStrategy;
import java.awt.peer.CanvasPeer;
import javax.accessibility.*;
/**
@ -65,7 +66,17 @@ public class Canvas extends Component implements Accessible {
*/
public Canvas(GraphicsConfiguration config) {
this();
graphicsConfig = config;
setGraphicsConfiguration(config);
}
@Override
void setGraphicsConfiguration(GraphicsConfiguration gc) {
CanvasPeer peer = (CanvasPeer)getPeer();
if (peer != null) {
gc = peer.getAppropriateGraphicsConfiguration(gc);
}
super.setGraphicsConfiguration(gc);
}
/**

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -300,7 +300,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
* @see GraphicsConfiguration
* @see #getGraphicsConfiguration
*/
transient GraphicsConfiguration graphicsConfig = null;
private transient GraphicsConfiguration graphicsConfig = null;
/**
* A reference to a <code>BufferStrategy</code> object
@ -799,8 +799,24 @@ public abstract class Component implements ImageObserver, MenuContainer,
}
}
// Whether this Component has had the background erase flag
// specified via SunToolkit.disableBackgroundErase(). This is
// needed in order to make this function work on X11 platforms,
// where currently there is no chance to interpose on the creation
// of the peer and therefore the call to XSetBackground.
transient boolean backgroundEraseDisabled;
static {
AWTAccessor.setComponentAccessor(new AWTAccessor.ComponentAccessor() {
public void setBackgroundEraseDisabled(Component comp, boolean disabled) {
comp.backgroundEraseDisabled = disabled;
}
public boolean getBackgroundEraseDisabled(Component comp) {
return comp.backgroundEraseDisabled;
}
public Rectangle getBounds(Component comp) {
return new Rectangle(comp.x, comp.y, comp.width, comp.height);
}
public void setMixingCutoutShape(Component comp, Shape shape) {
Region region = shape == null ? null :
Region.getInstance(shape, null);
@ -829,6 +845,22 @@ public abstract class Component implements ImageObserver, MenuContainer,
}
}
}
public void setGraphicsConfiguration(Component comp,
GraphicsConfiguration gc)
{
comp.setGraphicsConfiguration(gc);
}
public boolean requestFocus(Component comp, CausedFocusEvent.Cause cause) {
return comp.requestFocus(cause);
}
public boolean canBeFocusOwner(Component comp) {
return comp.canBeFocusOwner();
}
public boolean isVisible_NoClientCode(Component comp) {
return comp.isVisible_NoClientCode();
}
});
}
@ -996,50 +1028,21 @@ public abstract class Component implements ImageObserver, MenuContainer,
*/
public GraphicsConfiguration getGraphicsConfiguration() {
synchronized(getTreeLock()) {
if (graphicsConfig != null) {
return graphicsConfig;
} else if (getParent() != null) {
return getParent().getGraphicsConfiguration();
} else {
return null;
}
return getGraphicsConfiguration_NoClientCode();
}
}
final GraphicsConfiguration getGraphicsConfiguration_NoClientCode() {
GraphicsConfiguration graphicsConfig = this.graphicsConfig;
Container parent = this.parent;
if (graphicsConfig != null) {
return graphicsConfig;
} else if (parent != null) {
return parent.getGraphicsConfiguration_NoClientCode();
} else {
return null;
}
return graphicsConfig;
}
/**
* Resets this <code>Component</code>'s
* <code>GraphicsConfiguration</code> back to a default
* value. For most componenets, this is <code>null</code>.
* Called from the Toolkit thread, so NO CLIENT CODE.
*/
void resetGC() {
void setGraphicsConfiguration(GraphicsConfiguration gc) {
synchronized(getTreeLock()) {
graphicsConfig = null;
}
}
graphicsConfig = gc;
/*
* Not called on Component, but needed for Canvas and Window
*/
void setGCFromPeer() {
synchronized(getTreeLock()) {
if (peer != null) { // can't imagine how this will be false,
// but just in case
graphicsConfig = peer.getGraphicsConfiguration();
} else {
graphicsConfig = null;
ComponentPeer peer = getPeer();
if (peer != null) {
peer.updateGraphicsData(gc);
}
}
}
@ -6663,23 +6666,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
// Update stacking order
if (parent != null && parent.peer != null) {
ContainerPeer parentContPeer = (ContainerPeer) parent.peer;
// if our parent is lightweight and we are not
// we should call restack on nearest heavyweight
// container.
if (parentContPeer instanceof LightweightPeer
&& ! (peer instanceof LightweightPeer))
{
Container hwParent = getNativeContainer();
if (hwParent != null && hwParent.peer != null) {
parentContPeer = (ContainerPeer) hwParent.peer;
}
}
if (parentContPeer.isRestackSupported()) {
parentContPeer.restack();
}
}
peer.setZOrder(getHWPeerAboveMe());
if (!isAddNotifyComplete) {
mixOnShowing();
@ -7170,8 +7157,8 @@ public abstract class Component implements ImageObserver, MenuContainer,
requestFocusHelper(false, true);
}
void requestFocus(CausedFocusEvent.Cause cause) {
requestFocusHelper(false, true, cause);
boolean requestFocus(CausedFocusEvent.Cause cause) {
return requestFocusHelper(false, true, cause);
}
/**
@ -7456,7 +7443,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
// sometimes most recent focus owner may be null, but focus owner is not
// e.g. we reset most recent focus owner if user removes focus owner
focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
if (focusOwner != null && getContainingWindow(focusOwner) != window) {
if (focusOwner != null && focusOwner.getContainingWindow() != window) {
focusOwner = null;
}
}
@ -8689,30 +8676,8 @@ public abstract class Component implements ImageObserver, MenuContainer,
* null, if component is not a part of window hierarchy
*/
Window getContainingWindow() {
return getContainingWindow(this);
return SunToolkit.getContainingWindow(this);
}
/**
* Returns the <code>Window</code> ancestor of the component <code>comp</code>.
* @return Window ancestor of the component or component by itself if it is Window;
* null, if component is not a part of window hierarchy
*/
static Window getContainingWindow(Component comp) {
while (comp != null && !(comp instanceof Window)) {
comp = comp.getParent();
}
return (Window)comp;
}
/**
* Initialize JNI field and method IDs
@ -9575,6 +9540,27 @@ public abstract class Component implements ImageObserver, MenuContainer,
return nextAbove < 0 ? -1 : nextAbove;
}
final ComponentPeer getHWPeerAboveMe() {
checkTreeLock();
Container cont = getContainer();
int indexAbove = getSiblingIndexAbove();
while (cont != null) {
for (int i = indexAbove; i > -1; i--) {
Component comp = cont.getComponent(i);
if (comp != null && comp.isDisplayable() && !comp.isLightweight()) {
return comp.getPeer();
}
}
indexAbove = cont.getSiblingIndexAbove();
cont = cont.getContainer();
}
return null;
}
final int getSiblingIndexBelow() {
checkTreeLock();
Container parent = getContainer();
@ -9827,4 +9813,29 @@ public abstract class Component implements ImageObserver, MenuContainer,
}
// ****************** END OF MIXING CODE ********************************
private static boolean doesClassImplement(Class cls, String interfaceName) {
if (cls == null) return false;
for (Class c : cls.getInterfaces()) {
if (c.getName().equals(interfaceName)) {
return true;
}
}
return doesClassImplement(cls.getSuperclass(), interfaceName);
}
/**
* Checks that the given object implements the given interface.
* @param obj Object to be checked
* @param interfaceName The name of the interface. Must be fully-qualified interface name.
* @return true, if this object implements the given interface,
* false, otherwise, or if obj or interfaceName is null
*/
static boolean doesImplement(Object obj, String interfaceName) {
if (obj == null) return false;
if (interfaceName == null) return false;
return doesClassImplement(obj.getClass(), interfaceName);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -167,6 +167,9 @@ public class Container extends Component {
transient int listeningBoundsChildren;
transient int descendantsCount;
/* Non-opaque window support -- see Window.setLayersOpaque */
transient Color preserveBackgroundColor = null;
/**
* JDK 1.1 serialVersionUID
*/
@ -267,9 +270,13 @@ public class Container extends Component {
/**
* Gets the number of components in this panel.
* <p>
* Note: This method should be called under AWT tree lock.
*
* @return the number of components in this panel.
* @see #getComponent
* @since JDK1.1
* @see Component#getTreeLock()
*/
public int getComponentCount() {
return countComponents();
@ -281,43 +288,65 @@ public class Container extends Component {
*/
@Deprecated
public int countComponents() {
synchronized (getTreeLock()) {
return component.size();
}
// This method is not synchronized under AWT tree lock.
// Instead, the calling code is responsible for the
// synchronization. See 6784816 for details.
return component.size();
}
/**
* Gets the nth component in this container.
* <p>
* Note: This method should be called under AWT tree lock.
*
* @param n the index of the component to get.
* @return the n<sup>th</sup> component in this container.
* @exception ArrayIndexOutOfBoundsException
* if the n<sup>th</sup> value does not exist.
* @see Component#getTreeLock()
*/
public Component getComponent(int n) {
synchronized (getTreeLock()) {
if ((n < 0) || (n >= component.size())) {
throw new ArrayIndexOutOfBoundsException("No such child: " + n);
}
// This method is not synchronized under AWT tree lock.
// Instead, the calling code is responsible for the
// synchronization. See 6784816 for details.
try {
return component.get(n);
} catch (IndexOutOfBoundsException z) {
throw new ArrayIndexOutOfBoundsException("No such child: " + n);
}
}
/**
* Gets all the components in this container.
* <p>
* Note: This method should be called under AWT tree lock.
*
* @return an array of all the components in this container.
* @see Component#getTreeLock()
*/
public Component[] getComponents() {
// This method is not synchronized under AWT tree lock.
// Instead, the calling code is responsible for the
// synchronization. See 6784816 for details.
return getComponents_NoClientCode();
}
// NOTE: This method may be called by privileged threads.
// This functionality is implemented in a package-private method
// to insure that it cannot be overridden by client subclasses.
// DO NOT INVOKE CLIENT CODE ON THIS THREAD!
final Component[] getComponents_NoClientCode() {
return component.toArray(EMPTY_ARRAY);
}
/*
* Wrapper for getComponents() method with a proper synchronization.
*/
Component[] getComponentsSync() {
synchronized (getTreeLock()) {
return component.toArray(EMPTY_ARRAY);
return getComponents();
}
} // getComponents_NoClientCode()
}
/**
* Determines the insets of this container, which indicate the size
@ -503,6 +532,9 @@ public class Container extends Component {
adjustDescendants(-(comp.countHierarchyMembers()));
comp.parent = null;
if (needRemoveNotify) {
comp.setGraphicsConfiguration(null);
}
component.remove(index);
invalidateIfValid();
@ -643,10 +675,7 @@ public class Container extends Component {
// each HW descendant independently.
return !comp.peer.isReparentSupported();
} else {
// if container didn't change we still might need to recreate component's window as
// changes to zorder should be reflected in native window stacking order and it might
// not be supported by the platform. This is important only for heavyweight child
return !((ContainerPeer)(newNativeContainer.peer)).isRestackSupported();
return false;
}
}
@ -786,6 +815,7 @@ public class Container extends Component {
component.add(index, comp);
}
comp.parent = this;
comp.setGraphicsConfiguration(getGraphicsConfiguration());
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
@ -802,11 +832,6 @@ public class Container extends Component {
if (peer != null) {
if (comp.peer == null) { // Remove notify was called or it didn't have peer - create new one
comp.addNotify();
// New created peer creates component on top of the stacking order
Container newNativeContainer = getHeavyweightContainer();
if (((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported()) {
((ContainerPeer)newNativeContainer.getPeer()).restack();
}
} else { // Both container and child have peers, it means child peer should be reparented.
// In both cases we need to reparent native widgets.
Container newNativeContainer = getHeavyweightContainer();
@ -815,13 +840,8 @@ public class Container extends Component {
// Native container changed - need to reparent native widgets
newNativeContainer.reparentChild(comp);
}
// If component still has a peer and it is either container or heavyweight
// and restack is supported we have to restack native windows since order might have changed
if ((!comp.isLightweight() || (comp instanceof Container))
&& ((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported())
{
((ContainerPeer)newNativeContainer.getPeer()).restack();
}
comp.peer.setZOrder(comp.getHWPeerAboveMe());
if (!comp.isLightweight() && isLightweight()) {
// If component is heavyweight and one of the containers is lightweight
// the location of the component should be fixed.
@ -1034,9 +1054,9 @@ public class Container extends Component {
}
checkAddToSelf(comp);
checkNotAWindow(comp);
if (thisGC != null) {
comp.checkGD(thisGC.getDevice().getIDstring());
}
if (thisGC != null) {
comp.checkGD(thisGC.getDevice().getIDstring());
}
/* Reparent the component and tidy up the tree's state. */
if (comp.parent != null) {
@ -1053,6 +1073,7 @@ public class Container extends Component {
component.add(index, comp);
}
comp.parent = this;
comp.setGraphicsConfiguration(thisGC);
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
@ -1091,6 +1112,19 @@ public class Container extends Component {
}
}
@Override
void setGraphicsConfiguration(GraphicsConfiguration gc) {
synchronized (getTreeLock()) {
super.setGraphicsConfiguration(gc);
for (Component comp : component) {
if (comp != null) {
comp.setGraphicsConfiguration(gc);
}
}
}
}
/**
* Checks that all Components that this Container contains are on
* the same GraphicsDevice as this Container. If not, throws an
@ -1148,6 +1182,7 @@ public class Container extends Component {
comp.parent = null;
component.remove(index);
comp.setGraphicsConfiguration(null);
invalidateIfValid();
if (containerListener != null ||
@ -1224,6 +1259,7 @@ public class Container extends Component {
layoutMgr.removeLayoutComponent(comp);
}
comp.parent = null;
comp.setGraphicsConfiguration(null);
if (containerListener != null ||
(eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 ||
Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) {
@ -1339,7 +1375,7 @@ public class Container extends Component {
}
private int getListenersCount(int id, boolean enabledOnToolkit) {
assert Thread.holdsLock(getTreeLock());
checkTreeLock();
if (enabledOnToolkit) {
return descendantsCount;
}
@ -1357,7 +1393,7 @@ public class Container extends Component {
final int createHierarchyEvents(int id, Component changed,
Container changedParent, long changeFlags, boolean enabledOnToolkit)
{
assert Thread.holdsLock(getTreeLock());
checkTreeLock();
int listeners = getListenersCount(id, enabledOnToolkit);
for (int count = listeners, i = 0; count > 0; i++) {
@ -1372,7 +1408,7 @@ public class Container extends Component {
final void createChildHierarchyEvents(int id, long changeFlags,
boolean enabledOnToolkit)
{
assert Thread.holdsLock(getTreeLock());
checkTreeLock();
if (component.isEmpty()) {
return;
}
@ -1507,6 +1543,7 @@ public class Container extends Component {
* @see #validate
*/
protected void validateTree() {
checkTreeLock();
if (!isValid()) {
if (peer instanceof ContainerPeer) {
((ContainerPeer)peer).beginLayout();
@ -1783,7 +1820,7 @@ public class Container extends Component {
// super.paint(); -- Don't bother, since it's a NOP.
GraphicsCallback.PaintCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS);
runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS);
}
}
@ -1838,7 +1875,7 @@ public class Container extends Component {
}
GraphicsCallback.PrintCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS);
runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS);
}
}
@ -1851,7 +1888,7 @@ public class Container extends Component {
public void paintComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PaintAllCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES);
runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES);
}
}
@ -1873,8 +1910,8 @@ public class Container extends Component {
void paintHeavyweightComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PaintHeavyweightComponentsCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS |
GraphicsCallback.HEAVYWEIGHTS);
runComponents(getComponentsSync(), g,
GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS);
}
}
@ -1887,7 +1924,7 @@ public class Container extends Component {
public void printComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PrintAllCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES);
runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES);
}
}
@ -1909,8 +1946,8 @@ public class Container extends Component {
void printHeavyweightComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PrintHeavyweightComponentsCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS |
GraphicsCallback.HEAVYWEIGHTS);
runComponents(getComponentsSync(), g,
GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS);
}
}
@ -2460,9 +2497,7 @@ public class Container extends Component {
* @since 1.2
*/
public Component findComponentAt(int x, int y) {
synchronized (getTreeLock()) {
return findComponentAt(x, y, true);
}
return findComponentAt(x, y, true);
}
/**
@ -2475,58 +2510,60 @@ public class Container extends Component {
* The addition of this feature is temporary, pending the
* adoption of new, public API which exports this feature.
*/
final Component findComponentAt(int x, int y, boolean ignoreEnabled)
{
if (isRecursivelyVisible()){
return findComponentAtImpl(x, y, ignoreEnabled);
final Component findComponentAt(int x, int y, boolean ignoreEnabled) {
synchronized (getTreeLock()) {
if (isRecursivelyVisible()){
return findComponentAtImpl(x, y, ignoreEnabled);
}
}
return null;
}
final Component findComponentAtImpl(int x, int y, boolean ignoreEnabled){
checkTreeLock();
if (!(contains(x, y) && visible && (ignoreEnabled || enabled))) {
return null;
}
// Two passes: see comment in sun.awt.SunGraphicsCallback
synchronized (getTreeLock()) {
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null &&
!(comp.peer instanceof LightweightPeer)) {
if (comp instanceof Container) {
comp = ((Container)comp).findComponentAtImpl(x - comp.x,
y - comp.y,
ignoreEnabled);
} else {
comp = comp.locate(x - comp.x, y - comp.y);
}
if (comp != null && comp.visible &&
(ignoreEnabled || comp.enabled))
{
return comp;
}
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null &&
!(comp.peer instanceof LightweightPeer)) {
if (comp instanceof Container) {
comp = ((Container)comp).findComponentAtImpl(x - comp.x,
y - comp.y,
ignoreEnabled);
} else {
comp = comp.locate(x - comp.x, y - comp.y);
}
}
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null &&
comp.peer instanceof LightweightPeer) {
if (comp instanceof Container) {
comp = ((Container)comp).findComponentAtImpl(x - comp.x,
y - comp.y,
ignoreEnabled);
} else {
comp = comp.locate(x - comp.x, y - comp.y);
}
if (comp != null && comp.visible &&
(ignoreEnabled || comp.enabled))
{
return comp;
}
if (comp != null && comp.visible &&
(ignoreEnabled || comp.enabled))
{
return comp;
}
}
}
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null &&
comp.peer instanceof LightweightPeer) {
if (comp instanceof Container) {
comp = ((Container)comp).findComponentAtImpl(x - comp.x,
y - comp.y,
ignoreEnabled);
} else {
comp = comp.locate(x - comp.x, y - comp.y);
}
if (comp != null && comp.visible &&
(ignoreEnabled || comp.enabled))
{
return comp;
}
}
}
return this;
}
@ -2584,13 +2621,6 @@ public class Container extends Component {
for (int i = 0; i < component.size(); i++) {
component.get(i).addNotify();
}
// Update stacking order if native platform allows
ContainerPeer cpeer = (ContainerPeer)peer;
if (cpeer.isRestackSupported()) {
cpeer.restack();
}
}
}
@ -3488,7 +3518,7 @@ public class Container extends Component {
private void writeObject(ObjectOutputStream s) throws IOException {
ObjectOutputStream.PutField f = s.putFields();
f.put("ncomponents", component.size());
f.put("component", component.toArray(EMPTY_ARRAY));
f.put("component", getComponentsSync());
f.put("layoutMgr", layoutMgr);
f.put("dispatcher", dispatcher);
f.put("maxSize", maxSize);

View File

@ -479,7 +479,7 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager {
// that a Component outside of the focused Window receives a
// FOCUS_GAINED event. We synthesize a WINDOW_GAINED_FOCUS
// event in that case.
final Window newFocusedWindow = Component.getContainingWindow(newFocusOwner);
final Window newFocusedWindow = SunToolkit.getContainingWindow(newFocusOwner);
final Window currentFocusedWindow = getGlobalFocusedWindow();
if (newFocusedWindow != null &&
newFocusedWindow != currentFocusedWindow)

View File

@ -1226,7 +1226,7 @@ public class Dialog extends Window {
synchronized (getTreeLock()) {
if (keepBlockingEDT) {
keepBlockingEDT = false;
PeerEvent wakingEvent = new PeerEvent(this, new WakingRunnable(), PeerEvent.PRIORITY_EVENT);
PeerEvent wakingEvent = new PeerEvent(getToolkit(), new WakingRunnable(), PeerEvent.PRIORITY_EVENT);
AppContext curAppContext = AppContext.getAppContext();
if (showAppContext != curAppContext) {
// Wake up event dispatch thread on which the dialog was

View File

@ -36,6 +36,7 @@ import java.io.ObjectInputStream;
import java.io.IOException;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
import sun.awt.AWTAccessor;
import java.lang.ref.WeakReference;
import javax.accessibility.*;
@ -738,11 +739,15 @@ public class Frame extends Window implements MenuContainer {
* @since 1.4
* @see java.awt.Window#addWindowStateListener
*/
public synchronized void setExtendedState(int state) {
public void setExtendedState(int state) {
if ( !isFrameStateSupported( state ) ) {
return;
}
this.state = state;
synchronized (getObjectLock()) {
this.state = state;
}
// peer.setState must be called outside of object lock
// synchronization block to avoid possible deadlock
FramePeer peer = (FramePeer)this.peer;
if (peer != null) {
peer.setState(state);
@ -804,12 +809,27 @@ public class Frame extends Window implements MenuContainer {
* @see #setExtendedState(int)
* @since 1.4
*/
public synchronized int getExtendedState() {
FramePeer peer = (FramePeer)this.peer;
if (peer != null) {
state = peer.getState();
public int getExtendedState() {
synchronized (getObjectLock()) {
return state;
}
return state;
}
static {
AWTAccessor.setFrameAccessor(
new AWTAccessor.FrameAccessor() {
public void setExtendedState(Frame frame, int state) {
synchronized(frame.getObjectLock()) {
frame.state = state;
}
}
public int getExtendedState(Frame frame) {
synchronized(frame.getObjectLock()) {
return frame.state;
}
}
}
);
}
/**
@ -967,7 +987,7 @@ public class Frame extends Window implements MenuContainer {
if (resizable) {
str += ",resizable";
}
getExtendedState(); // sync with peer
int state = getExtendedState();
if (state == NORMAL) {
str += ",normal";
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -434,4 +434,20 @@ public abstract class GraphicsConfiguration {
}
return defaultImageCaps;
}
/**
* Returns whether this GraphicsConfiguration supports
* the {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT
* PERPIXEL_TRANSLUCENT} kind of translucency.
*
* @param gc GraphicsConfiguration
* @throws NullPointerException if the gc argument is null
* @return whether the given GraphicsConfiguration supports
* the translucency effects.
* @see Window#setBackground(Color)
*/
/*public */boolean isTranslucencyCapable() {
// Overridden in subclasses
return false;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -27,7 +27,10 @@
package java.awt;
import java.awt.image.ColorModel;
import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
/**
* The <code>GraphicsDevice</code> class describes the graphics devices
@ -109,6 +112,31 @@ public abstract class GraphicsDevice {
*/
public final static int TYPE_IMAGE_BUFFER = 2;
/** Kinds of translucency supported by the underlying system.
* @see #isTranslucencySupported
*/
/*public */static enum WindowTranslucency {
/**
* Represents support in the underlying system for windows each pixel
* of which is guaranteed to be either completely opaque, with
* an alpha value of 1.0, or completely transparent, with an alpha
* value of 0.0.
*/
PERPIXEL_TRANSPARENT,
/**
* Represents support in the underlying system for windows all of
* the pixels of which have the same alpha value between or including
* 0.0 and 1.0.
*/
TRANSLUCENT,
/**
* Represents support in the underlying system for windows that
* contain or might contain pixels with arbitrary alpha values
* between and including 0.0 and 1.0.
*/
PERPIXEL_TRANSLUCENT;
}
/**
* Returns the type of this <code>GraphicsDevice</code>.
* @return the type of this <code>GraphicsDevice</code>, which can
@ -235,6 +263,21 @@ public abstract class GraphicsDevice {
* @since 1.4
*/
public void setFullScreenWindow(Window w) {
if (w != null) {
//XXX: The actions should be documented in some non-update release.
/*
if (w.getShape() != null) {
w.setShape(w, null);
}
if (!w.isOpaque()) {
w.setOpaque(false);
}
if (w.getOpacity() < 1.0f) {
w.setOpacity(1.0f);
}
*/
}
if (fullScreenWindow != null && windowedModeBounds != null) {
// if the window went into fs mode before it was realized it may
// have (0,0) dimensions
@ -424,4 +467,94 @@ public abstract class GraphicsDevice {
public int getAvailableAcceleratedMemory() {
return -1;
}
/**
* Returns whether the given level of translucency is supported
* this graphics device.
*
* @param translucencyKind a kind of translucency support
* @return whether the given translucency kind is supported
*/
/*public */boolean isWindowTranslucencySupported(WindowTranslucency translucencyKind) {
switch (translucencyKind) {
case PERPIXEL_TRANSPARENT:
return isWindowShapingSupported();
case TRANSLUCENT:
return isWindowOpacitySupported();
case PERPIXEL_TRANSLUCENT:
return isWindowPerpixelTranslucencySupported();
}
return false;
}
/**
* Returns whether the windowing system supports changing the shape
* of top-level windows.
* Note that this method may sometimes return true, but the native
* windowing system may still not support the concept of
* shaping (due to the bugs in the windowing system).
*/
static boolean isWindowShapingSupported() {
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isWindowShapingSupported();
}
/**
* Returns whether the windowing system supports changing the opacity
* value of top-level windows.
* Note that this method may sometimes return true, but the native
* windowing system may still not support the concept of
* translucency (due to the bugs in the windowing system).
*/
static boolean isWindowOpacitySupported() {
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isWindowOpacitySupported();
}
boolean isWindowPerpixelTranslucencySupported() {
/*
* Per-pixel alpha is supported if all the conditions are TRUE:
* 1. The toolkit is a sort of SunToolkit
* 2. The toolkit supports translucency in general
* (isWindowTranslucencySupported())
* 3. There's at least one translucency-capable
* GraphicsConfiguration
*/
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) {
return false;
}
// TODO: cache translucency capable GC
return getTranslucencyCapableGC() != null;
}
GraphicsConfiguration getTranslucencyCapableGC() {
// If the default GC supports translucency return true.
// It is important to optimize the verification this way,
// see CR 6661196 for more details.
GraphicsConfiguration defaultGC = getDefaultConfiguration();
if (defaultGC.isTranslucencyCapable()) {
return defaultGC;
}
// ... otherwise iterate through all the GCs.
GraphicsConfiguration[] configs = getConfigurations();
for (int j = 0; j < configs.length; j++) {
if (configs[j].isTranslucencyCapable()) {
return configs[j];
}
}
return null;
}
}

View File

@ -61,6 +61,7 @@ import sun.awt.HeadlessToolkit;
import sun.awt.SunToolkit;
import sun.awt.CausedFocusEvent;
import sun.awt.KeyboardFocusManagerPeerProvider;
import sun.awt.AWTAccessor;
/**
* The KeyboardFocusManager is responsible for managing the active and focused
@ -118,6 +119,32 @@ public abstract class KeyboardFocusManager
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
AWTAccessor.setKeyboardFocusManagerAccessor(
new AWTAccessor.KeyboardFocusManagerAccessor() {
public int shouldNativelyFocusHeavyweight(Component heavyweight,
Component descendant,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time,
CausedFocusEvent.Cause cause)
{
return KeyboardFocusManager.shouldNativelyFocusHeavyweight(
heavyweight, descendant, temporary, focusedWindowChangeAllowed, time, cause);
}
public boolean processSynchronousLightweightTransfer(Component heavyweight,
Component descendant,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time)
{
return KeyboardFocusManager.processSynchronousLightweightTransfer(
heavyweight, descendant, temporary, focusedWindowChangeAllowed, time);
}
public void removeLastFocusRequest(Component heavyweight) {
KeyboardFocusManager.removeLastFocusRequest(heavyweight);
}
}
);
}
transient KeyboardFocusManagerPeer peer;
@ -2208,7 +2235,7 @@ public abstract class KeyboardFocusManager
boolean temporary, boolean focusedWindowChangeAllowed,
long time)
{
Window parentWindow = Component.getContainingWindow(heavyweight);
Window parentWindow = SunToolkit.getContainingWindow(heavyweight);
if (parentWindow == null || !parentWindow.syncLWRequests) {
return false;
}
@ -2443,79 +2470,7 @@ public abstract class KeyboardFocusManager
}
}
}
static void heavyweightButtonDown(Component heavyweight, long time) {
heavyweightButtonDown(heavyweight, time, false);
}
static void heavyweightButtonDown(Component heavyweight, long time, boolean acceptDuplicates) {
if (log.isLoggable(Level.FINE)) {
if (heavyweight == null) {
log.log(Level.FINE, "Assertion (heavyweight != null) failed");
}
if (time == 0) {
log.log(Level.FINE, "Assertion (time != 0) failed");
}
}
KeyboardFocusManager manager = getCurrentKeyboardFocusManager(SunToolkit.targetToAppContext(heavyweight));
synchronized (heavyweightRequests) {
HeavyweightFocusRequest hwFocusRequest = getLastHWRequest();
Component currentNativeFocusOwner = (hwFocusRequest == null)
? manager.getNativeFocusOwner()
: hwFocusRequest.heavyweight;
// Behavior for all use cases:
// 1. Heavyweight leaf Components (e.g., Button, Checkbox, Choice,
// List, TextComponent, Canvas) that respond to button down.
//
// Native platform will generate a FOCUS_GAINED if and only if
// the Component is not the focus owner (or, will not be the
// focus owner when all outstanding focus requests are
// processed).
//
// 2. Panel with no descendants.
//
// Same as (1).
//
// 3. Panel with at least one heavyweight descendant.
//
// This function should NOT be called for this case!
//
// 4. Panel with only lightweight descendants.
//
// Native platform will generate a FOCUS_GAINED if and only if
// neither the Panel, nor any of its recursive, lightweight
// descendants, is the focus owner. However, we want a
// requestFocus() for any lightweight descendant to win out over
// the focus request for the Panel. To accomplish this, we
// differ from the algorithm for shouldNativelyFocusHeavyweight
// as follows:
// a. If the requestFocus() for a lightweight descendant has
// been fully handled by the time this function is invoked,
// then 'hwFocusRequest' will be null and 'heavyweight'
// will be the native focus owner. Do *not* synthesize a
// focus transfer to the Panel.
// b. If the requestFocus() for a lightweight descendant has
// been recorded, but not handled, then 'hwFocusRequest'
// will be non-null and 'hwFocusRequest.heavyweight' will
// equal 'heavyweight'. Do *not* append 'heavyweight' to
// hwFocusRequest.lightweightRequests.
// c. If the requestFocus() for a lightweight descendant is
// yet to be made, then post a new HeavyweightFocusRequest.
// If no lightweight descendant ever requests focus, then
// the Panel will get focus. If some descendant does, then
// the descendant will get focus by either a synthetic
// focus transfer, or a lightweightRequests focus transfer.
if (acceptDuplicates || heavyweight != currentNativeFocusOwner) {
getCurrentKeyboardFocusManager
(SunToolkit.targetToAppContext(heavyweight)).
enqueueKeyEvents(time, heavyweight);
heavyweightRequests.add
(new HeavyweightFocusRequest(heavyweight, heavyweight,
false, CausedFocusEvent.Cause.MOUSE_EVENT));
}
}
}
/**
* Returns the Window which will be active after processing this request,
* or null if this is a duplicate request. The active Window is useful
@ -2542,7 +2497,7 @@ public abstract class KeyboardFocusManager
(HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER);
Component activeWindow = ((hwFocusRequest != null)
? Component.getContainingWindow(hwFocusRequest.heavyweight)
? SunToolkit.getContainingWindow(hwFocusRequest.heavyweight)
: nativeFocusedWindow);
while (activeWindow != null &&
!((activeWindow instanceof Frame) ||
@ -3013,8 +2968,8 @@ public abstract class KeyboardFocusManager
}
private static boolean focusedWindowChanged(Component to, Component from) {
Window wto = Component.getContainingWindow(to);
Window wfrom = Component.getContainingWindow(from);
Window wto = SunToolkit.getContainingWindow(to);
Window wfrom = SunToolkit.getContainingWindow(from);
if (wto == null && wfrom == null) {
return true;
}
@ -3028,8 +2983,8 @@ public abstract class KeyboardFocusManager
}
private static boolean isTemporary(Component to, Component from) {
Window wto = Component.getContainingWindow(to);
Window wfrom = Component.getContainingWindow(from);
Window wto = SunToolkit.getContainingWindow(to);
Window wfrom = SunToolkit.getContainingWindow(from);
if (wto == null && wfrom == null) {
return false;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -398,9 +398,11 @@ public class MenuItem extends MenuComponent implements Accessible {
boolean handleShortcut(KeyEvent e) {
MenuShortcut s = new MenuShortcut(e.getKeyCode(),
(e.getModifiers() & InputEvent.SHIFT_MASK) > 0);
MenuShortcut sE = new MenuShortcut(e.getExtendedKeyCode(),
(e.getModifiers() & InputEvent.SHIFT_MASK) > 0);
// Fix For 6185151: Menu shortcuts of all menuitems within a menu
// should be disabled when the menu itself is disabled
if (s.equals(shortcut) && isItemEnabled()) {
if ((s.equals(shortcut) || sE.equals(shortcut)) && isItemEnabled()) {
// MenuShortcut match -- issue an event on keydown.
if (e.getID() == KeyEvent.KEY_PRESSED) {
doMenuEvent(e.getWhen(), e.getModifiers());

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -34,7 +34,21 @@ import java.awt.event.KeyEvent;
* For example, a menu shortcut for Ctrl-a (assuming that Control is
* the accelerator key) would be created with code like the following:
* <p>
* MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false);
* <code>MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false);</code>
* <p> or alternatively
* <p>
* <code>MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('A'), false);</code>
* <p>
* Menu shortcuts may also be constructed for a wider set of keycodes
* using the <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code> call.
* For example, a menu shortcut for "Ctrl+cyrillic ef" is created by
* <p>
* <code>MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('\u0444'), false);</code>
* <p>
* Note that shortcuts created with a keycode or an extended keycode defined as a constant in <code>KeyEvent</code>
* work regardless of the current keyboard layout. However, a shortcut made of
* an extended keycode not listed in <code>KeyEvent</code>
* only work if the current keyboard layout produces a corresponding letter.
* <p>
* The accelerator key is platform-dependent and may be obtained
* via {@link Toolkit#getMenuShortcutKeyMask}.

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -25,8 +25,10 @@
package java.awt;
import java.awt.event.*;
import java.awt.geom.Point2D;
import java.awt.im.InputContext;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.peer.ComponentPeer;
import java.awt.peer.WindowPeer;
import java.beans.PropertyChangeListener;
@ -49,6 +51,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.accessibility.*;
import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.CausedFocusEvent;
import sun.awt.SunToolkit;
@ -291,6 +294,25 @@ public class Window extends Container implements Accessible {
*/
transient boolean isInShow = false;
/*
* Opacity level of the window
*
* @see #setOpacity(float)
* @see #getOpacity()
* @since 1.7
*/
private float opacity = 1.0f;
/*
* The shape assigned to this window. This field is set to null if
* no shape is set (rectangular window).
*
* @see #getShape()
* @see #setShape(Shape)
* @since 1.7
*/
private Shape shape = null;
private static final String base = "win";
private static int nameCounter = 0;
@ -305,6 +327,23 @@ public class Window extends Container implements Accessible {
transient boolean isTrayIconWindow = false;
/**
* These fields are initialized in the native peer code
* or via AWTAccessor's WindowAccessor.
*/
private transient volatile int securityWarningWidth = 0;
private transient volatile int securityWarningHeight = 0;
/**
* These fields represent the desired location for the security
* warning if this window is untrusted.
* See com.sun.awt.SecurityWarning for more details.
*/
private transient double securityWarningPointX = 2.0;
private transient double securityWarningPointY = 0.0;
private transient float securityWarningAlignmentX = RIGHT_ALIGNMENT;
private transient float securityWarningAlignmentY = TOP_ALIGNMENT;
static {
/* ensure that the necessary native libraries are loaded */
Toolkit.loadLibraries();
@ -373,6 +412,18 @@ public class Window extends Container implements Accessible {
}
}
private GraphicsConfiguration initGC(GraphicsConfiguration gc) {
GraphicsEnvironment.checkHeadless();
if (gc == null) {
gc = GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration();
}
setGraphicsConfiguration(gc);
return gc;
}
private void init(GraphicsConfiguration gc) {
GraphicsEnvironment.checkHeadless();
@ -384,14 +435,10 @@ public class Window extends Container implements Accessible {
setWarningString();
this.cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
this.visible = false;
if (gc == null) {
this.graphicsConfig =
GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration();
} else {
this.graphicsConfig = gc;
}
if (graphicsConfig.getDevice().getType() !=
gc = initGC(gc);
if (gc.getDevice().getType() !=
GraphicsDevice.TYPE_RASTER_SCREEN) {
throw new IllegalArgumentException("not a screen device");
}
@ -399,8 +446,8 @@ public class Window extends Container implements Accessible {
/* offset the initial location with the original of the screen */
/* and any insets */
Rectangle screenBounds = graphicsConfig.getBounds();
Insets screenInsets = getToolkit().getScreenInsets(graphicsConfig);
Rectangle screenBounds = gc.getBounds();
Insets screenInsets = getToolkit().getScreenInsets(gc);
int x = getX() + screenBounds.x + screenInsets.left;
int y = getY() + screenBounds.y + screenInsets.top;
if (x != this.x || y != this.y) {
@ -2744,7 +2791,7 @@ public class Window extends Container implements Accessible {
sun.java2d.Disposer.addRecord(anchor, new WindowDisposerRecord(appContext, this));
addToWindowList();
initGC(null);
}
private void deserializeResources(ObjectInputStream s)
@ -2849,6 +2896,15 @@ public class Window extends Container implements Accessible {
if(aot) {
setAlwaysOnTop(aot); // since 1.5; subject to permission check
}
shape = (Shape)f.get("shape", null);
opacity = (Float)f.get("opacity", 1.0f);
this.securityWarningWidth = 0;
this.securityWarningHeight = 0;
this.securityWarningPointX = 2.0;
this.securityWarningPointY = 0.0;
this.securityWarningAlignmentX = RIGHT_ALIGNMENT;
this.securityWarningAlignmentY = TOP_ALIGNMENT;
deserializeResources(s);
}
@ -2916,41 +2972,18 @@ public class Window extends Container implements Accessible {
} // inner class AccessibleAWTWindow
/**
* This method returns the GraphicsConfiguration used by this Window.
* @since 1.3
*/
public GraphicsConfiguration getGraphicsConfiguration() {
//NOTE: for multiscreen, this will need to take into account
//which screen the window is on/mostly on instead of returning the
//default or constructor argument config.
synchronized(getTreeLock()) {
if (graphicsConfig == null && !GraphicsEnvironment.isHeadless()) {
graphicsConfig =
GraphicsEnvironment. getLocalGraphicsEnvironment().
getDefaultScreenDevice().
getDefaultConfiguration();
}
return graphicsConfig;
}
}
/**
* Reset this Window's GraphicsConfiguration to match its peer.
*/
void resetGC() {
if (!GraphicsEnvironment.isHeadless()) {
// use the peer's GC
setGCFromPeer();
// if it's still null, use the default
if (graphicsConfig == null) {
graphicsConfig = GraphicsEnvironment.
@Override
void setGraphicsConfiguration(GraphicsConfiguration gc) {
if (gc == null) {
gc = GraphicsEnvironment.
getLocalGraphicsEnvironment().
getDefaultScreenDevice().
getDefaultConfiguration();
}
}
synchronized (getTreeLock()) {
super.setGraphicsConfiguration(gc);
if (log.isLoggable(Level.FINER)) {
log.finer("+ Window.resetGC(): new GC is \n+ " + graphicsConfig + "\n+ this is " + this);
log.finer("+ Window.setGraphicsConfiguration(): new GC is \n+ " + getGraphicsConfiguration_NoClientCode() + "\n+ this is " + this);
}
}
}
@ -3010,13 +3043,13 @@ public class Window extends Container implements Accessible {
// target location
int dx = 0, dy = 0;
// target GC
GraphicsConfiguration gc = this.graphicsConfig;
GraphicsConfiguration gc = getGraphicsConfiguration_NoClientCode();
Rectangle gcBounds = gc.getBounds();
Dimension windowSize = getSize();
// search a top-level of c
Window componentWindow = Component.getContainingWindow(c);
Window componentWindow = SunToolkit.getContainingWindow(c);
if ((c == null) || (componentWindow == null)) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
@ -3304,6 +3337,225 @@ public class Window extends Container implements Accessible {
}
// ******************** SHAPES & TRANSPARENCY CODE ********************
/**
* JavaDoc
*/
/*public */float getOpacity() {
synchronized (getTreeLock()) {
return opacity;
}
}
/**
* JavaDoc
*/
/*public */void setOpacity(float opacity) {
synchronized (getTreeLock()) {
if (opacity < 0.0f || opacity > 1.0f) {
throw new IllegalArgumentException(
"The value of opacity should be in the range [0.0f .. 1.0f].");
}
GraphicsConfiguration gc = getGraphicsConfiguration();
GraphicsDevice gd = gc.getDevice();
if (!gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT)) {
throw new UnsupportedOperationException(
"TRANSLUCENT translucency is not supported.");
}
if ((gc.getDevice().getFullScreenWindow() == this) && (opacity < 1.0f)) {
throw new IllegalArgumentException(
"Setting opacity for full-screen window is not supported.");
}
this.opacity = opacity;
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.setOpacity(opacity);
}
}
}
/**
* JavaDoc
*/
/*public */Shape getShape() {
synchronized (getTreeLock()) {
return shape;
}
}
/**
* JavaDoc
*
* @param window the window to set the shape to
* @param shape the shape to set to the window
* @throws IllegalArgumentException if the window is in full screen mode,
* and the shape is not null
*/
/*public */void setShape(Shape shape) {
synchronized (getTreeLock()) {
GraphicsConfiguration gc = getGraphicsConfiguration();
GraphicsDevice gd = gc.getDevice();
if (!gd.isWindowTranslucencySupported(
GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT))
{
throw new UnsupportedOperationException(
"PERPIXEL_TRANSPARENT translucency is not supported.");
}
if ((gc.getDevice().getFullScreenWindow() == this) && (shape != null)) {
throw new IllegalArgumentException(
"Setting shape for full-screen window is not supported.");
}
this.shape = shape;
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.applyShape(shape == null ? null : Region.getInstance(shape, null));
}
}
}
/**
* JavaDoc
*/
/*
@Override
public void setBackground(Color bgColor) {
int alpha = bgColor.getAlpha();
if (alpha < 255) { // non-opaque window
GraphicsConfiguration gc = getGraphicsConfiguration();
GraphicsDevice gd = gc.getDevice();
if (gc.getDevice().getFullScreenWindow() == this) {
throw new IllegalArgumentException(
"Making full-screen window non opaque is not supported.");
}
if (!gc.isTranslucencyCapable()) {
GraphicsConfiguration capableGC = gd.getTranslucencyCapableGC();
if (capableGC == null) {
throw new IllegalArgumentException(
"PERPIXEL_TRANSLUCENT translucency is not supported");
}
// TODO: change GC
}
setLayersOpaque(this, false);
}
super.setBackground(bgColor);
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.setOpaque(alpha == 255);
}
}
*/
private transient boolean opaque = true;
void setOpaque(boolean opaque) {
synchronized (getTreeLock()) {
GraphicsConfiguration gc = getGraphicsConfiguration();
if (!opaque && !com.sun.awt.AWTUtilities.isTranslucencyCapable(gc)) {
throw new IllegalArgumentException(
"The window must use a translucency-compatible graphics configuration");
}
if (!com.sun.awt.AWTUtilities.isTranslucencySupported(
com.sun.awt.AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT))
{
throw new UnsupportedOperationException(
"PERPIXEL_TRANSLUCENT translucency is not supported.");
}
if ((gc.getDevice().getFullScreenWindow() == this) && !opaque) {
throw new IllegalArgumentException(
"Making full-screen window non opaque is not supported.");
}
setLayersOpaque(this, opaque);
this.opaque = opaque;
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.setOpaque(opaque);
}
}
}
private void updateWindow(BufferedImage backBuffer) {
synchronized (getTreeLock()) {
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.updateWindow(backBuffer);
}
}
}
private static final Color TRANSPARENT_BACKGROUND_COLOR = new Color(0, 0, 0, 0);
private static void setLayersOpaque(Component component, boolean isOpaque) {
// Shouldn't use instanceof to avoid loading Swing classes
// if it's a pure AWT application.
if (Component.doesImplement(component, "javax.swing.RootPaneContainer")) {
javax.swing.RootPaneContainer rpc = (javax.swing.RootPaneContainer)component;
javax.swing.JRootPane root = rpc.getRootPane();
javax.swing.JLayeredPane lp = root.getLayeredPane();
Container c = root.getContentPane();
javax.swing.JComponent content =
(c instanceof javax.swing.JComponent) ? (javax.swing.JComponent)c : null;
javax.swing.JComponent gp =
(rpc.getGlassPane() instanceof javax.swing.JComponent) ?
(javax.swing.JComponent)rpc.getGlassPane() : null;
if (gp != null) {
gp.setDoubleBuffered(isOpaque);
}
lp.setOpaque(isOpaque);
root.setOpaque(isOpaque);
root.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround
if (content != null) {
content.setOpaque(isOpaque);
content.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround
// Iterate down one level to see whether we have a JApplet
// (which is also a RootPaneContainer) which requires processing
int numChildren = content.getComponentCount();
if (numChildren > 0) {
Component child = content.getComponent(0);
// It's OK to use instanceof here because we've
// already loaded the RootPaneContainer class by now
if (child instanceof javax.swing.RootPaneContainer) {
setLayersOpaque(child, isOpaque);
}
}
}
}
Color bg = component.getBackground();
boolean hasTransparentBg = TRANSPARENT_BACKGROUND_COLOR.equals(bg);
Container container = null;
if (component instanceof Container) {
container = (Container) component;
}
if (isOpaque) {
if (hasTransparentBg) {
// Note: we use the SystemColor.window color as the default.
// This color is used in the WindowPeer implementations to
// initialize the background color of the window if it is null.
// (This might not be the right thing to do for other
// RootPaneContainers we might be invoked with)
Color newColor = null;
if (container != null && container.preserveBackgroundColor != null) {
newColor = container.preserveBackgroundColor;
} else {
newColor = SystemColor.window;
}
component.setBackground(newColor);
}
} else {
if (!hasTransparentBg && container != null) {
container.preserveBackgroundColor = bg;
}
component.setBackground(TRANSPARENT_BACKGROUND_COLOR);
}
}
// ************************** MIXING CODE *******************************
// A window has a parent, but it does NOT have a container
@ -3341,6 +3593,87 @@ public class Window extends Container implements Accessible {
// ****************** END OF MIXING CODE ********************************
// This method gets the window location/size as reported by the native
// system since the locally cached values may represent outdated data.
// NOTE: this method is invoked on the toolkit thread, and therefore
// is not supposed to become public/user-overridable.
private Point2D calculateSecurityWarningPosition(double x, double y,
double w, double h)
{
return new Point2D.Double(
x + w * securityWarningAlignmentX + securityWarningPointX,
y + h * securityWarningAlignmentY + securityWarningPointY);
}
static {
AWTAccessor.setWindowAccessor(new AWTAccessor.WindowAccessor() {
public float getOpacity(Window window) {
return window.opacity;
}
public void setOpacity(Window window, float opacity) {
window.setOpacity(opacity);
}
public Shape getShape(Window window) {
return window.getShape();
}
public void setShape(Window window, Shape shape) {
window.setShape(shape);
}
public boolean isOpaque(Window window) {
/*
return window.getBackground().getAlpha() < 255;
*/
synchronized (window.getTreeLock()) {
return window.opaque;
}
}
public void setOpaque(Window window, boolean opaque) {
/*
Color bg = window.getBackground();
window.setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue(),
opaque ? 255 : 0));
*/
window.setOpaque(opaque);
}
public void updateWindow(Window window, BufferedImage backBuffer) {
window.updateWindow(backBuffer);
}
public Dimension getSecurityWarningSize(Window window) {
return new Dimension(window.securityWarningWidth,
window.securityWarningHeight);
}
public void setSecurityWarningSize(Window window, int width, int height)
{
window.securityWarningWidth = width;
window.securityWarningHeight = height;
}
public void setSecurityWarningPosition(Window window,
Point2D point, float alignmentX, float alignmentY)
{
window.securityWarningPointX = point.getX();
window.securityWarningPointY = point.getY();
window.securityWarningAlignmentX = alignmentX;
window.securityWarningAlignmentY = alignmentY;
synchronized (window.getTreeLock()) {
WindowPeer peer = (WindowPeer)window.getPeer();
if (peer != null) {
peer.repositionSecurityWarning();
}
}
}
public Point2D calculateSecurityWarningPosition(Window window,
double x, double y, double w, double h)
{
return window.calculateSecurityWarningPosition(x, y, w, h);
}
}); // WindowAccessor
} // static
} // class Window

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -65,15 +65,16 @@ import java.io.ObjectInputStream;
* <p>
* For key pressed and key released events, the getKeyCode method returns
* the event's keyCode. For key typed events, the getKeyCode method
* always returns VK_UNDEFINED.
* always returns {@code VK_UNDEFINED}. The {@code getExtendedKeyCode} method
* may also be used with many international keyboard layouts.
*
* <p>
* <em>"Key pressed" and "key released" events</em> are lower-level and depend
* on the platform and keyboard layout. They are generated whenever a key is
* pressed or released, and are the only way to find out about keys that don't
* generate character input (e.g., action keys, modifier keys, etc.). The key
* being pressed or released is indicated by the getKeyCode method, which returns
* a virtual key code.
* being pressed or released is indicated by the {@code getKeyCode} and {@code getExtendedKeyCode}
* methods, which return a virtual key code.
*
* <p>
* <em>Virtual key codes</em> are used to report which keyboard key has
@ -111,6 +112,11 @@ import java.io.ObjectInputStream;
* platform and keyboard layout. For example, the key that generates VK_Q
* when using a U.S. keyboard layout will generate VK_A when using a French
* keyboard layout.
* <li>The key that generates {@code VK_Q} when using a U.S. keyboard layout also
* generates a unique code for Russian or Hebrew layout. There is no a
* {@code VK_} constant for these and many other codes in various layouts. These codes
* may be obtained by using {@code getExtendedKeyCode} and are used whenever
* a {@code VK_} constant is used.
* <li>Not all characters have a keycode associated with them. For example,
* there is no keycode for the question mark because there is no keyboard
* for which it appears on the primary layer.
@ -891,6 +897,12 @@ public class KeyEvent extends InputEvent {
*/
int keyLocation;
//set from native code.
private transient long rawCode = 0;
private transient long primaryLevelUnicode = 0;
private transient long scancode = 0; // for MS Windows only
private transient long extendedKeyCode = 0;
/*
* JDK 1.1 serialVersionUID
*/
@ -1315,6 +1327,9 @@ public class KeyEvent extends InputEvent {
return numpad + "-" + c;
}
if ((keyCode & 0x01000000) != 0) {
return String.valueOf((char)(keyCode ^ 0x01000000 ));
}
String unknown = Toolkit.getProperty("AWT.unknown", "Unknown");
return unknown + " keyCode: 0x" + Integer.toString(keyCode, 16);
}
@ -1551,9 +1566,44 @@ public class KeyEvent extends InputEvent {
str.append("KEY_LOCATION_UNKNOWN");
break;
}
str.append(",rawCode=").append(rawCode);
str.append(",primaryLevelUnicode=").append(primaryLevelUnicode);
str.append(",scancode=").append(scancode);
str.append(",extendedKeyCode=0x").append(Long.toHexString(extendedKeyCode));
return str.toString();
}
/**
* Returns an extended key code for the event.
* The extended key code is a unique id assigned to a key on the keyboard
* just like {@code keyCode}. However, unlike {@code keyCode}, this value depends on the
* current keyboard layout. For instance, pressing the left topmost letter key
* in a common English layout produces the same value as {@code keyCode}, {@code VK_Q}.
* Pressing the same key in a regular Russian layout gives another code, unique for the
* letter "Cyrillic I short".
*
* @since 1.7
*
*/
public int getExtendedKeyCode() {
return (int)extendedKeyCode;
}
/**
* Returns an extended key code for a unicode character.
*
* @return for a unicode character with a corresponding {@code VK_} constant -- this
* {@code VK_} constant; for a character appearing on the primary
* level of a known keyboard layout -- a unique integer.
* If a character does not appear on the primary level of a known keyboard,
* {@code VK_UNDEFINED} is returned.
*
* @since 1.7
*
*/
public static int getExtendedKeyCodeForChar(int c) {
// Return a keycode (if any) associated with a character.
return sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(c);
}
/**
* Sets new modifiers by the old ones. The key modifiers

View File

@ -25,6 +25,7 @@
package java.awt.peer;
import java.awt.Canvas;
import java.awt.GraphicsConfiguration;
/**
* The peer interface for {@link Canvas}.
@ -36,4 +37,13 @@ import java.awt.Canvas;
* instances.
*/
public interface CanvasPeer extends ComponentPeer {
/**
* Requests a GC that best suits this Canvas. The returned GC may differ
* from the requested GC passed as the argument to this method. This method
* must return a non-null value (given the argument is non-null as well).
*
* @since 1.7
*/
GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc);
}

View File

@ -539,4 +539,16 @@ public interface ComponentPeer {
*/
void applyShape(Region shape);
/**
* Lowers this component at the bottom of the above HW peer. If the above parameter
* is null then the method places this component at the top of the Z-order.
*/
void setZOrder(ComponentPeer above);
/**
* Updates internal data structures related to the component's GC.
*
* @since 1.7
*/
void updateGraphicsData(GraphicsConfiguration gc);
}

View File

@ -76,21 +76,4 @@ public interface ContainerPeer extends ComponentPeer {
* @see Container#validateTree()
*/
void endLayout();
/**
* Restacks native windows - children of this native window - according to
* Java container order.
*
* @since 1.5
*/
void restack();
/**
* Indicates availability of restacking operation in this container.
*
* @return Returns true if restack is supported, false otherwise
*
* @since 1.5
*/
boolean isRestackSupported();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -27,6 +27,8 @@ package java.awt.peer;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* The peer interface for {@link Window}.
*
@ -92,4 +94,31 @@ public interface WindowPeer extends ContainerPeer {
* @see Window#setIconImages(java.util.List)
*/
void updateIconImages();
/**
* Sets the level of opacity for the window.
*
* @see Window#setOpacity(float)
*/
void setOpacity(float opacity);
/**
* Enables the per-pixel alpha support for the window.
*
* @see Window#setBackground(Color)
*/
void setOpaque(boolean isOpaque);
/**
* Updates the native part of non-opaque window using
* the given image with color+alpha values for each pixel.
*
* @see Window#setBackground(Color)
*/
void updateWindow(BufferedImage backBuffer);
/**
* Instructs the peer to update the position of the security warning.
*/
void repositionSecurityWarning();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -27,26 +27,41 @@ package java.beans;
import com.sun.beans.finder.ClassFinder;
import java.applet.*;
import java.applet.Applet;
import java.applet.AppletContext;
import java.applet.AppletStub;
import java.applet.AudioClip;
import java.awt.*;
import java.beans.AppletInitializer;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.beans.beancontext.BeanContext;
import java.io.*;
import java.lang.reflect.Constructor;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import java.io.StreamCorruptedException;
import java.net.URL;
import java.lang.reflect.Array;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;
import sun.awt.AppContext;
/**
* This class provides some general purpose beans control methods.
*/
public class Beans {
private static final Object DESIGN_TIME = new Object();
private static final Object GUI_AVAILABLE = new Object();
/**
* <p>
@ -59,12 +74,12 @@ public class Beans {
* @param beanName the name of the bean within the class-loader.
* For example "sun.beanbox.foobah"
*
* @exception java.lang.ClassNotFoundException if the class of a serialized
* @exception ClassNotFoundException if the class of a serialized
* object could not be found.
* @exception java.io.IOException if an I/O error occurs.
* @exception IOException if an I/O error occurs.
*/
public static Object instantiate(ClassLoader cls, String beanName) throws java.io.IOException, ClassNotFoundException {
public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException {
return Beans.instantiate(cls, beanName, null, null);
}
@ -80,12 +95,12 @@ public class Beans {
* For example "sun.beanbox.foobah"
* @param beanContext The BeanContext in which to nest the new bean
*
* @exception java.lang.ClassNotFoundException if the class of a serialized
* @exception ClassNotFoundException if the class of a serialized
* object could not be found.
* @exception java.io.IOException if an I/O error occurs.
* @exception IOException if an I/O error occurs.
*/
public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws java.io.IOException, ClassNotFoundException {
public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws IOException, ClassNotFoundException {
return Beans.instantiate(cls, beanName, beanContext, null);
}
@ -135,19 +150,19 @@ public class Beans {
* @param beanContext The BeanContext in which to nest the new bean
* @param initializer The AppletInitializer for the new bean
*
* @exception java.lang.ClassNotFoundException if the class of a serialized
* @exception ClassNotFoundException if the class of a serialized
* object could not be found.
* @exception java.io.IOException if an I/O error occurs.
* @exception IOException if an I/O error occurs.
*/
public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer)
throws java.io.IOException, ClassNotFoundException {
throws IOException, ClassNotFoundException {
java.io.InputStream ins;
java.io.ObjectInputStream oins = null;
InputStream ins;
ObjectInputStream oins = null;
Object result = null;
boolean serialized = false;
java.io.IOException serex = null;
IOException serex = null;
// If the given classloader is null, we check if an
// system classloader is available and (if so)
@ -166,8 +181,8 @@ public class Beans {
// Try to find a serialized object with this name
final String serName = beanName.replace('.','/').concat(".ser");
final ClassLoader loader = cls;
ins = (InputStream)java.security.AccessController.doPrivileged
(new java.security.PrivilegedAction() {
ins = (InputStream)AccessController.doPrivileged
(new PrivilegedAction() {
public Object run() {
if (loader == null)
return ClassLoader.getSystemResourceAsStream(serName);
@ -185,7 +200,7 @@ public class Beans {
result = oins.readObject();
serialized = true;
oins.close();
} catch (java.io.IOException ex) {
} catch (IOException ex) {
ins.close();
// Drop through and try opening the class. But remember
// the exception in case we can't find the class either.
@ -264,8 +279,8 @@ public class Beans {
final ClassLoader cloader = cls;
objectUrl = (URL)
java.security.AccessController.doPrivileged
(new java.security.PrivilegedAction() {
AccessController.doPrivileged
(new PrivilegedAction() {
public Object run() {
if (cloader == null)
return ClassLoader.getSystemResource
@ -377,10 +392,11 @@ public class Beans {
* @return True if we are running in an application construction
* environment.
*
* @see java.beans.DesignMode
* @see DesignMode
*/
public static boolean isDesignTime() {
return designTime;
Object value = AppContext.getAppContext().get(DESIGN_TIME);
return (value instanceof Boolean) && (Boolean) value;
}
/**
@ -393,11 +409,12 @@ public class Beans {
* false in a server environment or if an application is
* running as part of a batch job.
*
* @see java.beans.Visibility
* @see Visibility
*
*/
public static boolean isGuiAvailable() {
return guiAvailable;
Object value = AppContext.getAppContext().get(GUI_AVAILABLE);
return (value instanceof Boolean) ? (Boolean) value : !GraphicsEnvironment.isHeadless();
}
/**
@ -423,7 +440,7 @@ public class Beans {
if (sm != null) {
sm.checkPropertiesAccess();
}
designTime = isDesignTime;
AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime));
}
/**
@ -449,14 +466,7 @@ public class Beans {
if (sm != null) {
sm.checkPropertiesAccess();
}
guiAvailable = isGuiAvailable;
}
private static boolean designTime;
private static boolean guiAvailable;
static {
guiAvailable = !GraphicsEnvironment.isHeadless();
AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable));
}
}
@ -501,7 +511,7 @@ class ObjectInputStreamWithLoader extends ObjectInputStream
class BeansAppletContext implements AppletContext {
Applet target;
java.util.Hashtable imageCache = new java.util.Hashtable();
Hashtable imageCache = new Hashtable();
BeansAppletContext(Applet target) {
this.target = target;
@ -546,8 +556,8 @@ class BeansAppletContext implements AppletContext {
return null;
}
public java.util.Enumeration getApplets() {
java.util.Vector applets = new java.util.Vector();
public Enumeration getApplets() {
Vector applets = new Vector();
applets.addElement(target);
return applets.elements();
}
@ -573,7 +583,7 @@ class BeansAppletContext implements AppletContext {
return null;
}
public java.util.Iterator getStreamKeys(){
public Iterator getStreamKeys(){
// We do nothing.
return null;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -41,6 +41,7 @@ package java.beans;
* @author Mark Davidson
*/
public class IndexedPropertyChangeEvent extends PropertyChangeEvent {
private static final long serialVersionUID = -320227448495806870L;
private int index;

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -36,6 +36,7 @@ package java.beans;
public
class IntrospectionException extends Exception {
private static final long serialVersionUID = -3728150539969542619L;
/**
* Constructs an <code>IntrospectionException</code> with a

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -44,6 +44,7 @@ package java.beans;
*/
public class PropertyChangeEvent extends java.util.EventObject {
private static final long serialVersionUID = 7042693688939648123L;
/**
* Constructs a new <code>PropertyChangeEvent</code>.

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -33,7 +33,7 @@ package java.beans;
public
class PropertyVetoException extends Exception {
private static final long serialVersionUID = 129596057694162164L;
/**
* Constructs a <code>PropertyVetoException</code> with a

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -48,6 +48,7 @@ import java.beans.beancontext.BeanContext;
*/
public abstract class BeanContextEvent extends EventObject {
private static final long serialVersionUID = 7267998073569045052L;
/**
* Contruct a BeanContextEvent

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -55,6 +55,7 @@ import java.util.Iterator;
* @see java.beans.beancontext.BeanContextMembershipListener
*/
public class BeanContextMembershipEvent extends BeanContextEvent {
private static final long serialVersionUID = 3499346510334590959L;
/**
* Contruct a BeanContextMembershipEvent

View File

@ -1,5 +1,5 @@
/*
* Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -40,6 +40,7 @@ import java.util.Iterator;
*/
public class BeanContextServiceAvailableEvent extends BeanContextEvent {
private static final long serialVersionUID = -5333985775656400778L;
/**
* Construct a <code>BeanContextAvailableServiceEvent</code>.

View File

@ -1,5 +1,5 @@
/*
* Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -37,6 +37,7 @@ import java.beans.beancontext.BeanContextServices;
* </p>
*/
public class BeanContextServiceRevokedEvent extends BeanContextEvent {
private static final long serialVersionUID = -1295543154724961754L;
/**
* Construct a <code>BeanContextServiceEvent</code>.

View File

@ -1,5 +1,5 @@
/*
* Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -60,6 +60,7 @@ import java.util.Locale;
public class BeanContextServicesSupport extends BeanContextSupport
implements BeanContextServices {
private static final long serialVersionUID = -8494482757288719206L;
/**
* <p>
@ -594,6 +595,7 @@ public class BeanContextServicesSupport extends BeanContextSupport
*/
protected static class BCSSServiceProvider implements Serializable {
private static final long serialVersionUID = 861278251667444782L;
BCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) {
super();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -920,9 +920,9 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
*/
public static final UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS =
new UnicodeBlock("COMBINING_MARKS_FOR_SYMBOLS", new String[] {"Combining Diacritical Marks for Symbols",
"CombiningDiacriticalMarksforSymbols",
"Combining Marks for Symbols",
"CombiningMarksforSymbols" });
"CombiningDiacriticalMarksforSymbols",
"Combining Marks for Symbols",
"CombiningMarksforSymbols" });
/**
* Constant for the "Letterlike Symbols" Unicode character block.
@ -1332,8 +1332,11 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
* @since 1.5
*/
public static final UnicodeBlock CYRILLIC_SUPPLEMENTARY =
new UnicodeBlock("CYRILLIC_SUPPLEMENTARY", new String[] {"Cyrillic Supplementary",
"CyrillicSupplementary"});
new UnicodeBlock("CYRILLIC_SUPPLEMENTARY",
new String[] {"Cyrillic Supplementary",
"CyrillicSupplementary",
"Cyrillic Supplement",
"CyrillicSupplement"});
/**
* Constant for the "Tagalog" Unicode character block.
@ -1641,157 +1644,579 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
public static final UnicodeBlock LOW_SURROGATES =
new UnicodeBlock("LOW_SURROGATES", new String[] {"Low Surrogates", "LowSurrogates"});
/**
* Constant for the "Arabic Supplement" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock ARABIC_SUPPLEMENT =
new UnicodeBlock("ARABIC_SUPPLEMENT",
new String[] { "Arabic Supplement",
"ArabicSupplement"});
/**
* Constant for the "NKo" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock NKO = new UnicodeBlock("NKO");
/**
* Constant for the "Ethiopic Supplement" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock ETHIOPIC_SUPPLEMENT =
new UnicodeBlock("ETHIOPIC_SUPPLEMENT",
new String[] { "Ethiopic Supplement",
"EthiopicSupplement"});
/**
* Constant for the "New Tai Lue" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock NEW_TAI_LUE =
new UnicodeBlock("NEW_TAI_LUE",
new String[] { "New Tai Lue",
"NewTaiLue"});
/**
* Constant for the "Buginese" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock BUGINESE =
new UnicodeBlock("BUGINESE");
/**
* Constant for the "Balinese" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock BALINESE =
new UnicodeBlock("BALINESE");
/**
* Constant for the "Sundanese" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock SUNDANESE =
new UnicodeBlock("SUNDANESE");
/**
* Constant for the "Lepcha" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock LEPCHA = new UnicodeBlock("LEPCHA");
/**
* Constant for the "Ol Chiki" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock OL_CHIKI =
new UnicodeBlock("OL_CHIKI",
new String[] { "Ol Chiki",
"OlChiki"});
/**
* Constant for the "Phonetic Extensions Supplement" Unicode character
* block.
* @since 1.7
*/
public static final UnicodeBlock PHONETIC_EXTENSIONS_SUPPLEMENT =
new UnicodeBlock("PHONETIC_EXTENSIONS_SUPPLEMENT",
new String[] { "Phonetic Extensions Supplement",
"PhoneticExtensionsSupplement"});
/**
* Constant for the "Combining Diacritical Marks Supplement" Unicode
* character block.
* @since 1.7
*/
public static final UnicodeBlock COMBINING_DIACRITICAL_MARKS_SUPPLEMENT =
new UnicodeBlock("COMBINING_DIACRITICAL_MARKS_SUPPLEMENT",
new String[] { "Combining Diacritical Marks Supplement",
"CombiningDiacriticalMarksSupplement"});
/**
* Constant for the "Glagolitic" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock GLAGOLITIC =
new UnicodeBlock("GLAGOLITIC");
/**
* Constant for the "Latin Extended-C" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock LATIN_EXTENDED_C =
new UnicodeBlock("LATIN_EXTENDED_C",
new String[] { "Latin Extended-C",
"LatinExtended-C"});
/**
* Constant for the "Coptic" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock COPTIC = new UnicodeBlock("COPTIC");
/**
* Constant for the "Georgian Supplement" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock GEORGIAN_SUPPLEMENT =
new UnicodeBlock("GEORGIAN_SUPPLEMENT",
new String[] { "Georgian Supplement",
"GeorgianSupplement"});
/**
* Constant for the "Tifinagh" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock TIFINAGH =
new UnicodeBlock("TIFINAGH");
/**
* Constant for the "Ethiopic Extended" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock ETHIOPIC_EXTENDED =
new UnicodeBlock("ETHIOPIC_EXTENDED",
new String[] { "Ethiopic Extended",
"EthiopicExtended"});
/**
* Constant for the "Cyrillic Extended-A" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock CYRILLIC_EXTENDED_A =
new UnicodeBlock("CYRILLIC_EXTENDED_A",
new String[] { "Cyrillic Extended-A",
"CyrillicExtended-A"});
/**
* Constant for the "Supplemental Punctuation" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock SUPPLEMENTAL_PUNCTUATION =
new UnicodeBlock("SUPPLEMENTAL_PUNCTUATION",
new String[] { "Supplemental Punctuation",
"SupplementalPunctuation"});
/**
* Constant for the "CJK Strokes" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock CJK_STROKES =
new UnicodeBlock("CJK_STROKES",
new String[] { "CJK Strokes",
"CJKStrokes"});
/**
* Constant for the "Vai" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock VAI = new UnicodeBlock("VAI");
/**
* Constant for the "Cyrillic Extended-B" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock CYRILLIC_EXTENDED_B =
new UnicodeBlock("CYRILLIC_EXTENDED_B",
new String[] { "Cyrillic Extended-B",
"CyrillicExtended-B"});
/**
* Constant for the "Modifier Tone Letters" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock MODIFIER_TONE_LETTERS =
new UnicodeBlock("MODIFIER_TONE_LETTERS",
new String[] { "Modifier Tone Letters",
"ModifierToneLetters"});
/**
* Constant for the "Latin Extended-D" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock LATIN_EXTENDED_D =
new UnicodeBlock("LATIN_EXTENDED_D",
new String[] { "Latin Extended-D",
"LatinExtended-D"});
/**
* Constant for the "Syloti Nagri" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock SYLOTI_NAGRI =
new UnicodeBlock("SYLOTI_NAGRI",
new String[] { "Syloti Nagri",
"SylotiNagri"});
/**
* Constant for the "Phags-pa" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock PHAGS_PA =
new UnicodeBlock("PHAGS_PA", new String[] { "Phags-pa"});
/**
* Constant for the "Saurashtra" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock SAURASHTRA =
new UnicodeBlock("SAURASHTRA");
/**
* Constant for the "Kayah Li" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock KAYAH_LI =
new UnicodeBlock("KAYAH_LI",
new String[] { "Kayah Li",
"KayahLi"});
/**
* Constant for the "Rejang" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock REJANG = new UnicodeBlock("REJANG");
/**
* Constant for the "Cham" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock CHAM = new UnicodeBlock("CHAM");
/**
* Constant for the "Vertical Forms" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock VERTICAL_FORMS =
new UnicodeBlock("VERTICAL_FORMS",
new String[] { "Vertical Forms",
"VerticalForms"});
/**
* Constant for the "Ancient Greek Numbers" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock ANCIENT_GREEK_NUMBERS =
new UnicodeBlock("ANCIENT_GREEK_NUMBERS",
new String[] { "Ancient Greek Numbers",
"AncientGreekNumbers"});
/**
* Constant for the "Ancient Symbols" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock ANCIENT_SYMBOLS =
new UnicodeBlock("ANCIENT_SYMBOLS",
new String[] { "Ancient Symbols",
"AncientSymbols"});
/**
* Constant for the "Phaistos Disc" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock PHAISTOS_DISC =
new UnicodeBlock("PHAISTOS_DISC",
new String[] { "Phaistos Disc",
"PhaistosDisc"});
/**
* Constant for the "Lycian" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock LYCIAN = new UnicodeBlock("LYCIAN");
/**
* Constant for the "Carian" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock CARIAN = new UnicodeBlock("CARIAN");
/**
* Constant for the "Old Persian" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock OLD_PERSIAN =
new UnicodeBlock("OLD_PERSIAN",
new String[] { "Old Persian",
"OldPersian"});
/**
* Constant for the "Phoenician" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock PHOENICIAN =
new UnicodeBlock("PHOENICIAN");
/**
* Constant for the "Lydian" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock LYDIAN = new UnicodeBlock("LYDIAN");
/**
* Constant for the "Kharoshthi" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock KHAROSHTHI =
new UnicodeBlock("KHAROSHTHI");
/**
* Constant for the "Cuneiform" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock CUNEIFORM =
new UnicodeBlock("CUNEIFORM");
/**
* Constant for the "Cuneiform Numbers and Punctuation" Unicode
* character block.
* @since 1.7
*/
public static final UnicodeBlock CUNEIFORM_NUMBERS_AND_PUNCTUATION =
new UnicodeBlock("CUNEIFORM_NUMBERS_AND_PUNCTUATION",
new String[] { "Cuneiform Numbers and Punctuation",
"CuneiformNumbersandPunctuation"});
/**
* Constant for the "Ancient Greek Musical Notation" Unicode character
* block.
* @since 1.7
*/
public static final UnicodeBlock ANCIENT_GREEK_MUSICAL_NOTATION =
new UnicodeBlock("ANCIENT_GREEK_MUSICAL_NOTATION",
new String[] { "Ancient Greek Musical Notation",
"AncientGreekMusicalNotation"});
/**
* Constant for the "Counting Rod Numerals" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock COUNTING_ROD_NUMERALS =
new UnicodeBlock("COUNTING_ROD_NUMERALS",
new String[] { "Counting Rod Numerals",
"CountingRodNumerals"});
/**
* Constant for the "Mahjong Tiles" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock MAHJONG_TILES =
new UnicodeBlock("MAHJONG_TILES",
new String[] { "Mahjong Tiles",
"MahjongTiles"});
/**
* Constant for the "Domino Tiles" Unicode character block.
* @since 1.7
*/
public static final UnicodeBlock DOMINO_TILES =
new UnicodeBlock("DOMINO_TILES",
new String[] { "Domino Tiles",
"DominoTiles"});
private static final int blockStarts[] = {
0x0000, // Basic Latin
0x0080, // Latin-1 Supplement
0x0100, // Latin Extended-A
0x0180, // Latin Extended-B
0x0250, // IPA Extensions
0x02B0, // Spacing Modifier Letters
0x0300, // Combining Diacritical Marks
0x0370, // Greek and Coptic
0x0400, // Cyrillic
0x0500, // Cyrillic Supplementary
0x0530, // Armenian
0x0590, // Hebrew
0x0600, // Arabic
0x0700, // Syriac
0x0750, // unassigned
0x0780, // Thaana
0x07C0, // unassigned
0x0900, // Devanagari
0x0980, // Bengali
0x0A00, // Gurmukhi
0x0A80, // Gujarati
0x0B00, // Oriya
0x0B80, // Tamil
0x0C00, // Telugu
0x0C80, // Kannada
0x0D00, // Malayalam
0x0D80, // Sinhala
0x0E00, // Thai
0x0E80, // Lao
0x0F00, // Tibetan
0x1000, // Myanmar
0x10A0, // Georgian
0x1100, // Hangul Jamo
0x1200, // Ethiopic
0x1380, // unassigned
0x13A0, // Cherokee
0x1400, // Unified Canadian Aboriginal Syllabics
0x1680, // Ogham
0x16A0, // Runic
0x1700, // Tagalog
0x1720, // Hanunoo
0x1740, // Buhid
0x1760, // Tagbanwa
0x1780, // Khmer
0x1800, // Mongolian
0x18B0, // unassigned
0x1900, // Limbu
0x1950, // Tai Le
0x1980, // unassigned
0x19E0, // Khmer Symbols
0x1A00, // unassigned
0x1D00, // Phonetic Extensions
0x1D80, // unassigned
0x1E00, // Latin Extended Additional
0x1F00, // Greek Extended
0x2000, // General Punctuation
0x2070, // Superscripts and Subscripts
0x20A0, // Currency Symbols
0x20D0, // Combining Diacritical Marks for Symbols
0x2100, // Letterlike Symbols
0x2150, // Number Forms
0x2190, // Arrows
0x2200, // Mathematical Operators
0x2300, // Miscellaneous Technical
0x2400, // Control Pictures
0x2440, // Optical Character Recognition
0x2460, // Enclosed Alphanumerics
0x2500, // Box Drawing
0x2580, // Block Elements
0x25A0, // Geometric Shapes
0x2600, // Miscellaneous Symbols
0x2700, // Dingbats
0x27C0, // Miscellaneous Mathematical Symbols-A
0x27F0, // Supplemental Arrows-A
0x2800, // Braille Patterns
0x2900, // Supplemental Arrows-B
0x2980, // Miscellaneous Mathematical Symbols-B
0x2A00, // Supplemental Mathematical Operators
0x2B00, // Miscellaneous Symbols and Arrows
0x2C00, // unassigned
0x2E80, // CJK Radicals Supplement
0x2F00, // Kangxi Radicals
0x2FE0, // unassigned
0x2FF0, // Ideographic Description Characters
0x3000, // CJK Symbols and Punctuation
0x3040, // Hiragana
0x30A0, // Katakana
0x3100, // Bopomofo
0x3130, // Hangul Compatibility Jamo
0x3190, // Kanbun
0x31A0, // Bopomofo Extended
0x31C0, // unassigned
0x31F0, // Katakana Phonetic Extensions
0x3200, // Enclosed CJK Letters and Months
0x3300, // CJK Compatibility
0x3400, // CJK Unified Ideographs Extension A
0x4DC0, // Yijing Hexagram Symbols
0x4E00, // CJK Unified Ideographs
0xA000, // Yi Syllables
0xA490, // Yi Radicals
0xA4D0, // unassigned
0xAC00, // Hangul Syllables
0xD7B0, // unassigned
0xD800, // High Surrogates
0xDB80, // High Private Use Surrogates
0xDC00, // Low Surrogates
0xE000, // Private Use
0xF900, // CJK Compatibility Ideographs
0xFB00, // Alphabetic Presentation Forms
0xFB50, // Arabic Presentation Forms-A
0xFE00, // Variation Selectors
0xFE10, // unassigned
0xFE20, // Combining Half Marks
0xFE30, // CJK Compatibility Forms
0xFE50, // Small Form Variants
0xFE70, // Arabic Presentation Forms-B
0xFF00, // Halfwidth and Fullwidth Forms
0xFFF0, // Specials
0x10000, // Linear B Syllabary
0x10080, // Linear B Ideograms
0x10100, // Aegean Numbers
0x10140, // unassigned
0x10300, // Old Italic
0x10330, // Gothic
0x10350, // unassigned
0x10380, // Ugaritic
0x103A0, // unassigned
0x10400, // Deseret
0x10450, // Shavian
0x10480, // Osmanya
0x104B0, // unassigned
0x10800, // Cypriot Syllabary
0x10840, // unassigned
0x1D000, // Byzantine Musical Symbols
0x1D100, // Musical Symbols
0x1D200, // unassigned
0x1D300, // Tai Xuan Jing Symbols
0x1D360, // unassigned
0x1D400, // Mathematical Alphanumeric Symbols
0x1D800, // unassigned
0x20000, // CJK Unified Ideographs Extension B
0x2A6E0, // unassigned
0x2F800, // CJK Compatibility Ideographs Supplement
0x2FA20, // unassigned
0xE0000, // Tags
0xE0080, // unassigned
0xE0100, // Variation Selectors Supplement
0xE01F0, // unassigned
0xF0000, // Supplementary Private Use Area-A
0x100000, // Supplementary Private Use Area-B
0x0000, // 0000..007F; Basic Latin
0x0080, // 0080..00FF; Latin-1 Supplement
0x0100, // 0100..017F; Latin Extended-A
0x0180, // 0180..024F; Latin Extended-B
0x0250, // 0250..02AF; IPA Extensions
0x02B0, // 02B0..02FF; Spacing Modifier Letters
0x0300, // 0300..036F; Combining Diacritical Marks
0x0370, // 0370..03FF; Greek and Coptic
0x0400, // 0400..04FF; Cyrillic
0x0500, // 0500..052F; Cyrillic Supplement
0x0530, // 0530..058F; Armenian
0x0590, // 0590..05FF; Hebrew
0x0600, // 0600..06FF; Arabic
0x0700, // 0700..074F; Syria
0x0750, // 0750..077F; Arabic Supplement
0x0780, // 0780..07BF; Thaana
0x07C0, // 07C0..07FF; NKo
0x0800, // unassigned
0x0900, // 0900..097F; Devanagari
0x0980, // 0980..09FF; Bengali
0x0A00, // 0A00..0A7F; Gurmukhi
0x0A80, // 0A80..0AFF; Gujarati
0x0B00, // 0B00..0B7F; Oriya
0x0B80, // 0B80..0BFF; Tamil
0x0C00, // 0C00..0C7F; Telugu
0x0C80, // 0C80..0CFF; Kannada
0x0D00, // 0D00..0D7F; Malayalam
0x0D80, // 0D80..0DFF; Sinhala
0x0E00, // 0E00..0E7F; Thai
0x0E80, // 0E80..0EFF; Lao
0x0F00, // 0F00..0FFF; Tibetan
0x1000, // 1000..109F; Myanmar
0x10A0, // 10A0..10FF; Georgian
0x1100, // 1100..11FF; Hangul Jamo
0x1200, // 1200..137F; Ethiopic
0x1380, // 1380..139F; Ethiopic Supplement
0x13A0, // 13A0..13FF; Cherokee
0x1400, // 1400..167F; Unified Canadian Aboriginal Syllabics
0x1680, // 1680..169F; Ogham
0x16A0, // 16A0..16FF; Runic
0x1700, // 1700..171F; Tagalog
0x1720, // 1720..173F; Hanunoo
0x1740, // 1740..175F; Buhid
0x1760, // 1760..177F; Tagbanwa
0x1780, // 1780..17FF; Khmer
0x1800, // 1800..18AF; Mongolian
0x18B0, // unassigned
0x1900, // 1900..194F; Limbu
0x1950, // 1950..197F; Tai Le
0x1980, // 1980..19DF; New Tai Lue
0x19E0, // 19E0..19FF; Khmer Symbols
0x1A00, // 1A00..1A1F; Buginese
0x1A20, // unassigned
0x1B00, // 1B00..1B7F; Balinese
0x1B80, // 1B80..1BBF; Sundanese
0x1BC0, // unassigned
0x1C00, // 1C00..1C4F; Lepcha
0x1C50, // 1C50..1C7F; Ol Chiki
0x1C80, // unassigned
0x1D00, // 1D00..1D7F; Phonetic Extensions
0x1D80, // 1D80..1DBF; Phonetic Extensions Supplement
0x1DC0, // 1DC0..1DFF; Combining Diacritical Marks Supplement
0x1E00, // 1E00..1EFF; Latin Extended Additional
0x1F00, // 1F00..1FFF; Greek Extended
0x2000, // 2000..206F; General Punctuation
0x2070, // 2070..209F; Superscripts and Subscripts
0x20A0, // 20A0..20CF; Currency Symbols
0x20D0, // 20D0..20FF; Combining Diacritical Marks for Symbols
0x2100, // 2100..214F; Letterlike Symbols
0x2150, // 2150..218F; Number Forms
0x2190, // 2190..21FF; Arrows
0x2200, // 2200..22FF; Mathematical Operators
0x2300, // 2300..23FF; Miscellaneous Technical
0x2400, // 2400..243F; Control Pictures
0x2440, // 2440..245F; Optical Character Recognition
0x2460, // 2460..24FF; Enclosed Alphanumerics
0x2500, // 2500..257F; Box Drawing
0x2580, // 2580..259F; Block Elements
0x25A0, // 25A0..25FF; Geometric Shapes
0x2600, // 2600..26FF; Miscellaneous Symbols
0x2700, // 2700..27BF; Dingbats
0x27C0, // 27C0..27EF; Miscellaneous Mathematical Symbols-A
0x27F0, // 27F0..27FF; Supplemental Arrows-A
0x2800, // 2800..28FF; Braille Patterns
0x2900, // 2900..297F; Supplemental Arrows-B
0x2980, // 2980..29FF; Miscellaneous Mathematical Symbols-B
0x2A00, // 2A00..2AFF; Supplemental Mathematical Operators
0x2B00, // 2B00..2BFF; Miscellaneous Symbols and Arrows
0x2C00, // 2C00..2C5F; Glagolitic
0x2C60, // 2C60..2C7F; Latin Extended-C
0x2C80, // 2C80..2CFF; Coptic
0x2D00, // 2D00..2D2F; Georgian Supplement
0x2D30, // 2D30..2D7F; Tifinagh
0x2D80, // 2D80..2DDF; Ethiopic Extended
0x2DE0, // 2DE0..2DFF; Cyrillic Extended-A
0x2E00, // 2E00..2E7F; Supplemental Punctuation
0x2E80, // 2E80..2EFF; CJK Radicals Supplement
0x2F00, // 2F00..2FDF; Kangxi Radicals
0x2FE0, // unassigned
0x2FF0, // 2FF0..2FFF; Ideographic Description Characters
0x3000, // 3000..303F; CJK Symbols and Punctuation
0x3040, // 3040..309F; Hiragana
0x30A0, // 30A0..30FF; Katakana
0x3100, // 3100..312F; Bopomofo
0x3130, // 3130..318F; Hangul Compatibility Jamo
0x3190, // 3190..319F; Kanbun
0x31A0, // 31A0..31BF; Bopomofo Extended
0x31C0, // 31C0..31EF; CJK Strokes
0x31F0, // 31F0..31FF; Katakana Phonetic Extensions
0x3200, // 3200..32FF; Enclosed CJK Letters and Months
0x3300, // 3300..33FF; CJK Compatibility
0x3400, // 3400..4DBF; CJK Unified Ideographs Extension A
0x4DC0, // 4DC0..4DFF; Yijing Hexagram Symbols
0x4E00, // 4E00..9FFF; CJK Unified Ideograph
0xA000, // A000..A48F; Yi Syllables
0xA490, // A490..A4CF; Yi Radicals
0xA4D0, // unassigned
0xA500, // A500..A63F; Vai
0xA640, // A640..A69F; Cyrillic Extended-B
0xA6A0, // unassigned
0xA700, // A700..A71F; Modifier Tone Letters
0xA720, // A720..A7FF; Latin Extended-D
0xA800, // A800..A82F; Syloti Nagri
0xA830, // unassigned
0xA840, // A840..A87F; Phags-pa
0xA880, // A880..A8DF; Saurashtra
0xA8E0, // unassigned
0xA900, // A900..A92F; Kayah Li
0xA930, // A930..A95F; Rejang
0xA960, // unassigned
0xAA00, // AA00..AA5F; Cham
0xAA60, // unassigned
0xAC00, // AC00..D7AF; Hangul Syllables
0xD7B0, // unassigned
0xD800, // D800..DB7F; High Surrogates
0xDB80, // DB80..DBFF; High Private Use Surrogates
0xDC00, // DC00..DFFF; Low Surrogates
0xE000, // E000..F8FF; Private Use Area
0xF900, // F900..FAFF; CJK Compatibility Ideographs
0xFB00, // FB00..FB4F; Alphabetic Presentation Forms
0xFB50, // FB50..FDFF; Arabic Presentation Forms-A
0xFE00, // FE00..FE0F; Variation Selectors
0xFE10, // FE10..FE1F; Vertical Forms
0xFE20, // FE20..FE2F; Combining Half Marks
0xFE30, // FE30..FE4F; CJK Compatibility Forms
0xFE50, // FE50..FE6F; Small Form Variants
0xFE70, // FE70..FEFF; Arabic Presentation Forms-B
0xFF00, // FF00..FFEF; Halfwidth and Fullwidth Forms
0xFFF0, // FFF0..FFFF; Specials
0x10000, // 10000..1007F; Linear B Syllabary
0x10080, // 10080..100FF; Linear B Ideograms
0x10100, // 10100..1013F; Aegean Numbers
0x10140, // 10140..1018F; Ancient Greek Numbers
0x10190, // 10190..101CF; Ancient Symbols
0x101D0, // 101D0..101FF; Phaistos Disc
0x10200, // unassigned
0x10280, // 10280..1029F; Lycian
0x102A0, // 102A0..102DF; Carian
0x102E0, // unassigned
0x10300, // 10300..1032F; Old Italic
0x10330, // 10330..1034F; Gothic
0x10350, // unassigned
0x10380, // 10380..1039F; Ugaritic
0x103A0, // 103A0..103DF; Old Persian
0x103E0, // unassigned
0x10400, // 10400..1044F; Desere
0x10450, // 10450..1047F; Shavian
0x10480, // 10480..104AF; Osmanya
0x104B0, // unassigned
0x10800, // 10800..1083F; Cypriot Syllabary
0x10840, // unassigned
0x10900, // 10900..1091F; Phoenician
0x10920, // 10920..1093F; Lydian
0x10940, // unassigned
0x10A00, // 10A00..10A5F; Kharoshthi
0x10A60, // unassigned
0x12000, // 12000..123FF; Cuneiform
0x12400, // 12400..1247F; Cuneiform Numbers and Punctuation
0x12480, // unassigned
0x1D000, // 1D000..1D0FF; Byzantine Musical Symbols
0x1D100, // 1D100..1D1FF; Musical Symbols
0x1D200, // 1D200..1D24F; Ancient Greek Musical Notation
0x1D250, // unassigned
0x1D300, // 1D300..1D35F; Tai Xuan Jing Symbols
0x1D360, // 1D360..1D37F; Counting Rod Numerals
0x1D380, // unassigned
0x1D400, // 1D400..1D7FF; Mathematical Alphanumeric Symbols
0x1D800, // unassigned
0x1F000, // 1F000..1F02F; Mahjong Tiles
0x1F030, // 1F030..1F09F; Domino Tiles
0x1F0A0, // unassigned
0x20000, // 20000..2A6DF; CJK Unified Ideographs Extension B
0x2A6E0, // unassigned
0x2F800, // 2F800..2FA1F; CJK Compatibility Ideographs Supplement
0x2FA20, // unassigned
0xE0000, // E0000..E007F; Tags
0xE0080, // unassigned
0xE0100, // E0100..E01EF; Variation Selectors Supplement
0xE01F0, // unassigned
0xF0000, // F0000..FFFFF; Supplementary Private Use Area-A
0x100000, // 100000..10FFFF; Supplementary Private Use Area-B
};
private static final UnicodeBlock[] blocks = {
@ -1809,8 +2234,9 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
HEBREW,
ARABIC,
SYRIAC,
null,
ARABIC_SUPPLEMENT,
THAANA,
NKO,
null,
DEVANAGARI,
BENGALI,
@ -1829,7 +2255,7 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
GEORGIAN,
HANGUL_JAMO,
ETHIOPIC,
null,
ETHIOPIC_SUPPLEMENT,
CHEROKEE,
UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS,
OGHAM,
@ -1843,11 +2269,19 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
null,
LIMBU,
TAI_LE,
null,
NEW_TAI_LUE,
KHMER_SYMBOLS,
BUGINESE,
null,
BALINESE,
SUNDANESE,
null,
LEPCHA,
OL_CHIKI,
null,
PHONETIC_EXTENSIONS,
null,
PHONETIC_EXTENSIONS_SUPPLEMENT,
COMBINING_DIACRITICAL_MARKS_SUPPLEMENT,
LATIN_EXTENDED_ADDITIONAL,
GREEK_EXTENDED,
GENERAL_PUNCTUATION,
@ -1874,7 +2308,14 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B,
SUPPLEMENTAL_MATHEMATICAL_OPERATORS,
MISCELLANEOUS_SYMBOLS_AND_ARROWS,
null,
GLAGOLITIC,
LATIN_EXTENDED_C,
COPTIC,
GEORGIAN_SUPPLEMENT,
TIFINAGH,
ETHIOPIC_EXTENDED,
CYRILLIC_EXTENDED_A,
SUPPLEMENTAL_PUNCTUATION,
CJK_RADICALS_SUPPLEMENT,
KANGXI_RADICALS,
null,
@ -1886,7 +2327,7 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
HANGUL_COMPATIBILITY_JAMO,
KANBUN,
BOPOMOFO_EXTENDED,
null,
CJK_STROKES,
KATAKANA_PHONETIC_EXTENSIONS,
ENCLOSED_CJK_LETTERS_AND_MONTHS,
CJK_COMPATIBILITY,
@ -1896,6 +2337,21 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
YI_SYLLABLES,
YI_RADICALS,
null,
VAI,
CYRILLIC_EXTENDED_B,
null,
MODIFIER_TONE_LETTERS,
LATIN_EXTENDED_D,
SYLOTI_NAGRI,
null,
PHAGS_PA,
SAURASHTRA,
null,
KAYAH_LI,
REJANG,
null,
CHAM,
null,
HANGUL_SYLLABLES,
null,
HIGH_SURROGATES,
@ -1906,7 +2362,7 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
ALPHABETIC_PRESENTATION_FORMS,
ARABIC_PRESENTATION_FORMS_A,
VARIATION_SELECTORS,
null,
VERTICAL_FORMS,
COMBINING_HALF_MARKS,
CJK_COMPATIBILITY_FORMS,
SMALL_FORM_VARIANTS,
@ -1916,11 +2372,18 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
LINEAR_B_SYLLABARY,
LINEAR_B_IDEOGRAMS,
AEGEAN_NUMBERS,
ANCIENT_GREEK_NUMBERS,
ANCIENT_SYMBOLS,
PHAISTOS_DISC,
null,
LYCIAN,
CARIAN,
null,
OLD_ITALIC,
GOTHIC,
null,
UGARITIC,
OLD_PERSIAN,
null,
DESERET,
SHAVIAN,
@ -1928,13 +2391,26 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
null,
CYPRIOT_SYLLABARY,
null,
PHOENICIAN,
LYDIAN,
null,
KHAROSHTHI,
null,
CUNEIFORM,
CUNEIFORM_NUMBERS_AND_PUNCTUATION,
null,
BYZANTINE_MUSICAL_SYMBOLS,
MUSICAL_SYMBOLS,
ANCIENT_GREEK_MUSICAL_NOTATION,
null,
TAI_XUAN_JING_SYMBOLS,
COUNTING_ROD_NUMERALS,
null,
MATHEMATICAL_ALPHANUMERIC_SYMBOLS,
null,
MAHJONG_TILES,
DOMINO_TILES,
null,
CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B,
null,
CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT,

View File

@ -1,5 +1,5 @@
/*
* Copyright 1994-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1994-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -2846,14 +2846,14 @@ public final
if (loader == null)
return desiredAssertionStatus0(this);
synchronized(loader) {
// If the classloader has been initialized with
// the assertion directives, ask it. Otherwise,
// ask the VM.
return (loader.classAssertionStatus == null ?
desiredAssertionStatus0(this) :
loader.desiredAssertionStatus(getName()));
// If the classloader has been initialized with the assertion
// directives, ask it. Otherwise, ask the VM.
synchronized(loader.assertionLock) {
if (loader.classAssertionStatus != null) {
return loader.desiredAssertionStatus(getName());
}
}
return desiredAssertionStatus0(this);
}
// Retrieves the desired assertion status of this class from the VM

View File

@ -1,5 +1,5 @@
/*
* Copyright 1994-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1994-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -40,14 +40,17 @@ import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Stack;
import java.util.Map;
import java.util.Vector;
import java.util.Hashtable;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import sun.misc.ClassFileTransformer;
import sun.misc.CompoundEnumeration;
import sun.misc.Resource;
@ -91,6 +94,17 @@ import sun.security.util.SecurityConstants;
* called the "bootstrap class loader", does not itself have a parent but may
* serve as the parent of a <tt>ClassLoader</tt> instance.
*
* <p> Class loaders that support concurrent loading of classes are known as
* <em>parallel capable</em> class loaders and are required to register
* themselves at their class initialization time by invoking the
* {@link
* #registerAsParallelCapable <tt>ClassLoader.registerAsParallelCapable</tt>}
* method. In environments in which the delegation model is not strictly
* hierarchical, class loaders need to be parallel capable, otherise class
* loading can lead to deadlocks because the loader lock is held for the
* duration of the class loading process (see {@link #loadClass
* <tt>loadClass</tt>} methods).
*
* <p> Normally, the Java virtual machine loads classes from the local file
* system in a platform-dependent manner. For example, on UNIX systems, the
* virtual machine loads classes from the directory defined by the
@ -160,31 +174,51 @@ import sun.security.util.SecurityConstants;
public abstract class ClassLoader {
private static native void registerNatives();
// Set of classes which are registered as parallel capable class loaders
private static final Set<Class<? extends ClassLoader>> parallelLoaders
= Collections.newSetFromMap(Collections.synchronizedMap
(new WeakHashMap<Class<? extends ClassLoader>, Boolean>()));
static {
registerNatives();
parallelLoaders.add(ClassLoader.class);
}
// If initialization succeed this is set to true and security checks will
// succeed. Otherwise the object is not initialized and the object is
// useless.
private boolean initialized = false;
private final boolean initialized;
// The parent class loader for delegation
private ClassLoader parent;
// Note: VM hardcoded the offset of this field, thus all new fields
// must be added *after* it.
private final ClassLoader parent;
// Maps class name to the corresponding lock object when the current
// class loader is parallel capable.
// Note: VM also uses this field to decide if the current class loader
// is parallel capable and the appropriate lock object for class loading.
private final ConcurrentHashMap<String, Object> parallelLockMap;
// Hashtable that maps packages to certs
private Hashtable<String, Certificate[]> package2certs
= new Hashtable<String, Certificate[]>(11);
private final Map <String, Certificate[]> package2certs;
// Shared among all packages with unsigned classes
Certificate[] nocerts;
private static final Certificate[] nocerts = new Certificate[0];
// The classes loaded by this class loader. The only purpose of this table
// The classes loaded by this class loader. The only purpose of this table
// is to keep the classes from being GC'ed until the loader is GC'ed.
private Vector<Class<?>> classes = new Vector<Class<?>>();
private final Vector<Class<?>> classes = new Vector<Class<?>>();
// The "default" domain. Set as the default ProtectionDomain on newly
// created classes.
private final ProtectionDomain defaultDomain =
new ProtectionDomain(new CodeSource(null, (Certificate[]) null),
null, this, null);
// The initiating protection domains for all classes loaded by this loader
private Set<ProtectionDomain> domains = new HashSet<ProtectionDomain>();
private final Set<ProtectionDomain> domains;
// Invoked by the VM to record every loaded class with this loader.
void addClass(Class c) {
@ -193,7 +227,9 @@ public abstract class ClassLoader {
// The packages defined in this class loader. Each package name is mapped
// to its corresponding Package object.
private HashMap<String, Package> packages = new HashMap<String, Package>();
// @GuardedBy("itself")
private final HashMap<String, Package> packages =
new HashMap<String, Package>();
/**
* Creates a new class loader using the specified parent class loader for
@ -220,6 +256,19 @@ public abstract class ClassLoader {
security.checkCreateClassLoader();
}
this.parent = parent;
if (parallelLoaders.contains(this.getClass())) {
parallelLockMap = new ConcurrentHashMap<String, Object>();
package2certs = new ConcurrentHashMap<String, Certificate[]>();
domains =
Collections.synchronizedSet(new HashSet<ProtectionDomain>());
assertionLock = new Object();
} else {
// no finer-grained lock; lock on the classloader instance
parallelLockMap = null;
package2certs = new Hashtable<String, Certificate[]>();
domains = new HashSet<ProtectionDomain>();
assertionLock = this;
}
initialized = true;
}
@ -244,10 +293,22 @@ public abstract class ClassLoader {
security.checkCreateClassLoader();
}
this.parent = getSystemClassLoader();
if (parallelLoaders.contains(this.getClass())) {
parallelLockMap = new ConcurrentHashMap<String, Object>();
package2certs = new ConcurrentHashMap<String, Certificate[]>();
domains =
Collections.synchronizedSet(new HashSet<ProtectionDomain>());
assertionLock = new Object();
} else {
// no finer-grained lock; lock on the classloader instance
parallelLockMap = null;
package2certs = new Hashtable<String, Certificate[]>();
domains = new HashSet<ProtectionDomain>();
assertionLock = this;
}
initialized = true;
}
// -- Class --
/**
@ -296,6 +357,10 @@ public abstract class ClassLoader {
* <p> Subclasses of <tt>ClassLoader</tt> are encouraged to override {@link
* #findClass(String)}, rather than this method. </p>
*
* <p> Unless overridden, this method synchronizes on the result of
* {@link #getClassLoadingLock <tt>getClassLoadingLock</tt>} method
* during the entire class loading process.
*
* @param name
* The <a href="#name">binary name</a> of the class
*
@ -307,37 +372,80 @@ public abstract class ClassLoader {
* @throws ClassNotFoundException
* If the class could not be found
*/
protected synchronized Class<?> loadClass(String name, boolean resolve)
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
/**
* Returns the lock object for class loading operations.
* For backward compatibility, the default implementation of this method
* behaves as follows. If this ClassLoader object is registered as
* parallel capable, the method returns a dedicated object associated
* with the specified class name. Otherwise, the method returns this
* ClassLoader object. </p>
*
* @param className
* The name of the to-be-loaded class
*
* @return the lock for class loading operations
*
* @throws NullPointerException
* If registered as parallel capable and <tt>className</tt> is null
*
* @see #loadClass(String, boolean)
*
* @since 1.7
*/
protected Object getClassLoadingLock(String className) {
Object lock = this;
if (parallelLockMap != null) {
Object newLock = new Object();
lock = parallelLockMap.putIfAbsent(className, newLock);
if (lock == null) {
lock = newLock;
}
}
if (resolve) {
resolveClass(c);
}
return c;
return lock;
}
// This method is invoked by the virtual machine to load a class.
private synchronized Class loadClassInternal(String name)
private Class loadClassInternal(String name)
throws ClassNotFoundException
{
return loadClass(name);
// For backward compatibility, explicitly lock on 'this' when
// the current class loader is not parallel capable.
if (parallelLockMap == null) {
synchronized (this) {
return loadClass(name);
}
} else {
return loadClass(name);
}
}
// Invoked by the VM after loading class with this loader.
private void checkPackageAccess(Class cls, ProtectionDomain pd) {
final SecurityManager sm = System.getSecurityManager();
if (sm != null) {
@ -486,31 +594,32 @@ public abstract class ClassLoader {
/* Determine protection domain, and check that:
- not define java.* class,
- signer of this class matches signers for the rest of the classes in package.
- signer of this class matches signers for the rest of the classes in
package.
*/
private ProtectionDomain preDefineClass(String name,
ProtectionDomain protectionDomain)
ProtectionDomain pd)
{
if (!checkName(name))
throw new NoClassDefFoundError("IllegalName: " + name);
if ((name != null) && name.startsWith("java.")) {
throw new SecurityException("Prohibited package name: " +
name.substring(0, name.lastIndexOf('.')));
throw new SecurityException
("Prohibited package name: " +
name.substring(0, name.lastIndexOf('.')));
}
if (protectionDomain == null) {
protectionDomain = getDefaultDomain();
if (pd == null) {
pd = defaultDomain;
}
if (name != null)
checkCerts(name, protectionDomain.getCodeSource());
if (name != null) checkCerts(name, pd.getCodeSource());
return protectionDomain;
return pd;
}
private String defineClassSourceLocation(ProtectionDomain protectionDomain)
private String defineClassSourceLocation(ProtectionDomain pd)
{
CodeSource cs = protectionDomain.getCodeSource();
CodeSource cs = pd.getCodeSource();
String source = null;
if (cs != null && cs.getLocation() != null) {
source = cs.getLocation().toString();
@ -519,14 +628,15 @@ public abstract class ClassLoader {
}
private Class defineTransformedClass(String name, byte[] b, int off, int len,
ProtectionDomain protectionDomain,
ProtectionDomain pd,
ClassFormatError cfe, String source)
throws ClassFormatError
{
// Class format error - try to transform the bytecode and
// define the class again
//
ClassFileTransformer[] transformers = ClassFileTransformer.getTransformers();
ClassFileTransformer[] transformers =
ClassFileTransformer.getTransformers();
Class c = null;
if (transformers != null) {
@ -535,7 +645,7 @@ public abstract class ClassLoader {
// Transform byte code using transformer
byte[] tb = transformer.transform(b, off, len);
c = defineClass1(name, tb, 0, tb.length,
protectionDomain, source);
pd, source);
break;
} catch (ClassFormatError cfe2) {
// If ClassFormatError occurs, try next transformer
@ -552,11 +662,10 @@ public abstract class ClassLoader {
return c;
}
private void postDefineClass(Class c, ProtectionDomain protectionDomain)
private void postDefineClass(Class c, ProtectionDomain pd)
{
if (protectionDomain.getCodeSource() != null) {
Certificate certs[] =
protectionDomain.getCodeSource().getCertificates();
if (pd.getCodeSource() != null) {
Certificate certs[] = pd.getCodeSource().getCertificates();
if (certs != null)
setSigners(c, certs);
}
@ -641,7 +750,8 @@ public abstract class ClassLoader {
try {
c = defineClass1(name, b, off, len, protectionDomain, source);
} catch (ClassFormatError cfe) {
c = defineTransformedClass(name, b, off, len, protectionDomain, cfe, source);
c = defineTransformedClass(name, b, off, len, protectionDomain, cfe,
source);
}
postDefineClass(c, protectionDomain);
@ -656,10 +766,10 @@ public abstract class ClassLoader {
* specified in the documentation for {@link #defineClass(String, byte[],
* int, int)}. Before the class can be used it must be resolved.
*
* <p>The rules about the first class defined in a package determining the set of
* certificates for the package, and the restrictions on class names are identical
* to those specified in the documentation for {@link #defineClass(String, byte[],
* int, int, ProtectionDomain)}.
* <p>The rules about the first class defined in a package determining the
* set of certificates for the package, and the restrictions on class names
* are identical to those specified in the documentation for {@link
* #defineClass(String, byte[], int, int, ProtectionDomain)}.
*
* <p> An invocation of this method of the form
* <i>cl</i><tt>.defineClass(</tt><i>name</i><tt>,</tt>
@ -668,12 +778,13 @@ public abstract class ClassLoader {
*
* <blockquote><tt>
* ...<br>
* byte[] temp = new byte[</tt><i>bBuffer</i><tt>.{@link java.nio.ByteBuffer#remaining
* remaining}()];<br>
* byte[] temp = new byte[</tt><i>bBuffer</i><tt>.{@link
* java.nio.ByteBuffer#remaining remaining}()];<br>
* </tt><i>bBuffer</i><tt>.{@link java.nio.ByteBuffer#get(byte[])
* get}(temp);<br>
* return {@link #defineClass(String, byte[], int, int, ProtectionDomain)
* </tt><i>cl</i><tt>.defineClass}(</tt><i>name</i><tt>, temp, 0, temp.length, </tt><i>pd</i><tt>);<br>
* </tt><i>cl</i><tt>.defineClass}(</tt><i>name</i><tt>, temp, 0,
* temp.length, </tt><i>pd</i><tt>);<br>
* </tt></blockquote>
*
* @param name
@ -682,9 +793,9 @@ public abstract class ClassLoader {
*
* @param b
* The bytes that make up the class data. The bytes from positions
* <tt>b.position()</tt> through <tt>b.position() + b.limit() -1 </tt>
* should have the format of a valid class file as defined by the <a
* href="http://java.sun.com/docs/books/vmspec/">Java Virtual
* <tt>b.position()</tt> through <tt>b.position() + b.limit() -1
* </tt> should have the format of a valid class file as defined by
* the <a href="http://java.sun.com/docs/books/vmspec/">Java Virtual
* Machine Specification</a>.
*
* @param protectionDomain
@ -738,11 +849,13 @@ public abstract class ClassLoader {
String source = defineClassSourceLocation(protectionDomain);
try {
c = defineClass2(name, b, b.position(), len, protectionDomain, source);
c = defineClass2(name, b, b.position(), len, protectionDomain,
source);
} catch (ClassFormatError cfe) {
byte[] tb = new byte[len];
b.get(tb); // get bytes out of byte buffer.
c = defineTransformedClass(name, tb, 0, len, protectionDomain, cfe, source);
c = defineTransformedClass(name, tb, 0, len, protectionDomain, cfe,
source);
}
postDefineClass(c, protectionDomain);
@ -769,33 +882,29 @@ public abstract class ClassLoader {
return true;
}
private synchronized void checkCerts(String name, CodeSource cs) {
private void checkCerts(String name, CodeSource cs) {
int i = name.lastIndexOf('.');
String pname = (i == -1) ? "" : name.substring(0, i);
Certificate[] pcerts = package2certs.get(pname);
if (pcerts == null) {
// first class in this package gets to define which
// certificates must be the same for all other classes
// in this package
if (cs != null) {
pcerts = cs.getCertificates();
}
if (pcerts == null) {
if (nocerts == null)
nocerts = new Certificate[0];
pcerts = nocerts;
}
package2certs.put(pname, pcerts);
} else {
Certificate[] certs = null;
if (cs != null) {
certs = cs.getCertificates();
}
if (!compareCerts(pcerts, certs)) {
throw new SecurityException("class \""+ name +
"\"'s signer information does not match signer information of other classes in the same package");
Certificate[] certs = null;
if (cs != null) {
certs = cs.getCertificates();
}
Certificate[] pcerts = null;
if (parallelLockMap == null) {
synchronized (this) {
pcerts = package2certs.get(pname);
if (pcerts == null) {
package2certs.put(pname, (certs == null? nocerts:certs));
}
}
} else {
pcerts = ((ConcurrentHashMap<String, Certificate[]>)package2certs).
putIfAbsent(pname, (certs == null? nocerts:certs));
}
if (pcerts != null && !compareCerts(pcerts, certs)) {
throw new SecurityException("class \""+ name +
"\"'s signer information does not match signer information of other classes in the same package");
}
}
@ -1075,6 +1184,47 @@ public abstract class ClassLoader {
return java.util.Collections.emptyEnumeration();
}
// index 0: java.lang.ClassLoader.class
// index 1: the immediate caller of index 0.
// index 2: the immediate caller of index 1.
private static native Class<? extends ClassLoader> getCaller(int index);
/**
* Registers the caller class loader as parallel capable.
* In order for the registration to succeed, all super classes
* of the caller class loader must also be registered as
* parallel capable when this method is called. </p>
* Note that once a class loader is registered as
* parallel capable, there is no way to change it back.
* In addition, registration should be done statically before
* any instance of the caller classloader being constructed. </p>
*
* @return true if the caller is successfully registered as
* parallel capable and false if otherwise.
*
* @since 1.7
*/
protected static boolean registerAsParallelCapable() {
Class<? extends ClassLoader> caller = getCaller(1);
Class superCls = caller.getSuperclass();
boolean result = false;
// Explicit synchronization needed for composite action
synchronized (parallelLoaders) {
if (!parallelLoaders.contains(caller)) {
if (parallelLoaders.contains(superCls)) {
// register the immediate caller as parallel capable
// if and only if all of its super classes are.
// Note: given current classloading sequence, if
// the immediate super class is parallel capable,
// all the super classes higher up must be too.
result = true;
parallelLoaders.add(caller);
}
} else result = true;
}
return result;
}
/**
* Find a resource of the specified name from the search path used to load
* classes. This method locates the resource through the system class
@ -1141,7 +1291,8 @@ public abstract class ClassLoader {
private static Enumeration<URL> getBootstrapResources(String name)
throws IOException
{
final Enumeration<Resource> e = getBootstrapClassPath().getResources(name);
final Enumeration<Resource> e =
getBootstrapClassPath().getResources(name);
return new Enumeration<URL> () {
public URL nextElement() {
return e.nextElement().getURL();
@ -1377,9 +1528,11 @@ public abstract class ClassLoader {
}
// The class loader for the system
// @GuardedBy("ClassLoader.class")
private static ClassLoader scl;
// Set to true once the system class loader has been set
// @GuardedBy("ClassLoader.class")
private static boolean sclSet;
@ -1592,19 +1745,6 @@ public abstract class ClassLoader {
}
}
// The "default" domain. Set as the default ProtectionDomain on newly
// created classes.
private ProtectionDomain defaultDomain = null;
// Returns (and initializes) the default domain.
private synchronized ProtectionDomain getDefaultDomain() {
if (defaultDomain == null) {
CodeSource cs = new CodeSource(null, (Certificate[]) null);
defaultDomain = new ProtectionDomain(cs, null, this, null);
}
return defaultDomain;
}
// All native library names we've loaded.
private static Vector<String> loadedLibraryNames
= new Vector<String>();
@ -1622,8 +1762,8 @@ public abstract class ClassLoader {
= new Stack<NativeLibrary>();
// The paths searched for libraries
static private String usr_paths[];
static private String sys_paths[];
private static String usr_paths[];
private static String sys_paths[];
private static String[] initializePath(String propname) {
String ldpath = System.getProperty(propname, "");
@ -1803,7 +1943,10 @@ public abstract class ClassLoader {
// -- Assertion management --
final Object assertionLock;
// The default toggle for assertion checking.
// @GuardedBy("assertionLock")
private boolean defaultAssertionStatus = false;
// Maps String packageName to Boolean package default assertion status Note
@ -1811,12 +1954,14 @@ public abstract class ClassLoader {
// is null then we are delegating assertion status queries to the VM, i.e.,
// none of this ClassLoader's assertion status modification methods have
// been invoked.
// @GuardedBy("assertionLock")
private Map<String, Boolean> packageAssertionStatus = null;
// Maps String fullyQualifiedClassName to Boolean assertionStatus If this
// field is null then we are delegating assertion status queries to the VM,
// i.e., none of this ClassLoader's assertion status modification methods
// have been invoked.
// @GuardedBy("assertionLock")
Map<String, Boolean> classAssertionStatus = null;
/**
@ -1834,11 +1979,13 @@ public abstract class ClassLoader {
*
* @since 1.4
*/
public synchronized void setDefaultAssertionStatus(boolean enabled) {
if (classAssertionStatus == null)
initializeJavaAssertionMaps();
public void setDefaultAssertionStatus(boolean enabled) {
synchronized (assertionLock) {
if (classAssertionStatus == null)
initializeJavaAssertionMaps();
defaultAssertionStatus = enabled;
defaultAssertionStatus = enabled;
}
}
/**
@ -1878,13 +2025,14 @@ public abstract class ClassLoader {
*
* @since 1.4
*/
public synchronized void setPackageAssertionStatus(String packageName,
boolean enabled)
{
if (packageAssertionStatus == null)
initializeJavaAssertionMaps();
public void setPackageAssertionStatus(String packageName,
boolean enabled) {
synchronized (assertionLock) {
if (packageAssertionStatus == null)
initializeJavaAssertionMaps();
packageAssertionStatus.put(packageName, enabled);
packageAssertionStatus.put(packageName, enabled);
}
}
/**
@ -1909,13 +2057,13 @@ public abstract class ClassLoader {
*
* @since 1.4
*/
public synchronized void setClassAssertionStatus(String className,
boolean enabled)
{
if (classAssertionStatus == null)
initializeJavaAssertionMaps();
public void setClassAssertionStatus(String className, boolean enabled) {
synchronized (assertionLock) {
if (classAssertionStatus == null)
initializeJavaAssertionMaps();
classAssertionStatus.put(className, enabled);
classAssertionStatus.put(className, enabled);
}
}
/**
@ -1928,15 +2076,16 @@ public abstract class ClassLoader {
*
* @since 1.4
*/
public synchronized void clearAssertionStatus() {
public void clearAssertionStatus() {
/*
* Whether or not "Java assertion maps" are initialized, set
* them to empty maps, effectively ignoring any present settings.
*/
classAssertionStatus = new HashMap<String, Boolean>();
packageAssertionStatus = new HashMap<String, Boolean>();
defaultAssertionStatus = false;
synchronized (assertionLock) {
classAssertionStatus = new HashMap<String, Boolean>();
packageAssertionStatus = new HashMap<String, Boolean>();
defaultAssertionStatus = false;
}
}
/**
@ -1961,39 +2110,40 @@ public abstract class ClassLoader {
*
* @since 1.4
*/
synchronized boolean desiredAssertionStatus(String className) {
Boolean result;
boolean desiredAssertionStatus(String className) {
synchronized (assertionLock) {
// assert classAssertionStatus != null;
// assert packageAssertionStatus != null;
// assert classAssertionStatus != null;
// assert packageAssertionStatus != null;
// Check for a class entry
result = classAssertionStatus.get(className);
if (result != null)
return result.booleanValue();
// Check for most specific package entry
int dotIndex = className.lastIndexOf(".");
if (dotIndex < 0) { // default package
result = packageAssertionStatus.get(null);
// Check for a class entry
Boolean result = classAssertionStatus.get(className);
if (result != null)
return result.booleanValue();
}
while(dotIndex > 0) {
className = className.substring(0, dotIndex);
result = packageAssertionStatus.get(className);
if (result != null)
return result.booleanValue();
dotIndex = className.lastIndexOf(".", dotIndex-1);
}
// Return the classloader default
return defaultAssertionStatus;
// Check for most specific package entry
int dotIndex = className.lastIndexOf(".");
if (dotIndex < 0) { // default package
result = packageAssertionStatus.get(null);
if (result != null)
return result.booleanValue();
}
while(dotIndex > 0) {
className = className.substring(0, dotIndex);
result = packageAssertionStatus.get(className);
if (result != null)
return result.booleanValue();
dotIndex = className.lastIndexOf(".", dotIndex-1);
}
// Return the classloader default
return defaultAssertionStatus;
}
}
// Set up the assertions with information provided by the VM.
// Note: Should only be called inside a synchronized block
private void initializeJavaAssertionMaps() {
// assert Thread.holdsLock(this);
// assert Thread.holdsLock(assertionLock);
classAssertionStatus = new HashMap<String, Boolean>();
packageAssertionStatus = new HashMap<String, Boolean>();

View File

@ -74,6 +74,7 @@ final class ConditionalSpecialCasing {
new Entry(0x00CC, new char[]{0x0069, 0x0307, 0x0300}, new char[]{0x00CC}, "lt", 0), // # LATIN CAPITAL LETTER I WITH GRAVE
new Entry(0x00CD, new char[]{0x0069, 0x0307, 0x0301}, new char[]{0x00CD}, "lt", 0), // # LATIN CAPITAL LETTER I WITH ACUTE
new Entry(0x0128, new char[]{0x0069, 0x0307, 0x0303}, new char[]{0x0128}, "lt", 0), // # LATIN CAPITAL LETTER I WITH TILDE
new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, "lt", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE
//# ================================================================================
//# Turkish and Azeri
@ -84,7 +85,10 @@ final class ConditionalSpecialCasing {
new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "tr", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I
new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "az", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I
new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN SMALL LETTER I
new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "az", 0) // # LATIN SMALL LETTER I
new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN SMALL LETTER I
//# ================================================================================
//# Other
new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, "en", 0), // # LATIN CAPITALLETTER I WITH DOT ABOVE
};
// A hash table that contains the above entries

View File

@ -25,6 +25,8 @@
package java.lang;
import java.util.Properties;
/**
* The {@code Integer} class wraps a value of the primitive type
* {@code int} in an object. An object of type {@code Integer}
@ -442,6 +444,12 @@ public final class Integer extends Number implements Comparable<Integer> {
public static int parseInt(String s, int radix)
throws NumberFormatException
{
/*
* WARNING: This method may be invoked early during VM initialization
* before IntegerCache is initialized. Care must be taken to not use
* the valueOf method.
*/
if (s == null) {
throw new NumberFormatException("null");
}
@ -545,7 +553,7 @@ public final class Integer extends Number implements Comparable<Integer> {
* does not contain a parsable {@code int}.
*/
public static Integer valueOf(String s, int radix) throws NumberFormatException {
return new Integer(parseInt(s,radix));
return Integer.valueOf(parseInt(s,radix));
}
/**
@ -570,20 +578,56 @@ public final class Integer extends Number implements Comparable<Integer> {
* @exception NumberFormatException if the string cannot be parsed
* as an integer.
*/
public static Integer valueOf(String s) throws NumberFormatException
{
return new Integer(parseInt(s, 10));
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. During VM initialization the
* getAndRemoveCacheProperties method may be used to get and remove any system
* properites that configure the cache size. At this time, the size of the
* cache may be controlled by the -XX:AutoBoxCacheMax=<size> option.
*/
// value of java.lang.Integer.IntegerCache.high property (obtained during VM init)
private static String integerCacheHighPropValue;
static void getAndRemoveCacheProperties() {
if (!sun.misc.VM.isBooted()) {
Properties props = System.getProperties();
integerCacheHighPropValue =
(String)props.remove("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null)
System.setProperties(props); // remove from system props
}
}
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static final int low = -128;
static final int high;
static final Integer cache[];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
// high value may be configured by property
int h = 127;
if (integerCacheHighPropValue != null) {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low));
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}
private IntegerCache() {}
}
/**
@ -599,10 +643,9 @@ public final class Integer extends Number implements Comparable<Integer> {
* @since 1.5
*/
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
@ -806,7 +849,7 @@ public final class Integer extends Number implements Comparable<Integer> {
*/
public static Integer getInteger(String nm, int val) {
Integer result = getInteger(nm, null);
return (result == null) ? new Integer(val) : result;
return (result == null) ? Integer.valueOf(val) : result;
}
/**
@ -938,7 +981,7 @@ public final class Integer extends Number implements Comparable<Integer> {
try {
result = Integer.valueOf(nm.substring(index), radix);
result = negative ? new Integer(-result.intValue()) : result;
result = negative ? Integer.valueOf(-result.intValue()) : result;
} catch (NumberFormatException e) {
// If number is Integer.MIN_VALUE, we'll end up here. The next line
// handles this case, and causes any genuine format error to be

View File

@ -510,7 +510,7 @@ public final class Long extends Number implements Comparable<Long> {
* contain a parsable {@code long}.
*/
public static Long valueOf(String s, int radix) throws NumberFormatException {
return new Long(parseLong(s, radix));
return Long.valueOf(parseLong(s, radix));
}
/**
@ -537,7 +537,7 @@ public final class Long extends Number implements Comparable<Long> {
*/
public static Long valueOf(String s) throws NumberFormatException
{
return new Long(parseLong(s, 10));
return Long.valueOf(parseLong(s, 10));
}
private static class LongCache {
@ -650,7 +650,7 @@ public final class Long extends Number implements Comparable<Long> {
try {
result = Long.valueOf(nm.substring(index), radix);
result = negative ? new Long(-result.longValue()) : result;
result = negative ? Long.valueOf(-result.longValue()) : result;
} catch (NumberFormatException e) {
// If number is Long.MIN_VALUE, we'll end up here. The next line
// handles this case, and causes any genuine format error to be
@ -869,7 +869,7 @@ public final class Long extends Number implements Comparable<Long> {
*/
public static Long getLong(String nm, long val) {
Long result = Long.getLong(nm, null);
return (result == null) ? new Long(val) : result;
return (result == null) ? Long.valueOf(val) : result;
}
/**

View File

@ -2451,14 +2451,21 @@ public final class String
}
if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA
lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale);
} else if (srcChar == '\u0130') { // LATIN CAPITAL LETTER I DOT
lowerChar = Character.ERROR;
} else {
lowerChar = Character.toLowerCase(srcChar);
}
if ((lowerChar == Character.ERROR) ||
(lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
if (lowerChar == Character.ERROR) {
lowerCharArray =
ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale);
if (!localeDependent && srcChar == '\u0130') {
lowerCharArray =
ConditionalSpecialCasing.toLowerCaseCharArray(this, i, Locale.ENGLISH);
} else {
lowerCharArray =
ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale);
}
} else if (srcCount == 2) {
resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount;
continue;

View File

@ -1105,6 +1105,13 @@ public final class System {
props = new Properties();
initProperties(props);
sun.misc.Version.init();
// Gets and removes system properties that configure the Integer
// cache used to support the object identity semantics of autoboxing.
// At this time, the size of the cache may be controlled by the
// -XX:AutoBoxCacheMax=<size> option.
Integer.getAndRemoveCacheProperties();
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);

Some files were not shown because too many files have changed in this diff Show More