Merge
diff --git a/.hgtags b/.hgtags
index 8bfbeae..9e95b92 100644
--- a/.hgtags
+++ b/.hgtags
@@ -439,3 +439,4 @@
a006fa0a9e8f18dee6daf8984bd11625c4c4860c jdk8u60-b15
6ed3821c212a93ffc6bfcc292ef7aca3b7165139 jdk8u60-b16
c30db4c968f63dce1bf2f9df240fb75a8f27f922 jdk8u60-b17
+57336c319de8a141d0bcd04265ce36734fb51380 jdk8u60-b18
diff --git a/make/CompileJavaClasses.gmk b/make/CompileJavaClasses.gmk
index 9fc1198..0bc3d63 100644
--- a/make/CompileJavaClasses.gmk
+++ b/make/CompileJavaClasses.gmk
@@ -70,10 +70,7 @@
ifeq ($(OPENJDK_TARGET_OS), windows)
# AccessBridge is compiled separately below.
EXFILES += AccessBridge.java \
- AccessBridgeLoader.java \
- com/sun/java/accessibility/util/java/awt/ChoiceTranslator.java
- # This seems to never be built
- EXCLUDES += com/sun/java/accessibility/extensions
+ AccessBridgeLoader.java
endif
ifneq ($(OPENJDK_TARGET_OS), solaris)
diff --git a/make/CreateJars.gmk b/make/CreateJars.gmk
index bfbb10e..9df8fd1 100644
--- a/make/CreateJars.gmk
+++ b/make/CreateJars.gmk
@@ -650,17 +650,8 @@
##########################################################################################
- ifeq ($(OPENJDK_TARGET_OS), windows)
-
- $(eval $(call SetupArchive,BUILD_JACCESS_JAR, , \
- SRCS := $(JDK_OUTPUTDIR)/classes, \
- INCLUDES := com/sun/java/accessibility/util, \
- JAR := $(IMAGES_OUTPUTDIR)/lib/ext/jaccess.jar, \
- SKIP_METAINF := true))
-
- JARS += $(IMAGES_OUTPUTDIR)/lib/ext/jaccess.jar
-
- ifeq ($(OPENJDK_TARGET_CPU_BITS), 32)
+ifeq ($(OPENJDK_TARGET_OS), windows)
+ ifeq ($(OPENJDK_TARGET_CPU_BITS), 32)
$(eval $(call SetupArchive,BUILD_ACCESSBRIDGE_32_JAR, , \
SRCS := $(JDK_OUTPUTDIR)/classes_ab/32bit, \
INCLUDES := com/sun/java/accessibility, \
@@ -675,7 +666,7 @@
JARS += $(IMAGES_OUTPUTDIR)/lib/ext/access-bridge-32.jar \
$(IMAGES_OUTPUTDIR)/lib/ext/access-bridge.jar
- else
+ else
$(eval $(call SetupArchive,BUILD_ACCESSBRIDGE_64_JAR, , \
SRCS := $(JDK_OUTPUTDIR)/classes_ab/64bit, \
INCLUDES := com/sun/java/accessibility, \
@@ -683,8 +674,16 @@
SKIP_METAINF := true))
JARS += $(IMAGES_OUTPUTDIR)/lib/ext/access-bridge-64.jar
- endif
endif
+endif
+
+$(eval $(call SetupArchive,BUILD_JACCESS_JAR, , \
+ SRCS := $(JDK_OUTPUTDIR)/classes, \
+ INCLUDES := com/sun/java/accessibility/util, \
+ JAR := $(IMAGES_OUTPUTDIR)/lib/ext/jaccess.jar, \
+ SKIP_METAINF := true))
+
+JARS += $(IMAGES_OUTPUTDIR)/lib/ext/jaccess.jar
##########################################################################################
diff --git a/src/macosx/classes/sun/lwawt/macosx/CAccessibility.java b/src/macosx/classes/sun/lwawt/macosx/CAccessibility.java
index 736a1ff..d3ab6a6 100644
--- a/src/macosx/classes/sun/lwawt/macosx/CAccessibility.java
+++ b/src/macosx/classes/sun/lwawt/macosx/CAccessibility.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -630,7 +630,7 @@
if (!allowIgnored) {
final AccessibleRole role = context.getAccessibleRole();
- if (role != null && ignoredRoles.contains(roleKey(role))) {
+ if (role != null && ignoredRoles != null && ignoredRoles.contains(roleKey(role))) {
// Get the child's unignored children.
_addChildren(child, whichChildren, false, childrenAndRoles);
} else {
diff --git a/src/macosx/javavm/export/jawt_md.h b/src/macosx/javavm/export/jawt_md.h
index 1d66461..c6859fd 100644
--- a/src/macosx/javavm/export/jawt_md.h
+++ b/src/macosx/javavm/export/jawt_md.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
diff --git a/src/share/classes/com/sun/beans/decoder/ArrayElementHandler.java b/src/share/classes/com/sun/beans/decoder/ArrayElementHandler.java
index 9a6d228..ce0aeb3 100644
--- a/src/share/classes/com/sun/beans/decoder/ArrayElementHandler.java
+++ b/src/share/classes/com/sun/beans/decoder/ArrayElementHandler.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
diff --git a/src/windows/classes/com/sun/java/accessibility/util/AWTEventMonitor.java b/src/share/classes/com/sun/java/accessibility/util/AWTEventMonitor.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/AWTEventMonitor.java
rename to src/share/classes/com/sun/java/accessibility/util/AWTEventMonitor.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/AccessibilityEventMonitor.java b/src/share/classes/com/sun/java/accessibility/util/AccessibilityEventMonitor.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/AccessibilityEventMonitor.java
rename to src/share/classes/com/sun/java/accessibility/util/AccessibilityEventMonitor.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/AccessibilityListenerList.java b/src/share/classes/com/sun/java/accessibility/util/AccessibilityListenerList.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/AccessibilityListenerList.java
rename to src/share/classes/com/sun/java/accessibility/util/AccessibilityListenerList.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/EventID.java b/src/share/classes/com/sun/java/accessibility/util/EventID.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/EventID.java
rename to src/share/classes/com/sun/java/accessibility/util/EventID.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/EventQueueMonitor.java b/src/share/classes/com/sun/java/accessibility/util/EventQueueMonitor.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/EventQueueMonitor.java
rename to src/share/classes/com/sun/java/accessibility/util/EventQueueMonitor.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/GUIInitializedListener.java b/src/share/classes/com/sun/java/accessibility/util/GUIInitializedListener.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/GUIInitializedListener.java
rename to src/share/classes/com/sun/java/accessibility/util/GUIInitializedListener.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/GUIInitializedMulticaster.java b/src/share/classes/com/sun/java/accessibility/util/GUIInitializedMulticaster.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/GUIInitializedMulticaster.java
rename to src/share/classes/com/sun/java/accessibility/util/GUIInitializedMulticaster.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/SwingEventMonitor.java b/src/share/classes/com/sun/java/accessibility/util/SwingEventMonitor.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/SwingEventMonitor.java
rename to src/share/classes/com/sun/java/accessibility/util/SwingEventMonitor.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/TopLevelWindowListener.java b/src/share/classes/com/sun/java/accessibility/util/TopLevelWindowListener.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/TopLevelWindowListener.java
rename to src/share/classes/com/sun/java/accessibility/util/TopLevelWindowListener.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/TopLevelWindowMulticaster.java b/src/share/classes/com/sun/java/accessibility/util/TopLevelWindowMulticaster.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/TopLevelWindowMulticaster.java
rename to src/share/classes/com/sun/java/accessibility/util/TopLevelWindowMulticaster.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/Translator.java b/src/share/classes/com/sun/java/accessibility/util/Translator.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/Translator.java
rename to src/share/classes/com/sun/java/accessibility/util/Translator.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/java/awt/ButtonTranslator.java b/src/share/classes/com/sun/java/accessibility/util/java/awt/ButtonTranslator.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/java/awt/ButtonTranslator.java
rename to src/share/classes/com/sun/java/accessibility/util/java/awt/ButtonTranslator.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/java/awt/CheckboxTranslator.java b/src/share/classes/com/sun/java/accessibility/util/java/awt/CheckboxTranslator.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/java/awt/CheckboxTranslator.java
rename to src/share/classes/com/sun/java/accessibility/util/java/awt/CheckboxTranslator.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/java/awt/LabelTranslator.java b/src/share/classes/com/sun/java/accessibility/util/java/awt/LabelTranslator.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/java/awt/LabelTranslator.java
rename to src/share/classes/com/sun/java/accessibility/util/java/awt/LabelTranslator.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/java/awt/ListTranslator.java b/src/share/classes/com/sun/java/accessibility/util/java/awt/ListTranslator.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/java/awt/ListTranslator.java
rename to src/share/classes/com/sun/java/accessibility/util/java/awt/ListTranslator.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/java/awt/TextComponentTranslator.java b/src/share/classes/com/sun/java/accessibility/util/java/awt/TextComponentTranslator.java
similarity index 100%
rename from src/windows/classes/com/sun/java/accessibility/util/java/awt/TextComponentTranslator.java
rename to src/share/classes/com/sun/java/accessibility/util/java/awt/TextComponentTranslator.java
diff --git a/src/windows/classes/com/sun/java/accessibility/util/package-info.java b/src/share/classes/com/sun/java/accessibility/util/package-info.java
similarity index 99%
rename from src/windows/classes/com/sun/java/accessibility/util/package-info.java
rename to src/share/classes/com/sun/java/accessibility/util/package-info.java
index f3b0a62..2ae79d1 100644
--- a/src/windows/classes/com/sun/java/accessibility/util/package-info.java
+++ b/src/share/classes/com/sun/java/accessibility/util/package-info.java
@@ -64,4 +64,6 @@
*
* @since JDK1.7
*/
+
+@jdk.Exported
package com.sun.java.accessibility.util;
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk.properties
index dc84d13..ab5a2e4 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=Error creating directory "{0}": No such file or directory
FileChooser.deleteFileButton.textAndMnemonic=De&lete File
FileChooser.renameFileButton.textAndMnemonic=&Rename File
-FileChooser.cancelButton.textAndMnemonic=&Cancel
-FileChooser.saveButton.textAndMnemonic=&OK
-FileChooser.openButton.textAndMnemonic=&OK
+FileChooser.cancelButton.textAndMnemonic=Cancel
+FileChooser.saveButton.textAndMnemonic=OK
+FileChooser.openButton.textAndMnemonic=OK
FileChooser.saveDialogTitle.textAndMnemonic=Save
FileChooser.openDialogTitle.textAndMnemonic=Open
FileChooser.pathLabel.textAndMnemonic=&Selection:
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_de.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_de.properties
index a8985ce..1720c8e 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_de.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_de.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=Fehler beim Erstellen von Verzeichnis "{0}": Datei oder Verzeichnis nicht vorhanden
FileChooser.deleteFileButton.textAndMnemonic=Datei &l\u00F6schen
FileChooser.renameFileButton.textAndMnemonic=Datei &umbenennen
-FileChooser.cancelButton.textAndMnemonic=&Abbrechen
-FileChooser.saveButton.textAndMnemonic=&OK
-FileChooser.openButton.textAndMnemonic=&OK
+FileChooser.cancelButton.textAndMnemonic=Abbrechen
+FileChooser.saveButton.textAndMnemonic=OK
+FileChooser.openButton.textAndMnemonic=OK
FileChooser.saveDialogTitle.textAndMnemonic=Speichern
FileChooser.openDialogTitle.textAndMnemonic=\u00D6ffnen
FileChooser.pathLabel.textAndMnemonic=Aus&wahl:
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_es.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_es.properties
index 412938e..f5e90e1 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_es.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_es.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=Error al crear el directorio "{0}": no existe dicho archivo o directorio
FileChooser.deleteFileButton.textAndMnemonic=Su&primir Archivo
FileChooser.renameFileButton.textAndMnemonic=Cambiar Nomb&re de Archivo
-FileChooser.cancelButton.textAndMnemonic=&Cancelar
-FileChooser.saveButton.textAndMnemonic=&Aceptar
-FileChooser.openButton.textAndMnemonic=&Aceptar
+FileChooser.cancelButton.textAndMnemonic=Cancelar
+FileChooser.saveButton.textAndMnemonic=Aceptar
+FileChooser.openButton.textAndMnemonic=Aceptar
FileChooser.saveDialogTitle.textAndMnemonic=Guardar
FileChooser.openDialogTitle.textAndMnemonic=Abrir
FileChooser.pathLabel.textAndMnemonic=&Selecci\u00F3n:
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_fr.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_fr.properties
index 380f3d4..b436568 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_fr.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_fr.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=Erreur lors de la cr\u00E9ation du r\u00E9pertoire "{0}" : ce fichier ou r\u00E9pertoire n''existe pas
FileChooser.deleteFileButton.textAndMnemonic=Supprimer &le fichier
FileChooser.renameFileButton.textAndMnemonic=&Renommer le fichier
-FileChooser.cancelButton.textAndMnemonic=&Annuler
-FileChooser.saveButton.textAndMnemonic=&OK
-FileChooser.openButton.textAndMnemonic=&OK
+FileChooser.cancelButton.textAndMnemonic=Annuler
+FileChooser.saveButton.textAndMnemonic=OK
+FileChooser.openButton.textAndMnemonic=OK
FileChooser.saveDialogTitle.textAndMnemonic=Enregistrer
FileChooser.openDialogTitle.textAndMnemonic=Ouvrir
FileChooser.pathLabel.textAndMnemonic=&S\u00E9lection :
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_it.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_it.properties
index c629de5..7e955bf 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_it.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_it.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=Errore durante la creazione della directory "{0}": file o directory inesistente
FileChooser.deleteFileButton.textAndMnemonic=E&limina file
FileChooser.renameFileButton.textAndMnemonic=&Rinomina file
-FileChooser.cancelButton.textAndMnemonic=&Annulla
-FileChooser.saveButton.textAndMnemonic=&OK
-FileChooser.openButton.textAndMnemonic=&OK
+FileChooser.cancelButton.textAndMnemonic=Annulla
+FileChooser.saveButton.textAndMnemonic=OK
+FileChooser.openButton.textAndMnemonic=OK
FileChooser.saveDialogTitle.textAndMnemonic=Salva
FileChooser.openDialogTitle.textAndMnemonic=Apri
FileChooser.pathLabel.textAndMnemonic=&Selezione:
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_ja.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_ja.properties
index 5f4343e..479abec 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_ja.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_ja.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA"{0}"\u306E\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: \u3053\u306E\u30D5\u30A1\u30A4\u30EB\u307E\u305F\u306F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306F\u5B58\u5728\u3057\u307E\u305B\u3093
FileChooser.deleteFileButton.textAndMnemonic=\u30D5\u30A1\u30A4\u30EB\u306E\u524A\u9664(&L)
FileChooser.renameFileButton.textAndMnemonic=\u30D5\u30A1\u30A4\u30EB\u306E\u540D\u524D\u5909\u66F4(&R)
-FileChooser.cancelButton.textAndMnemonic=\u53D6\u6D88(&C)
-FileChooser.saveButton.textAndMnemonic=OK(&O)
-FileChooser.openButton.textAndMnemonic=OK(&O)
+FileChooser.cancelButton.textAndMnemonic=\u53D6\u6D88
+FileChooser.saveButton.textAndMnemonic=OK
+FileChooser.openButton.textAndMnemonic=OK
FileChooser.saveDialogTitle.textAndMnemonic=\u4FDD\u5B58
FileChooser.openDialogTitle.textAndMnemonic=\u958B\u304F
FileChooser.pathLabel.textAndMnemonic=\u9078\u629E(&S):
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_ko.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_ko.properties
index c3696a9..a43a8be 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_ko.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_ko.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic="{0}" \uB514\uB809\uD1A0\uB9AC\uB97C \uC0DD\uC131\uD558\uB294 \uC911 \uC624\uB958 \uBC1C\uC0DD: \uD574\uB2F9 \uD30C\uC77C \uB610\uB294 \uB514\uB809\uD1A0\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
FileChooser.deleteFileButton.textAndMnemonic=\uD30C\uC77C \uC0AD\uC81C(&L)
FileChooser.renameFileButton.textAndMnemonic=\uD30C\uC77C \uC774\uB984 \uBC14\uAFB8\uAE30(&R)
-FileChooser.cancelButton.textAndMnemonic=\uCDE8\uC18C(&C)
-FileChooser.saveButton.textAndMnemonic=\uD655\uC778(&O)
-FileChooser.openButton.textAndMnemonic=\uD655\uC778(&O)
+FileChooser.cancelButton.textAndMnemonic=\uCDE8\uC18C
+FileChooser.saveButton.textAndMnemonic=\uD655\uC778
+FileChooser.openButton.textAndMnemonic=\uD655\uC778
FileChooser.saveDialogTitle.textAndMnemonic=\uC800\uC7A5
FileChooser.openDialogTitle.textAndMnemonic=\uC5F4\uAE30
FileChooser.pathLabel.textAndMnemonic=\uC120\uD0DD \uC0AC\uD56D(&S):
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_pt_BR.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_pt_BR.properties
index 383fd9f..c6c6649 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_pt_BR.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_pt_BR.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=Erro ao criar o diret\u00F3rio "{0}": N\u00E3o h\u00E1 arquivo ou diret\u00F3rio
FileChooser.deleteFileButton.textAndMnemonic=De&letar Arquivo
FileChooser.renameFileButton.textAndMnemonic=&Renomear Arquivo
-FileChooser.cancelButton.textAndMnemonic=&Cancelar
-FileChooser.saveButton.textAndMnemonic=&OK
-FileChooser.openButton.textAndMnemonic=&OK
+FileChooser.cancelButton.textAndMnemonic=Cancelar
+FileChooser.saveButton.textAndMnemonic=OK
+FileChooser.openButton.textAndMnemonic=OK
FileChooser.saveDialogTitle.textAndMnemonic=Salvar
FileChooser.openDialogTitle.textAndMnemonic=Abrir
FileChooser.pathLabel.textAndMnemonic=&Sele\u00E7\u00E3o:
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_sv.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_sv.properties
index 1737b57..5149f9e 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_sv.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_sv.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=Ett fel intr\u00E4ffade vid f\u00F6rs\u00F6k att skapa katalogen "{0}": Filen eller katalogen finns inte
FileChooser.deleteFileButton.textAndMnemonic=Ta &bort fil
FileChooser.renameFileButton.textAndMnemonic=&\u00C4ndra namn p\u00E5 filen
-FileChooser.cancelButton.textAndMnemonic=&Avbryt
-FileChooser.saveButton.textAndMnemonic=&OK
-FileChooser.openButton.textAndMnemonic=&OK
+FileChooser.cancelButton.textAndMnemonic=Avbryt
+FileChooser.saveButton.textAndMnemonic=OK
+FileChooser.openButton.textAndMnemonic=OK
FileChooser.saveDialogTitle.textAndMnemonic=Spara
FileChooser.openDialogTitle.textAndMnemonic=\u00D6ppna
FileChooser.pathLabel.textAndMnemonic=&Urval:
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_zh_CN.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_zh_CN.properties
index 9e00fe1..12ab10e 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_zh_CN.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_zh_CN.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=\u521B\u5EFA\u76EE\u5F55 "{0}" \u65F6\u51FA\u9519: \u6CA1\u6709\u6B64\u7C7B\u6587\u4EF6\u6216\u76EE\u5F55
FileChooser.deleteFileButton.textAndMnemonic=\u5220\u9664\u6587\u4EF6(&L)
FileChooser.renameFileButton.textAndMnemonic=\u91CD\u547D\u540D\u6587\u4EF6(&R)
-FileChooser.cancelButton.textAndMnemonic=\u53D6\u6D88(&C)
-FileChooser.saveButton.textAndMnemonic=\u786E\u5B9A(&O)
-FileChooser.openButton.textAndMnemonic=\u786E\u5B9A(&O)
+FileChooser.cancelButton.textAndMnemonic=\u53D6\u6D88
+FileChooser.saveButton.textAndMnemonic=\u786E\u5B9A
+FileChooser.openButton.textAndMnemonic=\u786E\u5B9A
FileChooser.saveDialogTitle.textAndMnemonic=\u4FDD\u5B58
FileChooser.openDialogTitle.textAndMnemonic=\u6253\u5F00
FileChooser.pathLabel.textAndMnemonic=\u9009\u5B9A\u5185\u5BB9(&S):
diff --git a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_zh_TW.properties b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_zh_TW.properties
index 9ee492a..807b0d3 100644
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_zh_TW.properties
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/resources/gtk_zh_TW.properties
@@ -34,9 +34,9 @@
FileChooser.newFolderNoDirectoryError.textAndMnemonic=\u5EFA\u7ACB\u76EE\u9304 "{0}" \u6642\u767C\u751F\u932F\u8AA4: \u6C92\u6709\u6B64\u6A94\u6848\u6216\u76EE\u9304
FileChooser.deleteFileButton.textAndMnemonic=\u522A\u9664\u6A94\u6848(&L)
FileChooser.renameFileButton.textAndMnemonic=\u91CD\u65B0\u547D\u540D\u6A94\u6848(&R)
-FileChooser.cancelButton.textAndMnemonic=\u53D6\u6D88(&C)
-FileChooser.saveButton.textAndMnemonic=\u78BA\u5B9A(&O)
-FileChooser.openButton.textAndMnemonic=\u78BA\u5B9A(&O)
+FileChooser.cancelButton.textAndMnemonic=\u53D6\u6D88
+FileChooser.saveButton.textAndMnemonic=\u78BA\u5B9A
+FileChooser.openButton.textAndMnemonic=\u78BA\u5B9A
FileChooser.saveDialogTitle.textAndMnemonic=\u5132\u5B58
FileChooser.openDialogTitle.textAndMnemonic=\u958B\u555F
FileChooser.pathLabel.textAndMnemonic=\u9078\u53D6(&S):
diff --git a/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java b/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java
index 309c68a..a90cbc3 100644
--- a/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java
+++ b/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java
@@ -79,18 +79,20 @@
* Takes a JarFile and converts into a pack-stream.
* <p>
* Closes its input but not its output. (Pack200 archives are appendable.)
- * @param in a JarFile
+ *
+ * @param in a JarFile
* @param out an OutputStream
* @exception IOException if an error is encountered.
*/
public synchronized void pack(JarFile in, OutputStream out) throws IOException {
- assert(Utils.currentInstance.get() == null);
- TimeZone tz = (props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE))
- ? null
- : TimeZone.getDefault();
+ assert (Utils.currentInstance.get() == null);
+
+ boolean needUTC = !props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE);
try {
Utils.currentInstance.set(this);
- if (tz != null) TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ if (needUTC) {
+ Utils.changeDefaultTimeZoneToUtc();
+ }
if ("0".equals(props.getProperty(Pack200.Packer.EFFORT))) {
Utils.copyJarFile(in, out);
@@ -99,7 +101,9 @@
}
} finally {
Utils.currentInstance.set(null);
- if (tz != null) TimeZone.setDefault(tz);
+ if (needUTC) {
+ Utils.restoreDefaultTimeZone();
+ }
in.close();
}
}
@@ -119,12 +123,13 @@
* @exception IOException if an error is encountered.
*/
public synchronized void pack(JarInputStream in, OutputStream out) throws IOException {
- assert(Utils.currentInstance.get() == null);
- TimeZone tz = (props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE)) ? null :
- TimeZone.getDefault();
+ assert (Utils.currentInstance.get() == null);
+ boolean needUTC = !props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE);
try {
Utils.currentInstance.set(this);
- if (tz != null) TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ if (needUTC) {
+ Utils.changeDefaultTimeZoneToUtc();
+ }
if ("0".equals(props.getProperty(Pack200.Packer.EFFORT))) {
Utils.copyJarFile(in, out);
} else {
@@ -132,10 +137,13 @@
}
} finally {
Utils.currentInstance.set(null);
- if (tz != null) TimeZone.setDefault(tz);
+ if (needUTC) {
+ Utils.restoreDefaultTimeZone();
+ }
in.close();
}
}
+
/**
* Register a listener for changes to options.
* @param listener An object to be invoked when a property is changed.
diff --git a/src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java b/src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java
index 9044d92..7bc6281 100644
--- a/src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java
+++ b/src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java
@@ -96,13 +96,15 @@
//Driver routines
// The unpack worker...
+
/**
* Takes a packed-stream InputStream, and writes to a JarOutputStream. Internally
* the entire buffer must be read, it may be more efficient to read the packed-stream
* to a file and pass the File object, in the alternate method described below.
* <p>
* Closes its input but not its output. (The output can accumulate more elements.)
- * @param in an InputStream.
+ *
+ * @param in an InputStream.
* @param out a JarOutputStream.
* @exception IOException if an error is encountered.
*/
@@ -113,19 +115,19 @@
if (out == null) {
throw new NullPointerException("null output");
}
- assert(Utils.currentInstance.get() == null);
- TimeZone tz = (props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE))
- ? null
- : TimeZone.getDefault();
-
+ assert (Utils.currentInstance.get() == null);
+ boolean needUTC = !props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE);
try {
Utils.currentInstance.set(this);
- if (tz != null) TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ if (needUTC) {
+ Utils.changeDefaultTimeZoneToUtc();
+ }
final int verbose = props.getInteger(Utils.DEBUG_VERBOSE);
BufferedInputStream in0 = new BufferedInputStream(in);
if (Utils.isJarMagic(Utils.readMagic(in0))) {
- if (verbose > 0)
+ if (verbose > 0) {
Utils.log.info("Copying unpacked JAR file...");
+ }
Utils.copyJarFile(new JarInputStream(in0), out);
} else if (props.getBoolean(Utils.DEBUG_DISABLE_NATIVE)) {
(new DoUnpack()).run(in0, out);
@@ -144,7 +146,9 @@
} finally {
_nunp = null;
Utils.currentInstance.set(null);
- if (tz != null) TimeZone.setDefault(tz);
+ if (needUTC) {
+ Utils.restoreDefaultTimeZone();
+ }
}
}
@@ -152,7 +156,8 @@
* Takes an input File containing the pack file, and generates a JarOutputStream.
* <p>
* Does not close its output. (The output can accumulate more elements.)
- * @param in a File.
+ *
+ * @param in a File.
* @param out a JarOutputStream.
* @exception IOException if an error is encountered.
*/
diff --git a/src/share/classes/com/sun/java/util/jar/pack/Utils.java b/src/share/classes/com/sun/java/util/jar/pack/Utils.java
index ebe0960..dea559d 100644
--- a/src/share/classes/com/sun/java/util/jar/pack/Utils.java
+++ b/src/share/classes/com/sun/java/util/jar/pack/Utils.java
@@ -34,6 +34,7 @@
import java.io.OutputStream;
import java.util.Collections;
import java.util.Date;
+import java.util.TimeZone;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarInputStream;
@@ -133,6 +134,9 @@
// to the engine code, especially the native code.
static final ThreadLocal<TLGlobals> currentInstance = new ThreadLocal<>();
+ private static TimeZone tz;
+ private static int workingPackerCount = 0;
+
// convenience method to access the TL globals
static TLGlobals getTLGlobals() {
return currentInstance.get();
@@ -203,6 +207,24 @@
}
}
+ static synchronized void changeDefaultTimeZoneToUtc() {
+ if (workingPackerCount++ == 0) {
+ // only first thread saves default TZ
+ tz = TimeZone.getDefault();
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ }
+ }
+
+ static synchronized void restoreDefaultTimeZone() {
+ if (--workingPackerCount == 0) {
+ // reset timezone when all the packer/unpacker instances have terminated
+ if (tz != null) {
+ TimeZone.setDefault(tz);
+ }
+ tz = null;
+ }
+ }
+
static final Pack200Logger log
= new Pack200Logger("java.util.jar.Pack200");
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic.properties
index 4a8d160..01b5218 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic.properties
@@ -43,13 +43,13 @@
Specify a different file name.
FileChooser.acceptAllFileFilter.textAndMnemonic=All Files
FileChooser.cancelButton.textAndMnemonic=Cancel
-FileChooser.saveButton.textAndMnemonic=&Save
-FileChooser.openButton.textAndMnemonic=&Open
+FileChooser.saveButton.textAndMnemonic=Save
+FileChooser.openButton.textAndMnemonic=Open
FileChooser.saveDialogTitle.textAndMnemonic=Save
FileChooser.openDialogTitle.textAndMnemonic=Open
FileChooser.updateButton.textAndMnemonic=&Update
FileChooser.helpButton.textAndMnemonic=&Help
-FileChooser.directoryOpenButton.textAndMnemonic=&Open
+FileChooser.directoryOpenButton.textAndMnemonic=Open
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_de.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_de.properties
index 5f3d8e2..bd8ad6d 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_de.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_de.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic={0} kann nicht umbenannt werden: Es ist bereits eine Datei mit dem angegebenen Namen vorhanden. Geben Sie einen anderen Dateinamen an.
FileChooser.acceptAllFileFilter.textAndMnemonic=Alle Dateien
FileChooser.cancelButton.textAndMnemonic=Abbrechen
-FileChooser.saveButton.textAndMnemonic=&Speichern
-FileChooser.openButton.textAndMnemonic=\u00D6&ffnen
+FileChooser.saveButton.textAndMnemonic=Speichern
+FileChooser.openButton.textAndMnemonic=\u00D6ffnen
FileChooser.saveDialogTitle.textAndMnemonic=Speichern
FileChooser.openDialogTitle.textAndMnemonic=\u00D6ffnen
FileChooser.updateButton.textAndMnemonic=A&ktualisieren
FileChooser.helpButton.textAndMnemonic=&Hilfe
-FileChooser.directoryOpenButton.textAndMnemonic=\u00D6&ffnen
+FileChooser.directoryOpenButton.textAndMnemonic=\u00D6ffnen
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_es.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_es.properties
index 485ed06..71d145c 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_es.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_es.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic=No se puede cambiar el nombre de {0}: ya existe un archivo con el nombre especificado. Especifique otro nombre de archivo.
FileChooser.acceptAllFileFilter.textAndMnemonic=Todos los Archivos
FileChooser.cancelButton.textAndMnemonic=Cancelar
-FileChooser.saveButton.textAndMnemonic=&Guardar
-FileChooser.openButton.textAndMnemonic=&Abrir
+FileChooser.saveButton.textAndMnemonic=Guardar
+FileChooser.openButton.textAndMnemonic=Abrir
FileChooser.saveDialogTitle.textAndMnemonic=Guardar
FileChooser.openDialogTitle.textAndMnemonic=Abrir
FileChooser.updateButton.textAndMnemonic=Act&ualizar
FileChooser.helpButton.textAndMnemonic=A&yuda
-FileChooser.directoryOpenButton.textAndMnemonic=&Abrir
+FileChooser.directoryOpenButton.textAndMnemonic=Abrir
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_fr.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_fr.properties
index ac89a22..3ee5668 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_fr.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_fr.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic=Impossible de renommer {0} : il existe d\u00E9j\u00E0 un fichier portant le nom indiqu\u00E9. Indiquez-en un autre.
FileChooser.acceptAllFileFilter.textAndMnemonic=Tous les fichiers
FileChooser.cancelButton.textAndMnemonic=Annuler
-FileChooser.saveButton.textAndMnemonic=Enregi&strer
-FileChooser.openButton.textAndMnemonic=&Ouvrir
+FileChooser.saveButton.textAndMnemonic=Enregistrer
+FileChooser.openButton.textAndMnemonic=Ouvrir
FileChooser.saveDialogTitle.textAndMnemonic=Enregistrer
FileChooser.openDialogTitle.textAndMnemonic=Ouvrir
FileChooser.updateButton.textAndMnemonic=Mettre \u00E0 jo&ur
FileChooser.helpButton.textAndMnemonic=&Aide
-FileChooser.directoryOpenButton.textAndMnemonic=&Ouvrir
+FileChooser.directoryOpenButton.textAndMnemonic=Ouvrir
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_it.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_it.properties
index c86d214..7844f11 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_it.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_it.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic=Impossibile rinominare {0}: esiste gi\u00E0 un file con il nome specificato. Specificare un altro nome.
FileChooser.acceptAllFileFilter.textAndMnemonic=Tutti i file
FileChooser.cancelButton.textAndMnemonic=Annulla
-FileChooser.saveButton.textAndMnemonic=Sal&va
-FileChooser.openButton.textAndMnemonic=&Apri
+FileChooser.saveButton.textAndMnemonic=Salva
+FileChooser.openButton.textAndMnemonic=Apri
FileChooser.saveDialogTitle.textAndMnemonic=Salva
FileChooser.openDialogTitle.textAndMnemonic=Apri
FileChooser.updateButton.textAndMnemonic=Ag&giorna
FileChooser.helpButton.textAndMnemonic=&?
-FileChooser.directoryOpenButton.textAndMnemonic=&Apri
+FileChooser.directoryOpenButton.textAndMnemonic=Apri
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ja.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ja.properties
index c5314fa..cf95074 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ja.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ja.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic={0}\u306E\u540D\u524D\u3092\u5909\u66F4\u3067\u304D\u307E\u305B\u3093: \u6307\u5B9A\u3057\u305F\u540D\u524D\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\u5225\u306E\u30D5\u30A1\u30A4\u30EB\u540D\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002
FileChooser.acceptAllFileFilter.textAndMnemonic=\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB
FileChooser.cancelButton.textAndMnemonic=\u53D6\u6D88
-FileChooser.saveButton.textAndMnemonic=\u4FDD\u5B58(&S)
-FileChooser.openButton.textAndMnemonic=\u958B\u304F(&O)
+FileChooser.saveButton.textAndMnemonic=\u4FDD\u5B58
+FileChooser.openButton.textAndMnemonic=\u958B\u304F
FileChooser.saveDialogTitle.textAndMnemonic=\u4FDD\u5B58
FileChooser.openDialogTitle.textAndMnemonic=\u958B\u304F
FileChooser.updateButton.textAndMnemonic=\u66F4\u65B0(&U)
FileChooser.helpButton.textAndMnemonic=\u30D8\u30EB\u30D7(&H)
-FileChooser.directoryOpenButton.textAndMnemonic=\u958B\u304F(&O)
+FileChooser.directoryOpenButton.textAndMnemonic=\u958B\u304F
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ko.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ko.properties
index 7f31303..c8e67df 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ko.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ko.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic={0}\uC758 \uC774\uB984\uC744 \uBC14\uAFC0 \uC218 \uC5C6\uC74C: \uC9C0\uC815\uD55C \uC774\uB984\uC744 \uC0AC\uC6A9\uD558\uB294 \uD30C\uC77C\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4. \uB2E4\uB978 \uD30C\uC77C \uC774\uB984\uC744 \uC9C0\uC815\uD558\uC2ED\uC2DC\uC624.
FileChooser.acceptAllFileFilter.textAndMnemonic=\uBAA8\uB4E0 \uD30C\uC77C
FileChooser.cancelButton.textAndMnemonic=\uCDE8\uC18C
-FileChooser.saveButton.textAndMnemonic=\uC800\uC7A5(&S)
-FileChooser.openButton.textAndMnemonic=\uC5F4\uAE30(&O)
+FileChooser.saveButton.textAndMnemonic=\uC800\uC7A5
+FileChooser.openButton.textAndMnemonic=\uC5F4\uAE30
FileChooser.saveDialogTitle.textAndMnemonic=\uC800\uC7A5
FileChooser.openDialogTitle.textAndMnemonic=\uC5F4\uAE30
FileChooser.updateButton.textAndMnemonic=\uC5C5\uB370\uC774\uD2B8(&U)
FileChooser.helpButton.textAndMnemonic=\uB3C4\uC6C0\uB9D0(&H)
-FileChooser.directoryOpenButton.textAndMnemonic=\uC5F4\uAE30(&O)
+FileChooser.directoryOpenButton.textAndMnemonic=\uC5F4\uAE30
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_pt_BR.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_pt_BR.properties
index 5c5ad20..f29f4ec 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_pt_BR.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_pt_BR.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic=N\u00E3o \u00E9 poss\u00EDvel renomear {0}: Um arquivo com o nome especificado j\u00E1 existe. Especifique outro nome de arquivo.
FileChooser.acceptAllFileFilter.textAndMnemonic=Todos os Arquivos
FileChooser.cancelButton.textAndMnemonic=Cancelar
-FileChooser.saveButton.textAndMnemonic=&Salvar
-FileChooser.openButton.textAndMnemonic=A&brir
+FileChooser.saveButton.textAndMnemonic=Salvar
+FileChooser.openButton.textAndMnemonic=Abrir
FileChooser.saveDialogTitle.textAndMnemonic=Salvar
FileChooser.openDialogTitle.textAndMnemonic=Abrir
FileChooser.updateButton.textAndMnemonic=At&ualizar
FileChooser.helpButton.textAndMnemonic=Aj&uda
-FileChooser.directoryOpenButton.textAndMnemonic=A&brir
+FileChooser.directoryOpenButton.textAndMnemonic=Abrir
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_sv.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_sv.properties
index 825a025..8c8a501 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_sv.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_sv.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic=Kan inte namn\u00E4ndra {0}: En fil med angivet namn finns redan. Ange ett annat filnamn.
FileChooser.acceptAllFileFilter.textAndMnemonic=Alla filer
FileChooser.cancelButton.textAndMnemonic=Avbryt
-FileChooser.saveButton.textAndMnemonic=&Spara
-FileChooser.openButton.textAndMnemonic=&\u00D6ppna
+FileChooser.saveButton.textAndMnemonic=Spara
+FileChooser.openButton.textAndMnemonic=\u00D6ppna
FileChooser.saveDialogTitle.textAndMnemonic=Spara
FileChooser.openDialogTitle.textAndMnemonic=\u00D6ppna
FileChooser.updateButton.textAndMnemonic=Upp&datera
FileChooser.helpButton.textAndMnemonic=&Hj\u00E4lp
-FileChooser.directoryOpenButton.textAndMnemonic=&\u00D6ppna
+FileChooser.directoryOpenButton.textAndMnemonic=\u00D6ppna
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_zh_CN.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_zh_CN.properties
index d4c3572..ab3bb26 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_zh_CN.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_zh_CN.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic=\u65E0\u6CD5\u91CD\u547D\u540D{0}: \u5DF2\u5B58\u5728\u5177\u6709\u6240\u6307\u5B9A\u540D\u79F0\u7684\u6587\u4EF6\u3002\u8BF7\u6307\u5B9A\u5176\u4ED6\u6587\u4EF6\u540D\u3002
FileChooser.acceptAllFileFilter.textAndMnemonic=\u6240\u6709\u6587\u4EF6
FileChooser.cancelButton.textAndMnemonic=\u53D6\u6D88
-FileChooser.saveButton.textAndMnemonic=\u4FDD\u5B58(&S)
-FileChooser.openButton.textAndMnemonic=\u6253\u5F00(&O)
+FileChooser.saveButton.textAndMnemonic=\u4FDD\u5B58
+FileChooser.openButton.textAndMnemonic=\u6253\u5F00
FileChooser.saveDialogTitle.textAndMnemonic=\u4FDD\u5B58
FileChooser.openDialogTitle.textAndMnemonic=\u6253\u5F00
FileChooser.updateButton.textAndMnemonic=\u66F4\u65B0(&U)
FileChooser.helpButton.textAndMnemonic=\u5E2E\u52A9(&H)
-FileChooser.directoryOpenButton.textAndMnemonic=\u6253\u5F00(&O)
+FileChooser.directoryOpenButton.textAndMnemonic=\u6253\u5F00
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_zh_TW.properties b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_zh_TW.properties
index 6541661..d4b4795 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_zh_TW.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_zh_TW.properties
@@ -42,13 +42,13 @@
FileChooser.renameErrorFileExists.textAndMnemonic=\u7121\u6CD5\u91CD\u65B0\u547D\u540D {0}: \u5DF2\u7D93\u5B58\u5728\u60A8\u6240\u6307\u5B9A\u540D\u7A31\u7684\u6A94\u6848\u3002\u8ACB\u6307\u5B9A\u4E0D\u540C\u7684\u540D\u7A31\u3002
FileChooser.acceptAllFileFilter.textAndMnemonic=\u6240\u6709\u6A94\u6848
FileChooser.cancelButton.textAndMnemonic=\u53D6\u6D88
-FileChooser.saveButton.textAndMnemonic=\u5132\u5B58(&S)
-FileChooser.openButton.textAndMnemonic=\u958B\u555F(&O)
+FileChooser.saveButton.textAndMnemonic=\u5132\u5B58
+FileChooser.openButton.textAndMnemonic=\u958B\u555F
FileChooser.saveDialogTitle.textAndMnemonic=\u5132\u5B58
FileChooser.openDialogTitle.textAndMnemonic=\u958B\u555F
FileChooser.updateButton.textAndMnemonic=\u66F4\u65B0(&U)
FileChooser.helpButton.textAndMnemonic=\u8AAA\u660E(&H)
-FileChooser.directoryOpenButton.textAndMnemonic=\u958B\u555F(&O)
+FileChooser.directoryOpenButton.textAndMnemonic=\u958B\u555F
# File Size Units
FileChooser.fileSizeKiloBytes={0} KB
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal.properties
index 431d712..cd35fd8 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=Type
FileChooser.fileDateHeader.textAndMnemonic=Modified
FileChooser.fileAttrHeader.textAndMnemonic=Attributes
-FileChooser.saveButton.textAndMnemonic=Save
-FileChooser.openButton.textAndMnemonic=Open
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=&Restore
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_de.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_de.properties
index 48315d3..af23756 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_de.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_de.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=Typ
FileChooser.fileDateHeader.textAndMnemonic=Ge\u00E4ndert
FileChooser.fileAttrHeader.textAndMnemonic=Attribute
-FileChooser.saveButton.textAndMnemonic=Speichern
-FileChooser.openButton.textAndMnemonic=\u00D6ffnen
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=&Wiederherstellen
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_es.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_es.properties
index 72ec82e..09df76e 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_es.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_es.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=Tipo
FileChooser.fileDateHeader.textAndMnemonic=Modificado
FileChooser.fileAttrHeader.textAndMnemonic=Atributos
-FileChooser.saveButton.textAndMnemonic=Guardar
-FileChooser.openButton.textAndMnemonic=Abrir
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=&Restaurar
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_fr.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_fr.properties
index 15db368..9644ad6 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_fr.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_fr.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=Type
FileChooser.fileDateHeader.textAndMnemonic=Modifi\u00E9
FileChooser.fileAttrHeader.textAndMnemonic=Attributs
-FileChooser.saveButton.textAndMnemonic=Enregistrer
-FileChooser.openButton.textAndMnemonic=Ouvrir
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=&Restaurer
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_it.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_it.properties
index 6194621..9b3e471 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_it.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_it.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=Tipo
FileChooser.fileDateHeader.textAndMnemonic=Modificato
FileChooser.fileAttrHeader.textAndMnemonic=Attributi
-FileChooser.saveButton.textAndMnemonic=Salva
-FileChooser.openButton.textAndMnemonic=Apri
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=&Ripristina
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_ja.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_ja.properties
index 8a8fef8..4aa9ebd 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_ja.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_ja.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=\u30BF\u30A4\u30D7
FileChooser.fileDateHeader.textAndMnemonic=\u4FEE\u6B63\u65E5
FileChooser.fileAttrHeader.textAndMnemonic=\u5C5E\u6027
-FileChooser.saveButton.textAndMnemonic=\u4FDD\u5B58
-FileChooser.openButton.textAndMnemonic=\u958B\u304F
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=\u5FA9\u5143(&R)
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_ko.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_ko.properties
index 264976c..f01b47d 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_ko.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_ko.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=\uC720\uD615
FileChooser.fileDateHeader.textAndMnemonic=\uC218\uC815 \uB0A0\uC9DC
FileChooser.fileAttrHeader.textAndMnemonic=\uC18D\uC131
-FileChooser.saveButton.textAndMnemonic=\uC800\uC7A5
-FileChooser.openButton.textAndMnemonic=\uC5F4\uAE30
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=\uBCF5\uC6D0(&R)
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_pt_BR.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_pt_BR.properties
index 79c45cb..2edccf0 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_pt_BR.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_pt_BR.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=Tipo
FileChooser.fileDateHeader.textAndMnemonic=Modificado
FileChooser.fileAttrHeader.textAndMnemonic=Atributos
-FileChooser.saveButton.textAndMnemonic=Salvar
-FileChooser.openButton.textAndMnemonic=Abrir
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=&Restaurar
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_sv.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_sv.properties
index 467c8a7..f79a05a 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_sv.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_sv.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=Typ
FileChooser.fileDateHeader.textAndMnemonic=\u00C4ndrad
FileChooser.fileAttrHeader.textAndMnemonic=Attribut
-FileChooser.saveButton.textAndMnemonic=Spara
-FileChooser.openButton.textAndMnemonic=\u00D6ppna
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=&\u00C5terst\u00E4ll
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_zh_CN.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_zh_CN.properties
index 2d6cf13..d1bda4d 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_zh_CN.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_zh_CN.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=\u7C7B\u578B
FileChooser.fileDateHeader.textAndMnemonic=\u4FEE\u6539\u65E5\u671F
FileChooser.fileAttrHeader.textAndMnemonic=\u5C5E\u6027
-FileChooser.saveButton.textAndMnemonic=\u4FDD\u5B58
-FileChooser.openButton.textAndMnemonic=\u6253\u5F00
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=\u8FD8\u539F(&R)
diff --git a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_zh_TW.properties b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_zh_TW.properties
index 1d2b826..45045af 100644
--- a/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_zh_TW.properties
+++ b/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_zh_TW.properties
@@ -43,8 +43,6 @@
FileChooser.fileTypeHeader.textAndMnemonic=\u985E\u578B
FileChooser.fileDateHeader.textAndMnemonic=\u4FEE\u6539\u65E5\u671F
FileChooser.fileAttrHeader.textAndMnemonic=\u5C6C\u6027
-FileChooser.saveButton.textAndMnemonic=\u5132\u5B58
-FileChooser.openButton.textAndMnemonic=\u958B\u555F
############ Used by MetalTitlePane if rendering window decorations############
MetalTitlePane.restore.titleAndMnemonic=\u56DE\u5FA9(&R)
diff --git a/src/share/classes/java/awt/geom/Path2D.java b/src/share/classes/java/awt/geom/Path2D.java
index e5a1307..2513114 100644
--- a/src/share/classes/java/awt/geom/Path2D.java
+++ b/src/share/classes/java/awt/geom/Path2D.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -101,6 +101,8 @@
static final int INIT_SIZE = 20;
static final int EXPAND_MAX = 500;
+ static final int EXPAND_MAX_COORDS = EXPAND_MAX * 2;
+ static final int EXPAND_MIN = 10; // ensure > 6 (cubics)
/**
* Constructs a new empty {@code Path2D} object.
@@ -141,6 +143,42 @@
abstract int rectCrossings(double rxmin, double rymin,
double rxmax, double rymax);
+ static byte[] expandPointTypes(byte[] oldPointTypes, int needed) {
+ final int oldSize = oldPointTypes.length;
+ final int newSizeMin = oldSize + needed;
+ if (newSizeMin < oldSize) {
+ // hard overflow failure - we can't even accommodate
+ // new items without overflowing
+ throw new ArrayIndexOutOfBoundsException(
+ "pointTypes exceeds maximum capacity !");
+ }
+ // growth algorithm computation
+ int grow = oldSize;
+ if (grow > EXPAND_MAX) {
+ grow = Math.max(EXPAND_MAX, oldSize >> 3); // 1/8th min
+ } else if (grow < EXPAND_MIN) {
+ grow = EXPAND_MIN;
+ }
+ assert grow > 0;
+
+ int newSize = oldSize + grow;
+ if (newSize < newSizeMin) {
+ // overflow in growth algorithm computation
+ newSize = Integer.MAX_VALUE;
+ }
+ while (true) {
+ try {
+ // try allocating the larger array
+ return Arrays.copyOf(oldPointTypes, newSize);
+ } catch (OutOfMemoryError oome) {
+ if (newSize == newSizeMin) {
+ throw oome;
+ }
+ }
+ newSize = newSizeMin + (newSize - newSizeMin) / 2;
+ }
+ }
+
/**
* The {@code Float} class defines a geometric path with
* coordinates stored in single precision floating point.
@@ -224,8 +262,8 @@
Path2D p2d = (Path2D) s;
setWindingRule(p2d.windingRule);
this.numTypes = p2d.numTypes;
- this.pointTypes = Arrays.copyOf(p2d.pointTypes,
- p2d.pointTypes.length);
+ // trim arrays:
+ this.pointTypes = Arrays.copyOf(p2d.pointTypes, p2d.numTypes);
this.numCoords = p2d.numCoords;
this.floatCoords = p2d.cloneCoordsFloat(at);
} else {
@@ -237,19 +275,23 @@
}
}
+ @Override
float[] cloneCoordsFloat(AffineTransform at) {
+ // trim arrays:
float ret[];
if (at == null) {
- ret = Arrays.copyOf(this.floatCoords, this.floatCoords.length);
+ ret = Arrays.copyOf(floatCoords, numCoords);
} else {
- ret = new float[floatCoords.length];
+ ret = new float[numCoords];
at.transform(floatCoords, 0, ret, 0, numCoords / 2);
}
return ret;
}
+ @Override
double[] cloneCoordsDouble(AffineTransform at) {
- double ret[] = new double[floatCoords.length];
+ // trim arrays:
+ double ret[] = new double[numCoords];
if (at == null) {
for (int i = 0; i < numCoords; i++) {
ret[i] = floatCoords[i];
@@ -275,31 +317,53 @@
floatCoords[coordindex+1]);
}
+ @Override
void needRoom(boolean needMove, int newCoords) {
- if (needMove && numTypes == 0) {
+ if ((numTypes == 0) && needMove) {
throw new IllegalPathStateException("missing initial moveto "+
"in path definition");
}
- int size = pointTypes.length;
- if (numTypes >= size) {
- int grow = size;
- if (grow > EXPAND_MAX) {
- grow = EXPAND_MAX;
- } else if (grow == 0) {
- grow = 1;
- }
- pointTypes = Arrays.copyOf(pointTypes, size+grow);
+ if (numTypes >= pointTypes.length) {
+ pointTypes = expandPointTypes(pointTypes, 1);
}
- size = floatCoords.length;
- if (numCoords + newCoords > size) {
- int grow = size;
- if (grow > EXPAND_MAX * 2) {
- grow = EXPAND_MAX * 2;
+ if (numCoords > (floatCoords.length - newCoords)) {
+ floatCoords = expandCoords(floatCoords, newCoords);
+ }
+ }
+
+ static float[] expandCoords(float[] oldCoords, int needed) {
+ final int oldSize = oldCoords.length;
+ final int newSizeMin = oldSize + needed;
+ if (newSizeMin < oldSize) {
+ // hard overflow failure - we can't even accommodate
+ // new items without overflowing
+ throw new ArrayIndexOutOfBoundsException(
+ "coords exceeds maximum capacity !");
+ }
+ // growth algorithm computation
+ int grow = oldSize;
+ if (grow > EXPAND_MAX_COORDS) {
+ grow = Math.max(EXPAND_MAX_COORDS, oldSize >> 3); // 1/8th min
+ } else if (grow < EXPAND_MIN) {
+ grow = EXPAND_MIN;
+ }
+ assert grow > needed;
+
+ int newSize = oldSize + grow;
+ if (newSize < newSizeMin) {
+ // overflow in growth algorithm computation
+ newSize = Integer.MAX_VALUE;
+ }
+ while (true) {
+ try {
+ // try allocating the larger array
+ return Arrays.copyOf(oldCoords, newSize);
+ } catch (OutOfMemoryError oome) {
+ if (newSize == newSizeMin) {
+ throw oome;
+ }
}
- if (grow < newCoords) {
- grow = newCoords;
- }
- floatCoords = Arrays.copyOf(floatCoords, size+grow);
+ newSize = newSizeMin + (newSize - newSizeMin) / 2;
}
}
@@ -475,6 +539,9 @@
}
int pointCrossings(double px, double py) {
+ if (numTypes == 0) {
+ return 0;
+ }
double movx, movy, curx, cury, endx, endy;
float coords[] = floatCoords;
curx = movx = coords[0];
@@ -552,6 +619,9 @@
int rectCrossings(double rxmin, double rymin,
double rxmax, double rymax)
{
+ if (numTypes == 0) {
+ return 0;
+ }
float coords[] = floatCoords;
double curx, cury, movx, movy, endx, endy;
curx = movx = coords[0];
@@ -1061,8 +1131,8 @@
Path2D p2d = (Path2D) s;
setWindingRule(p2d.windingRule);
this.numTypes = p2d.numTypes;
- this.pointTypes = Arrays.copyOf(p2d.pointTypes,
- p2d.pointTypes.length);
+ // trim arrays:
+ this.pointTypes = Arrays.copyOf(p2d.pointTypes, p2d.numTypes);
this.numCoords = p2d.numCoords;
this.doubleCoords = p2d.cloneCoordsDouble(at);
} else {
@@ -1074,8 +1144,10 @@
}
}
+ @Override
float[] cloneCoordsFloat(AffineTransform at) {
- float ret[] = new float[doubleCoords.length];
+ // trim arrays:
+ float ret[] = new float[numCoords];
if (at == null) {
for (int i = 0; i < numCoords; i++) {
ret[i] = (float) doubleCoords[i];
@@ -1086,13 +1158,14 @@
return ret;
}
+ @Override
double[] cloneCoordsDouble(AffineTransform at) {
+ // trim arrays:
double ret[];
if (at == null) {
- ret = Arrays.copyOf(this.doubleCoords,
- this.doubleCoords.length);
+ ret = Arrays.copyOf(doubleCoords, numCoords);
} else {
- ret = new double[doubleCoords.length];
+ ret = new double[numCoords];
at.transform(doubleCoords, 0, ret, 0, numCoords / 2);
}
return ret;
@@ -1113,31 +1186,53 @@
doubleCoords[coordindex+1]);
}
+ @Override
void needRoom(boolean needMove, int newCoords) {
- if (needMove && numTypes == 0) {
+ if ((numTypes == 0) && needMove) {
throw new IllegalPathStateException("missing initial moveto "+
"in path definition");
}
- int size = pointTypes.length;
- if (numTypes >= size) {
- int grow = size;
- if (grow > EXPAND_MAX) {
- grow = EXPAND_MAX;
- } else if (grow == 0) {
- grow = 1;
- }
- pointTypes = Arrays.copyOf(pointTypes, size+grow);
+ if (numTypes >= pointTypes.length) {
+ pointTypes = expandPointTypes(pointTypes, 1);
}
- size = doubleCoords.length;
- if (numCoords + newCoords > size) {
- int grow = size;
- if (grow > EXPAND_MAX * 2) {
- grow = EXPAND_MAX * 2;
+ if (numCoords > (doubleCoords.length - newCoords)) {
+ doubleCoords = expandCoords(doubleCoords, newCoords);
+ }
+ }
+
+ static double[] expandCoords(double[] oldCoords, int needed) {
+ final int oldSize = oldCoords.length;
+ final int newSizeMin = oldSize + needed;
+ if (newSizeMin < oldSize) {
+ // hard overflow failure - we can't even accommodate
+ // new items without overflowing
+ throw new ArrayIndexOutOfBoundsException(
+ "coords exceeds maximum capacity !");
+ }
+ // growth algorithm computation
+ int grow = oldSize;
+ if (grow > EXPAND_MAX_COORDS) {
+ grow = Math.max(EXPAND_MAX_COORDS, oldSize >> 3); // 1/8th min
+ } else if (grow < EXPAND_MIN) {
+ grow = EXPAND_MIN;
+ }
+ assert grow > needed;
+
+ int newSize = oldSize + grow;
+ if (newSize < newSizeMin) {
+ // overflow in growth algorithm computation
+ newSize = Integer.MAX_VALUE;
+ }
+ while (true) {
+ try {
+ // try allocating the larger array
+ return Arrays.copyOf(oldCoords, newSize);
+ } catch (OutOfMemoryError oome) {
+ if (newSize == newSizeMin) {
+ throw oome;
+ }
}
- if (grow < newCoords) {
- grow = newCoords;
- }
- doubleCoords = Arrays.copyOf(doubleCoords, size+grow);
+ newSize = newSizeMin + (newSize - newSizeMin) / 2;
}
}
@@ -1202,6 +1297,9 @@
}
int pointCrossings(double px, double py) {
+ if (numTypes == 0) {
+ return 0;
+ }
double movx, movy, curx, cury, endx, endy;
double coords[] = doubleCoords;
curx = movx = coords[0];
@@ -1279,6 +1377,9 @@
int rectCrossings(double rxmin, double rymin,
double rxmax, double rymax)
{
+ if (numTypes == 0) {
+ return 0;
+ }
double coords[] = doubleCoords;
double curx, cury, movx, movy, endx, endy;
curx = movx = coords[0];
diff --git a/src/share/classes/java/lang/invoke/Invokers.java b/src/share/classes/java/lang/invoke/Invokers.java
index e09dc36..a2da2a9 100644
--- a/src/share/classes/java/lang/invoke/Invokers.java
+++ b/src/share/classes/java/lang/invoke/Invokers.java
@@ -281,7 +281,7 @@
outArgs[0] = names[CHECK_TYPE];
}
if (CHECK_CUSTOM != -1) {
- names[CHECK_CUSTOM] = new Name(NF_checkCustomized, names[CALL_MH]);
+ names[CHECK_CUSTOM] = new Name(NF_checkCustomized, outArgs[0]);
}
names[LINKER_CALL] = new Name(outCallType, outArgs);
lform = new LambdaForm(debugName, INARG_LIMIT, names);
diff --git a/src/share/classes/java/lang/invoke/LambdaForm.java b/src/share/classes/java/lang/invoke/LambdaForm.java
index 5c44107..09a742f 100644
--- a/src/share/classes/java/lang/invoke/LambdaForm.java
+++ b/src/share/classes/java/lang/invoke/LambdaForm.java
@@ -631,7 +631,7 @@
* as a sort of pre-invocation linkage step.)
*/
public void prepare() {
- if (COMPILE_THRESHOLD == 0) {
+ if (COMPILE_THRESHOLD == 0 && !isCompiled) {
compileToBytecode();
}
if (this.vmentry != null) {
@@ -645,11 +645,11 @@
/** Generate optimizable bytecode for this form. */
MemberName compileToBytecode() {
- MethodType invokerType = methodType();
- assert(vmentry == null || vmentry.getMethodType().basicType().equals(invokerType));
if (vmentry != null && isCompiled) {
return vmentry; // already compiled somehow
}
+ MethodType invokerType = methodType();
+ assert(vmentry == null || vmentry.getMethodType().basicType().equals(invokerType));
try {
vmentry = InvokerBytecodeGenerator.generateCustomizedCode(this, invokerType);
if (TRACE_INTERPRETER)
diff --git a/src/share/classes/java/util/concurrent/ForkJoinPool.java b/src/share/classes/java/util/concurrent/ForkJoinPool.java
index 255a0b2..b2a7d63 100644
--- a/src/share/classes/java/util/concurrent/ForkJoinPool.java
+++ b/src/share/classes/java/util/concurrent/ForkJoinPool.java
@@ -1323,13 +1323,16 @@
/**
* Number of times to spin-wait before blocking. The spins (in
* awaitRunStateLock and awaitWork) currently use randomized
- * spins. If/when MWAIT-like intrinsics becomes available, they
- * may allow quieter spinning. The value of SPINS must be a power
- * of two, at least 4. The current value causes spinning for a
- * small fraction of typical context-switch times, well worthwhile
- * given the typical likelihoods that blocking is not necessary.
+ * spins. Currently set to zero to reduce CPU usage.
+ *
+ * If greater than zero the value of SPINS must be a power
+ * of two, at least 4. A value of 2048 causes spinning for a
+ * small fraction of typical context-switch times.
+ *
+ * If/when MWAIT-like intrinsics becomes available, they
+ * may allow quieter spinning.
*/
- private static final int SPINS = 1 << 11;
+ private static final int SPINS = 0;
/**
* Increment for seed generators. See class ThreadLocal for
diff --git a/src/share/classes/javax/script/Compilable.java b/src/share/classes/javax/script/Compilable.java
index c4620cb..d355167 100644
--- a/src/share/classes/javax/script/Compilable.java
+++ b/src/share/classes/javax/script/Compilable.java
@@ -42,7 +42,7 @@
*
* @param script The source of the script, represented as a <code>String</code>.
*
- * @return An subclass of <code>CompiledScript</code> to be executed later using one
+ * @return An instance of a subclass of <code>CompiledScript</code> to be executed later using one
* of the <code>eval</code> methods of <code>CompiledScript</code>.
*
* @throws ScriptException if compilation fails.
@@ -61,7 +61,7 @@
*
* @param script The reader from which the script source is obtained.
*
- * @return An implementation of <code>CompiledScript</code> to be executed
+ * @return An instance of a subclass of <code>CompiledScript</code> to be executed
* later using one of its <code>eval</code> methods of <code>CompiledScript</code>.
*
* @throws ScriptException if compilation fails.
diff --git a/src/share/classes/javax/script/SimpleScriptContext.java b/src/share/classes/javax/script/SimpleScriptContext.java
index a5bf12f..9964c99 100644
--- a/src/share/classes/javax/script/SimpleScriptContext.java
+++ b/src/share/classes/javax/script/SimpleScriptContext.java
@@ -140,6 +140,7 @@
* @throws IllegalArgumentException if the name is empty.
*/
public Object getAttribute(String name) {
+ checkName(name);
if (engineScope.containsKey(name)) {
return getAttribute(name, ENGINE_SCOPE);
} else if (globalScope != null && globalScope.containsKey(name)) {
@@ -162,7 +163,7 @@
* @throws NullPointerException if the name is null.
*/
public Object getAttribute(String name, int scope) {
-
+ checkName(name);
switch (scope) {
case ENGINE_SCOPE:
@@ -191,7 +192,7 @@
* @throws NullPointerException if the name is null.
*/
public Object removeAttribute(String name, int scope) {
-
+ checkName(name);
switch (scope) {
case ENGINE_SCOPE:
@@ -223,7 +224,7 @@
* @throws NullPointerException if the name is null.
*/
public void setAttribute(String name, Object value, int scope) {
-
+ checkName(name);
switch (scope) {
case ENGINE_SCOPE:
@@ -281,6 +282,7 @@
* @throws IllegalArgumentException if name is empty.
*/
public int getAttributesScope(String name) {
+ checkName(name);
if (engineScope.containsKey(name)) {
return ENGINE_SCOPE;
} else if (globalScope != null && globalScope.containsKey(name)) {
@@ -314,6 +316,13 @@
return scopes;
}
+ private void checkName(String name) {
+ Objects.requireNonNull(name);
+ if (name.isEmpty()) {
+ throw new IllegalArgumentException("name cannot be empty");
+ }
+ }
+
private static List<Integer> scopes;
static {
scopes = new ArrayList<Integer>(2);
diff --git a/src/share/classes/javax/sql/rowset/serial/SerialBlob.java b/src/share/classes/javax/sql/rowset/serial/SerialBlob.java
index 4c5a6b8..9380760 100644
--- a/src/share/classes/javax/sql/rowset/serial/SerialBlob.java
+++ b/src/share/classes/javax/sql/rowset/serial/SerialBlob.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -66,7 +66,7 @@
* value of this <code>SerialBlob</code> object.
* @serial
*/
- private byte buf[];
+ private byte[] buf;
/**
* The internal representation of the <code>Blob</code> object on which this
@@ -102,12 +102,13 @@
* @throws SerialException if an error occurs during serialization
* @throws SQLException if a SQL errors occurs
*/
- public SerialBlob(byte[] b) throws SerialException, SQLException {
+ public SerialBlob(byte[] b)
+ throws SerialException, SQLException {
len = b.length;
buf = new byte[(int)len];
for(int i = 0; i < len; i++) {
- buf[i] = b[i];
+ buf[i] = b[i];
}
origLen = len;
}
@@ -132,19 +133,17 @@
* to this constructor is a <code>null</code>.
* @see java.sql.Blob
*/
- public SerialBlob (Blob blob) throws SerialException, SQLException {
+ public SerialBlob (Blob blob)
+ throws SerialException, SQLException {
if (blob == null) {
- throw new SQLException("Cannot instantiate a SerialBlob " +
- "object with a null Blob object");
+ throw new SQLException(
+ "Cannot instantiate a SerialBlob object with a null Blob object");
}
len = blob.length();
buf = blob.getBytes(1, (int)len );
this.blob = blob;
-
- //if ( len < 10240000)
- // len = 10240000;
origLen = len;
}
@@ -245,7 +244,8 @@
* value from the database
*/
public long position(byte[] pattern, long start)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
+
isValid();
if (start < 1 || start > len) {
return -1;
@@ -290,7 +290,7 @@
* value from the database
*/
public long position(Blob pattern, long start)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
isValid();
return position(pattern.getBytes(1, (int)(pattern.length())), start);
}
@@ -316,8 +316,8 @@
* @see #getBytes
*/
public int setBytes(long pos, byte[] bytes)
- throws SerialException, SQLException {
- return (setBytes(pos, bytes, 0, bytes.length));
+ throws SerialException, SQLException {
+ return setBytes(pos, bytes, 0, bytes.length);
}
/**
@@ -352,7 +352,7 @@
* @see #getBytes
*/
public int setBytes(long pos, byte[] bytes, int offset, int length)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
isValid();
if (offset < 0 || offset > bytes.length) {
@@ -369,7 +369,7 @@
if ((length + offset) > bytes.length) {
throw new SerialException("Invalid OffSet. Cannot have combined offset " +
- "and length that is greater that the Blob buffer");
+ "and length that is greater that the Blob buffer");
}
int i = 0;
@@ -402,7 +402,8 @@
* @see #getBinaryStream
*/
public java.io.OutputStream setBinaryStream(long pos)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
+
isValid();
if (this.blob != null) {
return this.blob.setBinaryStream(pos);
@@ -425,17 +426,16 @@
* if {@code free} had previously been called on this object
*/
public void truncate(long length) throws SerialException {
-
isValid();
if (length > len) {
- throw new SerialException
- ("Length more than what can be truncated");
+ throw new SerialException(
+ "Length more than what can be truncated");
} else if((int)length == 0) {
- buf = new byte[0];
- len = length;
+ buf = new byte[0];
+ len = length;
} else {
- len = length;
- buf = this.getBytes(1, (int)len);
+ len = length;
+ buf = this.getBytes(1, (int)len);
}
}
@@ -466,8 +466,8 @@
throw new SerialException("Invalid position in BLOB object set");
}
if (length < 1 || length > len - pos + 1) {
- throw new SerialException("length is < 1 or pos + length >"
- + "total number of bytes");
+ throw new SerialException(
+ "length is < 1 or pos + length > total number of bytes");
}
return new ByteArrayInputStream(buf, (int) pos - 1, (int) length);
}
@@ -536,14 +536,13 @@
public Object clone() {
try {
SerialBlob sb = (SerialBlob) super.clone();
- sb.buf = (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
+ sb.buf = (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
sb.blob = null;
return sb;
} catch (CloneNotSupportedException ex) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
-
}
/**
@@ -554,15 +553,15 @@
throws IOException, ClassNotFoundException {
ObjectInputStream.GetField fields = s.readFields();
- byte[] tmp = (byte[])fields.get("buf", null);
- if (tmp == null)
- throw new InvalidObjectException("buf is null and should not be!");
- buf = tmp.clone();
- len = fields.get("len", 0L);
- if (buf.length != len)
- throw new InvalidObjectException("buf is not the expected size");
- origLen = fields.get("origLen", 0L);
- blob = (Blob) fields.get("blob", null);
+ byte[] tmp = (byte[])fields.get("buf", null);
+ if (tmp == null)
+ throw new InvalidObjectException("buf is null and should not be!");
+ buf = tmp.clone();
+ len = fields.get("len", 0L);
+ if (buf.length != len)
+ throw new InvalidObjectException("buf is not the expected size");
+ origLen = fields.get("origLen", 0L);
+ blob = (Blob) fields.get("blob", null);
}
/**
@@ -590,8 +589,8 @@
*/
private void isValid() throws SerialException {
if (buf == null) {
- throw new SerialException("Error: You cannot call a method on a "
- + "SerialBlob instance once free() has been called.");
+ throw new SerialException("Error: You cannot call a method on a " +
+ "SerialBlob instance once free() has been called.");
}
}
diff --git a/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java b/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java
index 9f0ba3e..95ea7f7 100644
--- a/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java
+++ b/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java
@@ -125,6 +125,8 @@
protected MouseMotionListener popupMouseMotionListener;
protected KeyListener popupKeyListener;
+ private MouseWheelListener mouseWheelListener;
+
// This is used for knowing when to cache the minimum preferred size.
// If the data in the list changes, the cached value get marked for recalc.
// Added to the current JComboBox model
@@ -375,6 +377,10 @@
comboBox.getModel().addListDataListener( listDataListener );
}
}
+
+ if ((mouseWheelListener = createMouseWheelListener()) != null) {
+ comboBox.addMouseWheelListener(mouseWheelListener);
+ }
}
/**
@@ -421,6 +427,9 @@
comboBox.getModel().removeListDataListener( listDataListener );
}
}
+ if (mouseWheelListener != null) {
+ comboBox.removeMouseWheelListener(mouseWheelListener);
+ }
}
/**
@@ -534,6 +543,10 @@
return handler;
}
+ private MouseWheelListener createMouseWheelListener() {
+ return getHandler();
+ }
+
//
// end UI Initialization
//======================
@@ -1669,7 +1682,8 @@
//
private class Handler implements ActionListener, FocusListener,
KeyListener, LayoutManager,
- ListDataListener, PropertyChangeListener {
+ ListDataListener, PropertyChangeListener,
+ MouseWheelListener {
//
// PropertyChangeListener
//
@@ -1939,21 +1953,25 @@
public void actionPerformed(ActionEvent evt) {
Object item = comboBox.getEditor().getItem();
if (item != null) {
- if(!comboBox.isPopupVisible() && !item.equals(comboBox.getSelectedItem())) {
- comboBox.setSelectedItem(comboBox.getEditor().getItem());
- }
- ActionMap am = comboBox.getActionMap();
- if (am != null) {
- Action action = am.get("enterPressed");
- if (action != null) {
- action.actionPerformed(new ActionEvent(comboBox, evt.getID(),
- evt.getActionCommand(),
- evt.getModifiers()));
+ if (!comboBox.isPopupVisible() && !item.equals(comboBox.getSelectedItem())) {
+ comboBox.setSelectedItem(comboBox.getEditor().getItem());
+ }
+ ActionMap am = comboBox.getActionMap();
+ if (am != null) {
+ Action action = am.get("enterPressed");
+ if (action != null) {
+ action.actionPerformed(new ActionEvent(comboBox, evt.getID(),
+ evt.getActionCommand(),
+ evt.getModifiers()));
+ }
}
}
- }
+ }
+
+ public void mouseWheelMoved(MouseWheelEvent e) {
+ e.consume();
+ }
}
- }
class DefaultKeySelectionManager implements JComboBox.KeySelectionManager, UIResource {
private String prefix = "";
diff --git a/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java b/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java
index e7aab73..682e6c6 100644
--- a/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java
+++ b/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java
@@ -180,6 +180,8 @@
*/
protected ItemListener itemListener;
+ private MouseWheelListener scrollerMouseWheelListener;
+
/**
* This protected field is implementation specific. Do not access directly
* or override.
@@ -286,6 +288,7 @@
uninstallComboBoxModelListeners(comboBox.getModel());
uninstallKeyboardActions();
uninstallListListeners();
+ uninstallScrollerListeners();
// We do this, otherwise the listener the ui installs on
// the model (the combobox model in this case) will keep a
// reference to the list, causing the list (and us) to never get gced.
@@ -572,6 +575,7 @@
scroller.setFocusable( false );
scroller.getVerticalScrollBar().setFocusable( false );
scroller.setBorder( null );
+ installScrollerListeners();
}
/**
@@ -588,6 +592,20 @@
setFocusable( false );
}
+ private void installScrollerListeners() {
+ scrollerMouseWheelListener = getHandler();
+ if (scrollerMouseWheelListener != null) {
+ scroller.addMouseWheelListener(scrollerMouseWheelListener);
+ }
+ }
+
+ private void uninstallScrollerListeners() {
+ if (scrollerMouseWheelListener != null) {
+ scroller.removeMouseWheelListener(scrollerMouseWheelListener);
+ scrollerMouseWheelListener = null;
+ }
+ }
+
/**
* This method adds the necessary listeners to the JComboBox.
*/
@@ -796,8 +814,8 @@
private class Handler implements ItemListener, MouseListener,
- MouseMotionListener, PropertyChangeListener,
- Serializable {
+ MouseMotionListener, MouseWheelListener,
+ PropertyChangeListener, Serializable {
//
// MouseListener
// NOTE: this is added to both the JList and JComboBox
@@ -981,6 +999,13 @@
setListSelection(comboBox.getSelectedIndex());
}
}
+
+ //
+ // MouseWheelListener
+ //
+ public void mouseWheelMoved(MouseWheelEvent e) {
+ e.consume();
+ }
}
//
diff --git a/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java b/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java
index 517615a..00d8883 100644
--- a/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java
+++ b/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java
@@ -884,7 +884,9 @@
processMouseEvent(me);
break;
case MouseEvent.MOUSE_WHEEL:
- if (isInPopup(src)) {
+ if (isInPopup(src)
+ || ((src instanceof JComboBox) && ((JComboBox) src).isPopupVisible())) {
+
return;
}
cancelPopupMenu();
diff --git a/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java b/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
index 77c2e88..f361814 100644
--- a/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
+++ b/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
@@ -982,7 +982,7 @@
SocketPermission p = URLtoSocketPermission(this.url);
if (p != null) {
try {
- AccessController.doPrivileged(
+ AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<Void>() {
public Void run() throws IOException {
plainConnect0();
@@ -1243,7 +1243,7 @@
if (p != null) {
try {
- return AccessController.doPrivileged(
+ return AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<OutputStream>() {
public OutputStream run() throws IOException {
return getOutputStream0();
@@ -1426,7 +1426,7 @@
if (p != null) {
try {
- return AccessController.doPrivileged(
+ return AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<InputStream>() {
public InputStream run() throws IOException {
return getInputStream0();
@@ -2568,7 +2568,7 @@
if (p != null) {
try {
- return AccessController.doPrivileged(
+ return AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<Boolean>() {
public Boolean run() throws IOException {
return followRedirect0(loc, stat, locUrl0);
diff --git a/src/share/classes/sun/security/krb5/Config.java b/src/share/classes/sun/security/krb5/Config.java
index 48e4e91..129f774 100644
--- a/src/share/classes/sun/security/krb5/Config.java
+++ b/src/share/classes/sun/security/krb5/Config.java
@@ -232,6 +232,31 @@
}
/**
+ * Gets the boolean value for the specified keys. Returns TRUE if the
+ * string value is "yes", or "true", FALSE if "no", or "false", or null
+ * if otherwise or not defined. The comparision is case-insensitive.
+ *
+ * @param keys the keys, see {@link #get(String...)}
+ * @return the boolean value, or null if there is no value defined or the
+ * value does not look like a boolean value.
+ * @throws IllegalArgumentException see {@link #get(String...)}
+ */
+ private Boolean getBooleanObject(String... keys) {
+ String s = get(keys);
+ if (s == null) {
+ return null;
+ }
+ switch (s.toLowerCase(Locale.US)) {
+ case "yes": case "true":
+ return Boolean.TRUE;
+ case "no": case "false":
+ return Boolean.FALSE;
+ default:
+ return null;
+ }
+ }
+
+ /**
* Gets all values for the specified keys.
* @throws IllegalArgumentException if any of the keys is illegal
* (See {@link #get})
@@ -942,32 +967,30 @@
/**
* Check if need to use DNS to locate Kerberos services
*/
- private boolean useDNS(String name) {
- String value = get("libdefaults", name);
- if (value == null) {
- value = get("libdefaults", "dns_fallback");
- if ("false".equalsIgnoreCase(value)) {
- return false;
- } else {
- return true;
- }
- } else {
- return value.equalsIgnoreCase("true");
+ private boolean useDNS(String name, boolean defaultValue) {
+ Boolean value = getBooleanObject("libdefaults", name);
+ if (value != null) {
+ return value.booleanValue();
}
+ value = getBooleanObject("libdefaults", "dns_fallback");
+ if (value != null) {
+ return value.booleanValue();
+ }
+ return defaultValue;
}
/**
* Check if need to use DNS to locate the KDC
*/
private boolean useDNS_KDC() {
- return useDNS("dns_lookup_kdc");
+ return useDNS("dns_lookup_kdc", true);
}
/*
* Check if need to use DNS to locate the Realm
*/
private boolean useDNS_Realm() {
- return useDNS("dns_lookup_realm");
+ return useDNS("dns_lookup_realm", false);
}
/**
diff --git a/src/share/classes/sun/security/pkcs12/PKCS12KeyStore.java b/src/share/classes/sun/security/pkcs12/PKCS12KeyStore.java
index e3759c1..ca4d2d3 100644
--- a/src/share/classes/sun/security/pkcs12/PKCS12KeyStore.java
+++ b/src/share/classes/sun/security/pkcs12/PKCS12KeyStore.java
@@ -1058,6 +1058,39 @@
}
/**
+ * Determines if the keystore {@code Entry} for the specified
+ * {@code alias} is an instance or subclass of the specified
+ * {@code entryClass}.
+ *
+ * @param alias the alias name
+ * @param entryClass the entry class
+ *
+ * @return true if the keystore {@code Entry} for the specified
+ * {@code alias} is an instance or subclass of the
+ * specified {@code entryClass}, false otherwise
+ *
+ * @since 1.5
+ */
+ @Override
+ public boolean
+ engineEntryInstanceOf(String alias,
+ Class<? extends KeyStore.Entry> entryClass)
+ {
+ if (entryClass == KeyStore.TrustedCertificateEntry.class) {
+ return engineIsCertificateEntry(alias);
+ }
+
+ Entry entry = entries.get(alias.toLowerCase(Locale.ENGLISH));
+ if (entryClass == KeyStore.PrivateKeyEntry.class) {
+ return (entry != null && entry instanceof PrivateKeyEntry);
+ }
+ if (entryClass == KeyStore.SecretKeyEntry.class) {
+ return (entry != null && entry instanceof SecretKeyEntry);
+ }
+ return false;
+ }
+
+ /**
* Returns the (alias) name of the first keystore entry whose certificate
* matches the given certificate.
*
@@ -1089,7 +1122,7 @@
} else {
continue;
}
- if (certElem.equals(cert)) {
+ if (certElem != null && certElem.equals(cert)) {
return alias;
}
}
@@ -1932,7 +1965,12 @@
safeContentsData = safeContents.getData();
} else if (contentType.equals((Object)ContentInfo.ENCRYPTED_DATA_OID)) {
if (password == null) {
- continue;
+
+ if (debug != null) {
+ debug.println("Warning: skipping PKCS#7 encryptedData" +
+ " content-type - no password was supplied");
+ }
+ continue;
}
if (debug != null) {
@@ -1974,8 +2012,9 @@
password = new char[1];
continue;
}
- throw new IOException(
- "failed to decrypt safe contents entry: " + e, e);
+ throw new IOException("keystore password was incorrect",
+ new UnrecoverableKeyException(
+ "failed to decrypt safe contents entry: " + e));
}
}
} else {
diff --git a/src/share/classes/sun/security/provider/JavaKeyStore.java b/src/share/classes/sun/security/provider/JavaKeyStore.java
index f7cfb19..6145666 100644
--- a/src/share/classes/sun/security/provider/JavaKeyStore.java
+++ b/src/share/classes/sun/security/provider/JavaKeyStore.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,9 +31,10 @@
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateException;
import java.util.*;
-import sun.misc.IOUtils;
+import sun.misc.IOUtils;
import sun.security.pkcs.EncryptedPrivateKeyInfo;
+import sun.security.pkcs12.PKCS12KeyStore;
/**
* This class provides the keystore implementation referred to as "JKS".
@@ -65,6 +66,13 @@
}
}
+ // special JKS that supports JKS and PKCS12 file formats
+ public static final class DualFormatJKS extends KeyStoreDelegator {
+ public DualFormatJKS() {
+ super("JKS", JKS.class, "PKCS12", PKCS12KeyStore.class);
+ }
+ }
+
private static final int MAGIC = 0xfeedfeed;
private static final int VERSION_1 = 0x01;
private static final int VERSION_2 = 0x02;
diff --git a/src/share/classes/sun/security/provider/KeyStoreDelegator.java b/src/share/classes/sun/security/provider/KeyStoreDelegator.java
new file mode 100644
index 0000000..789d448
--- /dev/null
+++ b/src/share/classes/sun/security/provider/KeyStoreDelegator.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.provider;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.cert.CertificateException;
+import java.util.*;
+
+import sun.security.util.Debug;
+
+/**
+ * This class delegates to a primary or secondary keystore implementation.
+ *
+ * @since 1.8
+ */
+
+class KeyStoreDelegator extends KeyStoreSpi {
+
+ private static final String KEYSTORE_TYPE_COMPAT = "keystore.type.compat";
+ private static final Debug debug = Debug.getInstance("keystore");
+
+ private final String primaryType; // the primary keystore's type
+ private final String secondaryType; // the secondary keystore's type
+ private final Class<? extends KeyStoreSpi> primaryKeyStore;
+ // the primary keystore's class
+ private final Class<? extends KeyStoreSpi> secondaryKeyStore;
+ // the secondary keystore's class
+ private String type; // the delegate's type
+ private KeyStoreSpi keystore; // the delegate
+ private boolean compatModeEnabled = true;
+
+ public KeyStoreDelegator(
+ String primaryType,
+ Class<? extends KeyStoreSpi> primaryKeyStore,
+ String secondaryType,
+ Class<? extends KeyStoreSpi> secondaryKeyStore) {
+
+ // Check whether compatibility mode has been disabled
+ // (Use inner-class instead of lambda to avoid init/ClassLoader problem)
+ compatModeEnabled = "true".equalsIgnoreCase(
+ AccessController.doPrivileged(
+ new PrivilegedAction<String>() {
+ public String run() {
+ return Security.getProperty(KEYSTORE_TYPE_COMPAT);
+ }
+ }
+ ));
+
+ if (compatModeEnabled) {
+ this.primaryType = primaryType;
+ this.secondaryType = secondaryType;
+ this.primaryKeyStore = primaryKeyStore;
+ this.secondaryKeyStore = secondaryKeyStore;
+ } else {
+ this.primaryType = primaryType;
+ this.secondaryType = null;
+ this.primaryKeyStore = primaryKeyStore;
+ this.secondaryKeyStore = null;
+
+ if (debug != null) {
+ debug.println("WARNING: compatibility mode disabled for " +
+ primaryType + " and " + secondaryType + " keystore types");
+ }
+ }
+ }
+
+ @Override
+ public Key engineGetKey(String alias, char[] password)
+ throws NoSuchAlgorithmException, UnrecoverableKeyException {
+ return keystore.engineGetKey(alias, password);
+ }
+
+ @Override
+ public Certificate[] engineGetCertificateChain(String alias) {
+ return keystore.engineGetCertificateChain(alias);
+ }
+
+ @Override
+ public Certificate engineGetCertificate(String alias) {
+ return keystore.engineGetCertificate(alias);
+ }
+
+ @Override
+ public Date engineGetCreationDate(String alias) {
+ return keystore.engineGetCreationDate(alias);
+ }
+
+ @Override
+ public void engineSetKeyEntry(String alias, Key key, char[] password,
+ Certificate[] chain) throws KeyStoreException {
+ keystore.engineSetKeyEntry(alias, key, password, chain);
+ }
+
+ @Override
+ public void engineSetKeyEntry(String alias, byte[] key, Certificate[] chain)
+ throws KeyStoreException {
+ keystore.engineSetKeyEntry(alias, key, chain);
+ }
+
+ @Override
+ public void engineSetCertificateEntry(String alias, Certificate cert)
+ throws KeyStoreException {
+ keystore.engineSetCertificateEntry(alias, cert);
+ }
+
+ @Override
+ public void engineDeleteEntry(String alias) throws KeyStoreException {
+ keystore.engineDeleteEntry(alias);
+ }
+
+ @Override
+ public Enumeration<String> engineAliases() {
+ return keystore.engineAliases();
+ }
+
+ @Override
+ public boolean engineContainsAlias(String alias) {
+ return keystore.engineContainsAlias(alias);
+ }
+
+ @Override
+ public int engineSize() {
+ return keystore.engineSize();
+ }
+
+ @Override
+ public boolean engineIsKeyEntry(String alias) {
+ return keystore.engineIsKeyEntry(alias);
+ }
+
+ @Override
+ public boolean engineIsCertificateEntry(String alias) {
+ return keystore.engineIsCertificateEntry(alias);
+ }
+
+ @Override
+ public String engineGetCertificateAlias(Certificate cert) {
+ return keystore.engineGetCertificateAlias(cert);
+ }
+
+ @Override
+ public KeyStore.Entry engineGetEntry(String alias,
+ KeyStore.ProtectionParameter protParam)
+ throws KeyStoreException, NoSuchAlgorithmException,
+ UnrecoverableEntryException {
+ return keystore.engineGetEntry(alias, protParam);
+ }
+
+ @Override
+ public void engineSetEntry(String alias, KeyStore.Entry entry,
+ KeyStore.ProtectionParameter protParam)
+ throws KeyStoreException {
+ keystore.engineSetEntry(alias, entry, protParam);
+ }
+
+ @Override
+ public boolean engineEntryInstanceOf(String alias,
+ Class<? extends KeyStore.Entry> entryClass) {
+ return keystore.engineEntryInstanceOf(alias, entryClass);
+ }
+
+ @Override
+ public void engineStore(OutputStream stream, char[] password)
+ throws IOException, NoSuchAlgorithmException, CertificateException {
+
+ if (debug != null) {
+ debug.println("Storing keystore in " + type + " format");
+ }
+ keystore.engineStore(stream, password);
+ }
+
+ @Override
+ public void engineLoad(InputStream stream, char[] password)
+ throws IOException, NoSuchAlgorithmException, CertificateException {
+
+ // A new keystore is always created in the primary keystore format
+ if (stream == null || !compatModeEnabled) {
+ try {
+ keystore = primaryKeyStore.newInstance();
+
+ } catch (InstantiationException | IllegalAccessException e) {
+ // can safely ignore
+ }
+ type = primaryType;
+
+ if (debug != null && stream == null) {
+ debug.println("Creating a new keystore in " + type + " format");
+ }
+ keystore.engineLoad(stream, password);
+
+ } else {
+ // First try the primary keystore then try the secondary keystore
+ try (InputStream bufferedStream = new BufferedInputStream(stream)) {
+ bufferedStream.mark(Integer.MAX_VALUE);
+
+ try {
+ keystore = primaryKeyStore.newInstance();
+ type = primaryType;
+ keystore.engineLoad(bufferedStream, password);
+
+ } catch (Exception e) {
+
+ // incorrect password
+ if (e instanceof IOException &&
+ e.getCause() instanceof UnrecoverableKeyException) {
+ throw (IOException)e;
+ }
+
+ try {
+ keystore = secondaryKeyStore.newInstance();
+ type = secondaryType;
+ bufferedStream.reset();
+ keystore.engineLoad(bufferedStream, password);
+
+ if (debug != null) {
+ debug.println("WARNING: switching from " +
+ primaryType + " to " + secondaryType +
+ " keystore file format has altered the " +
+ "keystore security level");
+ }
+
+ } catch (InstantiationException |
+ IllegalAccessException e2) {
+ // can safely ignore
+
+ } catch (IOException |
+ NoSuchAlgorithmException |
+ CertificateException e3) {
+
+ // incorrect password
+ if (e3 instanceof IOException &&
+ e3.getCause() instanceof
+ UnrecoverableKeyException) {
+ throw (IOException)e3;
+ }
+ // rethrow the outer exception
+ if (e instanceof IOException) {
+ throw (IOException)e;
+ } else if (e instanceof CertificateException) {
+ throw (CertificateException)e;
+ } else if (e instanceof NoSuchAlgorithmException) {
+ throw (NoSuchAlgorithmException)e;
+ }
+ }
+ }
+ }
+
+ if (debug != null) {
+ debug.println("Loaded a keystore in " + type + " format");
+ }
+ }
+ }
+}
diff --git a/src/share/classes/sun/security/provider/SunEntries.java b/src/share/classes/sun/security/provider/SunEntries.java
index 5a14e7b..0e33ad8 100644
--- a/src/share/classes/sun/security/provider/SunEntries.java
+++ b/src/share/classes/sun/security/provider/SunEntries.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -228,7 +228,8 @@
/*
* KeyStore
*/
- map.put("KeyStore.JKS", "sun.security.provider.JavaKeyStore$JKS");
+ map.put("KeyStore.JKS",
+ "sun.security.provider.JavaKeyStore$DualFormatJKS");
map.put("KeyStore.CaseExactJKS",
"sun.security.provider.JavaKeyStore$CaseExactJKS");
map.put("KeyStore.DKS", "sun.security.provider.DomainKeyStore$DKS");
diff --git a/src/share/lib/security/java.security-aix b/src/share/lib/security/java.security-aix
index c0f9d5f..3a2adc8 100644
--- a/src/share/lib/security/java.security-aix
+++ b/src/share/lib/security/java.security-aix
@@ -171,6 +171,15 @@
keystore.type=jks
#
+# Controls compatibility mode for the JKS keystore type.
+#
+# When set to 'true', the JKS keystore type supports loading
+# keystore files in either JKS or PKCS12 format. When set to 'false'
+# it supports loading only JKS keystore files.
+#
+keystore.type.compat=true
+
+#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
diff --git a/src/share/lib/security/java.security-linux b/src/share/lib/security/java.security-linux
index c0f9d5f..3a2adc8 100644
--- a/src/share/lib/security/java.security-linux
+++ b/src/share/lib/security/java.security-linux
@@ -171,6 +171,15 @@
keystore.type=jks
#
+# Controls compatibility mode for the JKS keystore type.
+#
+# When set to 'true', the JKS keystore type supports loading
+# keystore files in either JKS or PKCS12 format. When set to 'false'
+# it supports loading only JKS keystore files.
+#
+keystore.type.compat=true
+
+#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
diff --git a/src/share/lib/security/java.security-macosx b/src/share/lib/security/java.security-macosx
index 329a1c5..614defa 100644
--- a/src/share/lib/security/java.security-macosx
+++ b/src/share/lib/security/java.security-macosx
@@ -172,6 +172,15 @@
keystore.type=jks
#
+# Controls compatibility mode for the JKS keystore type.
+#
+# When set to 'true', the JKS keystore type supports loading
+# keystore files in either JKS or PKCS12 format. When set to 'false'
+# it supports loading only JKS keystore files.
+#
+keystore.type.compat=true
+
+#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
diff --git a/src/share/lib/security/java.security-solaris b/src/share/lib/security/java.security-solaris
index 51a4203..45dfdf5 100644
--- a/src/share/lib/security/java.security-solaris
+++ b/src/share/lib/security/java.security-solaris
@@ -173,6 +173,15 @@
keystore.type=jks
#
+# Controls compatibility mode for the JKS keystore type.
+#
+# When set to 'true', the JKS keystore type supports loading
+# keystore files in either JKS or PKCS12 format. When set to 'false'
+# it supports loading only JKS keystore files.
+#
+keystore.type.compat=true
+
+#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
diff --git a/src/share/lib/security/java.security-windows b/src/share/lib/security/java.security-windows
index df27a5d..aedb39a 100644
--- a/src/share/lib/security/java.security-windows
+++ b/src/share/lib/security/java.security-windows
@@ -172,6 +172,15 @@
keystore.type=jks
#
+# Controls compatibility mode for the JKS keystore type.
+#
+# When set to 'true', the JKS keystore type supports loading
+# keystore files in either JKS or PKCS12 format. When set to 'false'
+# it supports loading only JKS keystore files.
+#
+keystore.type.compat=true
+
+#
# List of comma-separated packages that start with or equal this string
# will cause a security exception to be thrown when
# passed to checkPackageAccess unless the
diff --git a/src/solaris/classes/sun/awt/X11/XWindow.java b/src/solaris/classes/sun/awt/X11/XWindow.java
index 65fb345..d455979 100644
--- a/src/solaris/classes/sun/awt/X11/XWindow.java
+++ b/src/solaris/classes/sun/awt/X11/XWindow.java
@@ -568,10 +568,6 @@
}
static int getModifiers(int state, int button, int keyCode) {
- return getModifiers(state, button, keyCode, 0, false);
- }
-
- static int getModifiers(int state, int button, int keyCode, int type, boolean wheel_mouse) {
int modifiers = 0;
if (((state & XConstants.ShiftMask) != 0) ^ (keyCode == KeyEvent.VK_SHIFT)) {
@@ -602,7 +598,7 @@
// ONLY one of these conditions should be TRUE to add that modifier.
if (((state & XlibUtil.getButtonMask(i + 1)) != 0) != (button == XConstants.buttons[i])){
//exclude wheel buttons from adding their numbers as modifiers
- if (!wheel_mouse) {
+ if (!isWheel(XConstants.buttons[i])) {
modifiers |= InputEvent.getMaskForButton(i+1);
}
}
@@ -610,6 +606,11 @@
return modifiers;
}
+ static boolean isWheel(int button) {
+ // 4 and 5 buttons are usually considered assigned to a first wheel
+ return button == XConstants.buttons[3] || button == XConstants.buttons[4];
+ }
+
static int getXModifiers(AWTKeyStroke stroke) {
int mods = stroke.getModifiers();
int res = 0;
@@ -649,7 +650,6 @@
int modifiers;
boolean popupTrigger = false;
int button=0;
- boolean wheel_mouse = false;
int lbutton = xbe.get_button();
/*
* Ignore the buttons above 20 due to the bit limit for
@@ -702,11 +702,6 @@
}
button = XConstants.buttons[lbutton - 1];
- // 4 and 5 buttons are usually considered assigned to a first wheel
- if (lbutton == XConstants.buttons[3] ||
- lbutton == XConstants.buttons[4]) {
- wheel_mouse = true;
- }
// mapping extra buttons to numbers starting from 4.
if ((button > XConstants.buttons[4]) && (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled())){
@@ -716,9 +711,9 @@
if (button > XConstants.buttons[4]){
button -= 2;
}
- modifiers = getModifiers(xbe.get_state(),button,0, type, wheel_mouse);
+ modifiers = getModifiers(xbe.get_state(),button,0);
- if (!wheel_mouse) {
+ if (!isWheel(lbutton)) {
MouseEvent me = new MouseEvent((Component)getEventSource(),
type == XConstants.ButtonPress ? MouseEvent.MOUSE_PRESSED : MouseEvent.MOUSE_RELEASED,
jWhen,modifiers, x, y,
diff --git a/src/solaris/native/sun/awt/awt_InputMethod.c b/src/solaris/native/sun/awt/awt_InputMethod.c
index 93a69ad..07588c8 100644
--- a/src/solaris/native/sun/awt/awt_InputMethod.c
+++ b/src/solaris/native/sun/awt/awt_InputMethod.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -904,7 +904,6 @@
static Bool
createXIC(JNIEnv * env, X11InputMethodData *pX11IMData, Window w)
{
- XIC active_ic, passive_ic;
XVaNestedList preedit = NULL;
XVaNestedList status = NULL;
XIMStyle on_the_spot_styles = XIMPreeditCallbacks,
@@ -974,6 +973,12 @@
}
if (active_styles == on_the_spot_styles) {
+ pX11IMData->ic_passive = XCreateIC(X11im,
+ XNClientWindow, w,
+ XNFocusWindow, w,
+ XNInputStyle, passive_styles,
+ NULL);
+
callbacks = (XIMCallback *)malloc(sizeof(XIMCallback) * NCALLBACKS);
if (callbacks == (XIMCallback *)NULL)
return False;
@@ -1024,12 +1029,6 @@
NULL);
XFree((void *)preedit);
#endif /* __linux__ || MACOSX */
- pX11IMData->ic_passive = XCreateIC(X11im,
- XNClientWindow, w,
- XNFocusWindow, w,
- XNInputStyle, passive_styles,
- NULL);
-
} else {
pX11IMData->ic_active = XCreateIC(X11im,
XNClientWindow, w,
diff --git a/src/solaris/native/sun/awt/utility/rect.h b/src/solaris/native/sun/awt/utility/rect.h
index 063caa3..ceea38f 100644
--- a/src/solaris/native/sun/awt/utility/rect.h
+++ b/src/solaris/native/sun/awt/utility/rect.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2014 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
diff --git a/src/windows/bin/java_md.c b/src/windows/bin/java_md.c
index cf146ed..0474cc9 100644
--- a/src/windows/bin/java_md.c
+++ b/src/windows/bin/java_md.c
@@ -1407,6 +1407,26 @@
return JNI_FALSE;
}
+int
+filterArgs(StdArg *stdargs, const int nargc, StdArg **pargv) {
+ StdArg* argv = NULL;
+ int nargs = 0;
+ int i;
+
+ /* Copy the non-vm args */
+ for (i = 0; i < nargc ; i++) {
+ const char *arg = stdargs[i].arg;
+ if (arg[0] == '-' && arg[1] == 'J')
+ continue;
+ argv = (StdArg*) JLI_MemRealloc(argv, (nargs+1) * sizeof(StdArg));
+ argv[nargs].arg = JLI_StringDup(arg);
+ argv[nargs].has_wildcard = stdargs[i].has_wildcard;
+ nargs++;
+ }
+ *pargv = argv;
+ return nargs;
+}
+
/*
* At this point we have the arguments to the application, and we need to
* check with original stdargs in order to compare which of these truly
@@ -1421,8 +1441,9 @@
char *ostart, *astart, **nargv;
jboolean needs_expansion = JNI_FALSE;
jmethodID mid;
- int stdargc;
+ int filteredargc, stdargc;
StdArg *stdargs;
+ StdArg *filteredargs;
jclass cls = GetLauncherHelperClass(env);
NULL_CHECK0(cls);
@@ -1433,6 +1454,8 @@
stdargs = JLI_GetStdArgs();
stdargc = JLI_GetStdArgc();
+ filteredargc = filterArgs(stdargs, stdargc, &filteredargs);
+
// sanity check, this should never happen
if (argc > stdargc) {
JLI_TraceLauncher("Warning: app args is larger than the original, %d %d\n", argc, stdargc);
@@ -1441,8 +1464,8 @@
}
// sanity check, match the args we have, to the holy grail
- idx = stdargc - argc;
- ostart = stdargs[idx].arg;
+ idx = filteredargc - argc;
+ ostart = filteredargs[idx].arg;
astart = strv[0];
// sanity check, ensure that the first argument of the arrays are the same
if (JLI_StrCmp(ostart, astart) != 0) {
@@ -1455,8 +1478,8 @@
// make a copy of the args which will be expanded in java if required.
nargv = (char **)JLI_MemAlloc(argc * sizeof(char*));
for (i = 0, j = idx; i < argc; i++, j++) {
- jboolean arg_expand = (JLI_StrCmp(stdargs[j].arg, strv[i]) == 0)
- ? stdargs[j].has_wildcard
+ jboolean arg_expand = (JLI_StrCmp(filteredargs[j].arg, strv[i]) == 0)
+ ? filteredargs[j].has_wildcard
: JNI_FALSE;
if (needs_expansion == JNI_FALSE)
needs_expansion = arg_expand;
@@ -1493,5 +1516,6 @@
JLI_MemFree(nargv[i]);
}
JLI_MemFree(nargv);
+ JLI_MemFree(filteredargs);
return outArray;
}
diff --git a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRelation.java b/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRelation.java
deleted file mode 100644
index 93a5e31..0000000
--- a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRelation.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.java.accessibility.extensions;
-
-import javax.accessibility.*;
-
-/**
- * <P>Class AccessibleExtendedRelation contains extensions to the class
- * AccessibleRelation that are currently not in a public API.
- *
- * <P>Class AccessibleRelation describes a relation between the
- * object that implements the AccessibleRelation and one or more other
- * objects. The actual relations that an object has with other
- * objects are defined as an AccessibleRelationSet, which is a composed
- * set of AccessibleRelations.
- * <p>The toDisplayString method allows you to obtain the localized string
- * for a locale independent key from a predefined ResourceBundle for the
- * keys defined in this class.
- * <p>The constants in this class present a strongly typed enumeration
- * of common object roles. If the constants in this class are not sufficient
- * to describe the role of an object, a subclass should be generated
- * from this class and it should provide constants in a similar manner.
- *
- */
-
-public class AccessibleExtendedRelation
- extends AccessibleExtendedRelationConstants {
-
- public AccessibleExtendedRelation(String s) {
- super(s);
- }
-
- public AccessibleExtendedRelation(String key, Object target) {
- super(key, target);
- }
-}
diff --git a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRelationConstants.java b/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRelationConstants.java
deleted file mode 100644
index 28dd52c..0000000
--- a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRelationConstants.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.java.accessibility.extensions;
-
-import javax.accessibility.*;
-
-/**
- * <P>Class AccessibleExtendedRelation contains extensions to the class
- * AccessibleRelation that are currently not in a public API.
- *
- * <P>Class AccessibleRelation describes a relation between the
- * object that implements the AccessibleRelation and one or more other
- * objects. The actual relations that an object has with other
- * objects are defined as an AccessibleRelationSet, which is a composed
- * set of AccessibleRelations.
- * <p>The toDisplayString method allows you to obtain the localized string
- * for a locale independent key from a predefined ResourceBundle for the
- * keys defined in this class.
- * <p>The constants in this class present a strongly typed enumeration
- * of common object roles. If the constants in this class are not sufficient
- * to describe the role of an object, a subclass should be generated
- * from this class and it should provide constants in a similar manner.
- *
- */
-
-public abstract class AccessibleExtendedRelationConstants
- extends AccessibleRelation {
-
- /**
- * Indicates that one AccessibleText object is linked to the
- * target AccessibleText object(s). <p> A good example is a StarOffice
- * text window with the bottom of one page, a footer, a header,
- * and the top of another page all visible in the window. There
- * should be a FLOWS_TO relation from the last chunk of AccessibleText
- * in the bottom of one page to the first AccessibleText object at the
- * top of the next page, skipping over the AccessibleText object(s)
- * that make up the header and footer. A corresponding FLOWS_FROM
- * relation would link the AccessibleText object in the next page to
- * the last one in the previous page.
- * @see AccessibleExtendedRole.FLOWS_FROM
- */
- public static final String FLOWS_TO = "flowsTo";
-
- /**
- * Indicates that one AccessibleText object is linked to the
- * target AccessibleText object(s).
- * @see AccessibleExtendedRole.FLOWS_TO
- */
- public static final String FLOWS_FROM = "flowsFrom";
-
- /**
- * Indicates a component is a subwindow of a target component
- */
- public static final String SUBWINDOW_OF = "subwindowOf";
-
- /**
- * Identifies that the linkage between one AccessibleText
- * object and the target AccessibleText object(s) has changed.
- * @see AccessibleExtendedRole.FLOWS_TO
- * @see AccessibleExtendedRole.FLOWS_FROM
- */
- public static final String FLOWS_TO_PROPERTY = "flowsToProperty";
-
- /**
- * Identifies that the linkage between one AccessibleText
- * object and the target AccessibleText object(s) has changed.
- * @see AccessibleExtendedRole.FLOWS_TO
- * @see AccessibleExtendedRole.FLOWS_FROM
- */
- public static final String FLOWS_FROM_PROPERTY = "flowsFromProperty";
-
- /**
- * Identifies the subwindow relationship between two components
- * has changed
- */
- public static final String SUBWINDOW_OF_PROPERTY = "subwindowOfProperty";
-
- public AccessibleExtendedRelationConstants(String s) {
- super(s);
- }
-
- public AccessibleExtendedRelationConstants(String key, Object target) {
- super(key, target);
- }
-}
diff --git a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRole.java b/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRole.java
deleted file mode 100644
index 207eefb..0000000
--- a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRole.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.java.accessibility.extensions;
-
-import javax.accessibility.*;
-
-/**
- * <P>Class AccessibleExtendedRole contains extensions to the class
- * AccessibleRole that are currently not in a public API.
- *
- * <P>Class AccessibleRole determines the role of a component. The role
- * of a component describes its generic function. (E.G.,
- * "push button," "table," or "list.")
- * <p>The constants in this class present a strongly typed enumeration
- * of common object roles. A public constructor for this class has been
- * purposely omitted and applications should use one of the constants
- * from this class. If the constants in this class are not sufficient
- * to describe the role of an object, a subclass should be generated
- * from this class and it should provide constants in a similar manner.
- *
- */
-
-public class AccessibleExtendedRole extends AccessibleExtendedRoleConstants {
-
- public AccessibleExtendedRole(String s) {
- super(s);
- }
-}
diff --git a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRoleConstants.java b/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRoleConstants.java
deleted file mode 100644
index 708c013..0000000
--- a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedRoleConstants.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.java.accessibility.extensions;
-
-import javax.accessibility.*;
-
-/**
- * <P>Class AccessibleExtendedRole contains extensions to the class
- * AccessibleRole that are currently not in a public API.
- *
- * <P>Class AccessibleRole determines the role of a component. The role
- * of a component describes its generic function. (E.G.,
- * "push button," "table," or "list.")
- * <p>The constants in this class present a strongly typed enumeration
- * of common object roles. A public constructor for this class has been
- * purposely omitted and applications should use one of the constants
- * from this class. If the constants in this class are not sufficient
- * to describe the role of an object, a subclass should be generated
- * from this class and it should provide constants in a similar manner.
- *
- */
-
-public abstract class AccessibleExtendedRoleConstants extends AccessibleRole {
-
- /**
- * Indicates this component is a text header.
- */
- public static final AccessibleExtendedRole HEADER
- = new AccessibleExtendedRole("Header");
-
- /**
- * Indicates this component is a text footer.
- */
- public static final AccessibleExtendedRole FOOTER
- = new AccessibleExtendedRole("Footer");
-
- /**
- * Indicates this component is a text paragraph.
- */
- public static final AccessibleExtendedRole PARAGRAPH
- = new AccessibleExtendedRole("Paragraph");
-
- /**
- * Indicates this component is a ruler.
- */
- public static final AccessibleExtendedRole RULER
- = new AccessibleExtendedRole("RULER");
-
- public AccessibleExtendedRoleConstants(String s) {
- super(s);
- }
-}
diff --git a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedState.java b/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedState.java
deleted file mode 100644
index 96838f2..0000000
--- a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedState.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.java.accessibility.extensions;
-
-import javax.accessibility.*;
-
-/**
- * <P>Class AccessibleState describes a component's particular state. The actual
- * state of the component is defined as an AccessibleStateSet, which is a
- * composed set of AccessibleStates.
- * <p>The toDisplayString method allows you to obtain the localized string
- * for a locale independent key from a predefined ResourceBundle for the
- * keys defined in this class.
- * <p>The constants in this class present a strongly typed enumeration
- * of common object roles. A public constructor for this class has been
- * purposely omitted and applications should use one of the constants
- * from this class. If the constants in this class are not sufficient
- * to describe the role of an object, a subclass should be generated
- * from this class and it should provide constants in a similar manner.
- *
- */
-
-public abstract class AccessibleExtendedState
- extends AccessibleExtendedStateConstants {
-
- public AccessibleExtendedState(String s) {
- super(s);
- }
-}
diff --git a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedStateConstants.java b/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedStateConstants.java
deleted file mode 100644
index 6737cc4..0000000
--- a/src/windows/classes/com/sun/java/accessibility/extensions/AccessibleExtendedStateConstants.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.java.accessibility.extensions;
-
-import javax.accessibility.*;
-
-/**
- * <P>Class AccessibleState describes a component's particular state. The actual
- * state of the component is defined as an AccessibleStateSet, which is a
- * composed set of AccessibleStates.
- * <p>The toDisplayString method allows you to obtain the localized string
- * for a locale independent key from a predefined ResourceBundle for the
- * keys defined in this class.
- * <p>The constants in this class present a strongly typed enumeration
- * of common object roles. A public constructor for this class has been
- * purposely omitted and applications should use one of the constants
- * from this class. If the constants in this class are not sufficient
- * to describe the role of an object, a subclass should be generated
- * from this class and it should provide constants in a similar manner.
- *
- */
-
-public abstract class AccessibleExtendedStateConstants extends AccessibleState {
-
- /**
- * Indicates a component is responsible for managing
- * its subcomponents.
- */
- public static final AccessibleExtendedState MANAGES_DESCENDENTS
- = new AccessibleExtendedState("managesDescendents");
-
- public AccessibleExtendedStateConstants(String s) {
- super(s);
- }
-}
diff --git a/src/windows/classes/com/sun/java/accessibility/util/java/awt/ChoiceTranslator.java b/src/windows/classes/com/sun/java/accessibility/util/java/awt/ChoiceTranslator.java
deleted file mode 100644
index f56becb..0000000
--- a/src/windows/classes/com/sun/java/accessibility/util/java/awt/ChoiceTranslator.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.java.accessibility.util.java.awt;
-
-import java.lang.*;
-import java.util.*;
-import java.awt.*;
-import java.awt.image.*;
-import javax.accessibility.*;
-import com.sun.java.accessibility.util.*;
-
-/**
- * <p>The Translator class provides a translation to interface Accessible
- * for objects that do not implement interface Accessible. Assistive
- * technologies can use the 'getAccessible' class method of Translator to
- * obtain an object that implements interface Accessible. If the object
- * passed in already implements interface Accessible, getAccessible merely
- * returns the object.
- *
- * <p>An example of how an assistive technology might use the Translator
- * class is as follows:
- *
- * <PRE>
- * Accessible accessible = Translator.getAccessible(someObj);
- * // obtain information from the 'accessible' object.
- * </PRE>
- *
- * <P>This class extends the Translator class to provide specific support
- * for the Choice class. Translator.getAccessible() will automatically
- * load this class when an assistive technology asks for an accessible
- * translator for Choice.
- *
- */
-public class ChoiceTranslator extends Translator {
-
- /**
- * Get the state of this object.
- * @return an instance of AccessibleState containing the current state of the object
- * @see AccessibleState
- */
- public AccessibleStateSet getAccessibleStateSet() {
- AccessibleStateSet states = super.getAccessibleStateSet();
- states.add(AccessibleState.SELECTED);
- return states;
- }
-
- public AccessibleRole getAccessibleRole() {
- return AccessibleRole.CHOICE;
- }
-}
diff --git a/src/windows/classes/java/util/prefs/WindowsPreferences.java b/src/windows/classes/java/util/prefs/WindowsPreferences.java
index 53678e5..6c0e8f3 100644
--- a/src/windows/classes/java/util/prefs/WindowsPreferences.java
+++ b/src/windows/classes/java/util/prefs/WindowsPreferences.java
@@ -53,8 +53,8 @@
/**
* Windows registry path to <tt>Preferences</tt>'s root nodes.
*/
- private static final byte[] WINDOWS_ROOT_PATH
- = stringToByteArray("Software\\JavaSoft\\Prefs");
+ private static final byte[] WINDOWS_ROOT_PATH =
+ stringToByteArray("Software\\JavaSoft\\Prefs");
/**
* Windows handles to <tt>HKEY_CURRENT_USER</tt> and
@@ -138,12 +138,12 @@
* Java wrapper for Windows registry API RegOpenKey()
*/
private static native int[] WindowsRegOpenKey(int hKey, byte[] subKey,
- int securityMask);
+ int securityMask);
/**
* Retries RegOpenKey() MAX_ATTEMPTS times before giving up.
*/
private static int[] WindowsRegOpenKey1(int hKey, byte[] subKey,
- int securityMask) {
+ int securityMask) {
int[] result = WindowsRegOpenKey(hKey, subKey, securityMask);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
return result;
@@ -158,16 +158,16 @@
} else if (result[ERROR_CODE] != ERROR_ACCESS_DENIED) {
long sleepTime = INIT_SLEEP_TIME;
for (int i = 0; i < MAX_ATTEMPTS; i++) {
- try {
- Thread.sleep(sleepTime);
- } catch(InterruptedException e) {
- return result;
- }
- sleepTime *= 2;
- result = WindowsRegOpenKey(hKey, subKey, securityMask);
- if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
- }
+ try {
+ Thread.sleep(sleepTime);
+ } catch(InterruptedException e) {
+ return result;
+ }
+ sleepTime *= 2;
+ result = WindowsRegOpenKey(hKey, subKey, securityMask);
+ if (result[ERROR_CODE] == ERROR_SUCCESS) {
+ return result;
+ }
}
}
return result;
@@ -189,10 +189,10 @@
private static int[] WindowsRegCreateKeyEx1(int hKey, byte[] subKey) {
int[] result = WindowsRegCreateKeyEx(hKey, subKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -201,7 +201,7 @@
sleepTime *= 2;
result = WindowsRegCreateKeyEx(hKey, subKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -223,10 +223,10 @@
private static int WindowsRegFlushKey1(int hKey) {
int result = WindowsRegFlushKey(hKey);
if (result == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -235,7 +235,7 @@
sleepTime *= 2;
result = WindowsRegFlushKey(hKey);
if (result == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -246,23 +246,23 @@
* Java wrapper for Windows registry API RegQueryValueEx()
*/
private static native byte[] WindowsRegQueryValueEx(int hKey,
- byte[] valueName);
+ byte[] valueName);
/**
* Java wrapper for Windows registry API RegSetValueEx()
*/
private static native int WindowsRegSetValueEx(int hKey, byte[] valueName,
- byte[] value);
+ byte[] value);
/**
* Retries RegSetValueEx() MAX_ATTEMPTS times before giving up.
*/
private static int WindowsRegSetValueEx1(int hKey, byte[] valueName,
- byte[] value) {
+ byte[] value) {
int result = WindowsRegSetValueEx(hKey, valueName, value);
if (result == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -271,7 +271,7 @@
sleepTime *= 2;
result = WindowsRegSetValueEx(hKey, valueName, value);
if (result == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -294,10 +294,10 @@
private static int[] WindowsRegQueryInfoKey1(int hKey) {
int[] result = WindowsRegQueryInfoKey(hKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -306,7 +306,7 @@
sleepTime *= 2;
result = WindowsRegQueryInfoKey(hKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -317,19 +317,19 @@
* Java wrapper for Windows registry API RegEnumKeyEx()
*/
private static native byte[] WindowsRegEnumKeyEx(int hKey, int subKeyIndex,
- int maxKeyLength);
+ int maxKeyLength);
/**
* Retries RegEnumKeyEx() MAX_ATTEMPTS times before giving up.
*/
private static byte[] WindowsRegEnumKeyEx1(int hKey, int subKeyIndex,
- int maxKeyLength) {
+ int maxKeyLength) {
byte[] result = WindowsRegEnumKeyEx(hKey, subKeyIndex, maxKeyLength);
if (result != null) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -338,7 +338,7 @@
sleepTime *= 2;
result = WindowsRegEnumKeyEx(hKey, subKeyIndex, maxKeyLength);
if (result != null) {
- return result;
+ return result;
}
}
}
@@ -349,19 +349,19 @@
* Java wrapper for Windows registry API RegEnumValue()
*/
private static native byte[] WindowsRegEnumValue(int hKey, int valueIndex,
- int maxValueNameLength);
+ int maxValueNameLength);
/**
* Retries RegEnumValueEx() MAX_ATTEMPTS times before giving up.
*/
private static byte[] WindowsRegEnumValue1(int hKey, int valueIndex,
- int maxValueNameLength) {
+ int maxValueNameLength) {
byte[] result = WindowsRegEnumValue(hKey, valueIndex,
- maxValueNameLength);
+ maxValueNameLength);
if (result != null) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -369,9 +369,9 @@
}
sleepTime *= 2;
result = WindowsRegEnumValue(hKey, valueIndex,
- maxValueNameLength);
+ maxValueNameLength);
if (result != null) {
- return result;
+ return result;
}
}
}
@@ -395,11 +395,11 @@
int[] result =
WindowsRegCreateKeyEx1(parentNativeHandle, toWindowsName(name));
if (result[ERROR_CODE] != ERROR_SUCCESS) {
- logger().warning("Could not create windows registry "
- + "node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegCreateKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".");
+ logger().warning("Could not create windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegCreateKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".");
isBackingStoreAvailable = false;
return;
}
@@ -417,15 +417,15 @@
* @param rootDirectory Path to root directory, as a byte-encoded string.
*/
private WindowsPreferences(int rootNativeHandle, byte[] rootDirectory) {
- super(null,"");
+ super(null, "");
int[] result =
WindowsRegCreateKeyEx1(rootNativeHandle, rootDirectory);
if (result[ERROR_CODE] != ERROR_SUCCESS) {
logger().warning("Could not open/create prefs root node " +
- byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) +
- ". Windows RegCreateKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".");
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegCreateKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".");
isBackingStoreAvailable = false;
return;
}
@@ -442,7 +442,7 @@
private byte[] windowsAbsolutePath() {
ByteArrayOutputStream bstream = new ByteArrayOutputStream();
bstream.write(WINDOWS_ROOT_PATH, 0, WINDOWS_ROOT_PATH.length-1);
- StringTokenizer tokenizer = new StringTokenizer(absolutePath(),"/");
+ StringTokenizer tokenizer = new StringTokenizer(absolutePath(), "/");
while (tokenizer.hasMoreTokens()) {
bstream.write((byte)'\\');
String nextName = tokenizer.nextToken();
@@ -496,27 +496,30 @@
/* Check if key's path is short enough be opened at once
otherwise use a path-splitting procedure */
if (windowsAbsolutePath.length <= MAX_WINDOWS_PATH_LENGTH + 1) {
- int[] result = WindowsRegOpenKey1(rootNativeHandle(),
- windowsAbsolutePath, mask1);
- if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
- result = WindowsRegOpenKey1(rootNativeHandle(),
- windowsAbsolutePath, mask2);
+ int[] result = WindowsRegOpenKey1(rootNativeHandle(),
+ windowsAbsolutePath, mask1);
+ if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
+ result = WindowsRegOpenKey1(rootNativeHandle(),
+ windowsAbsolutePath, mask2);
- if (result[ERROR_CODE] != ERROR_SUCCESS) {
- logger().warning("Could not open windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegOpenKey(...) returned error code " +
- result[ERROR_CODE] + ".");
+ if (result[ERROR_CODE] != ERROR_SUCCESS) {
+ logger().warning("Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegOpenKey(...) returned error code " +
+ result[ERROR_CODE] + ".");
result[NATIVE_HANDLE] = NULL_NATIVE_HANDLE;
if (result[ERROR_CODE] == ERROR_ACCESS_DENIED) {
- throw new SecurityException("Could not open windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ": Access denied");
+ throw new SecurityException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ": Access denied");
}
- }
- return result[NATIVE_HANDLE];
+ }
+ return result[NATIVE_HANDLE];
} else {
return openKey(rootNativeHandle(), windowsAbsolutePath, mask1, mask2);
}
@@ -539,21 +542,21 @@
int mask1, int mask2) {
/* If the path is short enough open at once. Otherwise split the path */
if (windowsRelativePath.length <= MAX_WINDOWS_PATH_LENGTH + 1 ) {
- int[] result = WindowsRegOpenKey1(nativeHandle,
- windowsRelativePath, mask1);
- if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
- result = WindowsRegOpenKey1(nativeHandle,
- windowsRelativePath, mask2);
+ int[] result = WindowsRegOpenKey1(nativeHandle,
+ windowsRelativePath, mask1);
+ if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
+ result = WindowsRegOpenKey1(nativeHandle,
+ windowsRelativePath, mask2);
- if (result[ERROR_CODE] != ERROR_SUCCESS) {
- logger().warning("Could not open windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(nativeHandle) +
- ". Windows RegOpenKey(...) returned error code " +
- result[ERROR_CODE] + ".");
+ if (result[ERROR_CODE] != ERROR_SUCCESS) {
+ logger().warning("Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(nativeHandle) +
+ ". Windows RegOpenKey(...) returned error code " +
+ result[ERROR_CODE] + ".");
result[NATIVE_HANDLE] = NULL_NATIVE_HANDLE;
- }
- return result[NATIVE_HANDLE];
+ }
+ return result[NATIVE_HANDLE];
} else {
int separatorPosition = -1;
// Be greedy - open the longest possible path
@@ -595,10 +598,12 @@
private void closeKey(int nativeHandle) {
int result = WindowsRegCloseKey(nativeHandle);
if (result != ERROR_SUCCESS) {
- logger().warning("Could not close windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegCloseKey(...) returned error code " + result + ".");
+ logger().warning("Could not close windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegCloseKey(...) returned error code " +
+ result + ".");
}
}
@@ -609,22 +614,25 @@
* @see #getSpi(String)
*/
protected void putSpi(String javaName, String value) {
- int nativeHandle = openKey(KEY_SET_VALUE);
- if (nativeHandle == NULL_NATIVE_HANDLE) {
- isBackingStoreAvailable = false;
- return;
- }
- int result = WindowsRegSetValueEx1(nativeHandle,
- toWindowsName(javaName), toWindowsValueString(value));
- if (result != ERROR_SUCCESS) {
- logger().warning("Could not assign value to key " +
- byteArrayToString(toWindowsName(javaName))+ " at Windows registry node "
- + byteArrayToString(windowsAbsolutePath()) + " at root 0x"
- + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegSetValueEx(...) returned error code " + result + ".");
- isBackingStoreAvailable = false;
+ int nativeHandle = openKey(KEY_SET_VALUE);
+ if (nativeHandle == NULL_NATIVE_HANDLE) {
+ isBackingStoreAvailable = false;
+ return;
}
- closeKey(nativeHandle);
+ int result = WindowsRegSetValueEx1(nativeHandle,
+ toWindowsName(javaName), toWindowsValueString(value));
+ if (result != ERROR_SUCCESS) {
+ logger().warning("Could not assign value to key " +
+ byteArrayToString(toWindowsName(javaName)) +
+ " at Windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegSetValueEx(...) returned error code " +
+ result + ".");
+ isBackingStoreAvailable = false;
+ }
+ closeKey(nativeHandle);
}
/**
@@ -663,12 +671,12 @@
int result =
WindowsRegDeleteValue(nativeHandle, toWindowsName(key));
if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) {
- logger().warning("Could not delete windows registry "
- + "value " + byteArrayToString(windowsAbsolutePath())+ "\\" +
- toWindowsName(key) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) +
- ". Windows RegDeleteValue(...) returned error code " +
- result + ".");
+ logger().warning("Could not delete windows registry value " +
+ byteArrayToString(windowsAbsolutePath()) + "\\" +
+ toWindowsName(key) + " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegDeleteValue(...) returned error code " +
+ result + ".");
isBackingStoreAvailable = false;
}
closeKey(nativeHandle);
@@ -684,17 +692,20 @@
// Find out the number of values
int nativeHandle = openKey(KEY_QUERY_VALUE);
if (nativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
int[] result = WindowsRegQueryInfoKey1(nativeHandle);
if (result[ERROR_CODE] != ERROR_SUCCESS) {
- String info = "Could not query windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegQueryInfoKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".";
+ String info = "Could not query windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegQueryInfoKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -703,17 +714,17 @@
if (valuesNumber == 0) {
closeKey(nativeHandle);
return new String[0];
- }
- // Get the values
- String[] valueNames = new String[valuesNumber];
- for (int i = 0; i < valuesNumber; i++) {
+ }
+ // Get the values
+ String[] valueNames = new String[valuesNumber];
+ for (int i = 0; i < valuesNumber; i++) {
byte[] windowsName = WindowsRegEnumValue1(nativeHandle, i,
- maxValueNameLength+1);
+ maxValueNameLength+1);
if (windowsName == null) {
String info =
- "Could not enumerate value #" + i + " of windows node " +
- byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) + ".";
+ "Could not enumerate value #" + i + " of windows node " +
+ byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -731,20 +742,22 @@
*/
protected String[] childrenNamesSpi() throws BackingStoreException {
// Open key
- int nativeHandle = openKey(KEY_ENUMERATE_SUB_KEYS| KEY_QUERY_VALUE);
+ int nativeHandle = openKey(KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE);
if (nativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
// Get number of children
int[] result = WindowsRegQueryInfoKey1(nativeHandle);
if (result[ERROR_CODE] != ERROR_SUCCESS) {
- String info = "Could not query windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegQueryInfoKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".";
+ String info = "Could not query windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegQueryInfoKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -759,12 +772,12 @@
// Get children
for (int i = 0; i < subKeysNumber; i++) {
byte[] windowsName = WindowsRegEnumKeyEx1(nativeHandle, i,
- maxKeyLength+1);
+ maxKeyLength+1);
if (windowsName == null) {
String info =
- "Could not enumerate key #" + i + " of windows node " +
- byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) + ". ";
+ "Could not enumerate key #" + i + " of windows node " +
+ byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ". ";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -789,20 +802,24 @@
}
if (!isBackingStoreAvailable) {
throw new BackingStoreException(
- "flush(): Backing store not available.");
+ "flush(): Backing store not available.");
}
int nativeHandle = openKey(KEY_READ);
if (nativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
int result = WindowsRegFlushKey1(nativeHandle);
if (result != ERROR_SUCCESS) {
- String info = "Could not flush windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath())
- + " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegFlushKey(...) returned error code " + result + ".";
+ String info = "Could not flush windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegFlushKey(...) returned error code " +
+ result + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -829,7 +846,7 @@
* Logs a warning message, if Windows Registry is unavailable.
*/
protected AbstractPreferences childSpi(String name) {
- return new WindowsPreferences(this, name);
+ return new WindowsPreferences(this, name);
}
/**
@@ -840,20 +857,22 @@
*/
public void removeNodeSpi() throws BackingStoreException {
int parentNativeHandle =
- ((WindowsPreferences)parent()).openKey(DELETE);
+ ((WindowsPreferences)parent()).openKey(DELETE);
if (parentNativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open parent windows"
- + "registry node of " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open parent windows registry node of " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
int result =
WindowsRegDeleteKey(parentNativeHandle, toWindowsName(name()));
if (result != ERROR_SUCCESS) {
- String info = "Could not delete windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegDeleteKeyEx(...) returned error code " +
- result + ".";
+ String info = "Could not delete windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegDeleteKeyEx(...) returned error code " +
+ result + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -870,23 +889,25 @@
private static String toJavaName(byte[] windowsNameArray) {
String windowsName = byteArrayToString(windowsNameArray);
// check if Alt64
- if ((windowsName.length()>1) &&
- (windowsName.substring(0,2).equals("/!"))) {
+ if ((windowsName.length() > 1) &&
+ (windowsName.substring(0, 2).equals("/!"))) {
return toJavaAlt64Name(windowsName);
}
- StringBuffer javaName = new StringBuffer();
+ StringBuilder javaName = new StringBuilder();
char ch;
// Decode from simple encoding
- for (int i = 0; i < windowsName.length(); i++){
+ for (int i = 0; i < windowsName.length(); i++) {
if ((ch = windowsName.charAt(i)) == '/') {
char next = ' ';
if ((windowsName.length() > i + 1) &&
- ((next = windowsName.charAt(i+1)) >= 'A') && (next <= 'Z')) {
- ch = next;
- i++;
- } else if ((windowsName.length() > i + 1) && (next == '/')) {
- ch = '\\';
- i++;
+ ((next = windowsName.charAt(i+1)) >= 'A') &&
+ (next <= 'Z')) {
+ ch = next;
+ i++;
+ } else if ((windowsName.length() > i + 1) &&
+ (next == '/')) {
+ ch = '\\';
+ i++;
}
} else if (ch == '\\') {
ch = '/';
@@ -905,8 +926,8 @@
private static String toJavaAlt64Name(String windowsName) {
byte[] byteBuffer =
- Base64.altBase64ToByteArray(windowsName.substring(2));
- StringBuffer result = new StringBuffer();
+ Base64.altBase64ToByteArray(windowsName.substring(2));
+ StringBuilder result = new StringBuilder();
for (int i = 0; i < byteBuffer.length; i++) {
int firstbyte = (byteBuffer[i++] & 0xff);
int secondbyte = (byteBuffer[i] & 0xff);
@@ -936,10 +957,10 @@
* Base64 class.
*/
private static byte[] toWindowsName(String javaName) {
- StringBuffer windowsName = new StringBuffer();
+ StringBuilder windowsName = new StringBuilder();
for (int i = 0; i < javaName.length(); i++) {
- char ch =javaName.charAt(i);
- if ((ch < 0x0020)||(ch > 0x007f)) {
+ char ch = javaName.charAt(i);
+ if ((ch < 0x0020) || (ch > 0x007f)) {
// If a non-trivial character encountered, use altBase64
return toWindowsAlt64Name(javaName);
}
@@ -948,7 +969,7 @@
} else if (ch == '/') {
windowsName.append('\\');
} else if ((ch >= 'A') && (ch <='Z')) {
- windowsName.append("/" + ch);
+ windowsName.append('/').append(ch);
} else {
windowsName.append(ch);
}
@@ -967,13 +988,13 @@
// Convert to byte pairs
int counter = 0;
for (int i = 0; i < javaName.length();i++) {
- int ch = javaName.charAt(i);
- javaNameArray[counter++] = (byte)(ch >>> 8);
- javaNameArray[counter++] = (byte)ch;
+ int ch = javaName.charAt(i);
+ javaNameArray[counter++] = (byte)(ch >>> 8);
+ javaNameArray[counter++] = (byte)ch;
}
- return stringToByteArray(
- "/!" + Base64.byteArrayToAltBase64(javaNameArray));
+ return stringToByteArray("/!" +
+ Base64.byteArrayToAltBase64(javaNameArray));
}
/**
@@ -985,30 +1006,31 @@
private static String toJavaValueString(byte[] windowsNameArray) {
// Use modified native2ascii algorithm
String windowsName = byteArrayToString(windowsNameArray);
- StringBuffer javaName = new StringBuffer();
+ StringBuilder javaName = new StringBuilder();
char ch;
for (int i = 0; i < windowsName.length(); i++){
if ((ch = windowsName.charAt(i)) == '/') {
char next = ' ';
if (windowsName.length() > i + 1 &&
- (next = windowsName.charAt(i + 1)) == 'u') {
- if (windowsName.length() < i + 6){
+ (next = windowsName.charAt(i + 1)) == 'u') {
+ if (windowsName.length() < i + 6) {
break;
} else {
- ch = (char)Integer.parseInt
- (windowsName.substring(i + 2, i + 6), 16);
+ ch = (char)Integer.parseInt(
+ windowsName.substring(i + 2, i + 6), 16);
i += 5;
}
} else
if ((windowsName.length() > i + 1) &&
- ((windowsName.charAt(i+1)) >= 'A') && (next <= 'Z')) {
- ch = next;
- i++;
- } else if ((windowsName.length() > i + 1) &&
- (next == '/')) {
- ch = '\\';
- i++;
+ ((windowsName.charAt(i+1)) >= 'A') &&
+ (next <= 'Z')) {
+ ch = next;
+ i++;
+ } else if ((windowsName.length() > i + 1) &&
+ (next == '/')) {
+ ch = '\\';
+ i++;
}
} else if (ch == '\\') {
ch = '/';
@@ -1028,14 +1050,14 @@
* to convert java string to a byte array of ASCII characters.
*/
private static byte[] toWindowsValueString(String javaName) {
- StringBuffer windowsName = new StringBuffer();
+ StringBuilder windowsName = new StringBuilder();
for (int i = 0; i < javaName.length(); i++) {
- char ch =javaName.charAt(i);
- if ((ch < 0x0020)||(ch > 0x007f)){
+ char ch = javaName.charAt(i);
+ if ((ch < 0x0020) || (ch > 0x007f)){
// write \udddd
windowsName.append("/u");
String hex = Integer.toHexString(javaName.charAt(i));
- StringBuffer hex4 = new StringBuffer(hex);
+ StringBuilder hex4 = new StringBuilder(hex);
hex4.reverse();
int len = 4 - hex4.length();
for (int j = 0; j < len; j++){
@@ -1049,7 +1071,7 @@
} else if (ch == '/') {
windowsName.append('\\');
} else if ((ch >= 'A') && (ch <='Z')) {
- windowsName.append("/" + ch);
+ windowsName.append('/').append(ch);
} else {
windowsName.append(ch);
}
@@ -1061,8 +1083,9 @@
* Returns native handle for the top Windows node for this node.
*/
private int rootNativeHandle() {
- return (isUserNode()? USER_ROOT_NATIVE_HANDLE :
- SYSTEM_ROOT_NATIVE_HANDLE);
+ return (isUserNode()
+ ? USER_ROOT_NATIVE_HANDLE
+ : SYSTEM_ROOT_NATIVE_HANDLE);
}
/**
@@ -1081,7 +1104,7 @@
* Converts a null-terminated byte array to java string
*/
private static String byteArrayToString(byte[] array) {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
for (int i = 0; i < array.length - 1; i++) {
result.append((char)array[i]);
}
diff --git a/src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp b/src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp
index ac98701..11792b1 100644
--- a/src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp
+++ b/src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp
@@ -828,7 +828,7 @@
return 0;
}
- HWND hWnd = CreateWindow(L"D3DFocusWindow", L"D3DFocusWindow", 0,
+ HWND hWnd = CreateWindow(L"D3DFocusWindow", L"D3DFocusWindow", WS_POPUP,
mi.rcMonitor.left, mi.rcMonitor.top, 1, 1,
NULL, NULL, GetModuleHandle(NULL), NULL);
if (hWnd == 0) {
diff --git a/test/TEST.ROOT b/test/TEST.ROOT
index 0aba9d3..26377b7 100644
--- a/test/TEST.ROOT
+++ b/test/TEST.ROOT
@@ -8,7 +8,7 @@
othervm.dirs=java/awt java/beans java/rmi javax/accessibility javax/imageio javax/sound javax/print javax/management com/sun/awt sun/awt sun/java2d sun/pisces sun/rmi
# Tests that cannot run concurrently
-exclusiveAccess.dirs=java/rmi/Naming java/util/Currency java/util/prefs sun/management/jmxremote sun/tools/jstatd sun/security/mscapi
+exclusiveAccess.dirs=java/rmi/Naming java/util/Currency java/util/prefs sun/management/jmxremote sun/tools/jstatd sun/security/mscapi javax/rmi
# Group definitions
groups=TEST.groups [closed/TEST.groups]
diff --git a/test/TEST.groups b/test/TEST.groups
index 15c2f44..a70c509 100644
--- a/test/TEST.groups
+++ b/test/TEST.groups
@@ -111,7 +111,6 @@
jdk_rmi = \
java/rmi \
- javax/rmi/ssl \
sun/rmi
jdk_security1 = \
@@ -195,6 +194,7 @@
jdk_other = \
java/sql \
javax/sql \
+ javax/rmi \
javax/naming \
javax/script \
javax/smartcardio \
diff --git a/test/java/awt/event/MouseWheelEvent/WheelModifier/WheelModifier.java b/test/java/awt/event/MouseWheelEvent/WheelModifier/WheelModifier.java
new file mode 100644
index 0000000..28fd50a
--- /dev/null
+++ b/test/java/awt/event/MouseWheelEvent/WheelModifier/WheelModifier.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ @bug 8041470
+ @summary JButtons stay pressed after they have lost focus if you use the mouse wheel
+ @author Anton Nashatyrev
+*/
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.concurrent.CountDownLatch;
+
+public class WheelModifier {
+
+ JFrame f;
+ JButton fb;
+
+ CountDownLatch pressSema = new CountDownLatch(1);
+ CountDownLatch exitSema = new CountDownLatch(1);
+ CountDownLatch releaseSema = new CountDownLatch(1);
+ volatile CountDownLatch wheelSema;
+
+ void createGui() {
+ f = new JFrame("frame");
+ fb = new JButton("frame_button");
+ fb.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ System.out.println("WheelModifier.mouseReleased: " + e);
+ releaseSema.countDown();
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ System.out.println("WheelModifier.mouseEntered: " + e);
+
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ System.out.println("WheelModifier.mouseExited: " + e);
+ exitSema.countDown();
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ System.out.println("WheelModifier.mousePressed: " + e);
+ pressSema.countDown();
+ }
+
+ @Override
+ public void mouseDragged(MouseEvent e) {
+ System.out.println("WheelModifier.mouseDragged: " + e);
+ }
+ });
+
+ Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
+ @Override
+ public void eventDispatched(AWTEvent event) {
+ System.out.println("WheelModifier.mouseWheel: " + event);
+ wheelSema.countDown();
+ }
+ }, MouseEvent.MOUSE_WHEEL_EVENT_MASK);
+
+ f.setLayout(new FlowLayout());
+ f.add(fb);
+ f.setSize(200, 200);
+ f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ f.setVisible(true);
+ }
+
+ void run() throws Exception {
+ Robot r = new Robot();
+ r.waitForIdle();
+ System.out.println("# Started");
+
+ Point sLoc = fb.getLocationOnScreen();
+ Dimension bSize = fb.getSize();
+ r.mouseMove(sLoc.x + bSize.width / 2, sLoc.y + bSize.height / 2);
+ r.mousePress(MouseEvent.BUTTON1_MASK);
+ pressSema.await();
+ System.out.println("# Pressed");
+
+ r.mouseMove(sLoc.x + bSize.width / 2, sLoc.y + bSize.height * 2);
+ exitSema.await();
+ System.out.println("# Exited");
+
+ wheelSema = new CountDownLatch(1);
+ r.mouseWheel(1);
+ wheelSema.await();
+ System.out.println("# Wheeled 1");
+
+ wheelSema = new CountDownLatch(1);
+ r.mouseWheel(-1);
+ wheelSema.await();
+ System.out.println("# Wheeled 2");
+
+ r.mouseRelease(MouseEvent.BUTTON1_MASK);
+ releaseSema.await();
+ System.out.println("# Released!");
+ }
+
+ public static void main(String[] args) throws Exception {
+ WheelModifier test = new WheelModifier();
+
+ SwingUtilities.invokeAndWait(() -> test.createGui());
+ test.run();
+
+ System.out.println("Done.");
+ }
+}
diff --git a/test/java/awt/geom/Path2D/Path2DCopyConstructor.java b/test/java/awt/geom/Path2D/Path2DCopyConstructor.java
new file mode 100644
index 0000000..5667a0b
--- /dev/null
+++ b/test/java/awt/geom/Path2D/Path2DCopyConstructor.java
@@ -0,0 +1,537 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.IllegalPathStateException;
+import java.awt.geom.Path2D;
+import java.awt.geom.PathIterator;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.util.Arrays;
+
+/**
+ * @test
+ * @bug 8076419
+ * @summary Check Path2D copy constructor (trims arrays)
+ * and constructor with zero capacity
+ * @run main Path2DCopyConstructor
+ */
+public class Path2DCopyConstructor {
+
+ private final static float EPSILON = 5e-6f;
+ private final static float FLATNESS = 1e-2f;
+
+ private final static AffineTransform at
+ = AffineTransform.getScaleInstance(1.3, 2.4);
+
+ private final static Rectangle2D.Double rect2d
+ = new Rectangle2D.Double(3.2, 4.1, 5.0, 10.0);
+
+ private final static Point2D.Double pt2d
+ = new Point2D.Double(2.0, 2.5);
+
+ public static boolean verbose;
+
+ static void log(String msg) {
+ if (verbose) {
+ System.out.println(msg);
+ }
+ }
+
+ public static void main(String argv[]) {
+ verbose = (argv.length != 0);
+
+ testEmptyDoublePaths();
+ testDoublePaths();
+
+ testEmptyFloatPaths();
+ testFloatPaths();
+
+ testEmptyGeneralPath();
+ testGeneralPath();
+ }
+
+ static void testEmptyDoublePaths() {
+ log("\n - Test(Path2D.Double[0]) ---");
+ test(() -> new Path2D.Double(Path2D.WIND_NON_ZERO, 0));
+ }
+
+ static void testDoublePaths() {
+ log("\n - Test(Path2D.Double) ---");
+ test(() -> new Path2D.Double());
+ }
+
+ static void testEmptyFloatPaths() {
+ log("\n - Test(Path2D.Float[0]) ---");
+ test(() -> new Path2D.Float(Path2D.WIND_NON_ZERO, 0));
+ }
+
+ static void testFloatPaths() {
+ log("\n - Test(Path2D.Float) ---");
+ test(() -> new Path2D.Float());
+ }
+
+ static void testEmptyGeneralPath() {
+ log("\n - Test(GeneralPath[0]) ---");
+ test(() -> new GeneralPath(Path2D.WIND_NON_ZERO, 0));
+ }
+
+ static void testGeneralPath() {
+ log("\n - Test(GeneralPath) ---");
+ test(() -> new GeneralPath());
+ }
+
+ interface PathFactory {
+ Path2D makePath();
+ }
+
+ static void test(PathFactory pf) {
+ log("\n --- test: path(empty) ---");
+ test(pf.makePath(), true);
+ log("\n\n --- test: path(addMove) ---");
+ test(addMove(pf.makePath()), false);
+ log("\n\n --- test: path(addMoveAndLines) ---");
+ test(addMoveAndLines(pf.makePath()), false);
+ log("\n\n --- test: path(addMoveAndQuads) ---");
+ test(addMoveAndQuads(pf.makePath()), false);
+ log("\n\n --- test: path(addMoveAndCubics) ---");
+ test(addMoveAndCubics(pf.makePath()), false);
+ log("\n\n --- test: path(addMoveAndClose) ---");
+ test(addMoveAndClose(pf.makePath()), false);
+ }
+
+ static Path2D addMove(Path2D p2d) {
+ p2d.moveTo(1.0, 0.5);
+ return p2d;
+ }
+
+ static Path2D addMoveAndLines(Path2D p2d) {
+ addMove(p2d);
+ addLines(p2d);
+ return p2d;
+ }
+
+ static Path2D addLines(Path2D p2d) {
+ for (int i = 0; i < 10; i++) {
+ p2d.lineTo(1.1 * i, 2.3 * i);
+ }
+ return p2d;
+ }
+
+ static Path2D addMoveAndCubics(Path2D p2d) {
+ addMove(p2d);
+ addCubics(p2d);
+ return p2d;
+ }
+
+ static Path2D addCubics(Path2D p2d) {
+ for (int i = 0; i < 10; i++) {
+ p2d.curveTo(1.1 * i, 1.2 * i, 1.3 * i, 1.4 * i, 1.5 * i, 1.6 * i);
+ }
+ return p2d;
+ }
+
+ static Path2D addMoveAndQuads(Path2D p2d) {
+ addMove(p2d);
+ addQuads(p2d);
+ return p2d;
+ }
+
+ static Path2D addQuads(Path2D p2d) {
+ for (int i = 0; i < 10; i++) {
+ p2d.quadTo(1.1 * i, 1.2 * i, 1.3 * i, 1.4 * i);
+ }
+ return p2d;
+ }
+
+ static Path2D addMoveAndClose(Path2D p2d) {
+ addMove(p2d);
+ addClose(p2d);
+ return p2d;
+ }
+
+ static Path2D addClose(Path2D p2d) {
+ p2d.closePath();
+ return p2d;
+ }
+
+ static void test(Path2D p2d, boolean isEmpty) {
+ testEqual(new Path2D.Float(p2d), p2d);
+ testEqual(new Path2D.Double(p2d), p2d);
+ testEqual(new GeneralPath(p2d), p2d);
+
+ testIterator(new Path2D.Float(p2d), p2d);
+ testIterator(new Path2D.Double(p2d), p2d);
+ testIterator((Path2D) p2d.clone(), p2d);
+
+ testFlattening(new Path2D.Float(p2d), p2d);
+ testFlattening(new Path2D.Double(p2d), p2d);
+ testFlattening((Path2D) p2d.clone(), p2d);
+
+ testAddMove(new Path2D.Float(p2d));
+ testAddMove(new Path2D.Double(p2d));
+ testAddMove((Path2D) p2d.clone());
+
+ // These should expect exception if empty
+ testAddLine(new Path2D.Float(p2d), isEmpty);
+ testAddLine(new Path2D.Double(p2d), isEmpty);
+ testAddLine((Path2D) p2d.clone(), isEmpty);
+
+ testAddQuad(new Path2D.Float(p2d), isEmpty);
+ testAddQuad(new Path2D.Double(p2d), isEmpty);
+ testAddQuad((Path2D) p2d.clone(), isEmpty);
+
+ testAddCubic(new Path2D.Float(p2d), isEmpty);
+ testAddCubic(new Path2D.Double(p2d), isEmpty);
+ testAddCubic((Path2D) p2d.clone(), isEmpty);
+
+ testAddClose(new Path2D.Float(p2d), isEmpty);
+ testAddClose(new Path2D.Double(p2d), isEmpty);
+ testAddClose((Path2D) p2d.clone(), isEmpty);
+
+ testGetBounds(new Path2D.Float(p2d), p2d);
+ testGetBounds(new Path2D.Double(p2d), p2d);
+ testGetBounds((Path2D) p2d.clone(), p2d);
+
+ testTransform(new Path2D.Float(p2d));
+ testTransform(new Path2D.Double(p2d));
+ testTransform((Path2D) p2d.clone());
+
+ testIntersect(new Path2D.Float(p2d), p2d);
+ testIntersect(new Path2D.Double(p2d), p2d);
+ testIntersect((Path2D) p2d.clone(), p2d);
+
+ testContains(new Path2D.Float(p2d), p2d);
+ testContains(new Path2D.Double(p2d), p2d);
+ testContains((Path2D) p2d.clone(), p2d);
+
+ testGetCurrentPoint(new Path2D.Float(p2d), p2d);
+ testGetCurrentPoint(new Path2D.Double(p2d), p2d);
+ testGetCurrentPoint((Path2D) p2d.clone(), p2d);
+ }
+
+ static void testEqual(Path2D pathA, Path2D pathB) {
+ final PathIterator itA = pathA.getPathIterator(null);
+ final PathIterator itB = pathB.getPathIterator(null);
+
+ float[] coordsA = new float[6];
+ float[] coordsB = new float[6];
+
+ int n = 0;
+ for (; !itA.isDone() && !itB.isDone(); itA.next(), itB.next(), n++) {
+ int typeA = itA.currentSegment(coordsA);
+ int typeB = itB.currentSegment(coordsB);
+
+ if (typeA != typeB) {
+ throw new IllegalStateException("Path-segment[" + n + "] "
+ + " type are not equals [" + typeA + "|" + typeB + "] !");
+ }
+ if (!equalsArray(coordsA, coordsB, getLength(typeA))) {
+ throw new IllegalStateException("Path-segment[" + n + "] coords"
+ + " are not equals [" + Arrays.toString(coordsA) + "|"
+ + Arrays.toString(coordsB) + "] !");
+ }
+ }
+ if (!itA.isDone() || !itB.isDone()) {
+ throw new IllegalStateException("Paths do not have same lengths !");
+ }
+ log("testEqual: " + n + " segments.");
+ }
+
+ static void testIterator(Path2D pathA, Path2D pathB) {
+ final PathIterator itA = pathA.getPathIterator(at);
+ final PathIterator itB = pathB.getPathIterator(at);
+
+ float[] coordsA = new float[6];
+ float[] coordsB = new float[6];
+
+ int n = 0;
+ for (; !itA.isDone() && !itB.isDone(); itA.next(), itB.next(), n++) {
+ int typeA = itA.currentSegment(coordsA);
+ int typeB = itB.currentSegment(coordsB);
+
+ if (typeA != typeB) {
+ throw new IllegalStateException("Path-segment[" + n + "] "
+ + "type are not equals [" + typeA + "|" + typeB + "] !");
+ }
+ // Take care of floating-point precision:
+ if (!equalsArrayEps(coordsA, coordsB, getLength(typeA))) {
+ throw new IllegalStateException("Path-segment[" + n + "] coords"
+ + " are not equals [" + Arrays.toString(coordsA) + "|"
+ + Arrays.toString(coordsB) + "] !");
+ }
+ }
+ if (!itA.isDone() || !itB.isDone()) {
+ throw new IllegalStateException("Paths do not have same lengths !");
+ }
+ log("testIterator: " + n + " segments.");
+ }
+
+ static void testFlattening(Path2D pathA, Path2D pathB) {
+ final PathIterator itA = pathA.getPathIterator(at, FLATNESS);
+ final PathIterator itB = pathB.getPathIterator(at, FLATNESS);
+
+ float[] coordsA = new float[6];
+ float[] coordsB = new float[6];
+
+ int n = 0;
+ for (; !itA.isDone() && !itB.isDone(); itA.next(), itB.next(), n++) {
+ int typeA = itA.currentSegment(coordsA);
+ int typeB = itB.currentSegment(coordsB);
+
+ if (typeA != typeB) {
+ throw new IllegalStateException("Path-segment[" + n + "] "
+ + "type are not equals [" + typeA + "|" + typeB + "] !");
+ }
+ // Take care of floating-point precision:
+ if (!equalsArrayEps(coordsA, coordsB, getLength(typeA))) {
+ throw new IllegalStateException("Path-segment[" + n + "] coords"
+ + " are not equals [" + Arrays.toString(coordsA) + "|"
+ + Arrays.toString(coordsB) + "] !");
+ }
+ }
+ if (!itA.isDone() || !itB.isDone()) {
+ throw new IllegalStateException("Paths do not have same lengths !");
+ }
+ log("testFlattening: " + n + " segments.");
+ }
+
+ static void testAddMove(Path2D pathA) {
+ addMove(pathA);
+ log("testAddMove: passed.");
+ }
+
+ static void testAddLine(Path2D pathA, boolean isEmpty) {
+ try {
+ addLines(pathA);
+ }
+ catch (IllegalPathStateException ipse) {
+ if (isEmpty) {
+ log("testAddLine: passed "
+ + "(expected IllegalPathStateException catched).");
+ return;
+ } else {
+ throw ipse;
+ }
+ }
+ if (isEmpty) {
+ throw new IllegalStateException("IllegalPathStateException not thrown !");
+ }
+ log("testAddLine: passed.");
+ }
+
+ static void testAddQuad(Path2D pathA, boolean isEmpty) {
+ try {
+ addQuads(pathA);
+ }
+ catch (IllegalPathStateException ipse) {
+ if (isEmpty) {
+ log("testAddQuad: passed "
+ + "(expected IllegalPathStateException catched).");
+ return;
+ } else {
+ throw ipse;
+ }
+ }
+ if (isEmpty) {
+ throw new IllegalStateException("IllegalPathStateException not thrown !");
+ }
+ log("testAddQuad: passed.");
+ }
+
+ static void testAddCubic(Path2D pathA, boolean isEmpty) {
+ try {
+ addCubics(pathA);
+ }
+ catch (IllegalPathStateException ipse) {
+ if (isEmpty) {
+ log("testAddCubic: passed "
+ + "(expected IllegalPathStateException catched).");
+ return;
+ } else {
+ throw ipse;
+ }
+ }
+ if (isEmpty) {
+ throw new IllegalStateException("IllegalPathStateException not thrown !");
+ }
+ log("testAddCubic: passed.");
+ }
+
+ static void testAddClose(Path2D pathA, boolean isEmpty) {
+ try {
+ addClose(pathA);
+ }
+ catch (IllegalPathStateException ipse) {
+ if (isEmpty) {
+ log("testAddClose: passed "
+ + "(expected IllegalPathStateException catched).");
+ return;
+ } else {
+ throw ipse;
+ }
+ }
+ if (isEmpty) {
+ throw new IllegalStateException("IllegalPathStateException not thrown !");
+ }
+ log("testAddClose: passed.");
+ }
+
+ static void testGetBounds(Path2D pathA, Path2D pathB) {
+ final Rectangle rA = pathA.getBounds();
+ final Rectangle rB = pathB.getBounds();
+
+ if (!rA.equals(rB)) {
+ throw new IllegalStateException("Bounds are not equals [" + rA
+ + "|" + rB + "] !");
+ }
+ final Rectangle2D r2dA = pathA.getBounds2D();
+ final Rectangle2D r2dB = pathB.getBounds2D();
+
+ if (!equalsRectangle2D(r2dA, r2dB)) {
+ throw new IllegalStateException("Bounds2D are not equals ["
+ + r2dA + "|" + r2dB + "] !");
+ }
+ log("testGetBounds: passed.");
+ }
+
+ static void testTransform(Path2D pathA) {
+ pathA.transform(at);
+ log("testTransform: passed.");
+ }
+
+ static void testIntersect(Path2D pathA, Path2D pathB) {
+ boolean resA = pathA.intersects(rect2d);
+ boolean resB = pathB.intersects(rect2d);
+ if (resA != resB) {
+ throw new IllegalStateException("Intersects(rect2d) are not equals ["
+ + resA + "|" + resB + "] !");
+ }
+ resA = pathA.intersects(1.0, 2.0, 13.0, 17.0);
+ resB = pathB.intersects(1.0, 2.0, 13.0, 17.0);
+ if (resA != resB) {
+ throw new IllegalStateException("Intersects(doubles) are not equals ["
+ + resA + "|" + resB + "] !");
+ }
+ log("testIntersect: passed.");
+ }
+
+ static void testContains(Path2D pathA, Path2D pathB) {
+ boolean resA = pathA.contains(pt2d);
+ boolean resB = pathB.contains(pt2d);
+ if (resA != resB) {
+ throw new IllegalStateException("Contains(pt) are not equals ["
+ + resA + "|" + resB + "] !");
+ }
+ resA = pathA.contains(pt2d.getX(), pt2d.getY());
+ resB = pathB.contains(pt2d.getX(), pt2d.getY());
+ if (resA != resB) {
+ throw new IllegalStateException("Contains(x,y) are not equals ["
+ + resA + "|" + resB + "] !");
+ }
+ resA = pathA.contains(rect2d);
+ resB = pathB.contains(rect2d);
+ if (resA != resB) {
+ throw new IllegalStateException("Contains(rect2d) are not equals ["
+ + resA + "|" + resB + "] !");
+ }
+ resA = pathA.contains(1.0, 2.0, 13.0, 17.0);
+ resB = pathB.contains(1.0, 2.0, 13.0, 17.0);
+ if (resA != resB) {
+ throw new IllegalStateException("Contains(doubles) are not equals ["
+ + resA + "|" + resB + "] !");
+ }
+ log("testContains: passed.");
+ }
+
+ static void testGetCurrentPoint(Path2D pathA, Path2D pathB) {
+ final Point2D ptA = pathA.getCurrentPoint();
+ final Point2D ptB = pathA.getCurrentPoint();
+ if (((ptA == null) && (ptB != null))
+ || ((ptA != null) && !ptA.equals(ptB)))
+ {
+ throw new IllegalStateException("getCurrentPoint() are not equals ["
+ + ptA + "|" + ptB + "] !");
+ }
+ log("testGetCurrentPoint: passed.");
+ }
+
+ static int getLength(int type) {
+ switch(type) {
+ case PathIterator.SEG_CUBICTO:
+ return 6;
+ case PathIterator.SEG_QUADTO:
+ return 4;
+ case PathIterator.SEG_LINETO:
+ case PathIterator.SEG_MOVETO:
+ return 2;
+ case PathIterator.SEG_CLOSE:
+ return 0;
+ default:
+ throw new IllegalStateException("Invalid type: " + type);
+ }
+ }
+
+
+ // Custom equals methods ---
+
+ public static boolean equalsArray(float[] a, float[] a2, final int len) {
+ for (int i = 0; i < len; i++) {
+ if (Float.floatToIntBits(a[i]) != Float.floatToIntBits(a2[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ static boolean equalsArrayEps(float[] a, float[] a2, final int len) {
+ for (int i = 0; i < len; i++) {
+ if (!equalsEps(a[i], a2[i])) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ static boolean equalsRectangle2D(Rectangle2D a, Rectangle2D b) {
+ if (a == b) {
+ return true;
+ }
+ return equalsEps(a.getX(), b.getX())
+ && equalsEps(a.getY(), b.getY())
+ && equalsEps(a.getWidth(), b.getWidth())
+ && equalsEps(a.getHeight(), b.getHeight());
+ }
+
+ static boolean equalsEps(float a, float b) {
+ return (Math.abs(a - b) <= EPSILON);
+ }
+
+ static boolean equalsEps(double a, double b) {
+ return (Math.abs(a - b) <= EPSILON);
+ }
+}
diff --git a/test/java/awt/geom/Path2D/Path2DGrow.java b/test/java/awt/geom/Path2D/Path2DGrow.java
new file mode 100644
index 0000000..3ccbc15
--- /dev/null
+++ b/test/java/awt/geom/Path2D/Path2DGrow.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Path2D;
+
+/**
+ * @test
+ * @bug 8078464
+ * @summary Check the growth algorithm (needRoom) in Path2D implementations
+ * @run main Path2DGrow
+ */
+public class Path2DGrow {
+
+ public static final int N = 1000 * 1000;
+
+ public static boolean verbose = false;
+ public static boolean force = false;
+
+ static void echo(String msg) {
+ System.out.println(msg);
+ }
+
+ static void log(String msg) {
+ if (verbose || force) {
+ echo(msg);
+ }
+ }
+
+ public static void main(String argv[]) {
+ verbose = (argv.length != 0);
+
+ testEmptyDoublePaths();
+ testDoublePaths();
+
+ testEmptyFloatPaths();
+ testFloatPaths();
+
+ testEmptyGeneralPath();
+ testGeneralPath();
+ }
+
+ static void testEmptyDoublePaths() {
+ echo("\n - Test(Path2D.Double[0]) ---");
+ test(() -> new Path2D.Double(Path2D.WIND_NON_ZERO, 0));
+ }
+
+ static void testDoublePaths() {
+ echo("\n - Test(Path2D.Double) ---");
+ test(() -> new Path2D.Double());
+ }
+
+ static void testEmptyFloatPaths() {
+ echo("\n - Test(Path2D.Float[0]) ---");
+ test(() -> new Path2D.Float(Path2D.WIND_NON_ZERO, 0));
+ }
+
+ static void testFloatPaths() {
+ echo("\n - Test(Path2D.Float) ---");
+ test(() -> new Path2D.Float());
+ }
+
+ static void testEmptyGeneralPath() {
+ echo("\n - Test(GeneralPath[0]) ---");
+ test(() -> new GeneralPath(Path2D.WIND_NON_ZERO, 0));
+ }
+
+ static void testGeneralPath() {
+ echo("\n - Test(GeneralPath) ---");
+ test(() -> new GeneralPath());
+ }
+
+ interface PathFactory {
+ Path2D makePath();
+ }
+
+ static void test(PathFactory pf) {
+ long start, end;
+
+ for (int n = 1; n <= N; n *= 10) {
+ force = (n == N);
+
+ start = System.nanoTime();
+ testAddMoves(pf.makePath(), n);
+ end = System.nanoTime();
+ log("testAddMoves[" + n + "] duration= "
+ + (1e-6 * (end - start)) + " ms.");
+
+ start = System.nanoTime();
+ testAddLines(pf.makePath(), n);
+ end = System.nanoTime();
+ log("testAddLines[" + n + "] duration= "
+ + (1e-6 * (end - start)) + " ms.");
+
+ start = System.nanoTime();
+ testAddQuads(pf.makePath(), n);
+ end = System.nanoTime();
+ log("testAddQuads[" + n + "] duration= "
+ + (1e-6 * (end - start)) + " ms.");
+
+ start = System.nanoTime();
+ testAddCubics(pf.makePath(), n);
+ end = System.nanoTime();
+ log("testAddCubics[" + n + "] duration= "
+ + (1e-6 * (end - start)) + " ms.");
+
+ start = System.nanoTime();
+ testAddMoveAndCloses(pf.makePath(), n);
+ end = System.nanoTime();
+ log("testAddMoveAndCloses[" + n + "] duration= "
+ + (1e-6 * (end - start)) + " ms.");
+ }
+ }
+
+ static void addMove(Path2D p2d, int i) {
+ p2d.moveTo(1.0 * i, 0.5 * i);
+ }
+
+ static void addLine(Path2D p2d, int i) {
+ p2d.lineTo(1.1 * i, 2.3 * i);
+ }
+
+ static void addCubic(Path2D p2d, int i) {
+ p2d.curveTo(1.1 * i, 1.2 * i, 1.3 * i, 1.4 * i, 1.5 * i, 1.6 * i);
+ }
+
+ static void addQuad(Path2D p2d, int i) {
+ p2d.quadTo(1.1 * i, 1.2 * i, 1.3 * i, 1.4 * i);
+ }
+
+ static void addClose(Path2D p2d) {
+ p2d.closePath();
+ }
+
+ static void testAddMoves(Path2D pathA, int n) {
+ for (int i = 0; i < n; i++) {
+ addMove(pathA, i);
+ }
+ }
+
+ static void testAddLines(Path2D pathA, int n) {
+ addMove(pathA, 0);
+ for (int i = 0; i < n; i++) {
+ addLine(pathA, i);
+ }
+ }
+
+ static void testAddQuads(Path2D pathA, int n) {
+ addMove(pathA, 0);
+ for (int i = 0; i < n; i++) {
+ addQuad(pathA, i);
+ }
+ }
+
+ static void testAddCubics(Path2D pathA, int n) {
+ addMove(pathA, 0);
+ for (int i = 0; i < n; i++) {
+ addCubic(pathA, i);
+ }
+ }
+
+ static void testAddMoveAndCloses(Path2D pathA, int n) {
+ for (int i = 0; i < n; i++) {
+ addMove(pathA, i);
+ addClose(pathA);
+ }
+ }
+}
diff --git a/test/java/security/KeyStore/TestKeystoreCompat.java b/test/java/security/KeyStore/TestKeystoreCompat.java
new file mode 100644
index 0000000..d1c001f
--- /dev/null
+++ b/test/java/security/KeyStore/TestKeystoreCompat.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8062552
+ * @run main/othervm TestKeystoreCompat
+ * @summary test compatibility mode for JKS and PKCS12 keystores
+ */
+
+import java.io.*;
+import java.security.*;
+import java.security.KeyStore.*;
+import java.security.cert.*;
+import javax.crypto.*;
+import javax.security.auth.callback.*;
+
+public class TestKeystoreCompat {
+ private static final char[] PASSWORD = "changeit".toCharArray();
+ private static final String DIR = System.getProperty("test.src", ".");
+ // This is an arbitrary X.509 certificate
+ private static final String CERT_FILE = "trusted.pem";
+
+ public static final void main(String[] args) throws Exception {
+
+ // Testing empty keystores
+
+ init("empty.jks", "JKS");
+ init("empty.jceks", "JCEKS");
+ init("empty.p12", "PKCS12");
+
+ load("empty.jks", "JKS");
+ load("empty.jceks", "JCEKS");
+ load("empty.p12", "PKCS12");
+ load("empty.p12", "JKS"); // test compatibility mode
+ load("empty.jks", "PKCS12", true); // test without compatibility mode
+ load("empty.jks", "JKS", false); // test without compatibility mode
+ load("empty.p12", "JKS", true); // test without compatibility mode
+ load("empty.p12", "PKCS12", false); // test without compatibility mode
+
+ build("empty.jks", "JKS", true);
+ build("empty.jks", "JKS", false);
+ build("empty.jceks", "JCEKS", true);
+ build("empty.jceks", "JCEKS", false);
+ build("empty.p12", "PKCS12", true);
+ build("empty.p12", "PKCS12", false);
+
+ // Testing keystores containing an X.509 certificate
+
+ X509Certificate cert = loadCertificate(CERT_FILE);
+ init("onecert.jks", "JKS", cert);
+ init("onecert.jceks", "JCEKS", cert);
+ init("onecert.p12", "PKCS12", cert);
+
+ load("onecert.jks", "JKS");
+ load("onecert.jceks", "JCEKS");
+ load("onecert.p12", "PKCS12");
+ load("onecert.p12", "JKS"); // test compatibility mode
+ load("onecert.jks", "PKCS12", true); // test without compatibility mode
+ load("onecert.jks", "JKS", false); // test without compatibility mode
+ load("onecert.p12", "JKS", true); // test without compatibility mode
+ load("onecert.p12", "PKCS12", false); // test without compatibility mode
+
+ build("onecert.jks", "JKS", true);
+ build("onecert.jks", "JKS", false);
+ build("onecert.jceks", "JCEKS", true);
+ build("onecert.jceks", "JCEKS", false);
+ build("onecert.p12", "PKCS12", true);
+ build("onecert.p12", "PKCS12", false);
+
+ // Testing keystores containing a secret key
+
+ SecretKey key = generateSecretKey("AES", 128);
+ init("onekey.jceks", "JCEKS", key);
+ init("onekey.p12", "PKCS12", key);
+
+ load("onekey.jceks", "JCEKS");
+ load("onekey.p12", "PKCS12");
+ load("onekey.p12", "JKS"); // test compatibility mode
+ load("onekey.p12", "JKS", true); // test without compatibility mode
+ load("onekey.p12", "PKCS12", false); // test without compatibility mode
+
+ build("onekey.jceks", "JCEKS", true);
+ build("onekey.jceks", "JCEKS", false);
+ build("onekey.p12", "PKCS12", true);
+ build("onekey.p12", "PKCS12", false);
+
+ System.out.println("OK.");
+ }
+
+ // Instantiate an empty keystore using the supplied keystore type
+ private static void init(String file, String type) throws Exception {
+ KeyStore ks = KeyStore.getInstance(type);
+ ks.load(null, null);
+ try (OutputStream stream = new FileOutputStream(file)) {
+ ks.store(stream, PASSWORD);
+ }
+ System.out.println("Created a " + type + " keystore named '" + file + "'");
+ }
+
+ // Instantiate a keystore using the supplied keystore type & create an entry
+ private static void init(String file, String type, X509Certificate cert)
+ throws Exception {
+ KeyStore ks = KeyStore.getInstance(type);
+ ks.load(null, null);
+ ks.setEntry("mycert", new KeyStore.TrustedCertificateEntry(cert), null);
+ try (OutputStream stream = new FileOutputStream(file)) {
+ ks.store(stream, PASSWORD);
+ }
+ System.out.println("Created a " + type + " keystore named '" + file + "'");
+ }
+
+ // Instantiate a keystore using the supplied keystore type & create an entry
+ private static void init(String file, String type, SecretKey key)
+ throws Exception {
+ KeyStore ks = KeyStore.getInstance(type);
+ ks.load(null, null);
+ ks.setEntry("mykey", new KeyStore.SecretKeyEntry(key),
+ new PasswordProtection(PASSWORD));
+ try (OutputStream stream = new FileOutputStream(file)) {
+ ks.store(stream, PASSWORD);
+ }
+ System.out.println("Created a " + type + " keystore named '" + file + "'");
+ }
+
+ // Instantiate a keystore by probing the supplied file for the keystore type
+ private static void build(String file, String type, boolean usePassword)
+ throws Exception {
+
+ Builder builder;
+ if (usePassword) {
+ builder = Builder.newInstance(type, null, new File(file),
+ new PasswordProtection(PASSWORD));
+ } else {
+ builder = Builder.newInstance(type, null, new File(file),
+ new CallbackHandlerProtection(new DummyHandler()));
+ }
+ KeyStore ks = builder.getKeyStore();
+ if (!type.equalsIgnoreCase(ks.getType())) {
+ throw new Exception("ERROR: expected a " + type + " keystore, " +
+ "got a " + ks.getType() + " keystore instead");
+ } else {
+ System.out.println("Built a " + type + " keystore named '" + file + "'");
+ }
+ }
+
+ // Load the keystore entries
+ private static void load(String file, String type) throws Exception {
+ KeyStore ks = KeyStore.getInstance(type);
+ try (InputStream stream = new FileInputStream(file)) {
+ ks.load(stream, PASSWORD);
+ }
+ if (!type.equalsIgnoreCase(ks.getType())) {
+ throw new Exception("ERROR: expected a " + type + " keystore, " +
+ "got a " + ks.getType() + " keystore instead");
+ } else {
+ System.out.println("Loaded a " + type + " keystore named '" + file + "'");
+ }
+ }
+
+ // Load the keystore entries (with compatibility mode disabled)
+ private static void load(String file, String type, boolean expectFailure)
+ throws Exception {
+ Security.setProperty("keystore.type.compat", "false");
+ try {
+ load(file, type);
+ if (expectFailure) {
+ throw new Exception("ERROR: expected load to fail but it didn't");
+ }
+ } catch (IOException e) {
+ if (expectFailure) {
+ System.out.println("Failed to load a " + type + " keystore named '" + file + "' (as expected)");
+ } else {
+ throw e;
+ }
+ } finally {
+ Security.setProperty("keystore.type.compat", "true");
+ }
+ }
+
+ // Read an X.509 certificate from the supplied file
+ private static X509Certificate loadCertificate(String certFile)
+ throws Exception {
+ X509Certificate cert = null;
+ try (FileInputStream certStream =
+ new FileInputStream(DIR + "/" + certFile)) {
+ CertificateFactory factory =
+ CertificateFactory.getInstance("X.509");
+ return (X509Certificate) factory.generateCertificate(certStream);
+ }
+ }
+
+ // Generate a secret key using the supplied algorithm name and key size
+ private static SecretKey generateSecretKey(String algorithm, int size)
+ throws NoSuchAlgorithmException {
+ KeyGenerator generator = KeyGenerator.getInstance(algorithm);
+ generator.init(size);
+ return generator.generateKey();
+ }
+
+ private static class DummyHandler implements CallbackHandler {
+ public void handle(Callback[] callbacks)
+ throws IOException, UnsupportedCallbackException {
+ System.out.println("** Callbackhandler invoked");
+ for (int i = 0; i < callbacks.length; i++) {
+ Callback cb = callbacks[i];
+ if (cb instanceof PasswordCallback) {
+ PasswordCallback pcb = (PasswordCallback)cb;
+ pcb.setPassword(PASSWORD);
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/test/java/security/KeyStore/trusted.pem b/test/java/security/KeyStore/trusted.pem
new file mode 100644
index 0000000..32e7b84
--- /dev/null
+++ b/test/java/security/KeyStore/trusted.pem
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIF5DCCBMygAwIBAgIQGVCD3zqdD1ZMZZ/zLAPnQzANBgkqhkiG9w0BAQUFADCBvDELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29t
+L3JwYSAoYykxMDE2MDQGA1UEAxMtVmVyaVNpZ24gQ2xhc3MgMyBJbnRlcm5hdGlvbmFsIFNlcnZl
+ciBDQSAtIEczMB4XDTEyMDcxMDAwMDAwMFoXDTEzMDczMTIzNTk1OVowgbgxCzAJBgNVBAYTAlVT
+MRMwEQYDVQQIEwpDYWxpZm9ybmlhMRcwFQYDVQQHFA5SZWR3b29kIFNob3JlczEbMBkGA1UEChQS
+T3JhY2xlIENvcnBvcmF0aW9uMRIwEAYDVQQLFAlHbG9iYWwgSVQxMzAxBgNVBAsUKlRlcm1zIG9m
+IHVzZSBhdCB3d3cudmVyaXNpZ24uY29tL3JwYSAoYykwNTEVMBMGA1UEAxQMKi5vcmFjbGUuY29t
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz/dOCGrWzPj62q0ZkF59Oj9Fli4wHAuX
+U4/S0yBXF8j6K7TKWFTQkGZt3+08KUhmLm1CE1DbbyRJT292YNXYXunNaKdABob8kaBO/NESUOEJ
+0SZh7fd0xCSJAAPiwOMrM5jLeb/dEpU6nP74Afrhu5ffvKdcvTRGguj9H2oVsisTK8Z1HsiiwcJG
+JXcrjvdCZoPU4FHvK03XZPAqPHKNSaJOrux6kRIWYjQMlmL+qDOb0nNHa6gBdi+VqqJHJHeAM677
+dcUd0jn2m2OWtUnrM3MJZQof7/z27RTdX5J8np0ChkUgm63biDgRZO7uZP0DARQ0I6lZMlrarT8/
+sct3twIDAQABo4IB4jCCAd4wFwYDVR0RBBAwDoIMKi5vcmFjbGUuY29tMAkGA1UdEwQCMAAwCwYD
+VR0PBAQDAgWgMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHFwMwKjAoBggrBgEFBQcCARYcaHR0cHM6
+Ly93d3cudmVyaXNpZ24uY29tL3JwYTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwbgYI
+KwYBBQUHAQwEYjBgoV6gXDBaMFgwVhYJaW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUS2u5KJYGDLvQ
+UjibKaxLB4shBRgwJhYkaHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nbzEuZ2lmMHIGCCsG
+AQUFBwEBBGYwZDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AudmVyaXNpZ24uY29tMDwGCCsGAQUF
+BzAChjBodHRwOi8vc3ZyaW50bC1nMy1haWEudmVyaXNpZ24uY29tL1NWUkludGxHMy5jZXIwQQYD
+VR0fBDowODA2oDSgMoYwaHR0cDovL3N2cmludGwtZzMtY3JsLnZlcmlzaWduLmNvbS9TVlJJbnRs
+RzMuY3JsMB8GA1UdIwQYMBaAFNebfNgioBX33a1fzimbWMO8RgC1MA0GCSqGSIb3DQEBBQUAA4IB
+AQAITRBlEo+qXLwCL53Db2BGnhDgnSomjne8aCmU7Yt4Kp91tzJdhNuaC/wwDuzD2dPJqzemae3s
+wKiOXrmDQZDj9NNTdkrXHnCvDR4TpOynWe3zBa0bwKnV2cIRKcv482yV53u0kALyFZbagYPwOOz3
+YJA/2SqdcDn9Ztc/ABQ1SkyXyA5j4LJdf2g7BtYrFxjy0RG6We2iM781WSB/9MCNKyHgiwd3KpLf
+urdSKLzy1elNAyt1P3UHwBIIvZ6sJIr/eeELc54Lxt6PtQCXx8qwxYTYXWPXbLgKBHdebgrmAbPK
+TfD69wysvjk6vwSHjmvaqB4R4WRcgkuT+1gxx+ve
+-----END CERTIFICATE-----
diff --git a/test/java/time/TEST.properties b/test/java/time/TEST.properties
index 909c619..f480a51 100644
--- a/test/java/time/TEST.properties
+++ b/test/java/time/TEST.properties
@@ -1,3 +1,4 @@
# Threeten test uses TestNG
TestNG.dirs = .
othervm.dirs = tck/java/time/chrono test/java/time/chrono test/java/time/format
+lib.dirs = ../../lib/testlibrary
diff --git a/test/java/time/test/java/time/format/TestZoneTextPrinterParser.java b/test/java/time/test/java/time/format/TestZoneTextPrinterParser.java
index 28ccbfe..079af06 100644
--- a/test/java/time/test/java/time/format/TestZoneTextPrinterParser.java
+++ b/test/java/time/test/java/time/format/TestZoneTextPrinterParser.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -42,10 +42,17 @@
import java.util.Random;
import java.util.Set;
import java.util.TimeZone;
+import jdk.testlibrary.RandomFactory;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
+/*
+ * @test
+ * @bug 8081022
+ * @key randomness
+ */
+
/**
* Test ZoneTextPrinterParser
*/
@@ -59,8 +66,8 @@
}
public void test_printText() {
- Random r = new Random();
- int N = 50;
+ Random r = RandomFactory.getRandom();
+ int N = 8;
Locale[] locales = Locale.getAvailableLocales();
Set<String> zids = ZoneRulesProvider.getAvailableZoneIds();
ZonedDateTime zdt = ZonedDateTime.now();
diff --git a/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java b/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java
new file mode 100644
index 0000000..382f201
--- /dev/null
+++ b/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8068721
+ * @summary test RMI-IIOP call with ConcurrentHashMap as an argument
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @build Test HelloInterface HelloServer HelloClient HelloImpl _HelloImpl_Tie _HelloInterface_Stub ConcurrentHashMapTest
+ * @run main/othervm -Djava.naming.provider.url=iiop://localhost:1050 -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory ConcurrentHashMapTest
+ */
+
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.CountDownLatch;
+import jdk.testlibrary.JDKToolFinder;
+import jdk.testlibrary.JDKToolLauncher;
+
+public class ConcurrentHashMapTest {
+
+ static final String ORBD = JDKToolFinder.getTestJDKTool("orbd");
+ static final String JAVA = JDKToolFinder.getTestJDKTool("java");
+ static final JDKToolLauncher orbdLauncher = JDKToolLauncher.createUsingTestJDK("orbd");
+ static final String CLASSPATH = System.getProperty("java.class.path");
+ static final int FIVE_SECONDS = 5000;
+
+ private static Exception clientException;
+ private static boolean exceptionInClient;
+ private static Process orbdProcess;
+ private static Process rmiServerProcess;
+
+ public static void main(String[] args) throws Exception {
+ startTestComponents();
+ stopTestComponents();
+ System.err.println("Test completed OK ");
+ }
+
+ static void startTestComponents () throws Exception {
+ startOrbd();
+ Thread.sleep(FIVE_SECONDS);
+ startRmiIiopServer();
+ Thread.sleep(FIVE_SECONDS);
+ executeRmiIiopClient();
+ }
+
+ private static void stopTestComponents() throws Exception {
+ stopRmiIiopServer();
+ stopOrbd();
+ if (exceptionInClient) {
+ throw new RuntimeException(clientException);
+ } else if (!isResponseReceived()) {
+ throw new RuntimeException("Expected Response not received");
+ }
+ }
+
+ static void startOrbd() throws Exception {
+ System.out.println("\nStarting orbd on port 1050 ");
+
+ //orbd -ORBInitialHost localhost -ORBInitialPort 1050
+ orbdLauncher.addToolArg("-ORBInitialHost").addToolArg("localhost")
+ .addToolArg("-ORBInitialPort").addToolArg("1050");
+
+ System.out.println("ConcurrentHashMapTest: Executing: " + Arrays.asList(orbdLauncher.getCommand()));
+ ProcessBuilder pb = new ProcessBuilder(orbdLauncher.getCommand());
+ pb.redirectError(ProcessBuilder.Redirect.INHERIT);
+ orbdProcess = pb.start();
+ }
+
+
+ static void startRmiIiopServer() throws Exception {
+ System.out.println("\nStarting RmiServer");
+ // java -cp .
+ // -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
+ // -Djava.naming.provider.url=iiop://localhost:1050 HelloServer
+ List<String> commands = new ArrayList<>();
+ commands.add(ConcurrentHashMapTest.JAVA);
+ commands.add("-Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory");
+ commands.add("-Djava.naming.provider.url=iiop://localhost:1050");
+ commands.add("-cp");
+ commands.add(ConcurrentHashMapTest.CLASSPATH);
+ commands.add("HelloServer");
+
+ System.out.println("ConcurrentHashMapTest: Executing: " + commands);
+ ProcessBuilder pb = new ProcessBuilder(commands);
+ pb.redirectError(ProcessBuilder.Redirect.INHERIT);
+ rmiServerProcess = pb.start();
+ }
+
+ static boolean isResponseReceived() {
+ return HelloClient.isResponseReceived();
+ }
+
+ static void stopRmiIiopServer() throws Exception {
+ rmiServerProcess.destroy();
+ rmiServerProcess.waitFor();
+ //rmiServerProcess.waitFor(30, TimeUnit.SECONDS);
+ System.out.println("serverProcess exitCode:"
+ + rmiServerProcess.exitValue());
+ }
+
+ static void stopOrbd() throws Exception {
+ orbdProcess.destroy();
+ orbdProcess.waitFor();
+ //orbdProcess.waitFor(30, TimeUnit.SECONDS);
+ System.out.println("orbd exitCode:"
+ + orbdProcess.exitValue());
+ }
+
+ static void executeRmiIiopClient() throws Exception {
+ try {
+ HelloClient.executeRmiClientCall();
+ } catch (Exception ex) {
+ clientException = ex;
+ exceptionInClient = true;
+ }
+ }
+}
diff --git a/test/javax/rmi/PortableRemoteObject/HelloClient.java b/test/javax/rmi/PortableRemoteObject/HelloClient.java
new file mode 100644
index 0000000..d3baa64
--- /dev/null
+++ b/test/javax/rmi/PortableRemoteObject/HelloClient.java
@@ -0,0 +1,98 @@
+import java.rmi.RemoteException;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.rmi.NotBoundException;
+import java.util.HashMap;
+import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.naming.NamingException;
+import javax.naming.InitialContext;
+import javax.naming.Context;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+import javax.rmi.PortableRemoteObject;
+
+import org.omg.CORBA.Any;
+import org.omg.CORBA.ORB;
+
+public class HelloClient implements Runnable {
+ static final int MAX_RETRY = 10;
+ static final int ONE_SECOND = 1000;
+ private static boolean responseReceived;
+
+ public static void main(String args[]) throws Exception {
+ executeRmiClientCall();
+ }
+
+ @Override
+ public void run() {
+ try {
+ executeRmiClientCall();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ public static boolean isResponseReceived () {
+ return responseReceived;
+ }
+
+ public static void executeRmiClientCall() throws Exception {
+ Context ic;
+ Object objref;
+ HelloInterface helloSvc;
+ String response;
+ int retryCount = 0;
+
+ Test test = new Test();
+ System.out.println("HelloClient.main: enter ...");
+ while (retryCount < MAX_RETRY) {
+ try {
+ ic = new InitialContext();
+ System.out.println("HelloClient.main: HelloService lookup ...");
+ // STEP 1: Get the Object reference from the Name Service
+ // using JNDI call.
+ objref = ic.lookup("HelloService");
+ System.out.println("HelloClient: Obtained a ref. to Hello server.");
+
+ // STEP 2: Narrow the object reference to the concrete type and
+ // invoke the method.
+ helloSvc = (HelloInterface) PortableRemoteObject.narrow(objref,
+ HelloInterface.class);
+ System.out.println("HelloClient: Invoking on remote server with ConcurrentHashMap parameter");
+ ConcurrentHashMap <String, String> testConcurrentHashMap = new ConcurrentHashMap<String, String>();
+ response = helloSvc.sayHelloWithHashMap(testConcurrentHashMap);
+ System.out.println("HelloClient: Server says: " + response);
+ if (!response.contains("Hello with hashMapSize ==")) {
+ System.out.println("HelloClient: expected response not received");
+ throw new RuntimeException("Expected Response Hello with hashMapSize == 0 not received");
+ }
+ responseReceived = true;
+ break;
+ } catch (NameNotFoundException nnfEx) {
+ System.err.println("NameNotFoundException Caught .... try again");
+ retryCount++;
+ try {
+ Thread.sleep(ONE_SECOND);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ continue;
+ } catch (Exception e) {
+ System.err.println("Exception " + e + "Caught");
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+ System.err.println("HelloClient terminating ");
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/test/javax/rmi/PortableRemoteObject/HelloImpl.java b/test/javax/rmi/PortableRemoteObject/HelloImpl.java
new file mode 100644
index 0000000..e6b2494
--- /dev/null
+++ b/test/javax/rmi/PortableRemoteObject/HelloImpl.java
@@ -0,0 +1,60 @@
+import java.net.InetAddress;
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.rmi.PortableRemoteObject;
+
+public class HelloImpl extends PortableRemoteObject implements HelloInterface {
+ public HelloImpl() throws java.rmi.RemoteException {
+ super(); // invoke rmi linking and remote object initialization
+ }
+
+ public String sayHello(String from) throws java.rmi.RemoteException {
+ System.out.println("Hello from " + from + "!!");
+ System.out.flush();
+ String reply = "Hello from us to you " + from;
+ return reply;
+ }
+
+ @Override
+ public String sayHelloToTest(Test test) throws RemoteException {
+ return "Test says Hello";
+ }
+
+ @Override
+ public String sayHelloWithInetAddress(InetAddress ipAddr)
+ throws RemoteException {
+ String response = "Hello with InetAddress " + ipAddr.toString();
+ return response;
+ }
+
+ @Override
+ public String sayHelloWithHashMap(ConcurrentHashMap<String, String> receivedHashMap)
+ throws RemoteException {
+ int hashMapSize = 0;
+
+ hashMapSize = receivedHashMap.size();
+ String response = "Hello with hashMapSize == " + hashMapSize;
+ return response;
+ }
+
+ @Override
+ public String sayHelloWithHashMap2(HashMap<String, String> receivedHashMap)
+ throws RemoteException {
+ int hashMapSize = 0;
+
+ hashMapSize = receivedHashMap.size();
+ String response = "Hello with hashMapSize == " + hashMapSize;
+ return response;
+ }
+
+ @Override
+ public String sayHelloWithReentrantLock(ReentrantLock receivedLock)
+ throws RemoteException {
+
+ String response = "Hello with lock == " + receivedLock.isLocked();
+ return response;
+ }
+}
diff --git a/test/javax/rmi/PortableRemoteObject/HelloInterface.java b/test/javax/rmi/PortableRemoteObject/HelloInterface.java
new file mode 100644
index 0000000..0c1a163
--- /dev/null
+++ b/test/javax/rmi/PortableRemoteObject/HelloInterface.java
@@ -0,0 +1,14 @@
+import java.net.InetAddress;
+import java.rmi.Remote;
+import java.util.HashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+
+public interface HelloInterface extends Remote {
+ public String sayHello( String from ) throws java.rmi.RemoteException;
+ public String sayHelloToTest( Test test ) throws java.rmi.RemoteException;
+ public String sayHelloWithInetAddress( InetAddress ipAddr ) throws java.rmi.RemoteException;
+ public String sayHelloWithHashMap(ConcurrentHashMap<String, String> hashMap ) throws java.rmi.RemoteException;
+ public String sayHelloWithHashMap2(HashMap<String, String> hashMap ) throws java.rmi.RemoteException;
+ public String sayHelloWithReentrantLock(ReentrantLock lock ) throws java.rmi.RemoteException;
+}
diff --git a/test/javax/rmi/PortableRemoteObject/HelloServer.java b/test/javax/rmi/PortableRemoteObject/HelloServer.java
new file mode 100644
index 0000000..f3ec399
--- /dev/null
+++ b/test/javax/rmi/PortableRemoteObject/HelloServer.java
@@ -0,0 +1,36 @@
+import javax.naming.InitialContext;
+import javax.naming.Context;
+
+public class HelloServer {
+
+ static final int MAX_RETRY = 10;
+ static final int ONE_SECOND = 1000;
+
+ public static void main(String[] args) {
+ int retryCount = 0;
+ while (retryCount < MAX_RETRY) {
+ try {
+ //HelloServer.set("SETTING TEST ITL");
+ // Step 1: Instantiate the Hello servant
+ HelloImpl helloRef = new HelloImpl();
+
+ // Step 2: Publish the reference in the Naming Service
+ // using JNDI API
+ Context initialNamingContext = new InitialContext();
+ initialNamingContext.rebind("HelloService", helloRef);
+
+ System.out.println("Hello Server: Ready...");
+ break;
+ } catch (Exception e) {
+ System.out.println("Server initialization problem: " + e);
+ e.printStackTrace();
+ retryCount++;
+ try {
+ Thread.sleep(ONE_SECOND);
+ } catch (InterruptedException e1) {
+ e1.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/test/javax/rmi/PortableRemoteObject/Test.java b/test/javax/rmi/PortableRemoteObject/Test.java
new file mode 100644
index 0000000..1fc3ecf
--- /dev/null
+++ b/test/javax/rmi/PortableRemoteObject/Test.java
@@ -0,0 +1,6 @@
+import java.io.Serializable;
+
+
+public class Test implements Serializable {
+
+}
diff --git a/test/javax/rmi/PortableRemoteObject/_HelloImpl_Tie.java b/test/javax/rmi/PortableRemoteObject/_HelloImpl_Tie.java
new file mode 100644
index 0000000..040500d
--- /dev/null
+++ b/test/javax/rmi/PortableRemoteObject/_HelloImpl_Tie.java
@@ -0,0 +1,128 @@
+// Tie class generated by rmic, do not edit.
+// Contents subject to change without notice.
+
+import java.io.Serializable;
+import java.net.InetAddress;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+import javax.rmi.CORBA.Tie;
+import javax.rmi.CORBA.Util;
+import org.omg.CORBA.BAD_OPERATION;
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.SystemException;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
+import org.omg.CORBA.portable.ResponseHandler;
+import org.omg.CORBA.portable.UnknownException;
+import org.omg.CORBA_2_3.portable.ObjectImpl;
+
+
+public class _HelloImpl_Tie extends ObjectImpl implements Tie {
+
+ private HelloImpl target = null;
+
+ private static final String[] _type_ids = {
+ "RMI:HelloInterface:0000000000000000"
+ };
+
+ public void setTarget(Remote target) {
+ this.target = (HelloImpl) target;
+ }
+
+ public Remote getTarget() {
+ return target;
+ }
+
+ public org.omg.CORBA.Object thisObject() {
+ return this;
+ }
+
+ public void deactivate() {
+ _orb().disconnect(this);
+ _set_delegate(null);
+ target = null;
+ }
+
+ public ORB orb() {
+ return _orb();
+ }
+
+ public void orb(ORB orb) {
+ orb.connect(this);
+ }
+
+ public String[] _ids() {
+ return (String[]) _type_ids.clone();
+ }
+
+ public OutputStream _invoke(String method, InputStream _in, ResponseHandler reply) throws SystemException {
+ try {
+ org.omg.CORBA_2_3.portable.InputStream in =
+ (org.omg.CORBA_2_3.portable.InputStream) _in;
+ switch (method.length()) {
+ case 8:
+ if (method.equals("sayHello")) {
+ String arg0 = (String) in.read_value(String.class);
+ String result = target.sayHello(arg0);
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream) reply.createReply();
+ out.write_value(result,String.class);
+ return out;
+ }
+ case 14:
+ if (method.equals("sayHelloToTest")) {
+ Test arg0 = (Test) in.read_value(Test.class);
+ String result = target.sayHelloToTest(arg0);
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream) reply.createReply();
+ out.write_value(result,String.class);
+ return out;
+ }
+ case 19:
+ if (method.equals("sayHelloWithHashMap")) {
+ ConcurrentHashMap arg0 = (ConcurrentHashMap) in.read_value(ConcurrentHashMap.class);
+ String result = target.sayHelloWithHashMap(arg0);
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream) reply.createReply();
+ out.write_value(result,String.class);
+ return out;
+ }
+ case 20:
+ if (method.equals("sayHelloWithHashMap2")) {
+ HashMap arg0 = (HashMap) in.read_value(HashMap.class);
+ String result = target.sayHelloWithHashMap2(arg0);
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream) reply.createReply();
+ out.write_value(result,String.class);
+ return out;
+ }
+ case 23:
+ if (method.equals("sayHelloWithInetAddress")) {
+ InetAddress arg0 = (InetAddress) in.read_value(InetAddress.class);
+ String result = target.sayHelloWithInetAddress(arg0);
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream) reply.createReply();
+ out.write_value(result,String.class);
+ return out;
+ }
+ case 25:
+ if (method.equals("sayHelloWithReentrantLock")) {
+ ReentrantLock arg0 = (ReentrantLock) in.read_value(ReentrantLock.class);
+ String result = target.sayHelloWithReentrantLock(arg0);
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream) reply.createReply();
+ out.write_value(result,String.class);
+ return out;
+ }
+ }
+ throw new BAD_OPERATION();
+ } catch (SystemException ex) {
+ throw ex;
+ } catch (Throwable ex) {
+ throw new UnknownException(ex);
+ }
+ }
+}
diff --git a/test/javax/rmi/PortableRemoteObject/_HelloInterface_Stub.java b/test/javax/rmi/PortableRemoteObject/_HelloInterface_Stub.java
new file mode 100644
index 0000000..4098143
--- /dev/null
+++ b/test/javax/rmi/PortableRemoteObject/_HelloInterface_Stub.java
@@ -0,0 +1,272 @@
+// Stub class generated by rmic, do not edit.
+// Contents subject to change without notice.
+
+import java.io.Serializable;
+import java.net.InetAddress;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.UnexpectedException;
+import java.util.HashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+import javax.rmi.CORBA.Stub;
+import javax.rmi.CORBA.Util;
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.SystemException;
+import org.omg.CORBA.portable.ApplicationException;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
+import org.omg.CORBA.portable.RemarshalException;
+import org.omg.CORBA.portable.ResponseHandler;
+import org.omg.CORBA.portable.ServantObject;
+
+
+public class _HelloInterface_Stub extends Stub implements HelloInterface {
+
+ private static final String[] _type_ids = {
+ "RMI:HelloInterface:0000000000000000"
+ };
+
+ public String[] _ids() {
+ return (String[]) _type_ids.clone();
+ }
+
+ public String sayHello(String arg0) throws java.rmi.RemoteException {
+ if (!Util.isLocal(this)) {
+ try {
+ org.omg.CORBA_2_3.portable.InputStream in = null;
+ try {
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream)
+ _request("sayHello", true);
+ out.write_value(arg0,String.class);
+ in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);
+ return (String) in.read_value(String.class);
+ } catch (ApplicationException ex) {
+ in = (org.omg.CORBA_2_3.portable.InputStream) ex.getInputStream();
+ String $_id = in.read_string();
+ throw new UnexpectedException($_id);
+ } catch (RemarshalException ex) {
+ return sayHello(arg0);
+ } finally {
+ _releaseReply(in);
+ }
+ } catch (SystemException ex) {
+ throw Util.mapSystemException(ex);
+ }
+ } else {
+ ServantObject so = _servant_preinvoke("sayHello",HelloInterface.class);
+ if (so == null) {
+ return sayHello(arg0);
+ }
+ try {
+ return ((HelloInterface)so.servant).sayHello(arg0);
+ } catch (Throwable ex) {
+ Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
+ throw Util.wrapException(exCopy);
+ } finally {
+ _servant_postinvoke(so);
+ }
+ }
+ }
+
+ public String sayHelloToTest(Test arg0) throws java.rmi.RemoteException {
+ if (!Util.isLocal(this)) {
+ try {
+ org.omg.CORBA_2_3.portable.InputStream in = null;
+ try {
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream)
+ _request("sayHelloToTest", true);
+ out.write_value(arg0,Test.class);
+ in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);
+ return (String) in.read_value(String.class);
+ } catch (ApplicationException ex) {
+ in = (org.omg.CORBA_2_3.portable.InputStream) ex.getInputStream();
+ String $_id = in.read_string();
+ throw new UnexpectedException($_id);
+ } catch (RemarshalException ex) {
+ return sayHelloToTest(arg0);
+ } finally {
+ _releaseReply(in);
+ }
+ } catch (SystemException ex) {
+ throw Util.mapSystemException(ex);
+ }
+ } else {
+ ServantObject so = _servant_preinvoke("sayHelloToTest",HelloInterface.class);
+ if (so == null) {
+ return sayHelloToTest(arg0);
+ }
+ try {
+ Test arg0Copy = (Test) Util.copyObject(arg0,_orb());
+ return ((HelloInterface)so.servant).sayHelloToTest(arg0Copy);
+ } catch (Throwable ex) {
+ Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
+ throw Util.wrapException(exCopy);
+ } finally {
+ _servant_postinvoke(so);
+ }
+ }
+ }
+
+ public String sayHelloWithInetAddress(InetAddress arg0) throws java.rmi.RemoteException {
+ if (!Util.isLocal(this)) {
+ try {
+ org.omg.CORBA_2_3.portable.InputStream in = null;
+ try {
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream)
+ _request("sayHelloWithInetAddress", true);
+ out.write_value(arg0,InetAddress.class);
+ in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);
+ return (String) in.read_value(String.class);
+ } catch (ApplicationException ex) {
+ in = (org.omg.CORBA_2_3.portable.InputStream) ex.getInputStream();
+ String $_id = in.read_string();
+ throw new UnexpectedException($_id);
+ } catch (RemarshalException ex) {
+ return sayHelloWithInetAddress(arg0);
+ } finally {
+ _releaseReply(in);
+ }
+ } catch (SystemException ex) {
+ throw Util.mapSystemException(ex);
+ }
+ } else {
+ ServantObject so = _servant_preinvoke("sayHelloWithInetAddress",HelloInterface.class);
+ if (so == null) {
+ return sayHelloWithInetAddress(arg0);
+ }
+ try {
+ InetAddress arg0Copy = (InetAddress) Util.copyObject(arg0,_orb());
+ return ((HelloInterface)so.servant).sayHelloWithInetAddress(arg0Copy);
+ } catch (Throwable ex) {
+ Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
+ throw Util.wrapException(exCopy);
+ } finally {
+ _servant_postinvoke(so);
+ }
+ }
+ }
+
+ public String sayHelloWithHashMap(ConcurrentHashMap arg0) throws java.rmi.RemoteException {
+ if (!Util.isLocal(this)) {
+ try {
+ org.omg.CORBA_2_3.portable.InputStream in = null;
+ try {
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream)
+ _request("sayHelloWithHashMap", true);
+ out.write_value(arg0,ConcurrentHashMap.class);
+ in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);
+ return (String) in.read_value(String.class);
+ } catch (ApplicationException ex) {
+ in = (org.omg.CORBA_2_3.portable.InputStream) ex.getInputStream();
+ String $_id = in.read_string();
+ throw new UnexpectedException($_id);
+ } catch (RemarshalException ex) {
+ return sayHelloWithHashMap(arg0);
+ } finally {
+ _releaseReply(in);
+ }
+ } catch (SystemException ex) {
+ throw Util.mapSystemException(ex);
+ }
+ } else {
+ ServantObject so = _servant_preinvoke("sayHelloWithHashMap",HelloInterface.class);
+ if (so == null) {
+ return sayHelloWithHashMap(arg0);
+ }
+ try {
+ ConcurrentHashMap arg0Copy = (ConcurrentHashMap) Util.copyObject(arg0,_orb());
+ return ((HelloInterface)so.servant).sayHelloWithHashMap(arg0Copy);
+ } catch (Throwable ex) {
+ Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
+ throw Util.wrapException(exCopy);
+ } finally {
+ _servant_postinvoke(so);
+ }
+ }
+ }
+
+ public String sayHelloWithHashMap2(HashMap arg0) throws java.rmi.RemoteException {
+ if (!Util.isLocal(this)) {
+ try {
+ org.omg.CORBA_2_3.portable.InputStream in = null;
+ try {
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream)
+ _request("sayHelloWithHashMap2", true);
+ out.write_value(arg0,HashMap.class);
+ in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);
+ return (String) in.read_value(String.class);
+ } catch (ApplicationException ex) {
+ in = (org.omg.CORBA_2_3.portable.InputStream) ex.getInputStream();
+ String $_id = in.read_string();
+ throw new UnexpectedException($_id);
+ } catch (RemarshalException ex) {
+ return sayHelloWithHashMap2(arg0);
+ } finally {
+ _releaseReply(in);
+ }
+ } catch (SystemException ex) {
+ throw Util.mapSystemException(ex);
+ }
+ } else {
+ ServantObject so = _servant_preinvoke("sayHelloWithHashMap2",HelloInterface.class);
+ if (so == null) {
+ return sayHelloWithHashMap2(arg0);
+ }
+ try {
+ HashMap arg0Copy = (HashMap) Util.copyObject(arg0,_orb());
+ return ((HelloInterface)so.servant).sayHelloWithHashMap2(arg0Copy);
+ } catch (Throwable ex) {
+ Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
+ throw Util.wrapException(exCopy);
+ } finally {
+ _servant_postinvoke(so);
+ }
+ }
+ }
+
+ public String sayHelloWithReentrantLock(ReentrantLock arg0) throws java.rmi.RemoteException {
+ if (!Util.isLocal(this)) {
+ try {
+ org.omg.CORBA_2_3.portable.InputStream in = null;
+ try {
+ org.omg.CORBA_2_3.portable.OutputStream out =
+ (org.omg.CORBA_2_3.portable.OutputStream)
+ _request("sayHelloWithReentrantLock", true);
+ out.write_value(arg0,ReentrantLock.class);
+ in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);
+ return (String) in.read_value(String.class);
+ } catch (ApplicationException ex) {
+ in = (org.omg.CORBA_2_3.portable.InputStream) ex.getInputStream();
+ String $_id = in.read_string();
+ throw new UnexpectedException($_id);
+ } catch (RemarshalException ex) {
+ return sayHelloWithReentrantLock(arg0);
+ } finally {
+ _releaseReply(in);
+ }
+ } catch (SystemException ex) {
+ throw Util.mapSystemException(ex);
+ }
+ } else {
+ ServantObject so = _servant_preinvoke("sayHelloWithReentrantLock",HelloInterface.class);
+ if (so == null) {
+ return sayHelloWithReentrantLock(arg0);
+ }
+ try {
+ ReentrantLock arg0Copy = (ReentrantLock) Util.copyObject(arg0,_orb());
+ return ((HelloInterface)so.servant).sayHelloWithReentrantLock(arg0Copy);
+ } catch (Throwable ex) {
+ Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
+ throw Util.wrapException(exCopy);
+ } finally {
+ _servant_postinvoke(so);
+ }
+ }
+ }
+}
diff --git a/test/javax/script/SimpleScriptContextNameChecksTest.java b/test/javax/script/SimpleScriptContextNameChecksTest.java
new file mode 100644
index 0000000..02b3355
--- /dev/null
+++ b/test/javax/script/SimpleScriptContextNameChecksTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8072853
+ * @summary SimpleScriptContext used by NashornScriptEngine doesn't completely complies to the spec regarding exception throwing
+ * @run testng SimpleScriptContextNameChecksTest
+ */
+
+import java.util.List;
+import java.util.function.Consumer;
+import javax.script.*;
+import org.testng.annotations.Test;
+
+public class SimpleScriptContextNameChecksTest {
+ private List<ScriptEngineFactory> getFactories() {
+ return new ScriptEngineManager().getEngineFactories();
+ }
+
+ private void testAndExpect(Consumer<ScriptContext> c, Class<? extends RuntimeException> clazz) {
+ for (ScriptEngineFactory fac : getFactories()) {
+ ScriptContext sc = fac.getScriptEngine().getContext();
+ String name = fac.getEngineName();
+ try {
+ c.accept(sc);
+ throw new RuntimeException("no exception for " + name);
+ } catch (NullPointerException | IllegalArgumentException e) {
+ if (e.getClass() == clazz) {
+ System.out.println("got " + e + " as expected for " + name);
+ } else {
+ throw e;
+ }
+ }
+ }
+ }
+
+ private void testAndExpectIAE(Consumer<ScriptContext> c) {
+ testAndExpect(c, IllegalArgumentException.class);
+ }
+
+ private void testAndExpectNPE(Consumer<ScriptContext> c) {
+ testAndExpect(c, NullPointerException.class);
+ }
+
+ @Test
+ public void getAttributeEmptyName() {
+ testAndExpectIAE(sc -> sc.getAttribute("", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void getAttributeNullName() {
+ testAndExpectNPE(sc -> sc.getAttribute(null, ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void removeAttributeEmptyName() {
+ testAndExpectIAE(sc -> sc.removeAttribute("", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void removeAttributeNullName() {
+ testAndExpectNPE(sc -> sc.removeAttribute(null, ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void setAttributeEmptyName() {
+ testAndExpectIAE(sc -> sc.setAttribute("", "value", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void setAttributeNullName() {
+ testAndExpectNPE(sc -> sc.setAttribute(null, "value", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void getAttributesScopeEmptyName() {
+ testAndExpectIAE(sc -> sc.getAttributesScope(""));
+ }
+
+ @Test
+ public void getAttributesScopeNullName() {
+ testAndExpectNPE(sc -> sc.getAttributesScope(null));
+ }
+}
diff --git a/test/javax/swing/JComboBox/8033069/bug8033069NoScrollBar.java b/test/javax/swing/JComboBox/8033069/bug8033069NoScrollBar.java
new file mode 100644
index 0000000..9850aa2
--- /dev/null
+++ b/test/javax/swing/JComboBox/8033069/bug8033069NoScrollBar.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.AWTException;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.event.InputEvent;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
+import javax.swing.UnsupportedLookAndFeelException;
+
+/* @test
+ * @bug 8033069
+ * @summary Checks that JComboBox popup does not close when mouse wheel is
+ * rotated over combo box and over its popup. The case where popup
+ * has no scroll bar.
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main bug8033069NoScrollBar
+ * @author Alexey Ivanov
+ */
+public class bug8033069NoScrollBar implements Runnable {
+
+ private static final String[] NO_SCROLL_ITEMS = new String[] {
+ "A", "B", "C", "D", "E", "F"
+ };
+
+ private final Robot robot;
+
+ private final String[] items;
+
+ private JFrame frame;
+ private JComboBox cb1;
+ private JComboBox cb2;
+
+ public static void main(String[] args) throws Exception {
+ iterateLookAndFeels(new bug8033069NoScrollBar(NO_SCROLL_ITEMS));
+ }
+
+ protected static void iterateLookAndFeels(final bug8033069NoScrollBar test) throws Exception {
+ LookAndFeelInfo[] lafInfo = UIManager.getInstalledLookAndFeels();
+ for (LookAndFeelInfo info : lafInfo) {
+ try {
+ UIManager.setLookAndFeel(info.getClassName());
+ System.out.println("Look and Feel: " + info.getClassName());
+ test.runTest();
+ } catch (UnsupportedLookAndFeelException e) {
+ System.out.println("Skipping unsupported LaF: " + info);
+ }
+ }
+ }
+
+ public bug8033069NoScrollBar(String[] items) throws AWTException {
+ this.items = items;
+
+ robot = new Robot();
+ robot.setAutoDelay(200);
+ }
+
+ private void setupUI() {
+ frame = new JFrame();
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ cb1 = new JComboBox<>(items);
+ cb2 = new JComboBox<>(items);
+ JPanel panel = new JPanel(new GridLayout(1, 2));
+ panel.add(cb1);
+ panel.add(cb2);
+
+ frame.add(panel);
+
+ frame.pack();
+ frame.setVisible(true);
+ }
+
+ public void runTest() throws Exception {
+ try {
+ SwingUtilities.invokeAndWait(this);
+
+ robot.waitForIdle();
+ assertFalse("cb1 popup is visible",
+ Util.invokeOnEDT(cb1::isPopupVisible));
+
+ // Move mouse pointer to the center of the fist combo box
+ Point p = cb1.getLocationOnScreen();
+ Dimension d = cb1.getSize();
+ robot.mouseMove(p.x + d.width / 2, p.y + d.height / 2);
+ // Click it to open popup
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+
+ robot.waitForIdle();
+ assertTrue("cb1 popup is not visible",
+ Util.invokeOnEDT(cb1::isPopupVisible));
+
+ robot.mouseWheel(1);
+ robot.waitForIdle();
+ assertTrue("cb1 popup is not visible after mouse wheel up on combo box",
+ Util.invokeOnEDT(cb1::isPopupVisible));
+
+ robot.mouseWheel(-1);
+ robot.waitForIdle();
+ assertTrue("cb1 popup is not visible after mouse wheel down on combo box",
+ Util.invokeOnEDT(cb1::isPopupVisible));
+
+ // Move mouse down on the popup
+ robot.mouseMove(p.x + d.width / 2, p.y + d.height * 3);
+
+ robot.mouseWheel(1);
+ robot.waitForIdle();
+ assertTrue("cb1 popup is not visible after mouse wheel up on popup",
+ Util.invokeOnEDT(cb1::isPopupVisible));
+
+ robot.mouseWheel(-1);
+ robot.waitForIdle();
+ assertTrue("cb1 popup is not visible after mouse wheel down on popup",
+ Util.invokeOnEDT(cb1::isPopupVisible));
+
+
+ // Move mouse pointer to the center of the second combo box
+ p = cb2.getLocationOnScreen();
+ d = cb2.getSize();
+ robot.mouseMove(p.x + d.width / 2, p.y + d.height / 2);
+
+ robot.mouseWheel(1);
+ robot.waitForIdle();
+ assertFalse("cb1 popup is visible after mouse wheel up on cb2",
+ Util.invokeOnEDT(cb1::isPopupVisible));
+ } finally {
+ if (frame != null) {
+ frame.dispose();
+ }
+ }
+
+ System.out.println("Test passed");
+ }
+
+ @Override
+ public void run() {
+ setupUI();
+ }
+
+ private static void assertTrue(String message, boolean value) {
+ assertEquals(message, true, value);
+ }
+
+ private static void assertFalse(String message, boolean value) {
+ assertEquals(message, false, value);
+ }
+
+ private static void assertEquals(String message, boolean expected, boolean actual) {
+ if (expected != actual) {
+ throw new RuntimeException(message);
+ }
+ }
+}
diff --git a/test/javax/swing/JComboBox/8033069/bug8033069ScrollBar.java b/test/javax/swing/JComboBox/8033069/bug8033069ScrollBar.java
new file mode 100644
index 0000000..fed71e6
--- /dev/null
+++ b/test/javax/swing/JComboBox/8033069/bug8033069ScrollBar.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.AWTException;
+
+/* @test
+ * @bug 8033069
+ * @summary Checks that JComboBox popup does not close when mouse wheel is
+ * rotated over combo box and over its popup. The case where
+ * popup has scroll bar.
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main bug8033069ScrollBar
+ * @author Alexey Ivanov
+ */
+public class bug8033069ScrollBar extends bug8033069NoScrollBar {
+
+ private static final String[] SCROLL_ITEMS = new String[] {
+ "A", "B", "C", "D", "E", "F",
+ "G", "H", "I", "J", "K", "L",
+ "M", "N", "O", "P", "Q", "R"
+ };
+
+ public static void main(String[] args) throws Exception {
+ iterateLookAndFeels(new bug8033069ScrollBar(SCROLL_ITEMS));
+ }
+
+ public bug8033069ScrollBar(String[] items) throws AWTException {
+ super(items);
+ }
+
+}
diff --git a/test/javax/swing/JFileChooser/8080628/bug8080628.java b/test/javax/swing/JFileChooser/8080628/bug8080628.java
new file mode 100644
index 0000000..fc72ef2
--- /dev/null
+++ b/test/javax/swing/JFileChooser/8080628/bug8080628.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.util.Locale;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
+
+import sun.swing.SwingUtilities2;
+
+/*
+ * @test
+ * @bug 8080628
+ * @summary No mnemonics on Open and Save buttons in JFileChooser.
+ * @author Alexey Ivanov
+ * @run main bug8080628
+ */
+public class bug8080628 {
+ public static final String[] MNEMONIC_KEYS = new String[] {
+ "FileChooser.saveButtonMnemonic",
+ "FileChooser.openButtonMnemonic",
+ "FileChooser.cancelButtonMnemonic",
+ "FileChooser.directoryOpenButtonMnemonic"
+ };
+
+ public static final Locale[] LOCALES = new Locale[] {
+ new Locale("en"),
+ new Locale("de"),
+ new Locale("es"),
+ new Locale("fr"),
+ new Locale("it"),
+ new Locale("ja"),
+ new Locale("ko"),
+ new Locale("pt", "BR"),
+ new Locale("sv"),
+ new Locale("zh", "CN"),
+ new Locale("zh", "TW")
+ };
+
+ private static volatile Exception exception;
+
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ runTest();
+ }
+ });
+
+ if (exception != null) {
+ throw exception;
+ }
+ }
+
+ private static void runTest() {
+ try {
+ LookAndFeelInfo[] lafInfo = UIManager.getInstalledLookAndFeels();
+ for (LookAndFeelInfo info : lafInfo) {
+ UIManager.setLookAndFeel(info.getClassName());
+
+ for (Locale locale : LOCALES) {
+ for (String key : MNEMONIC_KEYS) {
+ int mnemonic = SwingUtilities2.getUIDefaultsInt(key, locale);
+ if (mnemonic != 0) {
+ throw new RuntimeException("No mnemonic expected (" + mnemonic + ") " +
+ "for '" + key + "' " +
+ "in locale '" + locale + "' " +
+ "in Look-and-Feel '"
+ + UIManager.getLookAndFeel().getClass().getName() + "'");
+ }
+ }
+ }
+ }
+ System.out.println("Test passed");
+ } catch (Exception e) {
+ exception = e;
+ }
+ }
+
+}
diff --git a/test/lib/testlibrary/jdk/testlibrary/RandomFactory.java b/test/lib/testlibrary/jdk/testlibrary/RandomFactory.java
new file mode 100644
index 0000000..0951d11
--- /dev/null
+++ b/test/lib/testlibrary/jdk/testlibrary/RandomFactory.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.testlibrary;
+
+import java.util.Random;
+import java.util.SplittableRandom;
+
+/**
+ * Factory class which generates and prints to STDOUT a long-valued seed
+ * for use in initializing a PRNG. An instance of {@code Random} or
+ * {@code SplittableRandom} may likewise be obtained.
+ */
+public class RandomFactory {
+ /**
+ * Attempt to obtain the seed from the value of the "seed" property.
+ * @return The seed or {@code null} if the "seed" property was not set or
+ * could not be parsed.
+ */
+ private static Long getSystemSeed() {
+ Long seed = null;
+ try {
+ // note that Long.valueOf(null) also throws a
+ // NumberFormatException so if the property is undefined this
+ // will still work correctly
+ seed = Long.valueOf(System.getProperty("seed"));
+ } catch (NumberFormatException e) {
+ // do nothing: seed is still null
+ }
+
+ return seed;
+ }
+
+ /**
+ * Obtain a seed from an independent PRNG.
+ *
+ * @return A random seed.
+ */
+ private static long getRandomSeed() {
+ return new Random().nextLong();
+ }
+
+ /**
+ * Obtain and print to STDOUT a seed appropriate for initializing a PRNG.
+ * If the system property "seed" is set and has value which may be correctly
+ * parsed it is used, otherwise a seed is generated using an independent
+ * PRNG.
+ *
+ * @return The seed.
+ */
+ public static long getSeed() {
+ Long seed = getSystemSeed();
+ if (seed == null) {
+ seed = getRandomSeed();
+ }
+ System.out.println("Seed from RandomFactory = "+seed+"L");
+ return seed;
+ }
+
+ /**
+ * Obtain and print to STDOUT a seed and use it to initialize a new
+ * {@code Random} instance which is returned. If the system
+ * property "seed" is set and has value which may be correctly parsed it
+ * is used, otherwise a seed is generated using an independent PRNG.
+ *
+ * @return The {@code Random} instance.
+ */
+ public static Random getRandom() {
+ return new Random(getSeed());
+ }
+
+ /**
+ * Obtain and print to STDOUT a seed and use it to initialize a new
+ * {@code SplittableRandom} instance which is returned. If the system
+ * property "seed" is set and has value which may be correctly parsed it
+ * is used, otherwise a seed is generated using an independent PRNG.
+ *
+ * @return The {@code SplittableRandom} instance.
+ */
+ public static SplittableRandom getSplittableRandom() {
+ return new SplittableRandom(getSeed());
+ }
+}
diff --git a/test/sun/security/krb5/ConfPlusProp.java b/test/sun/security/krb5/ConfPlusProp.java
index 0a94498..2376d02 100644
--- a/test/sun/security/krb5/ConfPlusProp.java
+++ b/test/sun/security/krb5/ConfPlusProp.java
@@ -35,6 +35,12 @@
public class ConfPlusProp {
Config config;
public static void main(String[] args) throws Exception {
+ if (System.getenv("USERDNSDOMAIN") != null ||
+ System.getenv("LOGONSERVER") != null) {
+ System.out.println(
+ "Looks like a Windows machine in a domain. Skip test.");
+ return;
+ }
new ConfPlusProp().run();
}
@@ -90,23 +96,8 @@
check("R2", "old");
check("R3", null);
- int version = System.getProperty("java.version").charAt(2) - '0';
- System.out.println("JDK version is " + version);
-
- // Zero-config is supported since 1.7
- if (version >= 7) {
- // Point to a non-existing file
- System.setProperty("java.security.krb5.conf", "i-am-not-a file");
- refresh();
-
- // Default realm might come from DNS
- //checkDefaultRealm(null);
- check("R1", null);
- check("R2", null);
- check("R3", null);
- if (config.get("libdefaults", "forwardable") != null) {
- throw new Exception("Extra config error");
- }
+ if (config.get("libdefaults", "forwardable") != null) {
+ throw new Exception("Extra config error");
}
// Add prop
@@ -136,14 +127,6 @@
check("R2", "k2");
check("R3", "k2");
- // Point to a non-existing file
- System.setProperty("java.security.krb5.conf", "i-am-not-a file");
- refresh();
-
- checkDefaultRealm("R2");
- check("R1", "k2");
- check("R2", "k2");
- check("R3", "k2");
if (config.get("libdefaults", "forwardable") != null) {
throw new Exception("Extra config error");
}
diff --git a/test/sun/security/krb5/DnsFallback.java b/test/sun/security/krb5/DnsFallback.java
index b1e6419..cf5e6ba 100644
--- a/test/sun/security/krb5/DnsFallback.java
+++ b/test/sun/security/krb5/DnsFallback.java
@@ -22,8 +22,7 @@
*/
/*
* @test
- * @bug 6673164
- * @bug 6552334
+ * @bug 6673164 6552334 8077102
* @run main/othervm DnsFallback
* @summary fix dns_fallback parse error, and use dns by default
*/
@@ -35,47 +34,66 @@
public class DnsFallback {
static Method useDNS_Realm;
+ static Method useDNS_KDC;
public static void main(String[] args) throws Exception {
useDNS_Realm = Config.class.getDeclaredMethod("useDNS_Realm");
useDNS_Realm.setAccessible(true);
+ useDNS_KDC = Config.class.getDeclaredMethod("useDNS_KDC");
+ useDNS_KDC.setAccessible(true);
// for 6673164
- check("true", "true", true);
- check("false", "true", false);
- check("true", "false", true);
- check("false", "false", false);
- check("true", null, true);
- check("false", null, false);
- check(null, "true", true);
- check(null, "false", false);
+ check("true", "true", true, true);
+ check("false", "true", false, false);
+ check("true", "false", true, true);
+ check("false", "false", false, false);
+ check("true", null, true, true);
+ check("false", null, false, false);
+ check(null, "true", true, true);
+ check(null, "false", false, false);
- // for 6552334
- check(null, null, true);
+ // for 6552334, no longer true
+ //check(null, null, true, true);
+
+ // 8077102
+ check(null, null, false, true);
}
- static void check(String realm, String fallback, boolean output)
+ /**
+ * Sets and checks.
+ *
+ * @param u dns_lookup_XXX value set, none if null
+ * @param f dns_fallback value set, none if null
+ * @param r expected useDNS_Realm
+ * @param k expected useDNS_KDC
+ */
+ static void check(String u, String f, boolean r, boolean k)
throws Exception {
try (PrintStream ps =
new PrintStream(new FileOutputStream("dnsfallback.conf"))) {
ps.println("[libdefaults]\n");
- if (realm != null) {
- ps.println("dns_lookup_realm=" + realm);
+ if (u != null) {
+ ps.println("dns_lookup_realm=" + u);
+ ps.println("dns_lookup_kdc=" + u);
}
- if (fallback != null) {
- ps.println("dns_fallback=" + fallback);
+ if (f != null) {
+ ps.println("dns_fallback=" + f);
}
}
System.setProperty("java.security.krb5.conf", "dnsfallback.conf");
Config.refresh();
- System.out.println("Testing " + realm + ", " + fallback + ", " + output);
+ System.out.println("Testing " + u + ", " + f + ", " + r + ", " + k);
- if (!useDNS_Realm.invoke(Config.getInstance()).equals(output)) {
- throw new Exception("Fail");
+ if (!useDNS_Realm.invoke(Config.getInstance()).equals(r)) {
+ throw new Exception("useDNS_Realm Fail");
+ }
+
+ if (!useDNS_KDC.invoke(Config.getInstance()).equals(k)) {
+ throw new Exception("useDNS_KDC Fail");
}
}
}
diff --git a/test/sun/security/krb5/auto/HttpNegotiateServer.java b/test/sun/security/krb5/auto/HttpNegotiateServer.java
index 3007454..4da7cfa 100644
--- a/test/sun/security/krb5/auto/HttpNegotiateServer.java
+++ b/test/sun/security/krb5/auto/HttpNegotiateServer.java
@@ -40,16 +40,28 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;
-import java.security.PrivilegedExceptionAction;
+import java.net.URLConnection;
+import java.security.*;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
import org.ietf.jgss.GSSContext;
import org.ietf.jgss.GSSCredential;
import org.ietf.jgss.GSSManager;
@@ -191,7 +203,7 @@
proxyUrl = new URL("http://nosuchplace/a/b/c");
try {
- Exception e1 = null, e2 = null;
+ Exception e1 = null, e2 = null, e3 = null;
try {
test6578647();
} catch (Exception e) {
@@ -204,7 +216,14 @@
e2 = e;
e.printStackTrace();
}
- if (e1 != null || e2 != null) {
+ try {
+ test8077155();
+ } catch (Exception e) {
+ e3 = e;
+ e.printStackTrace();
+ }
+
+ if (e1 != null || e2 != null || e3 != null) {
throw new RuntimeException("Test error");
}
} finally {
@@ -248,6 +267,121 @@
}
}
+ static void testConnect() {
+ InputStream inputStream = null;
+ try {
+ URL url = webUrl;
+
+ URLConnection conn = url.openConnection();
+ conn.connect();
+ inputStream = conn.getInputStream();
+ byte[] b = new byte[inputStream.available()];
+ for (int j = 0; j < b.length; j++) {
+ b[j] = (byte) inputStream.read();
+ }
+ String s = new String(b);
+ System.out.println("Length: " + s.length());
+ System.out.println(s);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ static void test8077155() throws Exception {
+ final String username = WEB_USER;
+ final char[] password = WEB_PASS;
+
+ SecurityManager security = new SecurityManager();
+ Policy.setPolicy(new SecurityPolicy());
+ System.setSecurityManager(security);
+
+ CallbackHandler callback = new CallbackHandler() {
+ @Override
+ public void handle(Callback[] pCallbacks) throws IOException, UnsupportedCallbackException {
+ for (Callback cb : pCallbacks) {
+ if (cb instanceof NameCallback) {
+ NameCallback ncb = (NameCallback)cb;
+ ncb.setName(username);
+
+ } else if (cb instanceof PasswordCallback) {
+ PasswordCallback pwdcb = (PasswordCallback) cb;
+ pwdcb.setPassword(password);
+ }
+ }
+ }
+
+ };
+
+ final String jaasConfigName = "oracle.test.kerberos.login";
+ final String krb5LoginModule = "com.sun.security.auth.module.Krb5LoginModule";
+
+ Configuration loginConfig = new Configuration() {
+ @Override
+ public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
+ if (! jaasConfigName.equals(name)) {
+ return new AppConfigurationEntry[0];
+ }
+
+ Map<String, String> options = new HashMap<String, String>();
+ options.put("useTicketCache", Boolean.FALSE.toString());
+ options.put("useKeyTab", Boolean.FALSE.toString());
+
+ return new AppConfigurationEntry[] {
+ new AppConfigurationEntry(krb5LoginModule,
+ LoginModuleControlFlag.REQUIRED,
+ options)
+ };
+ }
+ };
+
+ // oracle context/subject/login
+ LoginContext context = null;
+ try {
+ context = new LoginContext("oracle.test.kerberos.login", null, callback, loginConfig);
+ context.login();
+
+ } catch (LoginException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex);
+ }
+
+
+ Subject subject = context.getSubject();
+
+ final PrivilegedExceptionAction<Object> test_action = new PrivilegedExceptionAction<Object>() {
+ public Object run() throws Exception {
+ testConnect();
+ return null;
+ }
+ };
+
+ System.err.println("\n\nExpecting to succeed when executing with the the logged in subject.");
+
+ try {
+ Subject.doAs(subject, test_action);
+ System.err.println("\n\nConnection succeed when executing with the the logged in subject.");
+ } catch (PrivilegedActionException e) {
+ System.err.println("\n\nFailure unexpected when executing with the the logged in subject.");
+ e.printStackTrace();
+ throw new RuntimeException("Failed to login as subject");
+ }
+
+ try {
+ System.err.println("\n\nExpecting to fail when running with the current user's login.");
+ testConnect();
+ } catch (Exception ex) {
+ System.err.println("\nConnect failed when running with the current user's login:\n" + ex.getMessage());
+ }
+ }
+
/**
* Creates and starts an HTTP or proxy server that requires
* Negotiate authentication.
@@ -360,3 +494,22 @@
}
}
}
+
+class SecurityPolicy extends Policy {
+
+ private static Permissions perms;
+
+ public SecurityPolicy() {
+ super();
+ if (perms == null) {
+ perms = new Permissions();
+ perms.add(new AllPermission());
+ }
+ }
+
+ @Override
+ public PermissionCollection getPermissions(CodeSource codesource) {
+ return perms;
+ }
+
+}
diff --git a/test/sun/security/krb5/config/DNS.java b/test/sun/security/krb5/config/DNS.java
index 8c574be..7171441 100644
--- a/test/sun/security/krb5/config/DNS.java
+++ b/test/sun/security/krb5/config/DNS.java
@@ -23,12 +23,22 @@
// See dns.sh.
import sun.security.krb5.Config;
+import sun.security.krb5.KrbException;
public class DNS {
public static void main(String[] args) throws Exception {
System.setProperty("java.security.krb5.conf",
- System.getProperty("test.src", ".") +"/nothing.conf");
+ System.getProperty("test.src", ".") +"/no-such-file.conf");
Config config = Config.getInstance();
+ try {
+ String r = config.getDefaultRealm();
+ throw new Exception("What? There is a default realm " + r + "?");
+ } catch (KrbException ke) {
+ ke.printStackTrace();
+ if (ke.getCause() != null) {
+ throw new Exception("There should be no cause. Won't try DNS");
+ }
+ }
String kdcs = config.getKDCList("X");
if (!kdcs.equals("a.com.:88 b.com.:99") &&
!kdcs.equals("a.com. b.com.:99")) {
diff --git a/test/sun/security/krb5/confplusprop.conf b/test/sun/security/krb5/confplusprop.conf
index 5e49948..39f7472 100644
--- a/test/sun/security/krb5/confplusprop.conf
+++ b/test/sun/security/krb5/confplusprop.conf
@@ -1,7 +1,7 @@
[libdefaults]
default_realm = R1
forwardable = well
-dns_lookup_realm = false
+dns_lookup_kdc = false
[realms]
R1 = {
diff --git a/test/sun/security/krb5/confplusprop2.conf b/test/sun/security/krb5/confplusprop2.conf
index c55464b..b308e7e 100644
--- a/test/sun/security/krb5/confplusprop2.conf
+++ b/test/sun/security/krb5/confplusprop2.conf
@@ -1,5 +1,5 @@
[libdefaults]
-dns_lookup_realm = false
+dns_lookup_kdc = false
[realms]
R1 = {
diff --git a/test/tools/launcher/Arrrghs.java b/test/tools/launcher/Arrrghs.java
index 62552c3..89893e4 100644
--- a/test/tools/launcher/Arrrghs.java
+++ b/test/tools/launcher/Arrrghs.java
@@ -24,7 +24,7 @@
/**
* @test
* @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881 6753938
- * 6894719 6968053 7151434 7146424 8007333
+ * 6894719 6968053 7151434 7146424 8007333 8077822
* @summary Argument parsing validation.
* @compile -XDignore.symbol.file Arrrghs.java
* @run main/othervm Arrrghs
@@ -431,6 +431,16 @@
throw new RuntimeException("Error: compiling java wildcards");
}
+ // test if javac (the command) can compile *.java with a vmoption
+ tr = doExec(javacCmd, "-cp", ".",
+ "-J-showversion", "-J-Dsomeproperty=foo",
+ libDir.getName() + File.separator + "*.java");
+ if (!tr.isOK()) {
+ System.out.println(tr);
+ throw new RuntimeException("Error: compiling java wildcards with vmoptions");
+ }
+
+
// use the jar cmd to create jars using the ? wildcard
File jarFoo = new File(libDir, "Foo.jar");
tr = doExec(jarCmd, "cvf", jarFoo.getAbsolutePath(), "lib" + File.separator + "F?o.class");
diff --git a/test/tools/pack200/DefaultTimeZoneTest.java b/test/tools/pack200/DefaultTimeZoneTest.java
new file mode 100644
index 0000000..0402957
--- /dev/null
+++ b/test/tools/pack200/DefaultTimeZoneTest.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.TimeZone;
+import java.util.concurrent.CountDownLatch;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Pack200;
+
+/*
+ * @test
+ * @bug 8066985
+ * @summary multithreading packing/unpacking files can result in Timezone set to UTC
+ * @compile -XDignore.symbol.file Utils.java DefaultTimeZoneTest.java
+ * @run main/othervm DefaultTimeZoneTest
+ * @author mcherkas
+ */
+
+
+public class DefaultTimeZoneTest {
+
+ private static final TimeZone tz = TimeZone.getTimeZone("Europe/Moscow");
+ private static final int INIT_THREAD_COUNT = Math.min(4, Runtime.getRuntime().availableProcessors());
+ private static final int MAX_THREAD_COUNT = 4 * INIT_THREAD_COUNT;
+ private static final long MINUTE = 60 * 1000;
+
+ private static class NoOpOutputStream extends OutputStream {
+ @Override
+ public void write(int b) throws IOException {
+ // no op
+ }
+ }
+
+ static class PackAction implements Runnable {
+ private Pack200.Packer packer = Pack200.newPacker();
+ private JarFile jarFile;
+
+ PackAction() throws IOException {
+ jarFile = new JarFile(new File("golden.jar"));
+ }
+
+ @Override
+ public void run() {
+ try {
+ packer.pack(jarFile, new NoOpOutputStream());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ static class UnpackAction implements Runnable {
+ private Pack200.Unpacker unpacker = Pack200.newUnpacker();
+ private JarOutputStream jos;
+ private File packedJar = new File("golden.pack");
+
+ UnpackAction() throws IOException {
+ jos = new JarOutputStream(new NoOpOutputStream());
+ }
+
+ @Override
+ public void run() {
+ try {
+ unpacker.unpack(packedJar, jos);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ try {
+ jos.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ };
+
+ public static void test(final Class<? extends Runnable> runnableClass) throws InterruptedException {
+ for (int i = INIT_THREAD_COUNT; i <= MAX_THREAD_COUNT; i*=2) {
+ final CountDownLatch startLatch = new CountDownLatch(i);
+ final CountDownLatch doneLatch = new CountDownLatch(i);
+ for (int j = 0; j < i; j++) {
+ new Thread() {
+ @Override
+ public void run() {
+ try {
+ Runnable r = runnableClass.newInstance();
+ startLatch.countDown();
+ startLatch.await();
+ r.run();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ } finally {
+ doneLatch.countDown();
+ }
+ }
+ }.start();
+ }
+ doneLatch.await();
+
+ if(!TimeZone.getDefault().equals(tz)) {
+ throw new RuntimeException("FAIL: default time zone was changed");
+ }
+ }
+ }
+
+ public static void main(String args[]) throws IOException, InterruptedException {
+ TimeZone.setDefault(tz);
+
+ // make a local copy of our test file
+ File srcFile = Utils.locateJar("golden.jar");
+ final File goldenFile = new File("golden.jar");
+ Utils.copyFile(srcFile, goldenFile);
+
+ // created packed file
+ final JarFile goldenJarFile = new JarFile(goldenFile);
+ final File packFile = new File("golden.pack");
+ Utils.pack(goldenJarFile, packFile);
+
+ // before test let's unpack golden pack to warm up
+ // a native unpacker. That allow us to avoid JDK-8080438
+ UnpackAction unpackAction = new UnpackAction();
+ unpackAction.run();
+
+ long startTime = System.currentTimeMillis();
+ while(System.currentTimeMillis() - startTime < MINUTE) {
+ // test packer
+ test(PackAction.class);
+
+ // test unpacker
+ test(UnpackAction.class);
+ }
+
+ Utils.cleanup();
+ }
+}