提交 76c2ef31 编写于 作者: M mullan

Merge

...@@ -186,3 +186,5 @@ cec8fa02f15634acd7d02d04b0b2d8c044cdbaaa jdk8-b60 ...@@ -186,3 +186,5 @@ cec8fa02f15634acd7d02d04b0b2d8c044cdbaaa jdk8-b60
50b8b17449d200c66bfd68fb4f3a9197432c9e2b jdk8-b62 50b8b17449d200c66bfd68fb4f3a9197432c9e2b jdk8-b62
f117a3e06f78a258074674ad17601f99bcb1ce0d jdk8-b63 f117a3e06f78a258074674ad17601f99bcb1ce0d jdk8-b63
26dbd73fb7662a29b3e47179fdc88a0bfa4e231e jdk8-b64 26dbd73fb7662a29b3e47179fdc88a0bfa4e231e jdk8-b64
130d3a54d28becaac0846137256c2684adb34c33 jdk8-b65
4d337fae2250135729ee9ed2bf8baf3c60da5d6d jdk8-b66
...@@ -35,7 +35,7 @@ SUBDIRS_MAKEFLAGS += JAVAC_WARNINGS_FATAL=true ...@@ -35,7 +35,7 @@ SUBDIRS_MAKEFLAGS += JAVAC_WARNINGS_FATAL=true
include $(BUILDDIR)/common/Defs.gmk include $(BUILDDIR)/common/Defs.gmk
SUBDIRS = auth SUBDIRS = auth
SUBDIRS_misc = jgss sasl auth/module SUBDIRS_misc = jgss sasl auth/module ntlm
include $(BUILDDIR)/common/Subdirs.gmk include $(BUILDDIR)/common/Subdirs.gmk
all build clean clobber:: all build clean clobber::
......
#
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. 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.
#
BUILDDIR = ../../../..
PACKAGE = com.sun.security.ntlm
PRODUCT = sun
include $(BUILDDIR)/common/Defs.gmk
#
# Files
#
AUTO_FILES_JAVA_DIRS = com/sun/security/ntlm
#
# Rules
#
include $(BUILDDIR)/common/Classes.gmk
...@@ -69,6 +69,7 @@ FILES_java += \ ...@@ -69,6 +69,7 @@ FILES_java += \
sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \ sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
\ \
sun/nio/fs/GnomeFileTypeDetector.java \ sun/nio/fs/GnomeFileTypeDetector.java \
sun/nio/fs/MimeTypesFileTypeDetector.java \
sun/nio/fs/PollingWatchService.java \ sun/nio/fs/PollingWatchService.java \
sun/nio/fs/SolarisAclFileAttributeView.java \ sun/nio/fs/SolarisAclFileAttributeView.java \
sun/nio/fs/SolarisFileStore.java \ sun/nio/fs/SolarisFileStore.java \
...@@ -202,6 +203,8 @@ FILES_java += \ ...@@ -202,6 +203,8 @@ FILES_java += \
sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \ sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
\ \
sun/nio/fs/GnomeFileTypeDetector.java \ sun/nio/fs/GnomeFileTypeDetector.java \
sun/nio/fs/MagicFileTypeDetector.java \
sun/nio/fs/MimeTypesFileTypeDetector.java \
sun/nio/fs/LinuxDosFileAttributeView.java \ sun/nio/fs/LinuxDosFileAttributeView.java \
sun/nio/fs/LinuxFileStore.java \ sun/nio/fs/LinuxFileStore.java \
sun/nio/fs/LinuxFileSystem.java \ sun/nio/fs/LinuxFileSystem.java \
...@@ -239,6 +242,7 @@ FILES_c += \ ...@@ -239,6 +242,7 @@ FILES_c += \
UnixAsynchronousSocketChannelImpl.c \ UnixAsynchronousSocketChannelImpl.c \
\ \
GnomeFileTypeDetector.c \ GnomeFileTypeDetector.c \
MagicFileTypeDetector.c \
LinuxNativeDispatcher.c \ LinuxNativeDispatcher.c \
LinuxWatchService.c \ LinuxWatchService.c \
UnixCopyFile.c \ UnixCopyFile.c \
...@@ -254,6 +258,7 @@ FILES_export += \ ...@@ -254,6 +258,7 @@ FILES_export += \
sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \ sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
\ \
sun/nio/fs/GnomeFileTypeDetector.java \ sun/nio/fs/GnomeFileTypeDetector.java \
sun/nio/fs/MagicFileTypeDetector.java \
sun/nio/fs/LinuxNativeDispatcher.java \ sun/nio/fs/LinuxNativeDispatcher.java \
sun/nio/fs/LinuxWatchService.java \ sun/nio/fs/LinuxWatchService.java \
sun/nio/fs/UnixCopyFile.java \ sun/nio/fs/UnixCopyFile.java \
...@@ -277,6 +282,7 @@ FILES_java += \ ...@@ -277,6 +282,7 @@ FILES_java += \
sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \ sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \
sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \ sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
\ \
sun/nio/fs/MimeTypesFileTypeDetector.java \
sun/nio/fs/BsdFileStore.java \ sun/nio/fs/BsdFileStore.java \
sun/nio/fs/BsdFileSystem.java \ sun/nio/fs/BsdFileSystem.java \
sun/nio/fs/BsdFileSystemProvider.java \ sun/nio/fs/BsdFileSystemProvider.java \
......
...@@ -130,6 +130,8 @@ SUNWprivate_1.1 { ...@@ -130,6 +130,8 @@ SUNWprivate_1.1 {
Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGio; Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGio;
Java_sun_nio_fs_GnomeFileTypeDetector_initializeGnomeVfs; Java_sun_nio_fs_GnomeFileTypeDetector_initializeGnomeVfs;
Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGnomeVfs; Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGnomeVfs;
Java_sun_nio_fs_MagicFileTypeDetector_initialize0;
Java_sun_nio_fs_MagicFileTypeDetector_probe0;
Java_sun_nio_fs_LinuxWatchService_eventSize; Java_sun_nio_fs_LinuxWatchService_eventSize;
Java_sun_nio_fs_LinuxWatchService_eventOffsets; Java_sun_nio_fs_LinuxWatchService_eventOffsets;
Java_sun_nio_fs_LinuxWatchService_inotifyInit; Java_sun_nio_fs_LinuxWatchService_inotifyInit;
......
...@@ -40,7 +40,8 @@ AUTO_FILES_JAVA_DIRS = java/security ...@@ -40,7 +40,8 @@ AUTO_FILES_JAVA_DIRS = java/security
# Directories # Directories
# #
PROPS_SRC = $(TOPDIR)/src/share/lib/security/java.security # The default security properties file is for linux
PROPS_SRC = $(TOPDIR)/src/share/lib/security/java.security-linux
ifeq ($(PLATFORM), solaris) ifeq ($(PLATFORM), solaris)
PROPS_SRC = $(TOPDIR)/src/share/lib/security/java.security-solaris PROPS_SRC = $(TOPDIR)/src/share/lib/security/java.security-solaris
......
...@@ -86,7 +86,6 @@ jprt.make.rule.core.test.targets= \ ...@@ -86,7 +86,6 @@ jprt.make.rule.core.test.targets= \
${jprt.my.test.target.set:TESTNAME=jdk_jmx}, \ ${jprt.my.test.target.set:TESTNAME=jdk_jmx}, \
${jprt.my.test.target.set:TESTNAME=jdk_text}, \ ${jprt.my.test.target.set:TESTNAME=jdk_text}, \
${jprt.my.test.target.set:TESTNAME=jdk_tools}, \ ${jprt.my.test.target.set:TESTNAME=jdk_tools}, \
${jprt.my.test.target.set:TESTNAME=jdk_jdi}, \
${jprt.my.test.target.set:TESTNAME=jdk_jfr}, \ ${jprt.my.test.target.set:TESTNAME=jdk_jfr}, \
${jprt.my.test.target.set:TESTNAME=jdk_other} ${jprt.my.test.target.set:TESTNAME=jdk_other}
...@@ -103,6 +102,7 @@ jprt.make.rule.all.test.targets= \ ...@@ -103,6 +102,7 @@ jprt.make.rule.all.test.targets= \
${jprt.my.test.target.set:TESTNAME=jdk_beans1}, \ ${jprt.my.test.target.set:TESTNAME=jdk_beans1}, \
${jprt.my.test.target.set:TESTNAME=jdk_beans2}, \ ${jprt.my.test.target.set:TESTNAME=jdk_beans2}, \
${jprt.my.test.target.set:TESTNAME=jdk_beans3}, \ ${jprt.my.test.target.set:TESTNAME=jdk_beans3}, \
${jprt.my.test.target.set:TESTNAME=jdk_jdi}, \
${jprt.my.test.target.set:TESTNAME=jdk_sound}, \ ${jprt.my.test.target.set:TESTNAME=jdk_sound}, \
${jprt.my.test.target.set:TESTNAME=jdk_swing} ${jprt.my.test.target.set:TESTNAME=jdk_swing}
......
...@@ -29,6 +29,7 @@ import java.util.ArrayList; ...@@ -29,6 +29,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -86,7 +87,23 @@ class Bundle { ...@@ -86,7 +87,23 @@ class Bundle {
private final static String[] ERA_KEYS = { private final static String[] ERA_KEYS = {
"long.Eras", "long.Eras",
"Eras", "Eras",
"short.Eras" "narrow.Eras"
};
// Keys for individual time zone names
private final static String TZ_GEN_LONG_KEY = "timezone.displayname.generic.long";
private final static String TZ_GEN_SHORT_KEY = "timezone.displayname.generic.short";
private final static String TZ_STD_LONG_KEY = "timezone.displayname.standard.long";
private final static String TZ_STD_SHORT_KEY = "timezone.displayname.standard.short";
private final static String TZ_DST_LONG_KEY = "timezone.displayname.daylight.long";
private final static String TZ_DST_SHORT_KEY = "timezone.displayname.daylight.short";
private final static String[] ZONE_NAME_KEYS = {
TZ_STD_LONG_KEY,
TZ_STD_SHORT_KEY,
TZ_DST_LONG_KEY,
TZ_DST_SHORT_KEY,
TZ_GEN_LONG_KEY,
TZ_GEN_SHORT_KEY
}; };
private final String id; private final String id;
...@@ -98,6 +115,7 @@ class Bundle { ...@@ -98,6 +115,7 @@ class Bundle {
return bundles.get(id); return bundles.get(id);
} }
@SuppressWarnings("ConvertToStringSwitch")
Bundle(String id, String cldrPath, String bundles, String currencies) { Bundle(String id, String cldrPath, String bundles, String currencies) {
this.id = id; this.id = id;
this.cldrPath = cldrPath; this.cldrPath = cldrPath;
...@@ -242,9 +260,12 @@ class Bundle { ...@@ -242,9 +260,12 @@ class Bundle {
// handle multiple inheritance for month and day names // handle multiple inheritance for month and day names
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthNames"); handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthNames");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthAbbreviations"); handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthAbbreviations");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthNarrows");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayNames"); handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayNames");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayAbbreviations"); handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayAbbreviations");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayNarrows");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "AmPmMarkers"); handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "AmPmMarkers");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "narrow.AmPmMarkers");
adjustEraNames(myMap, calendarType); adjustEraNames(myMap, calendarType);
...@@ -253,6 +274,99 @@ class Bundle { ...@@ -253,6 +274,99 @@ class Bundle {
handleDateTimeFormatPatterns(DATETIME_PATTERN_KEYS, myMap, parentsMap, calendarType, "DateTimePatterns"); handleDateTimeFormatPatterns(DATETIME_PATTERN_KEYS, myMap, parentsMap, calendarType, "DateTimePatterns");
} }
// if myMap has any empty timezone or metazone names, weed out them.
// Fill in any missing abbreviations if locale is "en".
for (Iterator<String> it = myMap.keySet().iterator(); it.hasNext();) {
String key = it.next();
if (key.startsWith(CLDRConverter.TIMEZONE_ID_PREFIX)
|| key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) {
@SuppressWarnings("unchecked")
Map<String, String> nameMap = (Map<String, String>) myMap.get(key);
if (nameMap.isEmpty()) {
// Some zones have only exemplarCity, which become empty.
// Remove those from the map.
it.remove();
continue;
}
if (id.startsWith("en")) {
fillInAbbrs(key, nameMap);
}
}
}
for (Iterator<String> it = myMap.keySet().iterator(); it.hasNext();) {
String key = it.next();
if (key.startsWith(CLDRConverter.TIMEZONE_ID_PREFIX)
|| key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) {
@SuppressWarnings("unchecked")
Map<String, String> nameMap = (Map<String, String>) myMap.get(key);
// Convert key/value pairs to an array.
String[] names = new String[ZONE_NAME_KEYS.length];
int ix = 0;
for (String nameKey : ZONE_NAME_KEYS) {
String name = nameMap.get(nameKey);
if (name == null) {
@SuppressWarnings("unchecked")
Map<String, String> parentNames = (Map<String, String>) parentsMap.get(key);
if (parentNames != null) {
name = parentNames.get(nameKey);
}
}
names[ix++] = name;
}
if (hasNulls(names)) {
String metaKey = toMetaZoneKey(key);
if (metaKey != null) {
Object obj = myMap.get(metaKey);
if (obj instanceof String[]) {
String[] metaNames = (String[]) obj;
for (int i = 0; i < names.length; i++) {
if (names[i] == null) {
names[i] = metaNames[i];
}
}
} else if (obj instanceof Map) {
@SuppressWarnings("unchecked")
Map<String, String> m = (Map<String, String>) obj;
for (int i = 0; i < names.length; i++) {
if (names[i] == null) {
names[i] = m.get(ZONE_NAME_KEYS[i]);
}
}
}
}
// If there are still any nulls, try filling in them from en data.
if (hasNulls(names) && !id.equals("en")) {
@SuppressWarnings("unchecked")
String[] enNames = (String[]) Bundle.getBundle("en").getTargetMap().get(key);
if (enNames == null) {
if (metaKey != null) {
@SuppressWarnings("unchecked")
String[] metaNames = (String[]) Bundle.getBundle("en").getTargetMap().get(metaKey);
enNames = metaNames;
}
}
if (enNames != null) {
for (int i = 0; i < names.length; i++) {
if (names[i] == null) {
names[i] = enNames[i];
}
}
}
// If there are still nulls, give up names.
if (hasNulls(names)) {
names = null;
}
}
}
// replace the Map with the array
if (names != null) {
myMap.put(key, names);
} else {
it.remove();
}
}
}
return myMap; return myMap;
} }
...@@ -352,20 +466,10 @@ class Bundle { ...@@ -352,20 +466,10 @@ class Bundle {
realKeys[index] = realKey; realKeys[index] = realKey;
eraNames[index++] = value; eraNames[index++] = value;
} }
if (eraNames[0] != null) { for (int i = 0; i < eraNames.length; i++) {
if (eraNames[1] != null) { if (eraNames[i] == null) {
if (eraNames[2] == null) { map.put(realKeys[i], null);
// Eras -> short.Eras
// long.Eras -> Eras
map.put(realKeys[2], map.get(realKeys[1]));
map.put(realKeys[1], map.get(realKeys[0]));
} }
} else {
// long.Eras -> Eras
map.put(realKeys[1], map.get(realKeys[0]));
}
// remove long.Eras
map.remove(realKeys[0]);
} }
} }
...@@ -473,6 +577,86 @@ class Bundle { ...@@ -473,6 +577,86 @@ class Bundle {
return jrePattern.toString(); return jrePattern.toString();
} }
private String toMetaZoneKey(String tzKey) {
if (tzKey.startsWith(CLDRConverter.TIMEZONE_ID_PREFIX)) {
String tz = tzKey.substring(CLDRConverter.TIMEZONE_ID_PREFIX.length());
String meta = CLDRConverter.handlerMetaZones.get(tz);
if (meta != null) {
return CLDRConverter.METAZONE_ID_PREFIX + meta;
}
}
return null;
}
private void fillInAbbrs(String key, Map<String, String> map) {
fillInAbbrs(TZ_STD_LONG_KEY, TZ_STD_SHORT_KEY, map);
fillInAbbrs(TZ_DST_LONG_KEY, TZ_DST_SHORT_KEY, map);
fillInAbbrs(TZ_GEN_LONG_KEY, TZ_GEN_SHORT_KEY, map);
// If the standard std is "Standard Time" and daylight std is "Summer Time",
// replace the standard std with the generic std to avoid using
// the same abbrivation except for Australia time zone names.
String std = map.get(TZ_STD_SHORT_KEY);
String dst = map.get(TZ_DST_SHORT_KEY);
String gen = map.get(TZ_GEN_SHORT_KEY);
if (std != null) {
if (dst == null) {
// if dst is null, create long and short names from the standard
// std. ("Something Standard Time" to "Something Daylight Time",
// or "Something Time" to "Something Summer Time")
String name = map.get(TZ_STD_LONG_KEY);
if (name != null) {
if (name.contains("Standard Time")) {
name = name.replace("Standard Time", "Daylight Time");
} else if (name.endsWith("Mean Time")) {
name = name.replace("Mean Time", "Summer Time");
} else if (name.endsWith(" Time")) {
name = name.replace(" Time", " Summer Time");
}
map.put(TZ_DST_LONG_KEY, name);
fillInAbbrs(TZ_DST_LONG_KEY, TZ_DST_SHORT_KEY, map);
}
}
if (gen == null) {
String name = map.get(TZ_STD_LONG_KEY);
if (name != null) {
if (name.endsWith("Standard Time")) {
name = name.replace("Standard Time", "Time");
} else if (name.endsWith("Mean Time")) {
name = name.replace("Mean Time", "Time");
}
map.put(TZ_GEN_LONG_KEY, name);
fillInAbbrs(TZ_GEN_LONG_KEY, TZ_GEN_SHORT_KEY, map);
}
}
}
}
private void fillInAbbrs(String longKey, String shortKey, Map<String, String> map) {
String abbr = map.get(shortKey);
if (abbr == null) {
String name = map.get(longKey);
if (name != null) {
abbr = toAbbr(name);
if (abbr != null) {
map.put(shortKey, abbr);
}
}
}
}
private String toAbbr(String name) {
String[] substrs = name.split("\\s+");
StringBuilder sb = new StringBuilder();
for (String s : substrs) {
char c = s.charAt(0);
if (c >= 'A' && c <= 'Z') {
sb.append(c);
}
}
return sb.length() > 0 ? sb.toString() : null;
}
private void convert(CalendarType calendarType, char cldrLetter, int count, StringBuilder sb) { private void convert(CalendarType calendarType, char cldrLetter, int count, StringBuilder sb) {
switch (cldrLetter) { switch (cldrLetter) {
case 'G': case 'G':
...@@ -539,4 +723,13 @@ class Bundle { ...@@ -539,4 +723,13 @@ class Bundle {
sb.append(c); sb.append(c);
} }
} }
private static boolean hasNulls(Object[] array) {
for (int i = 0; i < array.length; i++) {
if (array[i] == null) {
return true;
}
}
return false;
}
} }
...@@ -30,8 +30,27 @@ import java.util.Map; ...@@ -30,8 +30,27 @@ import java.util.Map;
import java.util.SortedSet; import java.util.SortedSet;
public interface BundleGenerator { public interface BundleGenerator {
static enum BundleType {
PLAIN("java.util.ListResourceBundle"),
OPEN("sun.util.resources.OpenListResourceBundle"),
TIMEZONE("sun.util.resources.TimeZoneNamesBundle");
private final String pathName, className;
private BundleType(String name) {
pathName = name;
int x = name.lastIndexOf('.');
className = name.substring(x + 1);
}
String getPathName() {
return pathName;
}
String getClassName() {
return className;
}
};
public void generateBundle(String packageName, String baseName, String localeID, public void generateBundle(String packageName, String baseName, String localeID,
boolean useJava, Map<String, ?> map, boolean open) throws IOException; boolean useJava, Map<String, ?> map, BundleType type) throws IOException;
public void generateMetaInfo(Map<String, SortedSet<String>> metaInfo) throws IOException; public void generateMetaInfo(Map<String, SortedSet<String>> metaInfo) throws IOException;
} }
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
package build.tools.cldrconverter; package build.tools.cldrconverter;
import build.tools.cldrconverter.BundleGenerator.BundleType;
import java.io.File; import java.io.File;
import java.nio.file.DirectoryStream; import java.nio.file.DirectoryStream;
import java.nio.file.FileSystems; import java.nio.file.FileSystems;
...@@ -58,9 +59,8 @@ public class CLDRConverter { ...@@ -58,9 +59,8 @@ public class CLDRConverter {
static final String CURRENCY_SYMBOL_PREFIX = "currency.symbol."; static final String CURRENCY_SYMBOL_PREFIX = "currency.symbol.";
static final String CURRENCY_NAME_PREFIX = "currency.displayname."; static final String CURRENCY_NAME_PREFIX = "currency.displayname.";
static final String TIMEZONE_ID_PREFIX = "timezone.id."; static final String TIMEZONE_ID_PREFIX = "timezone.id.";
static final String TIMEZONE_NAME_PREFIX = "timezone.displayname."; static final String ZONE_NAME_PREFIX = "timezone.displayname.";
static final String METAZONE_ID_PREFIX = "metazone.id."; static final String METAZONE_ID_PREFIX = "metazone.id.";
static final String METAZONE_NAME_PREFIX = "metazone.displayname.";
private static SupplementDataParseHandler handlerSuppl; private static SupplementDataParseHandler handlerSuppl;
static NumberingSystemsParseHandler handlerNumbering; static NumberingSystemsParseHandler handlerNumbering;
...@@ -236,7 +236,14 @@ public class CLDRConverter { ...@@ -236,7 +236,14 @@ public class CLDRConverter {
if (sb.indexOf("root") == -1) { if (sb.indexOf("root") == -1) {
sb.append("root"); sb.append("root");
} }
retList.add(new Bundle(id, sb.toString(), null, null)); Bundle b = new Bundle(id, sb.toString(), null, null);
// Insert the bundle for en at the top so that it will get
// processed first.
if ("en".equals(id)) {
retList.add(0, b);
} else {
retList.add(b);
}
} }
} }
} }
...@@ -312,6 +319,7 @@ public class CLDRConverter { ...@@ -312,6 +319,7 @@ public class CLDRConverter {
Map<String, SortedSet<String>> metaInfo = new HashMap<>(); Map<String, SortedSet<String>> metaInfo = new HashMap<>();
metaInfo.put("LocaleNames", new TreeSet<String>()); metaInfo.put("LocaleNames", new TreeSet<String>());
metaInfo.put("CurrencyNames", new TreeSet<String>()); metaInfo.put("CurrencyNames", new TreeSet<String>());
metaInfo.put("TimeZoneNames", new TreeSet<String>());
metaInfo.put("CalendarData", new TreeSet<String>()); metaInfo.put("CalendarData", new TreeSet<String>());
metaInfo.put("FormatData", new TreeSet<String>()); metaInfo.put("FormatData", new TreeSet<String>());
...@@ -348,24 +356,28 @@ public class CLDRConverter { ...@@ -348,24 +356,28 @@ public class CLDRConverter {
Map<String, Object> localeNamesMap = extractLocaleNames(targetMap, bundle.getID()); Map<String, Object> localeNamesMap = extractLocaleNames(targetMap, bundle.getID());
if (!localeNamesMap.isEmpty() || bundle.isRoot()) { if (!localeNamesMap.isEmpty() || bundle.isRoot()) {
metaInfo.get("LocaleNames").add(toLanguageTag(bundle.getID())); metaInfo.get("LocaleNames").add(toLanguageTag(bundle.getID()));
bundleGenerator.generateBundle("util", "LocaleNames", bundle.getID(), true, localeNamesMap, true); bundleGenerator.generateBundle("util", "LocaleNames", bundle.getID(), true, localeNamesMap, BundleType.OPEN);
} }
} }
if (bundleTypes.contains(Bundle.Type.CURRENCYNAMES)) { if (bundleTypes.contains(Bundle.Type.CURRENCYNAMES)) {
Map<String, Object> currencyNamesMap = extractCurrencyNames(targetMap, bundle.getID(), bundle.getCurrencies()); Map<String, Object> currencyNamesMap = extractCurrencyNames(targetMap, bundle.getID(), bundle.getCurrencies());
if (!currencyNamesMap.isEmpty() || bundle.isRoot()) { if (!currencyNamesMap.isEmpty() || bundle.isRoot()) {
metaInfo.get("CurrencyNames").add(toLanguageTag(bundle.getID())); metaInfo.get("CurrencyNames").add(toLanguageTag(bundle.getID()));
bundleGenerator.generateBundle("util", "CurrencyNames", bundle.getID(), true, currencyNamesMap, true); bundleGenerator.generateBundle("util", "CurrencyNames", bundle.getID(), true, currencyNamesMap, BundleType.OPEN);
} }
} }
if (bundleTypes.contains(Bundle.Type.TIMEZONENAMES)) { if (bundleTypes.contains(Bundle.Type.TIMEZONENAMES)) {
Map<String, Object> zoneNamesMap = extractZoneNames(targetMap, bundle.getID()); Map<String, Object> zoneNamesMap = extractZoneNames(targetMap, bundle.getID());
if (!zoneNamesMap.isEmpty() || bundle.isRoot()) {
metaInfo.get("TimeZoneNames").add(toLanguageTag(bundle.getID()));
bundleGenerator.generateBundle("util", "TimeZoneNames", bundle.getID(), true, zoneNamesMap, BundleType.TIMEZONE);
}
} }
if (bundleTypes.contains(Bundle.Type.CALENDARDATA)) { if (bundleTypes.contains(Bundle.Type.CALENDARDATA)) {
Map<String, Object> calendarDataMap = extractCalendarData(targetMap, bundle.getID()); Map<String, Object> calendarDataMap = extractCalendarData(targetMap, bundle.getID());
if (!calendarDataMap.isEmpty() || bundle.isRoot()) { if (!calendarDataMap.isEmpty() || bundle.isRoot()) {
metaInfo.get("CalendarData").add(toLanguageTag(bundle.getID())); metaInfo.get("CalendarData").add(toLanguageTag(bundle.getID()));
bundleGenerator.generateBundle("util", "CalendarData", bundle.getID(), true, calendarDataMap, false); bundleGenerator.generateBundle("util", "CalendarData", bundle.getID(), true, calendarDataMap, BundleType.PLAIN);
} }
} }
if (bundleTypes.contains(Bundle.Type.FORMATDATA)) { if (bundleTypes.contains(Bundle.Type.FORMATDATA)) {
...@@ -373,9 +385,10 @@ public class CLDRConverter { ...@@ -373,9 +385,10 @@ public class CLDRConverter {
// LocaleData.getAvailableLocales depends on having FormatData bundles around // LocaleData.getAvailableLocales depends on having FormatData bundles around
if (!formatDataMap.isEmpty() || bundle.isRoot()) { if (!formatDataMap.isEmpty() || bundle.isRoot()) {
metaInfo.get("FormatData").add(toLanguageTag(bundle.getID())); metaInfo.get("FormatData").add(toLanguageTag(bundle.getID()));
bundleGenerator.generateBundle("text", "FormatData", bundle.getID(), true, formatDataMap, false); bundleGenerator.generateBundle("text", "FormatData", bundle.getID(), true, formatDataMap, BundleType.PLAIN);
} }
} }
// For testing // For testing
SortedSet<String> allLocales = new TreeSet<>(); SortedSet<String> allLocales = new TreeSet<>();
allLocales.addAll(metaInfo.get("CurrencyNames")); allLocales.addAll(metaInfo.get("CurrencyNames"));
...@@ -431,6 +444,7 @@ public class CLDRConverter { ...@@ -431,6 +444,7 @@ public class CLDRConverter {
private KeyComparator() { private KeyComparator() {
} }
@Override
public int compare(String o1, String o2) { public int compare(String o1, String o2) {
int len1 = o1.length(); int len1 = o1.length();
int len2 = o2.length(); int len2 = o2.length();
...@@ -476,7 +490,26 @@ public class CLDRConverter { ...@@ -476,7 +490,26 @@ public class CLDRConverter {
} }
private static Map<String, Object> extractZoneNames(Map<String, Object> map, String id) { private static Map<String, Object> extractZoneNames(Map<String, Object> map, String id) {
return null; Map<String, Object> names = new HashMap<>();
for (String tzid : handlerMetaZones.keySet()) {
String tzKey = TIMEZONE_ID_PREFIX + tzid;
Object data = map.get(tzKey);
if (data instanceof String[]) {
names.put(tzid, data);
} else {
String meta = handlerMetaZones.get(tzid);
if (meta != null) {
String metaKey = METAZONE_ID_PREFIX + meta;
data = map.get(metaKey);
if (data instanceof String[]) {
// Keep the metazone prefix here.
names.put(metaKey, data);
names.put(tzid, meta);
}
}
}
}
return names;
} }
private static Map<String, Object> extractCalendarData(Map<String, Object> map, String id) { private static Map<String, Object> extractCalendarData(Map<String, Object> map, String id) {
...@@ -494,11 +527,19 @@ public class CLDRConverter { ...@@ -494,11 +527,19 @@ public class CLDRConverter {
copyIfPresent(map, prefix + "standalone.MonthNames", formatData); copyIfPresent(map, prefix + "standalone.MonthNames", formatData);
copyIfPresent(map, prefix + "MonthAbbreviations", formatData); copyIfPresent(map, prefix + "MonthAbbreviations", formatData);
copyIfPresent(map, prefix + "standalone.MonthAbbreviations", formatData); copyIfPresent(map, prefix + "standalone.MonthAbbreviations", formatData);
copyIfPresent(map, prefix + "MonthNarrow", formatData);
copyIfPresent(map, prefix + "standalone.MonthNarrows", formatData);
copyIfPresent(map, prefix + "DayNames", formatData); copyIfPresent(map, prefix + "DayNames", formatData);
copyIfPresent(map, prefix + "standalone.DayNames", formatData);
copyIfPresent(map, prefix + "DayAbbreviations", formatData); copyIfPresent(map, prefix + "DayAbbreviations", formatData);
copyIfPresent(map, prefix + "standalone.DayAbbreviations", formatData);
copyIfPresent(map, prefix + "DayNarrows", formatData);
copyIfPresent(map, prefix + "standalone.DayNarrows", formatData);
copyIfPresent(map, prefix + "AmPmMarkers", formatData); copyIfPresent(map, prefix + "AmPmMarkers", formatData);
copyIfPresent(map, prefix + "narrow.AmPmMarkers", formatData);
copyIfPresent(map, prefix + "long.Eras", formatData);
copyIfPresent(map, prefix + "Eras", formatData); copyIfPresent(map, prefix + "Eras", formatData);
copyIfPresent(map, prefix + "short.Eras", formatData); copyIfPresent(map, prefix + "narrow.Eras", formatData);
copyIfPresent(map, prefix + "TimePatterns", formatData); copyIfPresent(map, prefix + "TimePatterns", formatData);
copyIfPresent(map, prefix + "DatePatterns", formatData); copyIfPresent(map, prefix + "DatePatterns", formatData);
copyIfPresent(map, prefix + "DateTimePatterns", formatData); copyIfPresent(map, prefix + "DateTimePatterns", formatData);
...@@ -560,7 +601,6 @@ public class CLDRConverter { ...@@ -560,7 +601,6 @@ public class CLDRConverter {
if (x == 0 || escapeSpace) { if (x == 0 || escapeSpace) {
outBuffer.append('\\'); outBuffer.append('\\');
} }
outBuffer.append(' '); outBuffer.append(' ');
break; break;
case '\\': case '\\':
...@@ -584,7 +624,7 @@ public class CLDRConverter { ...@@ -584,7 +624,7 @@ public class CLDRConverter {
outBuffer.append('f'); outBuffer.append('f');
break; break;
default: default:
if (!USE_UTF8 && ((aChar < 0x0020) || (aChar > 0x007e))) { if (aChar < 0x0020 || (!USE_UTF8 && aChar > 0x007e)) {
formatter.format("\\u%04x", (int)aChar); formatter.format("\\u%04x", (int)aChar);
} else { } else {
if (specialSaveChars.indexOf(aChar) != -1) { if (specialSaveChars.indexOf(aChar) != -1) {
......
...@@ -155,6 +155,9 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> { ...@@ -155,6 +155,9 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
case "abbreviated": case "abbreviated":
pushStringArrayEntry(qName, attributes, prefix + "MonthAbbreviations/" + getContainerKey(), 13); pushStringArrayEntry(qName, attributes, prefix + "MonthAbbreviations/" + getContainerKey(), 13);
break; break;
case "narrow":
pushStringArrayEntry(qName, attributes, prefix + "MonthNarrows/" + getContainerKey(), 13);
break;
default: default:
pushIgnoredContainer(qName); pushIgnoredContainer(qName);
break; break;
...@@ -191,6 +194,9 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> { ...@@ -191,6 +194,9 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
case "abbreviated": case "abbreviated":
pushStringArrayEntry(qName, attributes, prefix + "DayAbbreviations/" + getContainerKey(), 7); pushStringArrayEntry(qName, attributes, prefix + "DayAbbreviations/" + getContainerKey(), 7);
break; break;
case "narrow":
pushStringArrayEntry(qName, attributes, prefix + "DayNarrows/" + getContainerKey(), 7);
break;
default: default:
pushIgnoredContainer(qName); pushIgnoredContainer(qName);
break; break;
...@@ -219,15 +225,22 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> { ...@@ -219,15 +225,22 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
case "dayPeriodWidth": case "dayPeriodWidth":
// for FormatData // for FormatData
// create string array entry for am/pm. only keeping wide // create string array entry for am/pm. only keeping wide
if ("wide".equals(attributes.getValue("type"))) { switch (attributes.getValue("type")) {
case "wide":
pushStringArrayEntry(qName, attributes, "AmPmMarkers/" + getContainerKey(), 2); pushStringArrayEntry(qName, attributes, "AmPmMarkers/" + getContainerKey(), 2);
} else { break;
case "narrow":
pushStringArrayEntry(qName, attributes, "narrow.AmPmMarkers/" + getContainerKey(), 2);
break;
default:
pushIgnoredContainer(qName); pushIgnoredContainer(qName);
break;
} }
break; break;
case "dayPeriod": case "dayPeriod":
// for FormatData // for FormatData
// add to string array entry of AmPmMarkers element // add to string array entry of AmPmMarkers element
if (attributes.getValue("alt") == null) {
switch (attributes.getValue("type")) { switch (attributes.getValue("type")) {
case "am": case "am":
pushStringArrayElement(qName, attributes, 0); pushStringArrayElement(qName, attributes, 0);
...@@ -239,6 +252,10 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> { ...@@ -239,6 +252,10 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
pushIgnoredContainer(qName); pushIgnoredContainer(qName);
break; break;
} }
} else {
// discard alt values
pushIgnoredContainer(qName);
}
break; break;
case "eraNames": case "eraNames":
// CLDR era names are inconsistent in terms of their lengths. For example, // CLDR era names are inconsistent in terms of their lengths. For example,
...@@ -269,7 +286,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> { ...@@ -269,7 +286,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
assert currentContainer instanceof IgnoredContainer; assert currentContainer instanceof IgnoredContainer;
pushIgnoredContainer(qName); pushIgnoredContainer(qName);
} else { } else {
String key = currentCalendarType.keyElementName() + "short.Eras"; String key = currentCalendarType.keyElementName() + "narrow.Eras";
pushStringArrayEntry(qName, attributes, key, currentCalendarType.getEraLength(qName)); pushStringArrayEntry(qName, attributes, key, currentCalendarType.getEraLength(qName));
} }
break; break;
...@@ -301,15 +318,15 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> { ...@@ -301,15 +318,15 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
break; break;
case "zone": case "zone":
{ {
String zone = attributes.getValue("type"); String tzid = attributes.getValue("type"); // Olson tz id
zonePrefix = CLDRConverter.TIMEZONE_ID_PREFIX; zonePrefix = CLDRConverter.TIMEZONE_ID_PREFIX;
put(zonePrefix + zone, new HashMap<String, String>()); put(zonePrefix + tzid, new HashMap<String, String>());
pushKeyContainer(qName, attributes, zone); pushKeyContainer(qName, attributes, tzid);
} }
break; break;
case "metazone": case "metazone":
{ {
String zone = attributes.getValue("type"); String zone = attributes.getValue("type"); // LDML meta zone id
zonePrefix = CLDRConverter.METAZONE_ID_PREFIX; zonePrefix = CLDRConverter.METAZONE_ID_PREFIX;
put(zonePrefix + zone, new HashMap<String, String>()); put(zonePrefix + zone, new HashMap<String, String>());
pushKeyContainer(qName, attributes, zone); pushKeyContainer(qName, attributes, zone);
...@@ -323,16 +340,12 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> { ...@@ -323,16 +340,12 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
zoneNameStyle = "short"; zoneNameStyle = "short";
pushContainer(qName, attributes); pushContainer(qName, attributes);
break; break;
case "generic": // not used in JDK case "generic": // generic name
pushIgnoredContainer(qName); case "standard": // standard time name
break; case "daylight": // daylight saving (summer) time name
case "standard": // standard time pushStringEntry(qName, attributes, CLDRConverter.ZONE_NAME_PREFIX + qName + "." + zoneNameStyle);
pushStringEntry(qName, attributes, CLDRConverter.TIMEZONE_NAME_PREFIX + "standard." + zoneNameStyle);
break;
case "daylight":
pushStringEntry(qName, attributes, CLDRConverter.TIMEZONE_NAME_PREFIX + "daylight." + zoneNameStyle);
break; break;
case "exemplarCity": case "exemplarCity": // not used in JDK
pushIgnoredContainer(qName); pushIgnoredContainer(qName);
break; break;
...@@ -530,6 +543,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> { ...@@ -530,6 +543,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
case "timeZoneNames": case "timeZoneNames":
zonePrefix = null; zonePrefix = null;
break; break;
case "generic":
case "standard": case "standard":
case "daylight": case "daylight":
if (zonePrefix != null && (currentContainer instanceof Entry)) { if (zonePrefix != null && (currentContainer instanceof Entry)) {
......
...@@ -46,8 +46,9 @@ class MetaZonesParseHandler extends AbstractLDMLHandler<String> { ...@@ -46,8 +46,9 @@ class MetaZonesParseHandler extends AbstractLDMLHandler<String> {
return null; return null;
} }
// metaZone: ID -> metazone
// per locale: ID -> names, metazone -> names
@Override @Override
@SuppressWarnings("fallthrough")
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
switch (qName) { switch (qName) {
case "timezone": case "timezone":
......
...@@ -28,14 +28,16 @@ package build.tools.cldrconverter; ...@@ -28,14 +28,16 @@ package build.tools.cldrconverter;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Formatter;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.SortedSet; import java.util.SortedSet;
class ResourceBundleGenerator implements BundleGenerator { class ResourceBundleGenerator implements BundleGenerator {
@Override @Override
public void generateBundle(String packageName, String baseName, String localeID, boolean useJava, public void generateBundle(String packageName, String baseName, String localeID, boolean useJava,
Map<String, ?> map, boolean open) throws IOException { Map<String, ?> map, BundleType type) throws IOException {
String suffix = useJava ? ".java" : ".properties"; String suffix = useJava ? ".java" : ".properties";
String lang = CLDRConverter.getLanguageCode(localeID); String lang = CLDRConverter.getLanguageCode(localeID);
String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator
...@@ -67,6 +69,28 @@ class ResourceBundleGenerator implements BundleGenerator { ...@@ -67,6 +69,28 @@ class ResourceBundleGenerator implements BundleGenerator {
encoding = "iso-8859-1"; encoding = "iso-8859-1";
} }
Formatter fmt = null;
if (type == BundleType.TIMEZONE) {
fmt = new Formatter();
Set<String> metaKeys = new HashSet<>();
for (String key : map.keySet()) {
if (key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) {
String meta = key.substring(CLDRConverter.METAZONE_ID_PREFIX.length());
String[] value;
value = (String[]) map.get(key);
fmt.format(" final String[] %s = new String[] {\n", meta);
for (String s : value) {
fmt.format(" \"%s\",\n", CLDRConverter.saveConvert(s, useJava));
}
fmt.format(" };\n");
metaKeys.add(key);
}
}
for (String key : metaKeys) {
map.remove(key);
}
}
try (PrintWriter out = new PrintWriter(file, encoding)) { try (PrintWriter out = new PrintWriter(file, encoding)) {
// Output copyright headers // Output copyright headers
out.println(CopyrightHeaders.getOpenJDKCopyright()); out.println(CopyrightHeaders.getOpenJDKCopyright());
...@@ -74,16 +98,15 @@ class ResourceBundleGenerator implements BundleGenerator { ...@@ -74,16 +98,15 @@ class ResourceBundleGenerator implements BundleGenerator {
if (useJava) { if (useJava) {
out.println("package sun." + packageName + ";\n"); out.println("package sun." + packageName + ";\n");
if (open) { out.printf("import %s;\n\n", type.getPathName());
out.println("import sun.util.resources.OpenListResourceBundle;\n"); out.printf("public class %s%s extends %s {\n", baseName, "root".equals(localeID) ? "" : "_" + localeID, type.getClassName());
out.println("public class " + baseName + ("root".equals(localeID) ? "" : "_" + localeID) + " extends OpenListResourceBundle {");
} else {
out.println("import java.util.ListResourceBundle;\n");
out.println("public class " + baseName + ("root".equals(localeID) ? "" : "_" + localeID) + " extends ListResourceBundle {");
}
out.println(" @Override\n" + out.println(" @Override\n" +
" protected final Object[][] getContents() {\n" + " protected final Object[][] getContents() {");
" final Object[][] data = new Object[][] {"); if (fmt != null) {
out.print(fmt.toString());
}
out.println(" final Object[][] data = new Object[][] {");
} }
for (String key : map.keySet()) { for (String key : map.keySet()) {
if (useJava) { if (useJava) {
...@@ -91,7 +114,11 @@ class ResourceBundleGenerator implements BundleGenerator { ...@@ -91,7 +114,11 @@ class ResourceBundleGenerator implements BundleGenerator {
if (value == null) { if (value == null) {
CLDRConverter.warning("null value for " + key); CLDRConverter.warning("null value for " + key);
} else if (value instanceof String) { } else if (value instanceof String) {
out.println(" { \"" + key + "\", \"" + CLDRConverter.saveConvert((String) value, useJava) + "\" },"); if (type == BundleType.TIMEZONE) {
out.printf(" { \"%s\", %s },\n", key, CLDRConverter.saveConvert((String) value, useJava));
} else {
out.printf(" { \"%s\", \"%s\" },\n", key, CLDRConverter.saveConvert((String) value, useJava));
}
} else if (value instanceof String[]) { } else if (value instanceof String[]) {
String[] values = (String[]) value; String[] values = (String[]) value;
out.println(" { \"" + key + "\",\n new String[] {"); out.println(" { \"" + key + "\",\n new String[] {");
......
...@@ -166,9 +166,9 @@ $(eval $(call SetupDemo,SampleTree,jfc,,SampleTree,,,README*)) ...@@ -166,9 +166,9 @@ $(eval $(call SetupDemo,SampleTree,jfc,,SampleTree,,,README*))
$(eval $(call SetupDemo,SwingApplet,jfc,,SwingApplet,,,README* *.html)) $(eval $(call SetupDemo,SwingApplet,jfc,,SwingApplet,,,README* *.html))
$(eval $(call SetupDemo,TableExample,jfc,,TableExample,,,README*)) $(eval $(call SetupDemo,TableExample,jfc,,TableExample,,,README*))
$(eval $(call SetupDemo,TransparentRuler,jfc,,transparentruler.Ruler,,,README*)) $(eval $(call SetupDemo,TransparentRuler,jfc,,transparentruler.Ruler,,,README*))
$(eval $(call SetupDemo,jconsole-plugin,scripting,-cp $(JDK_OUTPUTDIR)/lib/jconsole.jar,,,,*.xml *.txt,,,,Main-Class: \n)) $(eval $(call SetupDemo,jconsole-plugin,scripting,,,,,*.xml *.txt,,,,Main-Class: \n))
$(eval $(call SetupDemo,FullThreadDump,management,,FullThreadDump,,,README*)) $(eval $(call SetupDemo,FullThreadDump,management,,FullThreadDump,,,README*))
$(eval $(call SetupDemo,JTop,management,-cp $(JDK_OUTPUTDIR)/lib/jconsole.jar,JTop,,,README*)) $(eval $(call SetupDemo,JTop,management,,JTop,,,README*))
$(eval $(call SetupDemo,MemoryMonitor,management,,MemoryMonitor,,,README*)) $(eval $(call SetupDemo,MemoryMonitor,management,,MemoryMonitor,,,README*))
$(eval $(call SetupDemo,VerboseGC,management,,VerboseGC,,,README*)) $(eval $(call SetupDemo,VerboseGC,management,,VerboseGC,,,README*))
$(eval $(call SetupDemo,zipfs,nio,,,,,README* *.java,,,,Main-Class: \n)) $(eval $(call SetupDemo,zipfs,nio,,,,,README* *.java,,,,Main-Class: \n))
......
...@@ -121,6 +121,7 @@ ifneq ($(OPENJDK_TARGET_OS),linux) ...@@ -121,6 +121,7 @@ ifneq ($(OPENJDK_TARGET_OS),linux)
sun/nio/fs/LinuxFileStore.java \ sun/nio/fs/LinuxFileStore.java \
sun/nio/fs/LinuxFileSystem.java \ sun/nio/fs/LinuxFileSystem.java \
sun/nio/fs/LinuxFileSystemProvider.java \ sun/nio/fs/LinuxFileSystemProvider.java \
sun/nio/fs/MagicFileTypeDetector.java \
sun/nio/fs/LinuxNativeDispatcher.java \ sun/nio/fs/LinuxNativeDispatcher.java \
sun/nio/fs/LinuxUserDefinedFileAttributeView.java \ sun/nio/fs/LinuxUserDefinedFileAttributeView.java \
sun/nio/fs/LinuxWatchService.java sun/nio/fs/LinuxWatchService.java
......
...@@ -238,7 +238,7 @@ $(eval $(call SetupLauncher,jar,\ ...@@ -238,7 +238,7 @@ $(eval $(call SetupLauncher,jar,\
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jar.Main"$(COMMA) }')) -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jar.Main"$(COMMA) }'))
$(eval $(call SetupLauncher,jarsigner,\ $(eval $(call SetupLauncher,jarsigner,\
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.tools.jarSigner.Main"$(COMMA) }')) -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.tools.jarsigner.Main"$(COMMA) }'))
$(eval $(call SetupLauncher,javac,\ $(eval $(call SetupLauncher,javac,\
-DEXPAND_CLASSPATH_WILDCARDS \ -DEXPAND_CLASSPATH_WILDCARDS \
......
...@@ -104,7 +104,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBFDLIBM,\ ...@@ -104,7 +104,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBFDLIBM,\
LANG:=C,\ LANG:=C,\
CFLAGS:=$(CFLAGS_JDKLIB) \ CFLAGS:=$(CFLAGS_JDKLIB) \
-I$(JDK_TOPDIR)/src/share/native/java/lang/fdlibm/include,\ -I$(JDK_TOPDIR)/src/share/native/java/lang/fdlibm/include,\
LDFLAGS:=-nostdlib -r -arch i386 -arch x86_64,\ LDFLAGS:=-nostdlib -r -arch x86_64,\
OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libfdlibm)) OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libfdlibm))
$(JDK_OUTPUTDIR)/objs/$(LIBRARY_PREFIX)fdlibm$(STATIC_LIBRARY_SUFFIX) : $(BUILD_LIBFDLIBM) $(JDK_OUTPUTDIR)/objs/$(LIBRARY_PREFIX)fdlibm$(STATIC_LIBRARY_SUFFIX) : $(BUILD_LIBFDLIBM)
...@@ -240,7 +240,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA,\ ...@@ -240,7 +240,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA,\
LDFLAGS:=$(LDFLAGS_JDKLIB) \ LDFLAGS:=$(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \ $(call SET_SHARED_LIBRARY_ORIGIN), \
LDFLAGS_SUFFIX_posix:=-ljvm -lverify, \ LDFLAGS_SUFFIX_posix:=-ljvm -lverify, \
LDFLAGS_SUFFIX_solaris:=-lnsl -lsocket -lscf $(LIBDL) $(BUILD_LIBFDLIBM) -lc,\ LDFLAGS_SUFFIX_solaris:=-lsocket -lnsl -lscf $(LIBDL) $(BUILD_LIBFDLIBM) -lc,\
LDFLAGS_SUFFIX_linux:=$(LIBDL) $(BUILD_LIBFDLIBM),\ LDFLAGS_SUFFIX_linux:=$(LIBDL) $(BUILD_LIBFDLIBM),\
LDFLAGS_SUFFIX_macosx:=-L$(JDK_OUTPUTDIR)/objs/ -lfdlibm \ LDFLAGS_SUFFIX_macosx:=-L$(JDK_OUTPUTDIR)/objs/ -lfdlibm \
-framework CoreFoundation \ -framework CoreFoundation \
...@@ -905,57 +905,34 @@ endif ...@@ -905,57 +905,34 @@ endif
########################################################################################## ##########################################################################################
BUILD_LIBZIP_FILES:=\ BUILD_LIBZIP_EXCLUDES :=
CRC32.c \
Adler32.c \
Deflater.c \
Inflater.c \
ZipFile.c \
zip_util.c
ifeq ($(USE_EXTERNAL_LIBZ),true) ifeq ($(USE_EXTERNAL_LIBZ),true)
LIBZ:=-lz LIBZ := -lz
LIBZIP_EXCLUDES += zlib-1.2.5
else else
BUILD_LIBZIP_FILES += \ ZLIB_CPPFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5
compress.c \
deflate.c \
gzclose.c \
gzlib.c \
gzread.c \
gzwrite.c \
infback.c \
inffast.c \
inflate.c \
inftrees.c \
trees.c \
uncompr.c \
zadler32.c \
zcrc32.c \
zutil.c
LIBZ_INCLUDE:=-I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5
endif endif
BUILD_LIBZIP_REORDER:= BUILD_LIBZIP_REORDER :=
ifeq ($(OPENJDK_TARGET_OS), solaris) ifeq ($(OPENJDK_TARGET_OS), solaris)
ifneq ($(OPENJDK_TARGET_CPU), x86_64) ifneq ($(OPENJDK_TARGET_CPU), x86_64)
BUILD_LIBZIP_REORDER:=$(JDK_TOPDIR)/makefiles/mapfiles/libzip/reorder-$(OPENJDK_TARGET_CPU) BUILD_LIBZIP_REORDER := $(JDK_TOPDIR)/makefiles/mapfiles/libzip/reorder-$(OPENJDK_TARGET_CPU)
endif endif
endif endif
ifeq ($(LIBZIP_CAN_USE_MMAP), true) ifeq ($(LIBZIP_CAN_USE_MMAP), true)
BUILD_LIBZIP_MMAP:=-DUSE_MMAP BUILD_LIBZIP_MMAP := -DUSE_MMAP
endif endif
$(eval $(call SetupNativeCompilation,BUILD_LIBZIP,\ $(eval $(call SetupNativeCompilation,BUILD_LIBZIP,\
LIBRARY:=zip,\ LIBRARY:=zip,\
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
SRC:=$(JDK_TOPDIR)/src/share/native/java/util/zip \
$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5,\
INCLUDE_FILES:=$(BUILD_LIBZIP_FILES), \
LANG:=C,\ LANG:=C,\
OPTIMIZATION:=LOW, \ OPTIMIZATION:=LOW, \
SRC:=$(JDK_TOPDIR)/src/share/native/java/util/zip,\
EXCLUDES:=$(LIBZIP_EXCLUDES),\
CFLAGS:=$(CFLAGS_JDKLIB) \ CFLAGS:=$(CFLAGS_JDKLIB) \
$(LIBZ_INCLUDE) \ $(ZLIB_CPPFLAGS) \
-I$(JDK_TOPDIR)/src/share/native/java/io \ -I$(JDK_TOPDIR)/src/share/native/java/io \
-I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/io,\ -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/io,\
CFLAGS_posix:=$(BUILD_LIBZIP_MMAP) -UDEBUG,\ CFLAGS_posix:=$(BUILD_LIBZIP_MMAP) -UDEBUG,\
...@@ -1238,15 +1215,7 @@ ifdef OPENJDK ...@@ -1238,15 +1215,7 @@ ifdef OPENJDK
$(eval $(call SetupNativeCompilation,BUILD_LIBLCMS,\ $(eval $(call SetupNativeCompilation,BUILD_LIBLCMS,\
LIBRARY:=lcms,\ LIBRARY:=lcms,\
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
SRC:=$(JDK_TOPDIR)/src/share/native/sun/java2d/cmm/lcms \ SRC:=$(JDK_TOPDIR)/src/share/native/sun/java2d/cmm/lcms,\
$(JDK_TOPDIR)/src/share/native/sun/java2d/,\
INCLUDE_FILES:=cmscam02.c cmscgats.c cmscnvrt.c cmserr.c \
cmsgamma.c cmsgmt.c cmsintrp.c cmsio0.c \
cmsio1.c cmslut.c cmsmd5.c cmsmtrx.c \
cmsnamed.c cmsopt.c cmshalf.c cmspack.c cmspcs.c \
cmsplugin.c cmsps2.c cmssamp.c cmssm.c \
cmstypes.c cmsvirt.c cmswtpnt.c cmsxform.c \
LCMS.c,\
LANG:=C,\ LANG:=C,\
OPTIMIZATION:=LOW, \ OPTIMIZATION:=LOW, \
CFLAGS:=$(filter-out -xc99=%none,$(CFLAGS_JDKLIB)) \ CFLAGS:=$(filter-out -xc99=%none,$(CFLAGS_JDKLIB)) \
...@@ -1928,6 +1897,7 @@ ifeq ($(OPENJDK_TARGET_OS), linux) ...@@ -1928,6 +1897,7 @@ ifeq ($(OPENJDK_TARGET_OS), linux)
UnixAsynchronousServerSocketChannelImpl.c \ UnixAsynchronousServerSocketChannelImpl.c \
UnixAsynchronousSocketChannelImpl.c \ UnixAsynchronousSocketChannelImpl.c \
GnomeFileTypeDetector.c \ GnomeFileTypeDetector.c \
MagicFileTypeDetector.c \
LinuxNativeDispatcher.c \ LinuxNativeDispatcher.c \
LinuxWatchService.c \ LinuxWatchService.c \
UnixCopyFile.c \ UnixCopyFile.c \
...@@ -2006,7 +1976,7 @@ $(BUILD_LIBNIO) : $(BUILD_LIBNET) ...@@ -2006,7 +1976,7 @@ $(BUILD_LIBNIO) : $(BUILD_LIBNET)
########################################################################################## ##########################################################################################
ifeq ($(OPENJDK_TARGET_OS_API),posix) ifeq ($(OPENJDK_TARGET_OS_API),posix)
# TODO make this work on macosx
ifneq ($(OPENJDK_TARGET_OS),macosx) ifneq ($(OPENJDK_TARGET_OS),macosx)
SCTP_WERROR := -Werror SCTP_WERROR := -Werror
...@@ -2034,7 +2004,6 @@ ifeq ($(OPENJDK_TARGET_OS_API),posix) ...@@ -2034,7 +2004,6 @@ ifeq ($(OPENJDK_TARGET_OS_API),posix)
LDFLAGS_SUFFIX_posix:=-lnio -lnet,\ LDFLAGS_SUFFIX_posix:=-lnio -lnet,\
LDFLAGS_SUFFIX_solaris:=-lsocket -ljava -ljvm -lc,\ LDFLAGS_SUFFIX_solaris:=-lsocket -ljava -ljvm -lc,\
LDFLAGS_SUFFIX_macosx:=-ljava -ljvm,\ LDFLAGS_SUFFIX_macosx:=-ljava -ljvm,\
INCLUDE_FILES:=SctpNet.c SctpChannelImpl.c SctpServerChannelImpl.c,\
OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsctp)) OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsctp))
BUILD_LIBRARIES += $(BUILD_LIBSCTP) BUILD_LIBRARIES += $(BUILD_LIBSCTP)
...@@ -2105,7 +2074,7 @@ endif ...@@ -2105,7 +2074,7 @@ endif
ifneq ($(USE_EXTERNAL_LIBZ),true) ifneq ($(USE_EXTERNAL_LIBZ),true)
BUILD_LIBJLI_SRC_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 BUILD_LIBJLI_SRC_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5
LIBJLI_CFLAGS += $(LIBZ_INCLUDE) LIBJLI_CFLAGS += $(ZLIB_CPPFLAGS)
BUILD_LIBJLI_FILES += \ BUILD_LIBJLI_FILES += \
inflate.c \ inflate.c \
inftrees.c \ inftrees.c \
...@@ -2416,8 +2385,14 @@ LIBSPLASHSCREEN_DIRS:=\ ...@@ -2416,8 +2385,14 @@ LIBSPLASHSCREEN_DIRS:=\
$(JDK_TOPDIR)/src/share/native/sun/awt/giflib \ $(JDK_TOPDIR)/src/share/native/sun/awt/giflib \
$(JDK_TOPDIR)/src/share/native/sun/awt/image/jpeg \ $(JDK_TOPDIR)/src/share/native/sun/awt/image/jpeg \
$(JDK_TOPDIR)/src/share/native/sun/awt/libpng \ $(JDK_TOPDIR)/src/share/native/sun/awt/libpng \
$(JDK_TOPDIR)/src/share/native/sun/awt/splashscreen \ $(JDK_TOPDIR)/src/share/native/sun/awt/splashscreen
$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/awt/splashscreen
ifneq ($(OPENJDK_TARGET_OS), macosx)
LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/awt/splashscreen
else
LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/macosx/native/sun/awt/splashscreen
endif
LIBSPLASHSCREEN_CFLAGS:=-DSPLASHSCREEN -DPNG_NO_MMX_CODE \ LIBSPLASHSCREEN_CFLAGS:=-DSPLASHSCREEN -DPNG_NO_MMX_CODE \
$(foreach dir,$(LIBSPLASHSCREEN_DIRS),-I$(dir)) $(foreach dir,$(LIBSPLASHSCREEN_DIRS),-I$(dir))
...@@ -2443,104 +2418,11 @@ else ...@@ -2443,104 +2418,11 @@ else
LIBSPLASHSCREEN_CFLAGS += -DWITH_WIN32 LIBSPLASHSCREEN_CFLAGS += -DWITH_WIN32
endif endif
LIBSPLASHSCREEN_FILES:=\
java_awt_SplashScreen.c \
splashscreen_gfx_impl.c \
splashscreen_gif.c \
splashscreen_impl.c \
splashscreen_jpeg.c \
splashscreen_png.c \
png.c \
pngerror.c \
pngget.c \
pngmem.c \
pngpread.c \
pngread.c \
pngrio.c \
pngrtran.c \
pngrutil.c \
pngset.c \
pngtrans.c \
pngwio.c \
pngwrite.c \
pngwtran.c \
pngwutil.c \
dgif_lib.c \
gif_err.c \
gifalloc.c \
jcomapi.c \
jdapimin.c \
jdapistd.c \
jdcoefct.c \
jdcolor.c \
jddctmgr.c \
jdhuff.c \
jdinput.c \
jdmainct.c \
jdmarker.c \
jdmaster.c \
jdmerge.c \
jdphuff.c \
jdpostct.c \
jdsample.c \
jerror.c \
jidctflt.c \
jidctfst.c \
jidctint.c \
jidctred.c \
jmemmgr.c \
jmemnobs.c \
jquant1.c \
jquant2.c \
jutils.c \
jcapimin.c \
jcapistd.c \
jccoefct.c \
jccolor.c \
jcdctmgr.c \
jchuff.c \
jcinit.c \
jcmainct.c \
jcmarker.c \
jcmaster.c \
jcparam.c \
jcphuff.c \
jcprepct.c \
jcsample.c \
jctrans.c \
jdtrans.c \
jfdctflt.c \
jfdctfst.c \
jfdctint.c
ifneq ($(OPENJDK_TARGET_OS), macosx)
LIBSPLASHSCREEN_FILES += splashscreen_sys.c
else
LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/macosx/native/sun/awt/splashscreen
LIBSPLASHSCREEN_FILES += splashscreen_sys.m
endif
LIBSPLASHSCREEN_LDFLAGS_SUFFIX:= LIBSPLASHSCREEN_LDFLAGS_SUFFIX:=
ifneq ($(USE_EXTERNAL_LIBZ),true) ifneq ($(USE_EXTERNAL_LIBZ),true)
LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5
LIBSPLASHSCREEN_CFLAGS += $(LIBZ_INCLUDE) LIBSPLASHSCREEN_CFLAGS += $(ZLIB_CPPFLAGS)
LIBSPLASHSCREEN_FILES += \
compress.c \
deflate.c \
gzclose.c \
gzlib.c \
gzread.c \
gzwrite.c \
infback.c \
inffast.c \
inflate.c \
inftrees.c \
trees.c \
uncompr.c \
zadler32.c \
zcrc32.c \
zutil.c
endif endif
ifeq ($(OPENJDK_TARGET_OS), macosx) ifeq ($(OPENJDK_TARGET_OS), macosx)
...@@ -2560,7 +2442,7 @@ $(eval $(call SetupNativeCompilation,LIBSPLASHSCREEN,\ ...@@ -2560,7 +2442,7 @@ $(eval $(call SetupNativeCompilation,LIBSPLASHSCREEN,\
LIBRARY:=splashscreen,\ LIBRARY:=splashscreen,\
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
SRC:=$(LIBSPLASHSCREEN_DIRS),\ SRC:=$(LIBSPLASHSCREEN_DIRS),\
INCLUDE_FILES:=$(LIBSPLASHSCREEN_FILES),\ EXCLUDE_FILES:=imageioJPEG.c jpegdecoder.c pngtest.c,\
LANG:=C,\ LANG:=C,\
OPTIMIZATION:=LOW, \ OPTIMIZATION:=LOW, \
CFLAGS:=$(LIBSPLASHSCREEN_CFLAGS) $(CFLAGS_JDKLIB),\ CFLAGS:=$(LIBSPLASHSCREEN_CFLAGS) $(CFLAGS_JDKLIB),\
...@@ -2683,14 +2565,13 @@ endif ...@@ -2683,14 +2565,13 @@ endif
BUILD_LIBKRB5_NAME:= BUILD_LIBKRB5_NAME:=
ifeq ($(OPENJDK_TARGET_OS), windows) ifeq ($(OPENJDK_TARGET_OS), windows)
BUILD_LIBKRB5_NAME:=w2k_lsa_auth BUILD_LIBKRB5_NAME:=w2k_lsa_auth
BUILD_LIBKRB5_FILES:=NativeCreds.c WindowsDirectory.c
BUILD_LIBKRB5_SRC:=$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/security/krb5 BUILD_LIBKRB5_SRC:=$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/security/krb5
BUILD_LIBKRB5_LIBS:=advapi32.lib Secur32.lib netapi32.lib kernel32.lib user32.lib \ BUILD_LIBKRB5_LIBS:=advapi32.lib Secur32.lib netapi32.lib kernel32.lib user32.lib \
gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib \ gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib \
ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib
else ifeq ($(OPENJDK_TARGET_OS), macosx) else ifeq ($(OPENJDK_TARGET_OS), macosx)
BUILD_LIBKRB5_NAME:=osxkrb5 BUILD_LIBKRB5_NAME:=osxkrb5
BUILD_LIBKRB5_FILES:=nativeccache.c BUILD_LIBKRB5_SRC:=$(JDK_TOPDIR)/src/share/native/sun/security/krb5
BUILD_LIBKRB5_LIBS:=-framework Kerberos BUILD_LIBKRB5_LIBS:=-framework Kerberos
endif endif
...@@ -2698,9 +2579,7 @@ ifneq ($(BUILD_LIBKRB5_NAME),) ...@@ -2698,9 +2579,7 @@ ifneq ($(BUILD_LIBKRB5_NAME),)
$(eval $(call SetupNativeCompilation,BUILD_LIBKRB5,\ $(eval $(call SetupNativeCompilation,BUILD_LIBKRB5,\
LIBRARY:=$(BUILD_LIBKRB5_NAME),\ LIBRARY:=$(BUILD_LIBKRB5_NAME),\
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
SRC:=$(JDK_TOPDIR)/src/share/native/sun/security/krb5 \ SRC:=$(BUILD_LIBKRB5_SRC),\
$(BUILD_LIBKRB5_SRC) ,\
INCLUDE_FILES:=$(BUILD_LIBKRB5_FILES),\
LANG:=C,\ LANG:=C,\
OPTIMIZATION:=LOW, \ OPTIMIZATION:=LOW, \
CFLAGS:=$(CFLAGS_JDKLIB) \ CFLAGS:=$(CFLAGS_JDKLIB) \
...@@ -3071,18 +2950,11 @@ endif ...@@ -3071,18 +2950,11 @@ endif
ifeq ($(OPENJDK_TARGET_OS), macosx) ifeq ($(OPENJDK_TARGET_OS), macosx)
LIBAPPLESCRIPTENGINE_FILES:=\
AppleScriptEngine.m \
AppleScriptExecutionContext.m \
AS_NS_ConversionUtils.m \
NS_Java_ConversionUtils.m
$(eval $(call SetupNativeCompilation,BUILD_LIBAPPLESCRIPTENGINE,\ $(eval $(call SetupNativeCompilation,BUILD_LIBAPPLESCRIPTENGINE,\
LIBRARY:=AppleScriptEngine,\ LIBRARY:=AppleScriptEngine,\
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
SRC:=$(JDK_TOPDIR)/src/macosx/native/apple/applescript,\ SRC:=$(JDK_TOPDIR)/src/macosx/native/apple/applescript,\
LANG:=C,\ LANG:=C,\
INCLUDE_FILES:=$(LIBAPPLESCRIPTENGINE_FILES),\
OPTIMIZATION:=LOW, \ OPTIMIZATION:=LOW, \
CFLAGS:=$(CFLAGS_JDKLIB) \ CFLAGS:=$(CFLAGS_JDKLIB) \
-I$(JDK_TOPDIR)/src/macosx/native/apple/applescript \ -I$(JDK_TOPDIR)/src/macosx/native/apple/applescript \
...@@ -3107,18 +2979,11 @@ endif ...@@ -3107,18 +2979,11 @@ endif
ifeq ($(OPENJDK_TARGET_OS), macosx) ifeq ($(OPENJDK_TARGET_OS), macosx)
LIBOSXAPP_FILES:=\
NSApplicationAWT.m \
QueuingApplicationDelegate.m \
PropertiesUtilities.m \
ThreadUtilities.m
$(eval $(call SetupNativeCompilation,BUILD_LIBOSXAPP,\ $(eval $(call SetupNativeCompilation,BUILD_LIBOSXAPP,\
LIBRARY:=osxapp,\ LIBRARY:=osxapp,\
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
SRC:=$(JDK_TOPDIR)/src/macosx/native/sun/osxapp,\ SRC:=$(JDK_TOPDIR)/src/macosx/native/sun/osxapp,\
LANG:=C,\ LANG:=C,\
INCLUDE_FILES:=$(LIBOSXAPP_FILES),\
OPTIMIZATION:=LOW, \ OPTIMIZATION:=LOW, \
CFLAGS:=$(CFLAGS_JDKLIB) \ CFLAGS:=$(CFLAGS_JDKLIB) \
-I$(JDK_TOPDIR)/src/macosx/native/sun/osxapp \ -I$(JDK_TOPDIR)/src/macosx/native/sun/osxapp \
...@@ -3151,14 +3016,6 @@ endif ...@@ -3151,14 +3016,6 @@ endif
ifeq ($(OPENJDK_TARGET_OS), macosx) ifeq ($(OPENJDK_TARGET_OS), macosx)
LIBOSX_FILES:=\
Dispatch.m \
CFileManager.m \
KeystoreImpl.m \
JavaAppLauncher.m \
MacOSXPreferencesFile.m \
SCDynamicStoreConfig.m
LIBOSX_DIRS:=\ LIBOSX_DIRS:=\
$(JDK_TOPDIR)/src/macosx/native/com/apple/concurrent \ $(JDK_TOPDIR)/src/macosx/native/com/apple/concurrent \
$(JDK_TOPDIR)/src/macosx/native/java/util \ $(JDK_TOPDIR)/src/macosx/native/java/util \
...@@ -3171,7 +3028,6 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBOSX,\ ...@@ -3171,7 +3028,6 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBOSX,\
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
SRC:=$(LIBOSX_DIRS),\ SRC:=$(LIBOSX_DIRS),\
LANG:=C,\ LANG:=C,\
INCLUDE_FILES:=$(LIBOSX_FILES),\
OPTIMIZATION:=LOW, \ OPTIMIZATION:=LOW, \
CFLAGS:=$(CFLAGS_JDKLIB) \ CFLAGS:=$(CFLAGS_JDKLIB) \
$(foreach dir,$(LIBOSX_DIRS),-I$(dir)) \ $(foreach dir,$(LIBOSX_DIRS),-I$(dir)) \
...@@ -3341,22 +3197,11 @@ endif ...@@ -3341,22 +3197,11 @@ endif
ifeq ($(OPENJDK_TARGET_OS), macosx) ifeq ($(OPENJDK_TARGET_OS), macosx)
LIBOSXUI_FILES:=\
AquaFileView.m \
AquaLookAndFeel.m \
AquaNativeResources.m \
JRSUIConstantSync.m \
JRSUIController.m \
JRSUIFocus.m \
ScreenPopupFactory.m \
ScreenMenu.m
$(eval $(call SetupNativeCompilation,BUILD_LIBOSXUI,\ $(eval $(call SetupNativeCompilation,BUILD_LIBOSXUI,\
LIBRARY:=osxui,\ LIBRARY:=osxui,\
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
SRC:=$(JDK_TOPDIR)/src/macosx/native/com/apple/laf,\ SRC:=$(JDK_TOPDIR)/src/macosx/native/com/apple/laf,\
LANG:=C,\ LANG:=C,\
INCLUDE_FILES:=$(LIBOSXUI_FILES),\
OPTIMIZATION:=LOW, \ OPTIMIZATION:=LOW, \
CFLAGS:=$(CFLAGS_JDKLIB) \ CFLAGS:=$(CFLAGS_JDKLIB) \
-I$(JDK_TOPDIR)/src/macosx/native/com/apple/laf \ -I$(JDK_TOPDIR)/src/macosx/native/com/apple/laf \
......
...@@ -356,21 +356,9 @@ COPY_FILES += $(JVMCFG) ...@@ -356,21 +356,9 @@ COPY_FILES += $(JVMCFG)
########################################################################################## ##########################################################################################
PROPS_SRC := $(JDK_TOPDIR)/src/share/lib/security/java.security PROPS_SRC := $(JDK_TOPDIR)/src/share/lib/security/java.security-$(OPENJDK_TARGET_OS)
PROPS_DST := $(JDK_OUTPUTDIR)/lib/security/java.security PROPS_DST := $(JDK_OUTPUTDIR)/lib/security/java.security
ifeq ($(OPENJDK_TARGET_OS), solaris)
PROPS_SRC := $(JDK_TOPDIR)/src/share/lib/security/java.security-solaris
endif
ifeq ($(OPENJDK_TARGET_OS), windows)
PROPS_SRC := $(JDK_TOPDIR)/src/share/lib/security/java.security-windows
endif
ifeq ($(OPENJDK_TARGET_OS), macosx)
PROPS_SRC := $(JDK_TOPDIR)/src/share/lib/security/java.security-macosx
endif
$(PROPS_DST): $(PROPS_SRC) $(PROPS_DST): $(PROPS_SRC)
$(MKDIR) -p $(@D) $(MKDIR) -p $(@D)
$(RM) $@ $(RM) $@
......
...@@ -419,6 +419,23 @@ $(eval $(call SetupArchive,BUILD_JSSE_JAR,,\ ...@@ -419,6 +419,23 @@ $(eval $(call SetupArchive,BUILD_JSSE_JAR,,\
JARS+=$(IMAGES_OUTPUTDIR)/lib/jsse.jar JARS+=$(IMAGES_OUTPUTDIR)/lib/jsse.jar
##########################################################################################
# Create manifest for security jars
#
# Include these extra attributes for now, should probably take out.
#
JCE_MANIFEST := $(IMAGES_OUTPUTDIR)/lib/_the.security.manifest.mf
$(JCE_MANIFEST): $(MAINMANIFEST)
$(MKDIR) -p $(@D)
$(RM) $@ $@.tmp
$(SED) -e "s#@@RELEASE@@#$(JDK_VERSION)#" \
-e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" \
$(MAINMANIFEST) >> $@.tmp
$(ECHO) "Extension-Name: javax.crypto" >> $@.tmp
$(ECHO) "Implementation-Vendor-Id: com.sun" >> $@.tmp
$(MV) $@.tmp $@
########################################################################################## ##########################################################################################
SUNPKCS11_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/sunpkcs11.jar SUNPKCS11_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/sunpkcs11.jar
...@@ -440,8 +457,11 @@ else ...@@ -440,8 +457,11 @@ else
SUFFIXES:=.class,\ SUFFIXES:=.class,\
INCLUDES:=sun/security/pkcs11,\ INCLUDES:=sun/security/pkcs11,\
JAR:=$(SUNPKCS11_JAR_DST), \ JAR:=$(SUNPKCS11_JAR_DST), \
MANIFEST:=$(JCE_MANIFEST), \
SKIP_METAINF := true)) SKIP_METAINF := true))
$(SUNPKCS11_JAR_DST): $(JCE_MANIFEST)
endif endif
JARS += $(SUNPKCS11_JAR_DST) JARS += $(SUNPKCS11_JAR_DST)
...@@ -452,9 +472,9 @@ SUNEC_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/sunec.jar ...@@ -452,9 +472,9 @@ SUNEC_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/ext/sunec.jar
ifndef OPENJDK ifndef OPENJDK
SUNEC_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/ec/sunec.jar SUNEC_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/ec/sunec.jar
$(SUNEC_JAR_DST) : $(SUNEC_JAR_SRC) $(SUNEC_JAR_DST) : $(SUNEC_JAR_SRC)
@$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt SunEC provider..." @$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt SunEC provider..."
$(MKDIR) -p $(@D) $(MKDIR) -p $(@D)
$(RM) $@ $(RM) $@
...@@ -462,13 +482,16 @@ $(SUNEC_JAR_DST) : $(SUNEC_JAR_SRC) ...@@ -462,13 +482,16 @@ $(SUNEC_JAR_DST) : $(SUNEC_JAR_SRC)
else else
$(eval $(call SetupArchive,BUILD_SUNEC_JAR,,\ $(eval $(call SetupArchive,BUILD_SUNEC_JAR,,\
SRCS:=$(JDK_OUTPUTDIR)/classes, \ SRCS:=$(JDK_OUTPUTDIR)/classes, \
SUFFIXES:=.class,\ SUFFIXES:=.class,\
INCLUDES:=sun/security/ec,\ INCLUDES:=sun/security/ec,\
JAR:=$(SUNEC_JAR_DST), \ JAR:=$(SUNEC_JAR_DST), \
MANIFEST:=$(JCE_MANIFEST), \
SKIP_METAINF := true)) SKIP_METAINF := true))
$(SUNEC_JAR_DST): $(JCE_MANIFEST)
endif endif
JARS += $(SUNEC_JAR_DST) JARS += $(SUNEC_JAR_DST)
...@@ -505,9 +528,11 @@ else ...@@ -505,9 +528,11 @@ else
SUFFIXES:=.class,\ SUFFIXES:=.class,\
INCLUDES:= com/sun/crypto/provider,\ INCLUDES:= com/sun/crypto/provider,\
JAR:=$(SUNJCE_PROVIDER_JAR_DST), \ JAR:=$(SUNJCE_PROVIDER_JAR_DST), \
MANIFEST := $(JDK_TOPDIR)/make/tools/manifest.mf, \ MANIFEST:=$(JCE_MANIFEST), \
EXTRA_MANIFEST_ATTR := Extension-Name: javax.crypto\nImplementation-Vendor-Id: com.sun, \
SKIP_METAINF := true)) SKIP_METAINF := true))
$(SUNJCE_PROVIDER_JAR_DST): $(JCE_MANIFEST)
endif endif
JARS += $(SUNJCE_PROVIDER_JAR_DST) JARS += $(SUNJCE_PROVIDER_JAR_DST)
...@@ -516,9 +541,9 @@ JCE_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/jce.jar ...@@ -516,9 +541,9 @@ JCE_JAR_DST := $(IMAGES_OUTPUTDIR)/lib/jce.jar
ifndef OPENJDK ifndef OPENJDK
JCE_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/jce/jce.jar JCE_JAR_SRC := $(JDK_TOPDIR)/make/closed/tools/crypto/jce/jce.jar
$(JCE_JAR_DST) : $(JCE_JAR_SRC) $(JCE_JAR_DST) : $(JCE_JAR_SRC)
@$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt jce.jar..." @$(ECHO) $(LOG_INFO) "\n>>>Installing prebuilt jce.jar..."
$(MKDIR) -p $(@D) $(MKDIR) -p $(@D)
$(RM) $@ $(RM) $@
...@@ -526,14 +551,16 @@ $(JCE_JAR_DST) : $(JCE_JAR_SRC) ...@@ -526,14 +551,16 @@ $(JCE_JAR_DST) : $(JCE_JAR_SRC)
else else
$(eval $(call SetupArchive,BUILD_JCE_JAR,,\ $(eval $(call SetupArchive,BUILD_JCE_JAR,,\
SRCS:=$(JDK_OUTPUTDIR)/classes, \ SRCS:=$(JDK_OUTPUTDIR)/classes, \
SUFFIXES:=.class,\ SUFFIXES:=.class,\
INCLUDES:= javax/crypto sun/security/internal,\ INCLUDES:= javax/crypto sun/security/internal,\
JAR:=$(JCE_JAR_DST), \ JAR:=$(JCE_JAR_DST), \
MANIFEST := $(JDK_TOPDIR)/make/tools/manifest.mf, \ MANIFEST:=$(JCE_MANIFEST), \
EXTRA_MANIFEST_ATTR := Extension-Name: javax.crypto\nImplementation-Vendor-Id: com.sun, \
SKIP_METAINF := true)) SKIP_METAINF := true))
$(JCE_JAR_DST): $(JCE_MANIFEST)
endif endif
JARS += $(JCE_JAR_DST) JARS += $(JCE_JAR_DST)
......
...@@ -130,6 +130,8 @@ SUNWprivate_1.1 { ...@@ -130,6 +130,8 @@ SUNWprivate_1.1 {
Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGio; Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGio;
Java_sun_nio_fs_GnomeFileTypeDetector_initializeGnomeVfs; Java_sun_nio_fs_GnomeFileTypeDetector_initializeGnomeVfs;
Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGnomeVfs; Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGnomeVfs;
Java_sun_nio_fs_MagicFileTypeDetector_initialize0;
Java_sun_nio_fs_MagicFileTypeDetector_probe0;
Java_sun_nio_fs_LinuxWatchService_eventSize; Java_sun_nio_fs_LinuxWatchService_eventSize;
Java_sun_nio_fs_LinuxWatchService_eventOffsets; Java_sun_nio_fs_LinuxWatchService_eventOffsets;
Java_sun_nio_fs_LinuxWatchService_inotifyInit; Java_sun_nio_fs_LinuxWatchService_inotifyInit;
......
/* /*
* Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "debugLoop.h" #include "debugLoop.h"
#include "bag.h" #include "bag.h"
#include "invoker.h" #include "invoker.h"
#include "sys.h"
/* How the options get to OnLoad: */ /* How the options get to OnLoad: */
#define XDEBUG "-Xdebug" #define XDEBUG "-Xdebug"
...@@ -201,6 +202,8 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved) ...@@ -201,6 +202,8 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
jint jvmtiCompileTimeMajorVersion; jint jvmtiCompileTimeMajorVersion;
jint jvmtiCompileTimeMinorVersion; jint jvmtiCompileTimeMinorVersion;
jint jvmtiCompileTimeMicroVersion; jint jvmtiCompileTimeMicroVersion;
char *boot_path = NULL;
char npt_lib[MAXPATHLEN];
/* See if it's already loaded */ /* See if it's already loaded */
if ( gdata!=NULL && gdata->isLoaded==JNI_TRUE ) { if ( gdata!=NULL && gdata->isLoaded==JNI_TRUE ) {
...@@ -227,18 +230,6 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved) ...@@ -227,18 +230,6 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
vmInitialized = JNI_FALSE; vmInitialized = JNI_FALSE;
gdata->vmDead = JNI_FALSE; gdata->vmDead = JNI_FALSE;
/* Npt and Utf function init */
NPT_INITIALIZE(&(gdata->npt), NPT_VERSION, NULL);
if (gdata->npt == NULL) {
ERROR_MESSAGE(("JDWP: unable to initialize NPT library"));
return JNI_ERR;
}
gdata->npt->utf = (gdata->npt->utfInitialize)(NULL);
if (gdata->npt->utf == NULL) {
ERROR_MESSAGE(("JDWP: UTF function initialization failed"));
return JNI_ERR;
}
/* Get the JVMTI Env, IMPORTANT: Do this first! For jvmtiAllocate(). */ /* Get the JVMTI Env, IMPORTANT: Do this first! For jvmtiAllocate(). */
error = JVM_FUNC_PTR(vm,GetEnv) error = JVM_FUNC_PTR(vm,GetEnv)
(vm, (void **)&(gdata->jvmti), JVMTI_VERSION_1); (vm, (void **)&(gdata->jvmti), JVMTI_VERSION_1);
...@@ -277,6 +268,24 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved) ...@@ -277,6 +268,24 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
forceExit(1); /* Kill entire process, no core dump wanted */ forceExit(1); /* Kill entire process, no core dump wanted */
} }
JVMTI_FUNC_PTR(gdata->jvmti, GetSystemProperty)
(gdata->jvmti, (const char *)"sun.boot.library.path",
&boot_path);
dbgsysBuildLibName(npt_lib, sizeof(npt_lib), boot_path, NPT_LIBNAME);
/* Npt and Utf function init */
NPT_INITIALIZE(npt_lib, &(gdata->npt), NPT_VERSION, NULL);
jvmtiDeallocate(boot_path);
if (gdata->npt == NULL) {
ERROR_MESSAGE(("JDWP: unable to initialize NPT library"));
return JNI_ERR;
}
gdata->npt->utf = (gdata->npt->utfInitialize)(NULL);
if (gdata->npt->utf == NULL) {
ERROR_MESSAGE(("JDWP: UTF function initialization failed"));
return JNI_ERR;
}
/* Parse input options */ /* Parse input options */
if (!parseOptions(options)) { if (!parseOptions(options)) {
/* No message necessary, should have been printed out already */ /* No message necessary, should have been printed out already */
......
/* /*
* Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -70,8 +70,13 @@ vprint_message(FILE *fp, const char *prefix, const char *suffix, ...@@ -70,8 +70,13 @@ vprint_message(FILE *fp, const char *prefix, const char *suffix,
len = (int)strlen((char*)utf8buf); len = (int)strlen((char*)utf8buf);
/* Convert to platform encoding (ignore errors, dangerous area) */ /* Convert to platform encoding (ignore errors, dangerous area) */
if (gdata->npt != NULL) {
(void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf, (void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf,
utf8buf, len, pbuf, MAX_MESSAGE_LEN); utf8buf, len, pbuf, MAX_MESSAGE_LEN);
} else {
/* May be called before NPT is initialized so don't fault */
strncpy(pbuf, (char*)utf8buf, len);
}
(void)fprintf(fp, "%s%s%s", prefix, pbuf, suffix); (void)fprintf(fp, "%s%s%s", prefix, pbuf, suffix);
} }
......
/* /*
* Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -144,7 +144,9 @@ loadTransport(char *name, jdwpTransportEnv **transportPtr) ...@@ -144,7 +144,9 @@ loadTransport(char *name, jdwpTransportEnv **transportPtr)
/* First, look in sun.boot.library.path. This should find the standard /* First, look in sun.boot.library.path. This should find the standard
* dt_socket and dt_shmem transport libraries, or any library * dt_socket and dt_shmem transport libraries, or any library
* that was delivered with the J2SE. * that was delivered with the J2SE.
* Note: Java property sun.boot.library.path contains a single directory. * Note: Since 6819213 fixed, Java property sun.boot.library.path can
* contain multiple paths. Dll_dir is the first entry and
* -Dsun.boot.library.path entries are appended.
*/ */
libdir = gdata->property_sun_boot_library_path; libdir = gdata->property_sun_boot_library_path;
if (libdir == NULL) { if (libdir == NULL) {
......
...@@ -25,8 +25,6 @@ ...@@ -25,8 +25,6 @@
package com.sun.java.util.jar.pack; package com.sun.java.util.jar.pack;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintStream; import java.io.PrintStream;
...@@ -42,40 +40,39 @@ import java.util.Set; ...@@ -42,40 +40,39 @@ import java.util.Set;
import java.util.SortedMap; import java.util.SortedMap;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.jar.Pack200; import java.util.jar.Pack200;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/** /**
* Control block for publishing Pack200 options to the other classes. * Control block for publishing Pack200 options to the other classes.
*/ */
final class PropMap implements SortedMap<String, String> { final class PropMap implements SortedMap<String, String> {
private final TreeMap<String, String> theMap = new TreeMap<>();; private final TreeMap<String, String> theMap = new TreeMap<>();;
private final List<PropertyChangeListener> listenerList = new ArrayList<>(1);
void addListener(PropertyChangeListener listener) { // type is erased, elements are of type java.beans.PropertyChangeListener
private final List<Object> listenerList = new ArrayList<>(1);
void addListener(Object listener) {
assert Beans.isPropertyChangeListener(listener);
listenerList.add(listener); listenerList.add(listener);
} }
void removeListener(PropertyChangeListener listener) { void removeListener(Object listener) {
assert Beans.isPropertyChangeListener(listener);
listenerList.remove(listener); listenerList.remove(listener);
} }
void addListeners(ArrayList<PropertyChangeListener> listeners) {
listenerList.addAll(listeners);
}
void removeListeners(ArrayList<PropertyChangeListener> listeners) {
listenerList.removeAll(listeners);
}
// Override: // Override:
public String put(String key, String value) { public String put(String key, String value) {
String oldValue = theMap.put(key, value); String oldValue = theMap.put(key, value);
if (value != oldValue && !listenerList.isEmpty()) { if (value != oldValue && !listenerList.isEmpty()) {
assert Beans.isBeansPresent();
// Post the property change event. // Post the property change event.
PropertyChangeEvent event = Object event = Beans.newPropertyChangeEvent(this, key, oldValue, value);
new PropertyChangeEvent(this, key, for (Object listener : listenerList) {
oldValue, value); Beans.invokePropertyChange(listener, event);
for (PropertyChangeListener listener : listenerList) {
listener.propertyChange(event);
} }
} }
return oldValue; return oldValue;
...@@ -339,4 +336,113 @@ final class PropMap implements SortedMap<String, String> { ...@@ -339,4 +336,113 @@ final class PropMap implements SortedMap<String, String> {
public String lastKey() { public String lastKey() {
return theMap.lastKey(); return theMap.lastKey();
} }
/**
* A class that provides access to the java.beans.PropertyChangeListener
* and java.beans.PropertyChangeEvent without creating a static dependency
* on java.beans. This class can be removed once the addPropertyChangeListener
* and removePropertyChangeListener methods are removed from Packer and
* Unpacker.
*/
private static class Beans {
private static final Class<?> propertyChangeListenerClass =
getClass("java.beans.PropertyChangeListener");
private static final Class<?> propertyChangeEventClass =
getClass("java.beans.PropertyChangeEvent");
private static final Method propertyChangeMethod =
getMethod(propertyChangeListenerClass,
"propertyChange",
propertyChangeEventClass);
private static final Constructor<?> propertyEventCtor =
getConstructor(propertyChangeEventClass,
Object.class,
String.class,
Object.class,
Object.class);
private static Class<?> getClass(String name) {
try {
return Class.forName(name, true, Beans.class.getClassLoader());
} catch (ClassNotFoundException e) {
return null;
}
}
private static Constructor<?> getConstructor(Class<?> c, Class<?>... types) {
try {
return (c == null) ? null : c.getDeclaredConstructor(types);
} catch (NoSuchMethodException x) {
throw new AssertionError(x);
}
}
private static Method getMethod(Class<?> c, String name, Class<?>... types) {
try {
return (c == null) ? null : c.getMethod(name, types);
} catch (NoSuchMethodException e) {
throw new AssertionError(e);
}
}
/**
* Returns {@code true} if java.beans is present.
*/
static boolean isBeansPresent() {
return propertyChangeListenerClass != null &&
propertyChangeEventClass != null;
}
/**
* Returns {@code true} if the given object is a PropertyChangeListener
*/
static boolean isPropertyChangeListener(Object obj) {
if (propertyChangeListenerClass == null) {
return false;
} else {
return propertyChangeListenerClass.isInstance(obj);
}
}
/**
* Returns a new PropertyChangeEvent with the given source, property
* name, old and new values.
*/
static Object newPropertyChangeEvent(Object source, String prop,
Object oldValue, Object newValue)
{
try {
return propertyEventCtor.newInstance(source, prop, oldValue, newValue);
} catch (InstantiationException | IllegalAccessException x) {
throw new AssertionError(x);
} catch (InvocationTargetException x) {
Throwable cause = x.getCause();
if (cause instanceof Error)
throw (Error)cause;
if (cause instanceof RuntimeException)
throw (RuntimeException)cause;
throw new AssertionError(x);
}
}
/**
* Invokes the given PropertyChangeListener's propertyChange method
* with the given event.
*/
static void invokePropertyChange(Object listener, Object ev) {
try {
propertyChangeMethod.invoke(listener, ev);
} catch (IllegalAccessException x) {
throw new AssertionError(x);
} catch (InvocationTargetException x) {
Throwable cause = x.getCause();
if (cause instanceof Error)
throw (Error)cause;
if (cause instanceof RuntimeException)
throw (RuntimeException)cause;
throw new AssertionError(x);
}
}
}
} }
...@@ -264,7 +264,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -264,7 +264,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
* <code>false</code> otherwise * <code>false</code> otherwise
*/ */
public boolean writeData(RowSetInternal caller) throws SQLException { public boolean writeData(RowSetInternal caller) throws SQLException {
boolean conflict = false; long conflicts = 0;
boolean showDel = false; boolean showDel = false;
PreparedStatement pstmtIns = null; PreparedStatement pstmtIns = null;
iChangedValsInDbAndCRS = 0; iChangedValsInDbAndCRS = 0;
...@@ -337,8 +337,9 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -337,8 +337,9 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
while (crs.next()) { while (crs.next()) {
if (crs.rowDeleted()) { if (crs.rowDeleted()) {
// The row has been deleted. // The row has been deleted.
if (conflict = (deleteOriginalRow(crs, this.crsResolve)) == true) { if (deleteOriginalRow(crs, this.crsResolve)) {
status.add(rows, SyncResolver.DELETE_ROW_CONFLICT); status.add(rows, SyncResolver.DELETE_ROW_CONFLICT);
conflicts++;
} else { } else {
// delete happened without any occurrence of conflicts // delete happened without any occurrence of conflicts
// so update status accordingly // so update status accordingly
...@@ -349,8 +350,9 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -349,8 +350,9 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
// The row has been inserted. // The row has been inserted.
pstmtIns = con.prepareStatement(insertCmd); pstmtIns = con.prepareStatement(insertCmd);
if ( (conflict = insertNewRow(crs, pstmtIns, this.crsResolve)) == true) { if (insertNewRow(crs, pstmtIns, this.crsResolve)) {
status.add(rows, SyncResolver.INSERT_ROW_CONFLICT); status.add(rows, SyncResolver.INSERT_ROW_CONFLICT);
conflicts++;
} else { } else {
// insert happened without any occurrence of conflicts // insert happened without any occurrence of conflicts
// so update status accordingly // so update status accordingly
...@@ -358,8 +360,9 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -358,8 +360,9 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
} }
} else if (crs.rowUpdated()) { } else if (crs.rowUpdated()) {
// The row has been updated. // The row has been updated.
if ( conflict = (updateOriginalRow(crs)) == true) { if (updateOriginalRow(crs)) {
status.add(rows, SyncResolver.UPDATE_ROW_CONFLICT); status.add(rows, SyncResolver.UPDATE_ROW_CONFLICT);
conflicts++;
} else { } else {
// update happened without any occurrence of conflicts // update happened without any occurrence of conflicts
// so update status accordingly // so update status accordingly
...@@ -395,21 +398,12 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -395,21 +398,12 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
// reset // reset
crs.setShowDeleted(showDel); crs.setShowDeleted(showDel);
boolean boolConf = false;
for (int j=1;j<status.size();j++){
// ignore status for index = 0 which is set to null
if(! ((status.get(j)).equals(SyncResolver.NO_ROW_CONFLICT))) {
// there is at least one conflict which needs to be resolved
boolConf = true;
break;
}
}
crs.beforeFirst(); crs.beforeFirst();
this.crsResolve.beforeFirst(); this.crsResolve.beforeFirst();
if(boolConf) { if(conflicts != 0) {
SyncProviderException spe = new SyncProviderException(status.size() - 1+resBundle.handleGetObject("crswriter.conflictsno").toString()); SyncProviderException spe = new SyncProviderException(conflicts + " " +
resBundle.handleGetObject("crswriter.conflictsno").toString());
//SyncResolver syncRes = spe.getSyncResolver(); //SyncResolver syncRes = spe.getSyncResolver();
SyncResolverImpl syncResImpl = (SyncResolverImpl) spe.getSyncResolver(); SyncResolverImpl syncResImpl = (SyncResolverImpl) spe.getSyncResolver();
......
...@@ -1067,10 +1067,6 @@ public class Krb5LoginModule implements LoginModule { ...@@ -1067,10 +1067,6 @@ public class Krb5LoginModule implements LoginModule {
if (ktab != null) { if (ktab != null) {
if (!privCredSet.contains(ktab)) { if (!privCredSet.contains(ktab)) {
privCredSet.add(ktab); privCredSet.add(ktab);
// Compatibility; also add keys to privCredSet
for (KerberosKey key: ktab.getKeys(kerbClientPrinc)) {
privCredSet.add(new Krb5Util.KeysFromKeyTab(key));
}
} }
} else { } else {
succeeded = false; succeeded = false;
......
...@@ -177,11 +177,10 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence { ...@@ -177,11 +177,10 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
ensureCapacityInternal(newLength); ensureCapacityInternal(newLength);
if (count < newLength) { if (count < newLength) {
for (; count < newLength; count++) Arrays.fill(value, count, newLength, '\0');
value[count] = '\0';
} else {
count = newLength;
} }
count = newLength;
} }
/** /**
...@@ -1308,8 +1307,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence { ...@@ -1308,8 +1307,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
* {@code null}. * {@code null}.
*/ */
public int indexOf(String str, int fromIndex) { public int indexOf(String str, int fromIndex) {
return String.indexOf(value, 0, count, return String.indexOf(value, 0, count, str, fromIndex);
str.toCharArray(), 0, str.length(), fromIndex);
} }
/** /**
...@@ -1352,8 +1350,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence { ...@@ -1352,8 +1350,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
* {@code null}. * {@code null}.
*/ */
public int lastIndexOf(String str, int fromIndex) { public int lastIndexOf(String str, int fromIndex) {
return String.lastIndexOf(value, 0, count, return String.lastIndexOf(value, 0, count, str, fromIndex);
str.toCharArray(), 0, str.length(), fromIndex);
} }
/** /**
......
...@@ -1705,6 +1705,24 @@ public final class String ...@@ -1705,6 +1705,24 @@ public final class String
str.value, 0, str.value.length, fromIndex); str.value, 0, str.value.length, fromIndex);
} }
/**
* Code shared by String and AbstractStringBuilder to do searches. The
* source is the character array being searched, and the target
* is the string being searched for.
*
* @param source the characters being searched.
* @param sourceOffset offset of the source string.
* @param sourceCount count of the source string.
* @param target the characters being searched for.
* @param fromIndex the index to begin searching from.
*/
static int indexOf(char[] source, int sourceOffset, int sourceCount,
String target, int fromIndex) {
return indexOf(source, sourceOffset, sourceCount,
target.value, 0, target.value.length,
fromIndex);
}
/** /**
* Code shared by String and StringBuffer to do searches. The * Code shared by String and StringBuffer to do searches. The
* source is the character array being searched, and the target * source is the character array being searched, and the target
...@@ -1796,6 +1814,24 @@ public final class String ...@@ -1796,6 +1814,24 @@ public final class String
str.value, 0, str.value.length, fromIndex); str.value, 0, str.value.length, fromIndex);
} }
/**
* Code shared by String and AbstractStringBuilder to do searches. The
* source is the character array being searched, and the target
* is the string being searched for.
*
* @param source the characters being searched.
* @param sourceOffset offset of the source string.
* @param sourceCount count of the source string.
* @param target the characters being searched for.
* @param fromIndex the index to begin searching from.
*/
static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
String target, int fromIndex) {
return lastIndexOf(source, sourceOffset, sourceCount,
target.value, 0, target.value.length,
fromIndex);
}
/** /**
* Code shared by String and StringBuffer to do searches. The * Code shared by String and StringBuffer to do searches. The
* source is the character array being searched, and the target * source is the character array being searched, and the target
......
...@@ -25,19 +25,21 @@ ...@@ -25,19 +25,21 @@
package java.lang; package java.lang;
import java.lang.ref.*; import java.lang.ref.*;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
/** /**
* This class provides thread-local variables. These variables differ from * This class provides thread-local variables. These variables differ from
* their normal counterparts in that each thread that accesses one (via its * their normal counterparts in that each thread that accesses one (via its
* <tt>get</tt> or <tt>set</tt> method) has its own, independently initialized * {@code get} or {@code set} method) has its own, independently initialized
* copy of the variable. <tt>ThreadLocal</tt> instances are typically private * copy of the variable. {@code ThreadLocal} instances are typically private
* static fields in classes that wish to associate state with a thread (e.g., * static fields in classes that wish to associate state with a thread (e.g.,
* a user ID or Transaction ID). * a user ID or Transaction ID).
* *
* <p>For example, the class below generates unique identifiers local to each * <p>For example, the class below generates unique identifiers local to each
* thread. * thread.
* A thread's id is assigned the first time it invokes <tt>ThreadId.get()</tt> * A thread's id is assigned the first time it invokes {@code ThreadId.get()}
* and remains unchanged on subsequent calls. * and remains unchanged on subsequent calls.
* <pre> * <pre>
* import java.util.concurrent.atomic.AtomicInteger; * import java.util.concurrent.atomic.AtomicInteger;
...@@ -61,7 +63,7 @@ import java.util.concurrent.atomic.AtomicInteger; ...@@ -61,7 +63,7 @@ import java.util.concurrent.atomic.AtomicInteger;
* } * }
* </pre> * </pre>
* <p>Each thread holds an implicit reference to its copy of a thread-local * <p>Each thread holds an implicit reference to its copy of a thread-local
* variable as long as the thread is alive and the <tt>ThreadLocal</tt> * variable as long as the thread is alive and the {@code ThreadLocal}
* instance is accessible; after a thread goes away, all of its copies of * instance is accessible; after a thread goes away, all of its copies of
* thread-local instances are subject to garbage collection (unless other * thread-local instances are subject to garbage collection (unless other
* references to these copies exist). * references to these copies exist).
...@@ -108,14 +110,14 @@ public class ThreadLocal<T> { ...@@ -108,14 +110,14 @@ public class ThreadLocal<T> {
* thread-local variable. This method will be invoked the first * thread-local variable. This method will be invoked the first
* time a thread accesses the variable with the {@link #get} * time a thread accesses the variable with the {@link #get}
* method, unless the thread previously invoked the {@link #set} * method, unless the thread previously invoked the {@link #set}
* method, in which case the <tt>initialValue</tt> method will not * method, in which case the {@code initialValue} method will not
* be invoked for the thread. Normally, this method is invoked at * be invoked for the thread. Normally, this method is invoked at
* most once per thread, but it may be invoked again in case of * most once per thread, but it may be invoked again in case of
* subsequent invocations of {@link #remove} followed by {@link #get}. * subsequent invocations of {@link #remove} followed by {@link #get}.
* *
* <p>This implementation simply returns <tt>null</tt>; if the * <p>This implementation simply returns {@code null}; if the
* programmer desires thread-local variables to have an initial * programmer desires thread-local variables to have an initial
* value other than <tt>null</tt>, <tt>ThreadLocal</tt> must be * value other than {@code null}, {@code ThreadLocal} must be
* subclassed, and this method overridden. Typically, an * subclassed, and this method overridden. Typically, an
* anonymous inner class will be used. * anonymous inner class will be used.
* *
...@@ -125,8 +127,22 @@ public class ThreadLocal<T> { ...@@ -125,8 +127,22 @@ public class ThreadLocal<T> {
return null; return null;
} }
/**
* Creates a thread local variable. The initial value of the variable is
* determined by invoking the {@code get} method on the {@code Supplier}.
*
* @param supplier the supplier to be used to determine the initial value
* @return a new thread local variable
* @throws NullPointerException if the specified supplier is null
* @since 1.8
*/
public static <T> ThreadLocal<T> withInitial(Supplier<? extends T> supplier) {
return new SuppliedThreadLocal<>(supplier);
}
/** /**
* Creates a thread local variable. * Creates a thread local variable.
* @see #withInitial(java.util.function.Supplier)
*/ */
public ThreadLocal() { public ThreadLocal() {
} }
...@@ -195,7 +211,7 @@ public class ThreadLocal<T> { ...@@ -195,7 +211,7 @@ public class ThreadLocal<T> {
* reinitialized by invoking its {@link #initialValue} method, * reinitialized by invoking its {@link #initialValue} method,
* unless its value is {@linkplain #set set} by the current thread * unless its value is {@linkplain #set set} by the current thread
* in the interim. This may result in multiple invocations of the * in the interim. This may result in multiple invocations of the
* <tt>initialValue</tt> method in the current thread. * {@code initialValue} method in the current thread.
* *
* @since 1.5 * @since 1.5
*/ */
...@@ -250,6 +266,24 @@ public class ThreadLocal<T> { ...@@ -250,6 +266,24 @@ public class ThreadLocal<T> {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
/**
* An extension of ThreadLocal that obtains its initial value from
* the specified {@code Supplier}.
*/
static final class SuppliedThreadLocal<T> extends ThreadLocal<T> {
private final Supplier<? extends T> supplier;
SuppliedThreadLocal(Supplier<? extends T> supplier) {
this.supplier = Objects.requireNonNull(supplier);
}
@Override
protected T initialValue() {
return supplier.get();
}
}
/** /**
* ThreadLocalMap is a customized hash map suitable only for * ThreadLocalMap is a customized hash map suitable only for
* maintaining thread local values. No operations are exported * maintaining thread local values. No operations are exported
...@@ -599,9 +633,9 @@ public class ThreadLocal<T> { ...@@ -599,9 +633,9 @@ public class ThreadLocal<T> {
* @param i a position known NOT to hold a stale entry. The * @param i a position known NOT to hold a stale entry. The
* scan starts at the element after i. * scan starts at the element after i.
* *
* @param n scan control: <tt>log2(n)</tt> cells are scanned, * @param n scan control: {@code log2(n)} cells are scanned,
* unless a stale entry is found, in which case * unless a stale entry is found, in which case
* <tt>log2(table.length)-1</tt> additional cells are scanned. * {@code log2(table.length)-1} additional cells are scanned.
* When called from insertions, this parameter is the number * When called from insertions, this parameter is the number
* of elements, but when from replaceStaleEntry, it is the * of elements, but when from replaceStaleEntry, it is the
* table length. (Note: all this could be changed to be either * table length. (Note: all this could be changed to be either
......
...@@ -25,15 +25,15 @@ ...@@ -25,15 +25,15 @@
package java.lang.invoke; package java.lang.invoke;
import java.io.FileOutputStream; import java.lang.reflect.Constructor;
import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.security.ProtectionDomain; import java.security.ProtectionDomain;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import sun.util.logging.PlatformLogger;
import jdk.internal.org.objectweb.asm.*; import jdk.internal.org.objectweb.asm.*;
import static jdk.internal.org.objectweb.asm.Opcodes.*; import static jdk.internal.org.objectweb.asm.Opcodes.*;
import sun.misc.Unsafe; import sun.misc.Unsafe;
import java.security.AccessController;
import java.security.PrivilegedAction;
/** /**
* InnerClassLambdaMetafactory * InnerClassLambdaMetafactory
...@@ -120,13 +120,34 @@ import sun.misc.Unsafe; ...@@ -120,13 +120,34 @@ import sun.misc.Unsafe;
* *
* @return a CallSite, which, when invoked, will return an instance of the * @return a CallSite, which, when invoked, will return an instance of the
* functional interface * functional interface
* @throws ReflectiveOperationException * @throws ReflectiveOperationException, LambdaConversionException
*/ */
@Override @Override
CallSite buildCallSite() throws ReflectiveOperationException, LambdaConversionException { CallSite buildCallSite() throws ReflectiveOperationException, LambdaConversionException {
final Class<?> innerClass = spinInnerClass(); final Class<?> innerClass = spinInnerClass();
if (invokedType.parameterCount() == 0) { if (invokedType.parameterCount() == 0) {
return new ConstantCallSite(MethodHandles.constant(samBase, innerClass.newInstance())); final Constructor[] ctrs = AccessController.doPrivileged(
new PrivilegedAction<Constructor[]>() {
@Override
public Constructor[] run() {
return innerClass.getDeclaredConstructors();
}
});
if (ctrs.length != 1) {
throw new ReflectiveOperationException("Expected one lambda constructor for "
+ innerClass.getCanonicalName() + ", got " + ctrs.length);
}
// The lambda implementing inner class constructor is private, set
// it accessible (by us) before creating the constant sole instance
AccessController.doPrivileged(new PrivilegedAction<Void>() {
@Override
public Void run() {
ctrs[0].setAccessible(true);
return null;
}
});
Object inst = ctrs[0].newInstance();
return new ConstantCallSite(MethodHandles.constant(samBase, inst));
} else { } else {
return new ConstantCallSite( return new ConstantCallSite(
MethodHandles.Lookup.IMPL_LOOKUP MethodHandles.Lookup.IMPL_LOOKUP
...@@ -144,7 +165,7 @@ import sun.misc.Unsafe; ...@@ -144,7 +165,7 @@ import sun.misc.Unsafe;
private <T> Class<? extends T> spinInnerClass() throws LambdaConversionException { private <T> Class<? extends T> spinInnerClass() throws LambdaConversionException {
String samName = samBase.getName().replace('.', '/'); String samName = samBase.getName().replace('.', '/');
cw.visit(CLASSFILE_VERSION, ACC_PUBLIC + ACC_SUPER, lambdaClassName, null, NAME_MAGIC_ACCESSOR_IMPL, cw.visit(CLASSFILE_VERSION, ACC_SUPER, lambdaClassName, null, NAME_MAGIC_ACCESSOR_IMPL,
isSerializable ? new String[]{samName, NAME_SERIALIZABLE} : new String[]{samName}); isSerializable ? new String[]{samName, NAME_SERIALIZABLE} : new String[]{samName});
// Generate final fields to be filled in by constructor // Generate final fields to be filled in by constructor
...@@ -186,17 +207,27 @@ import sun.misc.Unsafe; ...@@ -186,17 +207,27 @@ import sun.misc.Unsafe;
final byte[] classBytes = cw.toByteArray(); final byte[] classBytes = cw.toByteArray();
if (System.getProperty("debug.dump.generated") != null) { /*** Uncomment to dump the generated file
System.out.printf("Loaded: %s (%d bytes) %n", lambdaClassName, classBytes.length); System.out.printf("Loaded: %s (%d bytes) %n", lambdaClassName, classBytes.length);
try (FileOutputStream fos = new FileOutputStream(lambdaClassName.replace('/', '.') + ".class")) { try (FileOutputStream fos = new FileOutputStream(lambdaClassName.replace('/', '.') + ".class")) {
fos.write(classBytes); fos.write(classBytes);
} catch (IOException ex) { } catch (IOException ex) {
PlatformLogger.getLogger(InnerClassLambdaMetafactory.class.getName()).severe(ex.getMessage(), ex); Logger.getLogger(InnerClassLambdaMetafactory.class.getName()).log(Level.SEVERE, null, ex);
}
} }
***/
ClassLoader loader = targetClass.getClassLoader(); ClassLoader loader = targetClass.getClassLoader();
ProtectionDomain pd = (loader == null) ? null : targetClass.getProtectionDomain(); ProtectionDomain pd = (loader == null)
? null
: AccessController.doPrivileged(
new PrivilegedAction<ProtectionDomain>() {
@Override
public ProtectionDomain run() {
return targetClass.getProtectionDomain();
}
}
);
return (Class<? extends T>) Unsafe.getUnsafe().defineClass(lambdaClassName, classBytes, 0, classBytes.length, loader, pd); return (Class<? extends T>) Unsafe.getUnsafe().defineClass(lambdaClassName, classBytes, 0, classBytes.length, loader, pd);
} }
...@@ -205,7 +236,7 @@ import sun.misc.Unsafe; ...@@ -205,7 +236,7 @@ import sun.misc.Unsafe;
*/ */
private void generateConstructor() { private void generateConstructor() {
// Generate constructor // Generate constructor
MethodVisitor ctor = cw.visitMethod(ACC_PUBLIC, NAME_CTOR, constructorDesc, null, null); MethodVisitor ctor = cw.visitMethod(ACC_PRIVATE, NAME_CTOR, constructorDesc, null, null);
ctor.visitCode(); ctor.visitCode();
ctor.visitVarInsn(ALOAD, 0); ctor.visitVarInsn(ALOAD, 0);
ctor.visitMethodInsn(INVOKESPECIAL, NAME_MAGIC_ACCESSOR_IMPL, NAME_CTOR, METHOD_DESCRIPTOR_VOID); ctor.visitMethodInsn(INVOKESPECIAL, NAME_MAGIC_ACCESSOR_IMPL, NAME_CTOR, METHOD_DESCRIPTOR_VOID);
......
...@@ -688,7 +688,16 @@ public class DateFormatSymbols implements Serializable, Cloneable { ...@@ -688,7 +688,16 @@ public class DateFormatSymbols implements Serializable, Cloneable {
} }
ResourceBundle resource = adapter.getLocaleData().getDateFormatData(locale); ResourceBundle resource = adapter.getLocaleData().getDateFormatData(locale);
// JRE and CLDR use different keys
// JRE: Eras, short.Eras and narrow.Eras
// CLDR: long.Eras, Eras and narrow.Eras
if (resource.containsKey("Eras")) {
eras = resource.getStringArray("Eras"); eras = resource.getStringArray("Eras");
} else if (resource.containsKey("long.Eras")) {
eras = resource.getStringArray("long.Eras");
} else if (resource.containsKey("short.Eras")) {
eras = resource.getStringArray("short.Eras");
}
months = resource.getStringArray("MonthNames"); months = resource.getStringArray("MonthNames");
shortMonths = resource.getStringArray("MonthAbbreviations"); shortMonths = resource.getStringArray("MonthAbbreviations");
ampms = resource.getStringArray("AmPmMarkers"); ampms = resource.getStringArray("AmPmMarkers");
......
...@@ -48,12 +48,13 @@ import java.util.GregorianCalendar; ...@@ -48,12 +48,13 @@ import java.util.GregorianCalendar;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.SimpleTimeZone; import java.util.SimpleTimeZone;
import java.util.SortedMap;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import sun.util.locale.provider.LocaleProviderAdapter;
import sun.util.calendar.CalendarUtils; import sun.util.calendar.CalendarUtils;
import sun.util.calendar.ZoneInfoFile; import sun.util.calendar.ZoneInfoFile;
import sun.util.locale.provider.LocaleProviderAdapter;
/** /**
* <code>SimpleDateFormat</code> is a concrete class for formatting and * <code>SimpleDateFormat</code> is a concrete class for formatting and
...@@ -1593,6 +1594,17 @@ public class SimpleDateFormat extends DateFormat { ...@@ -1593,6 +1594,17 @@ public class SimpleDateFormat extends DateFormat {
private int matchString(String text, int start, int field, private int matchString(String text, int start, int field,
Map<String,Integer> data, CalendarBuilder calb) { Map<String,Integer> data, CalendarBuilder calb) {
if (data != null) { if (data != null) {
// TODO: make this default when it's in the spec.
if (data instanceof SortedMap) {
for (String name : data.keySet()) {
if (text.regionMatches(true, start, name, 0, name.length())) {
calb.set(field, data.get(name));
return start + name.length();
}
}
return -start;
}
String bestMatch = null; String bestMatch = null;
for (String name : data.keySet()) { for (String name : data.keySet()) {
...@@ -1803,7 +1815,7 @@ public class SimpleDateFormat extends DateFormat { ...@@ -1803,7 +1815,7 @@ public class SimpleDateFormat extends DateFormat {
boolean obeyCount, boolean[] ambiguousYear, boolean obeyCount, boolean[] ambiguousYear,
ParsePosition origPos, ParsePosition origPos,
boolean useFollowingMinusSignAsDelimiter, CalendarBuilder calb) { boolean useFollowingMinusSignAsDelimiter, CalendarBuilder calb) {
Number number = null; Number number;
int value = 0; int value = 0;
ParsePosition pos = new ParsePosition(0); ParsePosition pos = new ParsePosition(0);
pos.index = start; pos.index = start;
...@@ -1876,9 +1888,7 @@ public class SimpleDateFormat extends DateFormat { ...@@ -1876,9 +1888,7 @@ public class SimpleDateFormat extends DateFormat {
return index; return index;
} }
} else { } else {
Map<String, Integer> map = calendar.getDisplayNames(field, Map<String, Integer> map = getDisplayNamesMap(field, locale);
Calendar.ALL_STYLES,
locale);
if ((index = matchString(text, start, field, map, calb)) > 0) { if ((index = matchString(text, start, field, map, calb)) > 0) {
return index; return index;
} }
...@@ -1940,7 +1950,7 @@ public class SimpleDateFormat extends DateFormat { ...@@ -1940,7 +1950,7 @@ public class SimpleDateFormat extends DateFormat {
// count >= 3 // i.e., MMM or MMMM // count >= 3 // i.e., MMM or MMMM
// Want to be able to parse both short and long forms. // Want to be able to parse both short and long forms.
// Try count == 4 first: // Try count == 4 first:
int newStart = 0; int newStart;
if ((newStart = matchString(text, start, Calendar.MONTH, if ((newStart = matchString(text, start, Calendar.MONTH,
formatData.getMonths(), calb)) > 0) { formatData.getMonths(), calb)) > 0) {
return newStart; return newStart;
...@@ -1951,9 +1961,7 @@ public class SimpleDateFormat extends DateFormat { ...@@ -1951,9 +1961,7 @@ public class SimpleDateFormat extends DateFormat {
return index; return index;
} }
} else { } else {
Map<String, Integer> map = calendar.getDisplayNames(field, Map<String, Integer> map = getDisplayNamesMap(field, locale);
Calendar.ALL_STYLES,
locale);
if ((index = matchString(text, start, field, map, calb)) > 0) { if ((index = matchString(text, start, field, map, calb)) > 0) {
return index; return index;
} }
...@@ -1979,7 +1987,7 @@ public class SimpleDateFormat extends DateFormat { ...@@ -1979,7 +1987,7 @@ public class SimpleDateFormat extends DateFormat {
if (useDateFormatSymbols) { if (useDateFormatSymbols) {
// Want to be able to parse both short and long forms. // Want to be able to parse both short and long forms.
// Try count == 4 (DDDD) first: // Try count == 4 (DDDD) first:
int newStart = 0; int newStart;
if ((newStart=matchString(text, start, Calendar.DAY_OF_WEEK, if ((newStart=matchString(text, start, Calendar.DAY_OF_WEEK,
formatData.getWeekdays(), calb)) > 0) { formatData.getWeekdays(), calb)) > 0) {
return newStart; return newStart;
...@@ -2008,7 +2016,7 @@ public class SimpleDateFormat extends DateFormat { ...@@ -2008,7 +2016,7 @@ public class SimpleDateFormat extends DateFormat {
return index; return index;
} }
} else { } else {
Map<String,Integer> map = calendar.getDisplayNames(field, Calendar.ALL_STYLES, locale); Map<String,Integer> map = getDisplayNamesMap(field, locale);
if ((index = matchString(text, start, field, map, calb)) > 0) { if ((index = matchString(text, start, field, map, calb)) > 0) {
return index; return index;
} }
...@@ -2098,7 +2106,7 @@ public class SimpleDateFormat extends DateFormat { ...@@ -2098,7 +2106,7 @@ public class SimpleDateFormat extends DateFormat {
break parsing; break parsing;
} }
int sign = 0; int sign;
char c = text.charAt(pos.index); char c = text.charAt(pos.index);
if (c == 'Z') { if (c == 'Z') {
calb.set(Calendar.ZONE_OFFSET, 0).set(Calendar.DST_OFFSET, 0); calb.set(Calendar.ZONE_OFFSET, 0).set(Calendar.DST_OFFSET, 0);
...@@ -2340,6 +2348,21 @@ public class SimpleDateFormat extends DateFormat { ...@@ -2340,6 +2348,21 @@ public class SimpleDateFormat extends DateFormat {
&& formatData.equals(that.formatData)); && formatData.equals(that.formatData));
} }
private static final int[] REST_OF_STYLES = {
Calendar.SHORT_STANDALONE, Calendar.LONG_FORMAT, Calendar.LONG_STANDALONE,
};
private Map<String, Integer> getDisplayNamesMap(int field, Locale locale) {
Map<String, Integer> map = calendar.getDisplayNames(field, Calendar.SHORT_FORMAT, locale);
// Get all SHORT and LONG styles (avoid NARROW styles).
for (int style : REST_OF_STYLES) {
Map<String, Integer> m = calendar.getDisplayNames(field, style, locale);
if (m != null) {
map.putAll(m);
}
}
return map;
}
/** /**
* After reading an object from the input stream, the format * After reading an object from the input stream, the format
* pattern in the object is verified. * pattern in the object is verified.
......
...@@ -289,8 +289,8 @@ public class Base64 { ...@@ -289,8 +289,8 @@ public class Base64 {
* *
* <p> This method first encodes all input bytes into a base64 encoded * <p> This method first encodes all input bytes into a base64 encoded
* byte array and then constructs a new String by using the encoded byte * byte array and then constructs a new String by using the encoded byte
* array and the {@link java.nio.charset.StandardCharsets.ISO_8859_1 ISO-8859-1} * array and the {@link java.nio.charset.StandardCharsets#ISO_8859_1
* charset. * ISO-8859-1} charset.
* *
* <p> In other words, an invocation of this method has exactly the same * <p> In other words, an invocation of this method has exactly the same
* effect as invoking * effect as invoking
...@@ -358,9 +358,9 @@ public class Base64 { ...@@ -358,9 +358,9 @@ public class Base64 {
* to encode any more input bytes. The encoding operation can be * to encode any more input bytes. The encoding operation can be
* continued, if there is more bytes in input buffer to be encoded, * continued, if there is more bytes in input buffer to be encoded,
* by invoking this method again with an output buffer that has more * by invoking this method again with an output buffer that has more
* {@linkplain Buffer#remaining remaining} bytes. This is typically * {@linkplain java.nio.Buffer#remaining remaining} bytes. This is
* done by draining any encoded bytes from the output buffer. The * typically done by draining any encoded bytes from the output buffer.
* value returned from last invocation needs to be passed in as the * The value returned from last invocation needs to be passed in as the
* third parameter {@code bytesOut} if it is to continue an unfinished * third parameter {@code bytesOut} if it is to continue an unfinished
* encoding, 0 otherwise. * encoding, 0 otherwise.
* *
...@@ -806,9 +806,9 @@ public class Base64 { ...@@ -806,9 +806,9 @@ public class Base64 {
* buffer has insufficient space to decode any more input bytes. * buffer has insufficient space to decode any more input bytes.
* The decoding operation can be continued, if there is more bytes * The decoding operation can be continued, if there is more bytes
* in input buffer to be decoded, by invoking this method again with * in input buffer to be decoded, by invoking this method again with
* an output buffer that has more {@linkplain Buffer#remaining remaining} * an output buffer that has more {@linkplain java.nio.Buffer#remaining
* bytes.This is typically done by draining any decoded bytes from the * remaining} bytes. This is typically done by draining any decoded
* output buffer. * bytes from the output buffer.
* *
* <p><b>Recommended Usage Example</b> * <p><b>Recommended Usage Example</b>
* <pre> * <pre>
...@@ -901,7 +901,7 @@ public class Base64 { ...@@ -901,7 +901,7 @@ public class Base64 {
shiftto -= 6; shiftto -= 6;
if (shiftto < 0) { if (shiftto < 0) {
if (dl < dp + 3) if (dl < dp + 3)
return dp; return dp - dp0;
da[dp++] = (byte)(bits >> 16); da[dp++] = (byte)(bits >> 16);
da[dp++] = (byte)(bits >> 8); da[dp++] = (byte)(bits >> 8);
da[dp++] = (byte)(bits); da[dp++] = (byte)(bits);
...@@ -912,7 +912,7 @@ public class Base64 { ...@@ -912,7 +912,7 @@ public class Base64 {
} }
if (shiftto == 6) { if (shiftto == 6) {
if (dl - dp < 1) if (dl - dp < 1)
return dp; return dp - dp0;
if (padding && (sp + 1 != sl || sa[sp++] != '=')) if (padding && (sp + 1 != sl || sa[sp++] != '='))
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Input buffer has wrong 4-byte ending unit"); "Input buffer has wrong 4-byte ending unit");
...@@ -920,7 +920,7 @@ public class Base64 { ...@@ -920,7 +920,7 @@ public class Base64 {
mark = sp; mark = sp;
} else if (shiftto == 0) { } else if (shiftto == 0) {
if (dl - dp < 2) if (dl - dp < 2)
return dp; return dp - dp0;
if (padding && sp != sl) if (padding && sp != sl)
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Input buffer has wrong 4-byte ending unit"); "Input buffer has wrong 4-byte ending unit");
...@@ -969,7 +969,7 @@ public class Base64 { ...@@ -969,7 +969,7 @@ public class Base64 {
shiftto -= 6; shiftto -= 6;
if (shiftto < 0) { if (shiftto < 0) {
if (dl < dp + 3) if (dl < dp + 3)
return dp; return dp - dp0;
dst.put(dp++, (byte)(bits >> 16)); dst.put(dp++, (byte)(bits >> 16));
dst.put(dp++, (byte)(bits >> 8)); dst.put(dp++, (byte)(bits >> 8));
dst.put(dp++, (byte)(bits)); dst.put(dp++, (byte)(bits));
...@@ -980,7 +980,7 @@ public class Base64 { ...@@ -980,7 +980,7 @@ public class Base64 {
} }
if (shiftto == 6) { if (shiftto == 6) {
if (dl - dp < 1) if (dl - dp < 1)
return dp; return dp - dp0;
if (padding && (sp + 1 != sl || src.get(sp++) != '=')) if (padding && (sp + 1 != sl || src.get(sp++) != '='))
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Input buffer has wrong 4-byte ending unit"); "Input buffer has wrong 4-byte ending unit");
...@@ -988,7 +988,7 @@ public class Base64 { ...@@ -988,7 +988,7 @@ public class Base64 {
mark = sp; mark = sp;
} else if (shiftto == 0) { } else if (shiftto == 0) {
if (dl - dp < 2) if (dl - dp < 2)
return dp; return dp - dp0;
if (padding && sp != sl) if (padding && sp != sl)
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Input buffer has wrong 4-byte ending unit"); "Input buffer has wrong 4-byte ending unit");
......
...@@ -53,9 +53,7 @@ import java.text.DateFormat; ...@@ -53,9 +53,7 @@ import java.text.DateFormat;
import java.text.DateFormatSymbols; import java.text.DateFormatSymbols;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.spi.CalendarDataProvider;
import sun.util.BuddhistCalendar; import sun.util.BuddhistCalendar;
import sun.util.locale.provider.LocaleProviderAdapter;
import sun.util.calendar.ZoneInfo; import sun.util.calendar.ZoneInfo;
import sun.util.locale.provider.CalendarDataUtility; import sun.util.locale.provider.CalendarDataUtility;
...@@ -743,6 +741,32 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca ...@@ -743,6 +741,32 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
*/ */
public static final int LONG = 2; public static final int LONG = 2;
/**
* A style specifier for {@link #getDisplayName(int, int, Locale)
* getDisplayName} and {@link #getDisplayNames(int, int, Locale)
* getDisplayNames} indicating a narrow name used for format. Narrow names
* are typically single character strings, such as "M" for Monday.
*
* @see #NARROW_STANDALONE
* @see #SHORT_FORMAT
* @see #LONG_FOTMAT
* @since 1.8
*/
public static final int NARROW_FORMAT = 4;
/**
* A style specifier for {@link #getDisplayName(int, int, Locale)
* getDisplayName} and {@link #getDisplayNames(int, int, Locale)
* getDisplayNames} indicating a narrow name independently. Narrow names
* are typically single character strings, such as "M" for Monday.
*
* @see #NARROW_FORMAT
* @see #SHORT_STANDALONE
* @see #LONG_STANDALONE
* @since 1.8
*/
public static final int NARROW_STANDALONE = NARROW_FORMAT | STANDALONE_MASK;
/** /**
* A style specifier for {@link #getDisplayName(int, int, Locale) * A style specifier for {@link #getDisplayName(int, int, Locale)
* getDisplayName} and {@link #getDisplayNames(int, int, Locale) * getDisplayName} and {@link #getDisplayNames(int, int, Locale)
...@@ -1472,30 +1496,31 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca ...@@ -1472,30 +1496,31 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
* @param style * @param style
* the style applied to the string representation; one of {@link * the style applied to the string representation; one of {@link
* #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE}, * #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE},
* {@link #LONG_FORMAT} ({@link #LONG}) or {@link #LONG_STANDALONE}. * {@link #LONG_FORMAT} ({@link #LONG}), {@link #LONG_STANDALONE},
* {@link #NARROW_FORMAT}, or {@link #NARROW_STANDALONE}.
* @param locale * @param locale
* the locale for the string representation * the locale for the string representation
* (any calendar types specified by {@code locale} are ignored) * (any calendar types specified by {@code locale} are ignored)
* @return the string representation of the given * @return the string representation of the given
* <code>field</code> in the given <code>style</code>, or * {@code field} in the given {@code style}, or
* <code>null</code> if no string representation is * {@code null} if no string representation is
* applicable. * applicable.
* @exception IllegalArgumentException * @exception IllegalArgumentException
* if <code>field</code> or <code>style</code> is invalid, * if {@code field} or {@code style} is invalid,
* or if this <code>Calendar</code> is non-lenient and any * or if this {@code Calendar} is non-lenient and any
* of the calendar fields have invalid values * of the calendar fields have invalid values
* @exception NullPointerException * @exception NullPointerException
* if <code>locale</code> is null * if {@code locale} is null
* @since 1.6 * @since 1.6
*/ */
public String getDisplayName(int field, int style, Locale locale) { public String getDisplayName(int field, int style, Locale locale) {
if (!checkDisplayNameParams(field, style, SHORT, LONG, locale, if (!checkDisplayNameParams(field, style, SHORT, NARROW_FORMAT, locale,
ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
return null; return null;
} }
// the standalone styles are supported only through CalendarDataProviders. // the standalone and narrow styles are supported only through CalendarDataProviders.
if (isStandaloneStyle(style)) { if (isStandaloneStyle(style) || isNarrowStyle(style)) {
return CalendarDataUtility.retrieveFieldValueName(getCalendarType(), return CalendarDataUtility.retrieveFieldValueName(getCalendarType(),
field, get(field), field, get(field),
style, locale); style, locale);
...@@ -1513,26 +1538,30 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca ...@@ -1513,26 +1538,30 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
} }
/** /**
* Returns a <code>Map</code> containing all names of the calendar * Returns a {@code Map} containing all names of the calendar
* <code>field</code> in the given <code>style</code> and * {@code field} in the given {@code style} and
* <code>locale</code> and their corresponding field values. For * {@code locale} and their corresponding field values. For
* example, if this <code>Calendar</code> is a {@link * example, if this {@code Calendar} is a {@link
* GregorianCalendar}, the returned map would contain "Jan" to * GregorianCalendar}, the returned map would contain "Jan" to
* {@link #JANUARY}, "Feb" to {@link #FEBRUARY}, and so on, in the * {@link #JANUARY}, "Feb" to {@link #FEBRUARY}, and so on, in the
* {@linkplain #SHORT short} style in an English locale. * {@linkplain #SHORT short} style in an English locale.
* *
* <p>Narrow names may not be unique due to use of single characters,
* such as "S" for Sunday and Saturday. In that case narrow names are not
* included in the returned {@code Map}.
*
* <p>The values of other calendar fields may be taken into * <p>The values of other calendar fields may be taken into
* account to determine a set of display names. For example, if * account to determine a set of display names. For example, if
* this <code>Calendar</code> is a lunisolar calendar system and * this {@code Calendar} is a lunisolar calendar system and
* the year value given by the {@link #YEAR} field has a leap * the year value given by the {@link #YEAR} field has a leap
* month, this method would return month names containing the leap * month, this method would return month names containing the leap
* month name, and month names are mapped to their values specific * month name, and month names are mapped to their values specific
* for the year. * for the year.
* *
* <p>The default implementation supports display names contained in * <p>The default implementation supports display names contained in
* a {@link DateFormatSymbols}. For example, if <code>field</code> * a {@link DateFormatSymbols}. For example, if {@code field}
* is {@link #MONTH} and <code>style</code> is {@link * is {@link #MONTH} and {@code style} is {@link
* #ALL_STYLES}, this method returns a <code>Map</code> containing * #ALL_STYLES}, this method returns a {@code Map} containing
* all strings returned by {@link DateFormatSymbols#getShortMonths()} * all strings returned by {@link DateFormatSymbols#getShortMonths()}
* and {@link DateFormatSymbols#getMonths()}. * and {@link DateFormatSymbols#getMonths()}.
* *
...@@ -1541,30 +1570,31 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca ...@@ -1541,30 +1570,31 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
* @param style * @param style
* the style applied to the string representation; one of {@link * the style applied to the string representation; one of {@link
* #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE}, * #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE},
* {@link #LONG_FORMAT} ({@link #LONG}) or {@link #LONG_STANDALONE}. * {@link #LONG_FORMAT} ({@link #LONG}), {@link #LONG_STANDALONE},
* {@link #NARROW_FORMAT}, or {@link #NARROW_STANDALONE}
* @param locale * @param locale
* the locale for the display names * the locale for the display names
* @return a <code>Map</code> containing all display names in * @return a {@code Map} containing all display names in
* <code>style</code> and <code>locale</code> and their * {@code style} and {@code locale} and their
* field values, or <code>null</code> if no display names * field values, or {@code null} if no display names
* are defined for <code>field</code> * are defined for {@code field}
* @exception IllegalArgumentException * @exception IllegalArgumentException
* if <code>field</code> or <code>style</code> is invalid, * if {@code field} or {@code style} is invalid,
* or if this <code>Calendar</code> is non-lenient and any * or if this {@code Calendar} is non-lenient and any
* of the calendar fields have invalid values * of the calendar fields have invalid values
* @exception NullPointerException * @exception NullPointerException
* if <code>locale</code> is null * if {@code locale} is null
* @since 1.6 * @since 1.6
*/ */
public Map<String, Integer> getDisplayNames(int field, int style, Locale locale) { public Map<String, Integer> getDisplayNames(int field, int style, Locale locale) {
if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale, if (!checkDisplayNameParams(field, style, ALL_STYLES, NARROW_FORMAT, locale,
ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
return null; return null;
} }
if (style == ALL_STYLES || isStandaloneStyle(style)) { if (style == ALL_STYLES || isStandaloneStyle(style)) {
return CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale); return CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale);
} }
// SHORT or LONG // SHORT, LONG, or NARROW
return getDisplayNamesImpl(field, style, locale); return getDisplayNamesImpl(field, style, locale);
} }
...@@ -1599,6 +1629,12 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca ...@@ -1599,6 +1629,12 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
private String[] getFieldStrings(int field, int style, DateFormatSymbols symbols) { private String[] getFieldStrings(int field, int style, DateFormatSymbols symbols) {
int baseStyle = getBaseStyle(style); // ignore the standalone mask int baseStyle = getBaseStyle(style); // ignore the standalone mask
// DateFormatSymbols doesn't support any narrow names.
if (baseStyle == NARROW_FORMAT) {
return null;
}
String[] strings = null; String[] strings = null;
switch (field) { switch (field) {
case ERA: case ERA:
...@@ -1948,6 +1984,10 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca ...@@ -1948,6 +1984,10 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
return (style & STANDALONE_MASK) != 0; return (style & STANDALONE_MASK) != 0;
} }
boolean isNarrowStyle(int style) {
return style == NARROW_FORMAT || style == NARROW_STANDALONE;
}
/** /**
* Returns the pseudo-time-stamp for two fields, given their * Returns the pseudo-time-stamp for two fields, given their
* individual pseudo-time-stamps. If either of the fields * individual pseudo-time-stamps. If either of the fields
......
...@@ -56,12 +56,13 @@ import sun.util.logging.PlatformLogger; ...@@ -56,12 +56,13 @@ import sun.util.logging.PlatformLogger;
* no public constructor. You obtain a <code>Currency</code> instance using * no public constructor. You obtain a <code>Currency</code> instance using
* the <code>getInstance</code> methods. * the <code>getInstance</code> methods.
* <p> * <p>
* Users can supersede the Java runtime currency data by creating a properties * Users can supersede the Java runtime currency data by means of the system
* file named <code>&lt;JAVA_HOME&gt;/lib/currency.properties</code>. The contents * property {@code java.util.currency.data}. If this system property is
* of the properties file are key/value pairs of the ISO 3166 country codes * defined then its value is the location of a properties file, the contents of
* and the ISO 4217 currency data respectively. The value part consists of * which are key/value pairs of the ISO 3166 country codes and the ISO 4217
* three ISO 4217 values of a currency, i.e., an alphabetic code, a numeric * currency data respectively. The value part consists of three ISO 4217 values
* code, and a minor unit. Those three ISO 4217 values are separated by commas. * of a currency, i.e., an alphabetic code, a numeric code, and a minor unit.
* Those three ISO 4217 values are separated by commas.
* The lines which start with '#'s are considered comment lines. An optional UTC * The lines which start with '#'s are considered comment lines. An optional UTC
* timestamp may be specified per currency entry if users need to specify a * timestamp may be specified per currency entry if users need to specify a
* cutover date indicating when the new data comes into effect. The timestamp is * cutover date indicating when the new data comes into effect. The timestamp is
...@@ -246,10 +247,13 @@ public final class Currency implements Serializable { ...@@ -246,10 +247,13 @@ public final class Currency implements Serializable {
} }
// look for the properties file for overrides // look for the properties file for overrides
String propsFile = System.getProperty("java.util.currency.data");
if (propsFile == null) {
propsFile = homeDir + File.separator + "lib" +
File.separator + "currency.properties";
}
try { try {
File propFile = new File(homeDir + File.separator + File propFile = new File(propsFile);
"lib" + File.separator +
"currency.properties");
if (propFile.exists()) { if (propFile.exists()) {
Properties props = new Properties(); Properties props = new Properties();
try (FileReader fr = new FileReader(propFile)) { try (FileReader fr = new FileReader(propFile)) {
......
...@@ -946,8 +946,9 @@ class JapaneseImperialCalendar extends Calendar { ...@@ -946,8 +946,9 @@ class JapaneseImperialCalendar extends Calendar {
set(field, getRolledValue(internalGet(field), amount, min, max)); set(field, getRolledValue(internalGet(field), amount, min, max));
} }
@Override
public String getDisplayName(int field, int style, Locale locale) { public String getDisplayName(int field, int style, Locale locale) {
if (!checkDisplayNameParams(field, style, SHORT, LONG, locale, if (!checkDisplayNameParams(field, style, SHORT, NARROW_FORMAT, locale,
ERA_MASK|YEAR_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { ERA_MASK|YEAR_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
return null; return null;
} }
...@@ -956,11 +957,12 @@ class JapaneseImperialCalendar extends Calendar { ...@@ -956,11 +957,12 @@ class JapaneseImperialCalendar extends Calendar {
// "GanNen" is supported only in the LONG style. // "GanNen" is supported only in the LONG style.
if (field == YEAR if (field == YEAR
&& (getBaseStyle(style) == SHORT || fieldValue != 1 || get(ERA) == 0)) { && (getBaseStyle(style) != LONG || fieldValue != 1 || get(ERA) == 0)) {
return null; return null;
} }
String name = CalendarDataUtility.retrieveFieldValueName("japanese", field, fieldValue, style, locale); String name = CalendarDataUtility.retrieveFieldValueName(getCalendarType(), field,
fieldValue, style, locale);
// If the ERA value is null, then // If the ERA value is null, then
// try to get its name or abbreviation from the Era instance. // try to get its name or abbreviation from the Era instance.
if (name == null && field == ERA && fieldValue < eras.length) { if (name == null && field == ERA && fieldValue < eras.length) {
...@@ -970,23 +972,32 @@ class JapaneseImperialCalendar extends Calendar { ...@@ -970,23 +972,32 @@ class JapaneseImperialCalendar extends Calendar {
return name; return name;
} }
@Override
public Map<String,Integer> getDisplayNames(int field, int style, Locale locale) { public Map<String,Integer> getDisplayNames(int field, int style, Locale locale) {
if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale, if (!checkDisplayNameParams(field, style, ALL_STYLES, NARROW_FORMAT, locale,
ERA_MASK|YEAR_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { ERA_MASK|YEAR_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
return null; return null;
} }
Map<String, Integer> names = CalendarDataUtility.retrieveFieldValueNames("japanese", field, style, locale); Map<String, Integer> names;
names = CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale);
// If strings[] has fewer than eras[], get more names from eras[]. // If strings[] has fewer than eras[], get more names from eras[].
if (names != null) {
if (field == ERA) { if (field == ERA) {
int size = names.size(); int size = names.size();
if (style == ALL_STYLES) { if (style == ALL_STYLES) {
size /= 2; // SHORT and LONG Set<Integer> values = new HashSet<>();
// count unique era values
for (String key : names.keySet()) {
values.add(names.get(key));
}
size = values.size();
} }
if (size < eras.length) { if (size < eras.length) {
int baseStyle = getBaseStyle(style); int baseStyle = getBaseStyle(style);
for (int i = size; i < eras.length; i++) { for (int i = size; i < eras.length; i++) {
Era era = eras[i]; Era era = eras[i];
if (baseStyle == ALL_STYLES || baseStyle == SHORT) { if (baseStyle == ALL_STYLES || baseStyle == SHORT
|| baseStyle == NARROW_FORMAT) {
names.put(era.getAbbreviation(), i); names.put(era.getAbbreviation(), i);
} }
if (baseStyle == ALL_STYLES || baseStyle == LONG) { if (baseStyle == ALL_STYLES || baseStyle == LONG) {
...@@ -995,6 +1006,7 @@ class JapaneseImperialCalendar extends Calendar { ...@@ -995,6 +1006,7 @@ class JapaneseImperialCalendar extends Calendar {
} }
} }
} }
}
return names; return names;
} }
......
...@@ -43,12 +43,12 @@ import java.lang.ref.SoftReference; ...@@ -43,12 +43,12 @@ import java.lang.ref.SoftReference;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import sun.misc.SharedSecrets;
import sun.misc.JavaAWTAccess; import sun.misc.JavaAWTAccess;
import sun.misc.SharedSecrets;
import sun.security.action.GetPropertyAction; import sun.security.action.GetPropertyAction;
import sun.util.locale.provider.TimeZoneNameUtility;
import sun.util.calendar.ZoneInfo; import sun.util.calendar.ZoneInfo;
import sun.util.calendar.ZoneInfoFile; import sun.util.calendar.ZoneInfoFile;
import sun.util.locale.provider.TimeZoneNameUtility;
/** /**
* <code>TimeZone</code> represents a time zone offset, and also figures out daylight * <code>TimeZone</code> represents a time zone offset, and also figures out daylight
...@@ -399,10 +399,12 @@ abstract public class TimeZone implements Serializable, Cloneable { ...@@ -399,10 +399,12 @@ abstract public class TimeZone implements Serializable, Cloneable {
if (style != SHORT && style != LONG) { if (style != SHORT && style != LONG) {
throw new IllegalArgumentException("Illegal style: " + style); throw new IllegalArgumentException("Illegal style: " + style);
} }
String id = getID(); String id = getID();
String[] names = getDisplayNames(id, locale); String name = TimeZoneNameUtility.retrieveDisplayName(id, daylight, style, locale);
if (names == null) { if (name != null) {
return name;
}
if (id.startsWith("GMT") && id.length() > 3) { if (id.startsWith("GMT") && id.length() > 3) {
char sign = id.charAt(3); char sign = id.charAt(3);
if (sign == '+' || sign == '-') { if (sign == '+' || sign == '-') {
...@@ -416,22 +418,18 @@ abstract public class TimeZone implements Serializable, Cloneable { ...@@ -416,22 +418,18 @@ abstract public class TimeZone implements Serializable, Cloneable {
return ZoneInfoFile.toCustomID(offset); return ZoneInfoFile.toCustomID(offset);
} }
int index = daylight ? 3 : 1;
if (style == SHORT) {
index++;
}
return names[index];
}
private static class DisplayNames { private static class DisplayNames {
// Cache for managing display names per timezone per locale // Cache for managing display names per timezone per locale
// The structure is: // The structure is:
// Map(key=id, value=SoftReference(Map(key=locale, value=displaynames))) // Map(key=id, value=SoftReference(Map(key=locale, value=displaynames)))
private static final Map<String, SoftReference<Map<Locale, String[]>>> CACHE = private static final Map<String, SoftReference<Map<Locale, String[]>>> CACHE =
new ConcurrentHashMap<>(); new ConcurrentHashMap<>();
private DisplayNames() {
}
} }
private static final String[] getDisplayNames(String id, Locale locale) { private static String[] getDisplayNames(String id, Locale locale) {
Map<String, SoftReference<Map<Locale, String[]>>> displayNames = DisplayNames.CACHE; Map<String, SoftReference<Map<Locale, String[]>>> displayNames = DisplayNames.CACHE;
SoftReference<Map<Locale, String[]>> ref = displayNames.get(id); SoftReference<Map<Locale, String[]>> ref = displayNames.get(id);
...@@ -631,14 +629,14 @@ abstract public class TimeZone implements Serializable, Cloneable { ...@@ -631,14 +629,14 @@ abstract public class TimeZone implements Serializable, Cloneable {
} }
private static synchronized TimeZone setDefaultZone() { private static synchronized TimeZone setDefaultZone() {
TimeZone tz = null; TimeZone tz;
// get the time zone ID from the system properties // get the time zone ID from the system properties
String zoneID = AccessController.doPrivileged( String zoneID = AccessController.doPrivileged(
new GetPropertyAction("user.timezone")); new GetPropertyAction("user.timezone"));
// if the time zone ID is not set (yet), perform the // if the time zone ID is not set (yet), perform the
// platform to Java time zone ID mapping. // platform to Java time zone ID mapping.
if (zoneID == null || zoneID.equals("")) { if (zoneID == null || zoneID.isEmpty()) {
String country = AccessController.doPrivileged( String country = AccessController.doPrivileged(
new GetPropertyAction("user.country")); new GetPropertyAction("user.country"));
String javaHome = AccessController.doPrivileged( String javaHome = AccessController.doPrivileged(
...@@ -670,8 +668,9 @@ abstract public class TimeZone implements Serializable, Cloneable { ...@@ -670,8 +668,9 @@ abstract public class TimeZone implements Serializable, Cloneable {
assert tz != null; assert tz != null;
final String id = zoneID; final String id = zoneID;
AccessController.doPrivileged(new PrivilegedAction<Object>() { AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Object run() { @Override
public Void run() {
System.setProperty("user.timezone", id); System.setProperty("user.timezone", id);
return null; return null;
} }
......
...@@ -1759,7 +1759,7 @@ public class TreeMap<K,V> ...@@ -1759,7 +1759,7 @@ public class TreeMap<K,V>
public Set<Map.Entry<K,V>> entrySet() { public Set<Map.Entry<K,V>> entrySet() {
EntrySetView es = entrySetView; EntrySetView es = entrySetView;
return (es != null) ? es : new AscendingEntrySetView(); return (es != null) ? es : (entrySetView = new AscendingEntrySetView());
} }
TreeMap.Entry<K,V> subLowest() { return absLowest(); } TreeMap.Entry<K,V> subLowest() { return absLowest(); }
...@@ -1840,7 +1840,7 @@ public class TreeMap<K,V> ...@@ -1840,7 +1840,7 @@ public class TreeMap<K,V>
public Set<Map.Entry<K,V>> entrySet() { public Set<Map.Entry<K,V>> entrySet() {
EntrySetView es = entrySetView; EntrySetView es = entrySetView;
return (es != null) ? es : new DescendingEntrySetView(); return (es != null) ? es : (entrySetView = new DescendingEntrySetView());
} }
TreeMap.Entry<K,V> subLowest() { return absHighest(); } TreeMap.Entry<K,V> subLowest() { return absHighest(); }
......
...@@ -31,10 +31,10 @@ import java.util.*; ...@@ -31,10 +31,10 @@ import java.util.*;
import java.security.*; import java.security.*;
import java.lang.ref.ReferenceQueue; import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.net.URL;
import sun.security.action.GetPropertyAction;
/** /**
* There is a single global LogManager object that is used to * There is a single global LogManager object that is used to
...@@ -56,20 +56,14 @@ import sun.security.action.GetPropertyAction; ...@@ -56,20 +56,14 @@ import sun.security.action.GetPropertyAction;
* At startup the LogManager class is located using the * At startup the LogManager class is located using the
* java.util.logging.manager system property. * java.util.logging.manager system property.
* <p> * <p>
* By default, the LogManager reads its initial configuration from * The LogManager defines two optional system properties that allow control over
* a properties file "lib/logging.properties" in the JRE directory. * the initial configuration:
* If you edit that property file you can change the default logging
* configuration for all uses of that JRE.
* <p>
* In addition, the LogManager uses two optional system properties that
* allow more control over reading the initial configuration:
* <ul> * <ul>
* <li>"java.util.logging.config.class" * <li>"java.util.logging.config.class"
* <li>"java.util.logging.config.file" * <li>"java.util.logging.config.file"
* </ul> * </ul>
* These two properties may be set via the Preferences API, or as * These two properties may be specified on the command line to the "java"
* command line property definitions to the "java" command, or as * command, or as system property definitions passed to JNI_CreateJavaVM.
* system property definitions passed to JNI_CreateJavaVM.
* <p> * <p>
* If the "java.util.logging.config.class" property is set, then the * If the "java.util.logging.config.class" property is set, then the
* property value is treated as a class name. The given class will be * property value is treated as a class name. The given class will be
...@@ -84,9 +78,10 @@ import sun.security.action.GetPropertyAction; ...@@ -84,9 +78,10 @@ import sun.security.action.GetPropertyAction;
* to specify a properties file (in java.util.Properties format). The * to specify a properties file (in java.util.Properties format). The
* initial logging configuration will be read from this file. * initial logging configuration will be read from this file.
* <p> * <p>
* If neither of these properties is defined then, as described * If neither of these properties is defined then the LogManager uses its
* above, the LogManager will read its initial configuration from * default configuration. The default configuration is typically loaded from the
* a properties file "lib/logging.properties" in the JRE directory. * properties file "{@code lib/logging.properties}" in the Java installation
* directory.
* <p> * <p>
* The properties for loggers and Handlers will have names starting * The properties for loggers and Handlers will have names starting
* with the dot-separated name for the handler or logger. * with the dot-separated name for the handler or logger.
...@@ -155,7 +150,7 @@ public class LogManager { ...@@ -155,7 +150,7 @@ public class LogManager {
// The map of the registered listeners. The map value is the registration // The map of the registered listeners. The map value is the registration
// count to allow for cases where the same listener is registered many times. // count to allow for cases where the same listener is registered many times.
private final Map<PropertyChangeListener,Integer> listenerMap = new HashMap<>(); private final Map<Object,Integer> listenerMap = new HashMap<>();
// Table of named Loggers that maps names to Loggers. // Table of named Loggers that maps names to Loggers.
private Hashtable<String,LoggerWeakRef> namedLoggers = new Hashtable<>(); private Hashtable<String,LoggerWeakRef> namedLoggers = new Hashtable<>();
...@@ -248,7 +243,7 @@ public class LogManager { ...@@ -248,7 +243,7 @@ public class LogManager {
* Protected constructor. This is protected so that container applications * Protected constructor. This is protected so that container applications
* (such as J2EE containers) can subclass the object. It is non-public as * (such as J2EE containers) can subclass the object. It is non-public as
* it is intended that there only be one LogManager object, whose value is * it is intended that there only be one LogManager object, whose value is
* retrieved by calling Logmanager.getLogManager. * retrieved by calling LogManager.getLogManager.
*/ */
protected LogManager() { protected LogManager() {
// Add a shutdown hook to close the global handlers. // Add a shutdown hook to close the global handlers.
...@@ -976,22 +971,24 @@ public class LogManager { ...@@ -976,22 +971,24 @@ public class LogManager {
// Notify any interested parties that our properties have changed. // Notify any interested parties that our properties have changed.
// We first take a copy of the listener map so that we aren't holding any // We first take a copy of the listener map so that we aren't holding any
// locks when calling the listeners. // locks when calling the listeners.
Map<PropertyChangeListener,Integer> listeners = null; Map<Object,Integer> listeners = null;
synchronized (listenerMap) { synchronized (listenerMap) {
if (!listenerMap.isEmpty()) if (!listenerMap.isEmpty())
listeners = new HashMap<>(listenerMap); listeners = new HashMap<>(listenerMap);
} }
if (listeners != null) { if (listeners != null) {
PropertyChangeEvent ev = new PropertyChangeEvent(LogManager.class, null, null, null); assert Beans.isBeansPresent();
for (Map.Entry<PropertyChangeListener,Integer> entry : listeners.entrySet()) { Object ev = Beans.newPropertyChangeEvent(LogManager.class, null, null, null);
PropertyChangeListener listener = entry.getKey(); for (Map.Entry<Object,Integer> entry : listeners.entrySet()) {
Object listener = entry.getKey();
int count = entry.getValue().intValue(); int count = entry.getValue().intValue();
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
listener.propertyChange(ev); Beans.invokePropertyChange(listener, ev);
} }
} }
} }
// Note that we need to reinitialize global handles when // Note that we need to reinitialize global handles when
// they are first referenced. // they are first referenced.
synchronized (this) { synchronized (this) {
...@@ -1274,4 +1271,100 @@ public class LogManager { ...@@ -1274,4 +1271,100 @@ public class LogManager {
return loggingMXBean; return loggingMXBean;
} }
/**
* A class that provides access to the java.beans.PropertyChangeListener
* and java.beans.PropertyChangeEvent without creating a static dependency
* on java.beans. This class can be removed once the addPropertyChangeListener
* and removePropertyChangeListener methods are removed.
*/
private static class Beans {
private static final Class<?> propertyChangeListenerClass =
getClass("java.beans.PropertyChangeListener");
private static final Class<?> propertyChangeEventClass =
getClass("java.beans.PropertyChangeEvent");
private static final Method propertyChangeMethod =
getMethod(propertyChangeListenerClass,
"propertyChange",
propertyChangeEventClass);
private static final Constructor<?> propertyEventCtor =
getConstructor(propertyChangeEventClass,
Object.class,
String.class,
Object.class,
Object.class);
private static Class<?> getClass(String name) {
try {
return Class.forName(name, true, Beans.class.getClassLoader());
} catch (ClassNotFoundException e) {
return null;
}
}
private static Constructor<?> getConstructor(Class<?> c, Class<?>... types) {
try {
return (c == null) ? null : c.getDeclaredConstructor(types);
} catch (NoSuchMethodException x) {
throw new AssertionError(x);
}
}
private static Method getMethod(Class<?> c, String name, Class<?>... types) {
try {
return (c == null) ? null : c.getMethod(name, types);
} catch (NoSuchMethodException e) {
throw new AssertionError(e);
}
}
/**
* Returns {@code true} if java.beans is present.
*/
static boolean isBeansPresent() {
return propertyChangeListenerClass != null &&
propertyChangeEventClass != null;
}
/**
* Returns a new PropertyChangeEvent with the given source, property
* name, old and new values.
*/
static Object newPropertyChangeEvent(Object source, String prop,
Object oldValue, Object newValue)
{
try {
return propertyEventCtor.newInstance(source, prop, oldValue, newValue);
} catch (InstantiationException | IllegalAccessException x) {
throw new AssertionError(x);
} catch (InvocationTargetException x) {
Throwable cause = x.getCause();
if (cause instanceof Error)
throw (Error)cause;
if (cause instanceof RuntimeException)
throw (RuntimeException)cause;
throw new AssertionError(x);
}
}
/**
* Invokes the given PropertyChangeListener's propertyChange method
* with the given event.
*/
static void invokePropertyChange(Object listener, Object ev) {
try {
propertyChangeMethod.invoke(listener, ev);
} catch (IllegalAccessException x) {
throw new AssertionError(x);
} catch (InvocationTargetException x) {
Throwable cause = x.getCause();
if (cause instanceof Error)
throw (Error)cause;
if (cause instanceof RuntimeException)
throw (RuntimeException)cause;
throw new AssertionError(x);
}
}
}
} }
...@@ -174,7 +174,8 @@ public abstract class CalendarNameProvider extends LocaleServiceProvider { ...@@ -174,7 +174,8 @@ public abstract class CalendarNameProvider extends LocaleServiceProvider {
* <p>{@code style} gives the style of the string representation. It is one * <p>{@code style} gives the style of the string representation. It is one
* of {@link Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}), * of {@link Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}),
* {@link Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT} * {@link Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT}
* ({@link Calendar#LONG LONG}), or {@link Calendar#LONG_STANDALONE}. * ({@link Calendar#LONG LONG}), {@link Calendar#LONG_STANDALONE},
* {@link Calendar#NARROW_FORMAT}, or {@link Calendar#NARROW_STANDALONE}.
* *
* <p>For example, the following call will return {@code "Sunday"}. * <p>For example, the following call will return {@code "Sunday"}.
* <pre> * <pre>
...@@ -195,8 +196,10 @@ public abstract class CalendarNameProvider extends LocaleServiceProvider { ...@@ -195,8 +196,10 @@ public abstract class CalendarNameProvider extends LocaleServiceProvider {
* the string representation style: one of {@link * the string representation style: one of {@link
* Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}), * Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}),
* {@link Calendar#SHORT_STANDALONE}, {@link * {@link Calendar#SHORT_STANDALONE}, {@link
* Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}),
* {@link Calendar#LONG_STANDALONE} * {@link Calendar#LONG_STANDALONE},
* {@link Calendar#NARROW_FORMAT},
* or {@link Calendar#NARROW_STANDALONE}
* @param locale * @param locale
* the desired locale * the desired locale
* @return the string representation of the {@code field value}, or {@code * @return the string representation of the {@code field value}, or {@code
...@@ -226,8 +229,11 @@ public abstract class CalendarNameProvider extends LocaleServiceProvider { ...@@ -226,8 +229,11 @@ public abstract class CalendarNameProvider extends LocaleServiceProvider {
* <p>{@code style} gives the style of the string representation. It must be * <p>{@code style} gives the style of the string representation. It must be
* one of {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} ({@link * one of {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} ({@link
* Calendar#SHORT SHORT}), {@link Calendar#SHORT_STANDALONE}, {@link * Calendar#SHORT SHORT}), {@link Calendar#SHORT_STANDALONE}, {@link
* Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or {@link * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), {@link
* Calendar#LONG_STANDALONE}. * Calendar#LONG_STANDALONE}, {@link Calendar#NARROW_FORMAT}, or
* {@link Calendar#NARROW_STANDALONE}. Note that narrow names may
* not be unique due to use of single characters, such as "S" for Sunday
* and Saturday, and that no narrow names are included in that case.
* *
* <p>For example, the following call will return a {@code Map} containing * <p>For example, the following call will return a {@code Map} containing
* {@code "January"} to {@link Calendar#JANUARY}, {@code "Jan"} to {@link * {@code "January"} to {@link Calendar#JANUARY}, {@code "Jan"} to {@link
...@@ -247,8 +253,9 @@ public abstract class CalendarNameProvider extends LocaleServiceProvider { ...@@ -247,8 +253,9 @@ public abstract class CalendarNameProvider extends LocaleServiceProvider {
* {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} * {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT}
* ({@link Calendar#SHORT SHORT}), {@link * ({@link Calendar#SHORT SHORT}), {@link
* Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT} * Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT}
* ({@link Calendar#LONG LONG}), or {@link * ({@link Calendar#LONG LONG}), {@link Calendar#LONG_STANDALONE},
* Calendar#LONG_STANDALONE}. * {@link Calendar#NARROW_FORMAT},
* or {@link Calendar#NARROW_STANDALONE}
* @param locale * @param locale
* the desired locale * the desired locale
* @return a {@code Map} containing all display names of {@code field} in * @return a {@code Map} containing all display names of {@code field} in
......
/* /*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -77,4 +77,34 @@ public abstract class TimeZoneNameProvider extends LocaleServiceProvider { ...@@ -77,4 +77,34 @@ public abstract class TimeZoneNameProvider extends LocaleServiceProvider {
* @see java.util.TimeZone#getDisplayName(boolean, int, java.util.Locale) * @see java.util.TimeZone#getDisplayName(boolean, int, java.util.Locale)
*/ */
public abstract String getDisplayName(String ID, boolean daylight, int style, Locale locale); public abstract String getDisplayName(String ID, boolean daylight, int style, Locale locale);
/**
* Returns a generic name for the given time zone {@code ID} that's suitable
* for presentation to the user in the specified {@code locale}. Generic
* time zone names are neutral from standard time and daylight saving
* time. For example, "PT" is the short generic name of time zone ID {@code
* America/Los_Angeles}, while its short standard time and daylight saving
* time names are "PST" and "PDT", respectively. Refer to
* {@link #getDisplayName(String, boolean, int, Locale) getDisplayName}
* for valid time zone IDs.
*
* <p>The default implementation of this method returns {@code null}.
*
* @param ID a time zone ID string
* @param style either {@link java.util.TimeZone#LONG TimeZone.LONG} or
* {@link java.util.TimeZone#SHORT TimeZone.SHORT}
* @param locale the desired locale
* @return the human-readable generic name of the given time zone in the
* given locale, or {@code null} if it's not available.
* @exception IllegalArgumentException if <code>style</code> is invalid,
* or <code>locale</code> isn't one of the locales returned from
* {@link LocaleServiceProvider#getAvailableLocales()
* getAvailableLocales()}.
* @exception NullPointerException if <code>ID</code> or <code>locale</code>
* is {@code null}
* @since 1.8
*/
public String getGenericDisplayName(String ID, int style, Locale locale) {
return null;
}
} }
/* /*
* Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -786,7 +786,7 @@ public class InputContext extends java.awt.im.InputContext ...@@ -786,7 +786,7 @@ public class InputContext extends java.awt.im.InputContext
public void disableNativeIM() { public void disableNativeIM() {
InputMethod inputMethod = getInputMethod(); InputMethod inputMethod = getInputMethod();
if (inputMethod != null && inputMethod instanceof InputMethodAdapter) { if (inputMethod != null && inputMethod instanceof InputMethodAdapter) {
((InputMethodAdapter)inputMethod).disableInputMethod(); ((InputMethodAdapter)inputMethod).stopListening();
} }
} }
......
/* /*
* Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -79,7 +79,6 @@ public abstract class InputMethodAdapter implements InputMethod { ...@@ -79,7 +79,6 @@ public abstract class InputMethodAdapter implements InputMethod {
/** /**
* Informs the input method adapter not to listen to the native events. * Informs the input method adapter not to listen to the native events.
* This method is called when a Java input method is active.
*/ */
protected void stopListening() { protected void stopListening() {
// ignore - adapters can override if needed // ignore - adapters can override if needed
......
...@@ -137,6 +137,43 @@ class MessageHeader { ...@@ -137,6 +137,43 @@ class MessageHeader {
return null; return null;
} }
/**
* Removes bare Negotiate and Kerberos headers when an "NTLM ..."
* appears. All Performed on headers with key being k.
* @return true if there is a change
*/
public boolean filterNTLMResponses(String k) {
boolean found = false;
for (int i=0; i<nkeys; i++) {
if (k.equalsIgnoreCase(keys[i])
&& values[i] != null && values[i].length() > 5
&& values[i].substring(0, 5).equalsIgnoreCase("NTLM ")) {
found = true;
break;
}
}
if (found) {
int j = 0;
for (int i=0; i<nkeys; i++) {
if (k.equalsIgnoreCase(keys[i]) && (
"Negotiate".equalsIgnoreCase(values[i]) ||
"Kerberos".equalsIgnoreCase(values[i]))) {
continue;
}
if (i != j) {
keys[j] = keys[i];
values[j] = values[i];
}
j++;
}
if (j != nkeys) {
nkeys = j;
return true;
}
}
return false;
}
class HeaderIterator implements Iterator<String> { class HeaderIterator implements Iterator<String> {
int index = 0; int index = 0;
int next = -1; int next = -1;
......
...@@ -1326,6 +1326,16 @@ public class HttpURLConnection extends java.net.HttpURLConnection { ...@@ -1326,6 +1326,16 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
if (logger.isLoggable(PlatformLogger.FINE)) { if (logger.isLoggable(PlatformLogger.FINE)) {
logger.fine(responses.toString()); logger.fine(responses.toString());
} }
boolean b1 = responses.filterNTLMResponses("WWW-Authenticate");
boolean b2 = responses.filterNTLMResponses("Proxy-Authenticate");
if (b1 || b2) {
if (logger.isLoggable(PlatformLogger.FINE)) {
logger.fine(">>>> Headers are filtered");
logger.fine(responses.toString());
}
}
inputStream = http.getInputStream(); inputStream = http.getInputStream();
respCode = getResponseCode(); respCode = getResponseCode();
...@@ -1784,6 +1794,13 @@ public class HttpURLConnection extends java.net.HttpURLConnection { ...@@ -1784,6 +1794,13 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
logger.fine(responses.toString()); logger.fine(responses.toString());
} }
if (responses.filterNTLMResponses("Proxy-Authenticate")) {
if (logger.isLoggable(PlatformLogger.FINE)) {
logger.fine(">>>> Headers are filtered");
logger.fine(responses.toString());
}
}
statusLine = responses.getValue(0); statusLine = responses.getValue(0);
StringTokenizer st = new StringTokenizer(statusLine); StringTokenizer st = new StringTokenizer(statusLine);
st.nextToken(); st.nextToken();
......
...@@ -102,11 +102,7 @@ public class ThreadPool { ...@@ -102,11 +102,7 @@ public class ThreadPool {
if (threadFactory == null) if (threadFactory == null)
threadFactory = defaultThreadFactory; threadFactory = defaultThreadFactory;
// create thread pool // create thread pool
ExecutorService executor = ExecutorService executor = Executors.newCachedThreadPool(threadFactory);
new ThreadPoolExecutor(0, Integer.MAX_VALUE,
Long.MAX_VALUE, TimeUnit.MILLISECONDS,
new SynchronousQueue<Runnable>(),
threadFactory);
return new ThreadPool(executor, false, initialSize); return new ThreadPool(executor, false, initialSize);
} }
......
...@@ -37,7 +37,7 @@ import sun.reflect.Reflection; ...@@ -37,7 +37,7 @@ import sun.reflect.Reflection;
import sun.misc.JavaLangAccess; import sun.misc.JavaLangAccess;
public final class AnnotationSupport { public final class AnnotationSupport {
private static JavaLangAccess javaLangAccess = sun.misc.SharedSecrets.getJavaLangAccess(); private static final JavaLangAccess javaLangAccess = sun.misc.SharedSecrets.getJavaLangAccess();
/** /**
* Finds and returns _one_ annotation of the type indicated by * Finds and returns _one_ annotation of the type indicated by
...@@ -104,7 +104,7 @@ public final class AnnotationSupport { ...@@ -104,7 +104,7 @@ public final class AnnotationSupport {
/** /**
* Unpacks the {@code annotationMap} parameter into an array of * Unpacks the {@code annotationMap} parameter into an array of
* {@code Annotation}s. This method will unpack all repeating * {@code Annotation}s. This method will unpack all repeating
* annotaions containers (once). An annotation type is marked as a * annotations containers (once). An annotation type is marked as a
* container by meta-annotating it the with the {@code * container by meta-annotating it the with the {@code
* ContainerFor} annotation. * ContainerFor} annotation.
* *
...@@ -175,7 +175,6 @@ public final class AnnotationSupport { ...@@ -175,7 +175,6 @@ public final class AnnotationSupport {
IllegalArgumentException | // parameters doesn't match IllegalArgumentException | // parameters doesn't match
InvocationTargetException | // the value method threw an exception InvocationTargetException | // the value method threw an exception
ClassCastException e) { // well, a cast failed ... ClassCastException e) { // well, a cast failed ...
e.getCause().printStackTrace();
throw new InvalidContainerAnnotationError(containerInstance + " is an invalid container for repeating annotations", throw new InvalidContainerAnnotationError(containerInstance + " is an invalid container for repeating annotations",
e, e,
containerInstance, containerInstance,
......
...@@ -40,10 +40,7 @@ import sun.security.krb5.EncryptionKey; ...@@ -40,10 +40,7 @@ import sun.security.krb5.EncryptionKey;
import sun.security.krb5.KrbException; import sun.security.krb5.KrbException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Set;
import sun.security.krb5.KerberosSecrets; import sun.security.krb5.KerberosSecrets;
import sun.security.krb5.PrincipalName; import sun.security.krb5.PrincipalName;
/** /**
...@@ -189,18 +186,6 @@ public class Krb5Util { ...@@ -189,18 +186,6 @@ public class Krb5Util {
return subject; return subject;
} }
// A special KerberosKey, used as keys read from a KeyTab object.
// Each time new keys are read from KeyTab objects in the private
// credentials set, old ones are removed and new ones added.
public static class KeysFromKeyTab extends KerberosKey {
private static final long serialVersionUID = 8238092170252746927L;
public KeysFromKeyTab(KerberosKey key) {
super(key.getPrincipal(), key.getEncoded(),
key.getKeyType(), key.getVersionNumber());
}
}
/** /**
* Credentials of a service, the private secret to authenticate its * Credentials of a service, the private secret to authenticate its
* identity, which can be: * identity, which can be:
...@@ -239,7 +224,7 @@ public class Krb5Util { ...@@ -239,7 +224,7 @@ public class Krb5Util {
// Compatibility with old behavior: even when there is no // Compatibility with old behavior: even when there is no
// KerberosPrincipal, we can find one from KerberosKeys // KerberosPrincipal, we can find one from KerberosKeys
List<KerberosKey> keys = SubjectComber.findMany( List<KerberosKey> keys = SubjectComber.findMany(
subj, null, null, KerberosKey.class); subj, serverPrincipal, null, KerberosKey.class);
if (!keys.isEmpty()) { if (!keys.isEmpty()) {
sc.kp = keys.get(0).getPrincipal(); sc.kp = keys.get(0).getPrincipal();
serverPrincipal = sc.kp.getName(); serverPrincipal = sc.kp.getName();
...@@ -255,9 +240,9 @@ public class Krb5Util { ...@@ -255,9 +240,9 @@ public class Krb5Util {
subj, null, null, KeyTab.class); subj, null, null, KeyTab.class);
sc.kk = SubjectComber.findMany( sc.kk = SubjectComber.findMany(
subj, serverPrincipal, null, KerberosKey.class); subj, serverPrincipal, null, KerberosKey.class);
sc.tgt = SubjectComber.find(subj, null, null, KerberosTicket.class); sc.tgt = SubjectComber.find(
subj, null, serverPrincipal, KerberosTicket.class);
if (sc.ktabs.isEmpty() && sc.kk.isEmpty()) { if (sc.ktabs.isEmpty() && sc.kk.isEmpty() && sc.tgt == null) {
return null; return null;
} }
return sc; return sc;
...@@ -268,38 +253,17 @@ public class Krb5Util { ...@@ -268,38 +253,17 @@ public class Krb5Util {
} }
public KerberosKey[] getKKeys() { public KerberosKey[] getKKeys() {
if (ktabs.isEmpty()) {
return kk.toArray(new KerberosKey[kk.size()]);
} else {
List<KerberosKey> keys = new ArrayList<>(); List<KerberosKey> keys = new ArrayList<>();
for (KerberosKey k: kk) {
keys.add(k);
}
for (KeyTab ktab: ktabs) { for (KeyTab ktab: ktabs) {
for (KerberosKey k: ktab.getKeys(kp)) { for (KerberosKey k: ktab.getKeys(kp)) {
keys.add(k); keys.add(k);
} }
} }
// Compatibility: also add keys to privCredSet. Remove old
// ones first, only remove those from keytab.
if (!subj.isReadOnly()) {
Set<Object> pcs = subj.getPrivateCredentials();
synchronized (pcs) {
Iterator<Object> iterator = pcs.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
if (obj instanceof KeysFromKeyTab) {
KerberosKey key = (KerberosKey)obj;
if (Objects.equals(key.getPrincipal(), kp)) {
iterator.remove();
}
}
}
}
for (KerberosKey key: keys) {
subj.getPrivateCredentials().add(new KeysFromKeyTab(key));
}
}
return keys.toArray(new KerberosKey[keys.size()]); return keys.toArray(new KerberosKey[keys.size()]);
} }
}
public EncryptionKey[] getEKeys() { public EncryptionKey[] getEKeys() {
KerberosKey[] kkeys = getKKeys(); KerberosKey[] kkeys = getKKeys();
......
...@@ -43,6 +43,7 @@ import java.util.List; ...@@ -43,6 +43,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import static sun.security.provider.certpath.OCSPResponse.*; import static sun.security.provider.certpath.OCSPResponse.*;
import sun.security.action.GetIntegerAction;
import sun.security.util.Debug; import sun.security.util.Debug;
import sun.security.util.ObjectIdentifier; import sun.security.util.ObjectIdentifier;
import sun.security.x509.AccessDescription; import sun.security.x509.AccessDescription;
...@@ -69,7 +70,31 @@ public final class OCSP { ...@@ -69,7 +70,31 @@ public final class OCSP {
private static final Debug debug = Debug.getInstance("certpath"); private static final Debug debug = Debug.getInstance("certpath");
private static final int CONNECT_TIMEOUT = 15000; // 15 seconds private static final int DEFAULT_CONNECT_TIMEOUT = 15000;
/**
* Integer value indicating the timeout length, in seconds, to be
* used for the OCSP check. A timeout of zero is interpreted as
* an infinite timeout.
*/
private static final int CONNECT_TIMEOUT = initializeTimeout();
/**
* Initialize the timeout length by getting the OCSP timeout
* system property. If the property has not been set, or if its
* value is negative, set the timeout length to the default.
*/
private static int initializeTimeout() {
int tmp = java.security.AccessController.doPrivileged(
new GetIntegerAction("com.sun.security.ocsp.timeout",
DEFAULT_CONNECT_TIMEOUT));
if (tmp < 0) {
tmp = DEFAULT_CONNECT_TIMEOUT;
}
// Convert to milliseconds, as the system property will be
// specified in seconds
return tmp * 1000;
}
private OCSP() {} private OCSP() {}
......
...@@ -50,6 +50,20 @@ public class FormatData extends ListResourceBundle { ...@@ -50,6 +50,20 @@ public class FormatData extends ListResourceBundle {
* Overrides ListResourceBundle * Overrides ListResourceBundle
*/ */
protected final Object[][] getContents() { protected final Object[][] getContents() {
final String[] buddhistEras = new String[] { // Thai Buddhist calendar era strings
"BC", // BC
"B.E." // Buddhist Era
};
// Japanese imperial calendar era abbreviations
final String[] japaneseEraAbbrs = new String[] {
"",
"M",
"T",
"S",
"H",
};
return new Object[][] { return new Object[][] {
{ "MonthNames", { "MonthNames",
new String[] { new String[] {
...@@ -107,29 +121,49 @@ public class FormatData extends ListResourceBundle { ...@@ -107,29 +121,49 @@ public class FormatData extends ListResourceBundle {
"Sat" // abb Saturday "Sat" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"S",
"M",
"T",
"W",
"T",
"F",
"S",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"AM", // am marker "AM", // am marker
"PM" // pm marker "PM" // pm marker
} }
}, },
{ "narrow.AmPmMarkers",
new String[] {
"a", // am marker
"p" // pm marker
}
},
{ "Eras", { "Eras",
new String[] { // era strings for GregorianCalendar new String[] { // era strings for GregorianCalendar
"BC", "BC",
"AD" "AD"
} }
}, },
{ "buddhist.Eras", { "narrow.Eras",
new String[] { // Thai Buddhist calendar era strings new String[] {
"BC", // BC "B",
"B.E." // Buddhist Era "A",
} }
}, },
{ "buddhist.Eras",
buddhistEras
},
{ "buddhist.short.Eras", { "buddhist.short.Eras",
new String[] { // Thai Buddhist calendar era strings buddhistEras
"BC", // BC },
"B.E." // Buddhist Era { "buddhist.narrow.Eras",
} buddhistEras
}, },
{ "japanese.Eras", { "japanese.Eras",
new String[] { // Japanese imperial calendar era strings new String[] { // Japanese imperial calendar era strings
...@@ -141,13 +175,10 @@ public class FormatData extends ListResourceBundle { ...@@ -141,13 +175,10 @@ public class FormatData extends ListResourceBundle {
} }
}, },
{ "japanese.short.Eras", { "japanese.short.Eras",
new String[] { // Japanese imperial calendar era abbreviations japaneseEraAbbrs
"", },
"M", { "japanese.narrow.Eras",
"T", japaneseEraAbbrs
"S",
"H",
}
}, },
{ "japanese.FirstYear", { "japanese.FirstYear",
new String[] { // Japanese imperial calendar year name new String[] { // Japanese imperial calendar year name
......
...@@ -107,6 +107,17 @@ public class FormatData_ar extends ListResourceBundle { ...@@ -107,6 +107,17 @@ public class FormatData_ar extends ListResourceBundle {
"\u0633" // abb Saturday "\u0633" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u062d",
"\u0646",
"\u062b",
"\u0631",
"\u062e",
"\u062c",
"\u0633",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"\u0635", // am marker "\u0635", // am marker
......
...@@ -85,6 +85,23 @@ public class FormatData_be extends ListResourceBundle { ...@@ -85,6 +85,23 @@ public class FormatData_be extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"\u0441",
"\u043b",
"\u0441",
"\u043a",
"\u043c",
"\u0447",
"\u043b",
"\u0436",
"\u0432",
"\u043a",
"\u043b",
"\u0441",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"\u043d\u044f\u0434\u0437\u0435\u043b\u044f", // Sunday "\u043d\u044f\u0434\u0437\u0435\u043b\u044f", // Sunday
...@@ -107,6 +124,17 @@ public class FormatData_be extends ListResourceBundle { ...@@ -107,6 +124,17 @@ public class FormatData_be extends ListResourceBundle {
"\u0441\u0431" // abb Saturday "\u0441\u0431" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u043d",
"\u043f",
"\u0430",
"\u0441",
"\u0447",
"\u043f",
"\u0441",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"\u0434\u0430 \u043d.\u0435.", "\u0434\u0430 \u043d.\u0435.",
......
...@@ -107,6 +107,17 @@ public class FormatData_bg extends ListResourceBundle { ...@@ -107,6 +107,17 @@ public class FormatData_bg extends ListResourceBundle {
"\u0421\u0431" // abb Saturday "\u0421\u0431" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u043d",
"\u043f",
"\u0432",
"\u0441",
"\u0447",
"\u043f",
"\u0441",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"\u043f\u0440.\u043d.\u0435.", "\u043f\u0440.\u043d.\u0435.",
......
...@@ -119,6 +119,23 @@ public class FormatData_ca extends ListResourceBundle { ...@@ -119,6 +119,23 @@ public class FormatData_ca extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"g",
"f",
"m",
"a",
"m",
"j",
"j",
"a",
"s",
"o",
"n",
"d",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"diumenge", // Sunday "diumenge", // Sunday
...@@ -141,6 +158,28 @@ public class FormatData_ca extends ListResourceBundle { ...@@ -141,6 +158,28 @@ public class FormatData_ca extends ListResourceBundle {
"ds." // abb Saturday "ds." // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"G",
"L", // Note: contributed item in CDLR
"T",
"C",
"J",
"V",
"S",
}
},
{ "standalone.DayNarrows",
new String[] {
"g",
"l",
"t",
"c",
"j",
"v",
"s",
}
},
{ "NumberElements", { "NumberElements",
new String[] { new String[] {
",", // decimal separator ",", // decimal separator
......
...@@ -141,6 +141,17 @@ public class FormatData_cs extends ListResourceBundle { ...@@ -141,6 +141,17 @@ public class FormatData_cs extends ListResourceBundle {
"So" // abb Saturday "So" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"N",
"P",
"\u00da",
"S",
"\u010c",
"P",
"S",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"dop.", // am marker "dop.", // am marker
......
...@@ -124,6 +124,17 @@ public class FormatData_da extends ListResourceBundle { ...@@ -124,6 +124,17 @@ public class FormatData_da extends ListResourceBundle {
"l\u00f8" // abb Saturday "l\u00f8" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"S",
"M",
"T",
"O",
"T",
"F",
"L",
}
},
{ "NumberElements", { "NumberElements",
new String[] { new String[] {
",", // decimal separator ",", // decimal separator
......
...@@ -124,6 +124,17 @@ public class FormatData_de extends ListResourceBundle { ...@@ -124,6 +124,17 @@ public class FormatData_de extends ListResourceBundle {
"Sa" // abb Saturday "Sa" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"S",
"M",
"D",
"M",
"D",
"F",
"S",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"v. Chr.", "v. Chr.",
......
...@@ -124,6 +124,17 @@ public class FormatData_el extends ListResourceBundle { ...@@ -124,6 +124,17 @@ public class FormatData_el extends ListResourceBundle {
"\u03a3\u03b1\u03b2" // abb Saturday "\u03a3\u03b1\u03b2" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u039a",
"\u0394",
"\u03a4",
"\u03a4",
"\u03a0",
"\u03a0",
"\u03a3",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"\u03c0\u03bc", // am marker "\u03c0\u03bc", // am marker
......
...@@ -104,6 +104,17 @@ public class FormatData_es extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_es extends ListResourceBundle {
"s\u00e1b" // abb Saturday "s\u00e1b" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"D",
"L",
"M",
"X",
"J",
"V",
"S",
}
},
{ "NumberPatterns", { "NumberPatterns",
new String[] { new String[] {
"#,##0.###;-#,##0.###", // decimal pattern "#,##0.###;-#,##0.###", // decimal pattern
......
...@@ -104,6 +104,17 @@ public class FormatData_et extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_et extends ListResourceBundle {
"L" // abb Saturday "L" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"P",
"E",
"T",
"K",
"N",
"R",
"L",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"e.m.a.", "e.m.a.",
......
...@@ -116,6 +116,23 @@ public class FormatData_fi extends ListResourceBundle { ...@@ -116,6 +116,23 @@ public class FormatData_fi extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"T",
"H",
"M",
"H",
"T",
"K",
"H",
"E",
"S",
"L",
"M",
"J",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"sunnuntai", // Sunday "sunnuntai", // Sunday
...@@ -138,6 +155,28 @@ public class FormatData_fi extends ListResourceBundle { ...@@ -138,6 +155,28 @@ public class FormatData_fi extends ListResourceBundle {
"la" // abb Saturday "la" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"S",
"M",
"T",
"K",
"T",
"P",
"L",
}
},
{ "standalone.DayNarrows",
new String[] {
"S",
"M",
"T",
"K",
"T",
"P",
"L",
}
},
{ "NumberElements", { "NumberElements",
new String[] { new String[] {
",", // decimal separator ",", // decimal separator
...@@ -181,6 +220,12 @@ public class FormatData_fi extends ListResourceBundle { ...@@ -181,6 +220,12 @@ public class FormatData_fi extends ListResourceBundle {
"ip." // pm marker "ip." // pm marker
} }
}, },
{ "narrow.AmPmMarkers",
new String[] {
"ap.",
"ip.",
}
},
}; };
} }
} }
...@@ -104,6 +104,17 @@ public class FormatData_fr extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_fr extends ListResourceBundle {
"sam." // abb Saturday "sam." // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"D",
"L",
"M",
"M",
"J",
"V",
"S",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"BC", "BC",
......
...@@ -99,6 +99,17 @@ public class FormatData_hi_IN extends ListResourceBundle { ...@@ -99,6 +99,17 @@ public class FormatData_hi_IN extends ListResourceBundle {
"\u0936\u0928\u093f" // abb Saturday "\u0936\u0928\u093f" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u0930",
"\u0938\u094b",
"\u092e\u0902",
"\u092c\u0941",
"\u0917\u0941",
"\u0936\u0941",
"\u0936",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"\u092a\u0942\u0930\u094d\u0935\u093e\u0939\u094d\u0928", // am marker "\u092a\u0942\u0930\u094d\u0935\u093e\u0939\u094d\u0928", // am marker
......
...@@ -116,6 +116,23 @@ public class FormatData_hr extends ListResourceBundle { ...@@ -116,6 +116,23 @@ public class FormatData_hr extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"1.",
"2.",
"3.",
"4.",
"5.",
"6.",
"7.",
"8.",
"9.",
"10.",
"11.",
"12.",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"nedjelja", // Sunday "nedjelja", // Sunday
...@@ -138,6 +155,28 @@ public class FormatData_hr extends ListResourceBundle { ...@@ -138,6 +155,28 @@ public class FormatData_hr extends ListResourceBundle {
"sub" // abb Saturday "sub" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"N",
"P",
"U",
"S",
"\u010c",
"P",
"S",
}
},
{ "standalone.DayNarrows",
new String[] {
"n",
"p",
"u",
"s",
"\u010d",
"p",
"s",
}
},
{ "NumberElements", { "NumberElements",
new String[] { new String[] {
",", // decimal separator ",", // decimal separator
......
...@@ -104,6 +104,17 @@ public class FormatData_hu extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_hu extends ListResourceBundle {
"Szo" // abb Saturday "Szo" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"V",
"H",
"K",
"Sz",
"Cs",
"P",
"Sz",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"DE", // am marker "DE", // am marker
......
...@@ -82,6 +82,23 @@ public class FormatData_is extends ListResourceBundle { ...@@ -82,6 +82,23 @@ public class FormatData_is extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"j",
"f",
"m",
"a",
"m",
"j",
"j",
"\u00e1",
"s",
"o",
"n",
"d",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"sunnudagur", // Sunday "sunnudagur", // Sunday
...@@ -104,6 +121,28 @@ public class FormatData_is extends ListResourceBundle { ...@@ -104,6 +121,28 @@ public class FormatData_is extends ListResourceBundle {
"lau." // abb Saturday "lau." // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"S",
"M",
"\u00de",
"M",
"F",
"F",
"L",
}
},
{ "standalone.DayNarrows",
new String[] {
"s",
"m",
"\u00fe",
"m",
"f",
"f",
"l",
}
},
{ "NumberElements", { "NumberElements",
new String[] { new String[] {
",", // decimal separator ",", // decimal separator
......
...@@ -121,6 +121,17 @@ public class FormatData_it extends ListResourceBundle { ...@@ -121,6 +121,17 @@ public class FormatData_it extends ListResourceBundle {
"sab" // abb Saturday "sab" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"D",
"L",
"M",
"M",
"G",
"V",
"S",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"BC", "BC",
......
...@@ -121,6 +121,28 @@ public class FormatData_iw extends ListResourceBundle { ...@@ -121,6 +121,28 @@ public class FormatData_iw extends ListResourceBundle {
"\u05e9" // abb Saturday "\u05e9" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u05d0",
"\u05d1",
"\u05d2",
"\u05d3",
"\u05d4",
"\u05d5",
"\u05e9",
}
},
{ "standalone.DayNarrows",
new String[] {
"\u05d0",
"\u05d1",
"\u05d2",
"\u05d3",
"\u05d4",
"\u05d5",
"\u05e9",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"\u05dc\u05e1\u05d4\"\u05e0", "\u05dc\u05e1\u05d4\"\u05e0",
......
...@@ -104,6 +104,17 @@ public class FormatData_ja extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_ja extends ListResourceBundle {
"\u571f" // abb Saturday "\u571f" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u65e5",
"\u6708",
"\u706b",
"\u6c34",
"\u6728",
"\u91d1",
"\u571f",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"\u5348\u524d", // am marker "\u5348\u524d", // am marker
......
...@@ -104,6 +104,17 @@ public class FormatData_ko extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_ko extends ListResourceBundle {
"\ud1a0" // abb Saturday "\ud1a0" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\uc77c",
"\uc6d4",
"\ud654",
"\uc218",
"\ubaa9",
"\uae08",
"\ud1a0",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"\uc624\uc804", // am marker "\uc624\uc804", // am marker
......
...@@ -99,6 +99,23 @@ public class FormatData_lt extends ListResourceBundle { ...@@ -99,6 +99,23 @@ public class FormatData_lt extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"S",
"V",
"K",
"B",
"G",
"B",
"L",
"R",
"R",
"S",
"L",
"G",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"Sekmadienis", // Sunday "Sekmadienis", // Sunday
...@@ -121,6 +138,28 @@ public class FormatData_lt extends ListResourceBundle { ...@@ -121,6 +138,28 @@ public class FormatData_lt extends ListResourceBundle {
"\u0160t" // abb Saturday "\u0160t" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"S",
"P",
"A",
"T",
"K",
"P",
"\u0160",
}
},
{ "standalone.DayNarrows",
new String[] {
"S",
"P",
"A",
"T",
"K",
"P",
"\u0160",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"pr.Kr.", "pr.Kr.",
......
...@@ -121,6 +121,17 @@ public class FormatData_lv extends ListResourceBundle { ...@@ -121,6 +121,17 @@ public class FormatData_lv extends ListResourceBundle {
"S" // abb Saturday "S" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"S",
"P",
"O",
"T",
"C",
"P",
"S",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"pm\u0113", "pm\u0113",
......
...@@ -104,6 +104,17 @@ public class FormatData_mk extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_mk extends ListResourceBundle {
"\u0441\u0430\u0431." // abb Saturday "\u0441\u0430\u0431." // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u043d",
"\u043f",
"\u0432",
"\u0441",
"\u0447",
"\u043f",
"\u0441",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"\u043f\u0440.\u043d.\u0435.", "\u043f\u0440.\u043d.\u0435.",
......
...@@ -81,6 +81,23 @@ public class FormatData_ms extends ListResourceBundle { ...@@ -81,6 +81,23 @@ public class FormatData_ms extends ListResourceBundle {
"", "",
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"J",
"F",
"M",
"A",
"M",
"J",
"J",
"O",
"S",
"O",
"N",
"D",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"Ahad", "Ahad",
...@@ -103,6 +120,28 @@ public class FormatData_ms extends ListResourceBundle { ...@@ -103,6 +120,28 @@ public class FormatData_ms extends ListResourceBundle {
"Sab", "Sab",
} }
}, },
{ "DayNarrows",
new String[] {
"A",
"I",
"S",
"R",
"K",
"J",
"S",
}
},
{ "standalone.DayNarrows",
new String[] {
"A",
"I",
"S",
"R",
"K",
"J",
"S",
}
},
{ "Eras", { "Eras",
new String[] { new String[] {
"BCE", "BCE",
......
...@@ -103,6 +103,17 @@ public class FormatData_mt extends ListResourceBundle { ...@@ -103,6 +103,17 @@ public class FormatData_mt extends ListResourceBundle {
"Sib", "Sib",
} }
}, },
{ "DayNarrows",
new String[] {
"\u0126",
"T",
"T",
"E",
"\u0126",
"\u0120",
"S",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"QN", "QN",
......
...@@ -104,6 +104,17 @@ public class FormatData_nl extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_nl extends ListResourceBundle {
"za" // abb Saturday "za" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"Z",
"M",
"D",
"W",
"D",
"V",
"Z",
}
},
{ "Eras", { "Eras",
new String[] { // era strings for GregorianCalendar new String[] { // era strings for GregorianCalendar
"v. Chr.", "v. Chr.",
......
...@@ -121,6 +121,17 @@ public class FormatData_pl extends ListResourceBundle { ...@@ -121,6 +121,17 @@ public class FormatData_pl extends ListResourceBundle {
"So" // abb Saturday "So" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"N",
"P",
"W",
"\u015a",
"C",
"P",
"S",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"p.n.e.", "p.n.e.",
......
...@@ -104,6 +104,17 @@ public class FormatData_pt extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_pt extends ListResourceBundle {
"S\u00e1b" // abb Saturday "S\u00e1b" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"D",
"S",
"T",
"Q",
"Q",
"S",
"S",
}
},
{ "NumberElements", { "NumberElements",
new String[] { new String[] {
",", // decimal al separator ",", // decimal al separator
......
...@@ -82,6 +82,23 @@ public class FormatData_ro extends ListResourceBundle { ...@@ -82,6 +82,23 @@ public class FormatData_ro extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"I",
"F",
"M",
"A",
"M",
"I",
"I",
"A",
"S",
"O",
"N",
"D",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"duminic\u0103", // Sunday "duminic\u0103", // Sunday
...@@ -104,6 +121,29 @@ public class FormatData_ro extends ListResourceBundle { ...@@ -104,6 +121,29 @@ public class FormatData_ro extends ListResourceBundle {
"S" // abb Saturday "S" // abb Saturday
} }
}, },
// commented out DayNarrows because most names are contributed.
// { "DayNarrows",
// new String[] {
// "D",
// "",
// "",
// "",
// "",
// "",
// "",
// }
// },
{ "standalone.DayNarrows",
new String[] {
"D",
"L",
"M",
"M",
"J",
"V",
"S",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"d.C.", "d.C.",
......
...@@ -138,6 +138,28 @@ public class FormatData_ru extends ListResourceBundle { ...@@ -138,6 +138,28 @@ public class FormatData_ru extends ListResourceBundle {
"\u0421\u0431" // abb Saturday "\u0421\u0431" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u0412",
"\u041f\u043d",
"\u0412\u0442",
"\u0421",
"\u0427",
"\u041f",
"\u0421", // contributed item in CLDR
}
},
{ "standalone.DayNarrows",
new String[] {
"\u0412",
"\u041f",
"\u0412",
"\u0421",
"\u0427",
"\u041f",
"\u0421",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"\u0434\u043e \u043d.\u044d.", "\u0434\u043e \u043d.\u044d.",
......
...@@ -138,6 +138,17 @@ public class FormatData_sk extends ListResourceBundle { ...@@ -138,6 +138,17 @@ public class FormatData_sk extends ListResourceBundle {
"So" // abb Saturday "So" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"N",
"P",
"U",
"S",
"\u0160",
"P",
"S",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"pred n.l.", "pred n.l.",
......
...@@ -121,6 +121,17 @@ public class FormatData_sl extends ListResourceBundle { ...@@ -121,6 +121,17 @@ public class FormatData_sl extends ListResourceBundle {
"Sob" // abb Saturday "Sob" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"n",
"p",
"t",
"s",
"\u010d",
"p",
"s",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"pr.n.\u0161.", "pr.n.\u0161.",
......
...@@ -104,6 +104,17 @@ public class FormatData_sq extends ListResourceBundle { ...@@ -104,6 +104,17 @@ public class FormatData_sq extends ListResourceBundle {
"Sht" // abb Saturday "Sht" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"D",
"H",
"M",
"M",
"E",
"P",
"S",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"PD", // am marker "PD", // am marker
......
...@@ -103,12 +103,35 @@ public class FormatData_sr extends ListResourceBundle { ...@@ -103,12 +103,35 @@ public class FormatData_sr extends ListResourceBundle {
"\u0441\u0443\u0431", "\u0441\u0443\u0431",
} }
}, },
{ "DayNarrows",
new String[] {
"\u043d",
"\u043f",
"\u0443",
"\u0441",
"\u0447",
"\u043f",
"\u0441",
}
},
{ "Eras", { "Eras",
new String[] { new String[] {
"\u043f. \u043d. \u0435.", "\u043f. \u043d. \u0435.",
"\u043d. \u0435", "\u043d. \u0435",
} }
}, },
{ "short.Eras",
new String[] {
"\u043f. \u043d. \u0435.",
"\u043d. \u0435.",
}
},
{ "narrow.Eras",
new String[] {
"\u043f.\u043d.\u0435.",
"\u043d.\u0435.",
}
},
{ "NumberPatterns", { "NumberPatterns",
new String[] { new String[] {
"#,##0.###", "#,##0.###",
......
...@@ -82,6 +82,23 @@ public class FormatData_sv extends ListResourceBundle { ...@@ -82,6 +82,23 @@ public class FormatData_sv extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"J",
"F",
"M",
"A",
"M",
"J",
"J",
"A",
"S",
"O",
"N",
"D",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"s\u00f6ndag", // Sunday "s\u00f6ndag", // Sunday
...@@ -104,12 +121,46 @@ public class FormatData_sv extends ListResourceBundle { ...@@ -104,12 +121,46 @@ public class FormatData_sv extends ListResourceBundle {
"l\u00f6" // abb Saturday "l\u00f6" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"S",
"M",
"T",
"O",
"T",
"F",
"L",
}
},
{ "standalone.DayNarrows",
new String[] {
"S",
"M",
"T",
"O",
"T",
"F",
"L",
}
},
{ "narrow.Eras",
new String[] {
"f.Kr.",
"e.Kr.",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"fm", // am marker "fm", // am marker
"em" // pm marker "em" // pm marker
} }
}, },
{ "narrow.AmPmMarkers",
new String[] {
"f",
"e",
}
},
{ "NumberElements", { "NumberElements",
new String[] { new String[] {
",", // decimal separator ",", // decimal separator
......
...@@ -99,6 +99,23 @@ public class FormatData_th extends ListResourceBundle { ...@@ -99,6 +99,23 @@ public class FormatData_th extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"\u0e21.\u0e04.",
"\u0e01.\u0e1e.",
"\u0e21\u0e35.\u0e04.",
"\u0e40\u0e21.\u0e22.",
"\u0e1e.\u0e04.",
"\u0e21\u0e34.\u0e22.",
"\u0e01.\u0e04.",
"\u0e2a.\u0e04.",
"\u0e01.\u0e22.",
"\u0e15.\u0e04.",
"\u0e1e.\u0e22.",
"\u0e18.\u0e04.",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c", // Sunday "\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c", // Sunday
...@@ -121,6 +138,17 @@ public class FormatData_th extends ListResourceBundle { ...@@ -121,6 +138,17 @@ public class FormatData_th extends ListResourceBundle {
"\u0e2a." // abb Saturday "\u0e2a." // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u0e2d",
"\u0e08",
"\u0e2d",
"\u0e1e",
"\u0e1e",
"\u0e28",
"\u0e2a",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07", // am marker "\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07", // am marker
...@@ -145,6 +173,12 @@ public class FormatData_th extends ListResourceBundle { ...@@ -145,6 +173,12 @@ public class FormatData_th extends ListResourceBundle {
"\u0e04.\u0e28." "\u0e04.\u0e28."
} }
}, },
{ "narrow.Eras",
new String[] {
"\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.",
"\u0e04.\u0e28.",
}
},
{ "buddhist.TimePatterns", { "buddhist.TimePatterns",
timePatterns timePatterns
}, },
......
...@@ -82,6 +82,23 @@ public class FormatData_tr extends ListResourceBundle { ...@@ -82,6 +82,23 @@ public class FormatData_tr extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"O",
"\u015e",
"M",
"N",
"M",
"H",
"T",
"A",
"E",
"E",
"K",
"A",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"Pazar", // Sunday "Pazar", // Sunday
...@@ -104,6 +121,17 @@ public class FormatData_tr extends ListResourceBundle { ...@@ -104,6 +121,17 @@ public class FormatData_tr extends ListResourceBundle {
"Cmt" // abb Saturday "Cmt" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"P",
"P",
"S",
"\u00c7",
"P",
"C",
"C",
}
},
{ "NumberPatterns", { "NumberPatterns",
new String[] { new String[] {
"#,##0.###;-#,##0.###", // decimal pattern "#,##0.###;-#,##0.###", // decimal pattern
......
...@@ -138,6 +138,17 @@ public class FormatData_uk extends ListResourceBundle { ...@@ -138,6 +138,17 @@ public class FormatData_uk extends ListResourceBundle {
"\u0441\u0431" // abb Saturday "\u0441\u0431" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u041d",
"\u041f",
"\u0412",
"\u0421",
"\u0427",
"\u041f",
"\u0421",
}
},
{ "Eras", { "Eras",
new String[] { // era strings new String[] { // era strings
"\u0434\u043e \u043d.\u0435.", "\u0434\u043e \u043d.\u0435.",
......
...@@ -106,6 +106,17 @@ public class FormatData_vi extends ListResourceBundle { ...@@ -106,6 +106,17 @@ public class FormatData_vi extends ListResourceBundle {
"Th 7" // abb Saturday "Th 7" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"CN",
"T2",
"T3",
"T4",
"T5",
"T6",
"T7",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"SA", // am marker "SA", // am marker
......
...@@ -82,6 +82,23 @@ public class FormatData_zh extends ListResourceBundle { ...@@ -82,6 +82,23 @@ public class FormatData_zh extends ListResourceBundle {
"" // abb month 13 if applicable "" // abb month 13 if applicable
} }
}, },
{ "standalone.MonthNarrows",
new String[] {
"1\u6708",
"2\u6708",
"3\u6708",
"4\u6708",
"5\u6708",
"6\u6708",
"7\u6708",
"8\u6708",
"9\u6708",
"10\u6708",
"11\u6708",
"12\u6708",
"",
}
},
{ "DayNames", { "DayNames",
new String[] { new String[] {
"\u661f\u671f\u65e5", // Sunday "\u661f\u671f\u65e5", // Sunday
...@@ -104,6 +121,17 @@ public class FormatData_zh extends ListResourceBundle { ...@@ -104,6 +121,17 @@ public class FormatData_zh extends ListResourceBundle {
"\u661f\u671f\u516d" // abb Saturday "\u661f\u671f\u516d" // abb Saturday
} }
}, },
{ "DayNarrows",
new String[] {
"\u65e5",
"\u4e00",
"\u4e8c",
"\u4e09",
"\u56db",
"\u4e94",
"\u516d",
}
},
{ "AmPmMarkers", { "AmPmMarkers",
new String[] { new String[] {
"\u4e0a\u5348", // am marker "\u4e0a\u5348", // am marker
......
...@@ -88,11 +88,6 @@ public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter { ...@@ -88,11 +88,6 @@ public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter {
return null; return null;
} }
@Override
public TimeZoneNameProvider getTimeZoneNameProvider() {
return null;
}
@Override @Override
public Locale[] getAvailableLocales() { public Locale[] getAvailableLocales() {
Set<String> all = createLanguageTagSet("All"); Set<String> all = createLanguageTagSet("All");
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
package sun.util.locale.provider; package sun.util.locale.provider;
import java.util.Calendar;
import static java.util.Calendar.*; import static java.util.Calendar.*;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
......
...@@ -52,7 +52,7 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av ...@@ -52,7 +52,7 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av
@Override @Override
public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) { public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) {
String name = null; String name = null;
String key = getKey(calendarType, field, style); String key = getResourceKey(calendarType, field, style);
if (key != null) { if (key != null) {
ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale); ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale);
if (rb.containsKey(key)) { if (rb.containsKey(key)) {
...@@ -64,9 +64,10 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av ...@@ -64,9 +64,10 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av
name = strings[value]; name = strings[value];
// If name is empty in standalone, try its `format' style. // If name is empty in standalone, try its `format' style.
if (name.length() == 0 if (name.length() == 0
&& (style == SHORT_STANDALONE || style == LONG_STANDALONE)) { && (style == SHORT_STANDALONE || style == LONG_STANDALONE
|| style == NARROW_STANDALONE)) {
name = getDisplayName(calendarType, field, value, name = getDisplayName(calendarType, field, value,
style == SHORT_STANDALONE ? SHORT_FORMAT : LONG_FORMAT, getBaseStyle(style),
locale); locale);
} }
} }
...@@ -75,16 +76,18 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av ...@@ -75,16 +76,18 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av
return name; return name;
} }
private static int[] REST_OF_STYLES = {
SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE,
NARROW_FORMAT, NARROW_STANDALONE
};
@Override @Override
public Map<String, Integer> getDisplayNames(String calendarType, int field, int style, Locale locale) { public Map<String, Integer> getDisplayNames(String calendarType, int field, int style, Locale locale) {
Map<String, Integer> names; Map<String, Integer> names;
if (style == ALL_STYLES) { if (style == ALL_STYLES) {
names = getDisplayNamesImpl(calendarType, field, SHORT_FORMAT, locale); names = getDisplayNamesImpl(calendarType, field, SHORT_FORMAT, locale);
if (field != AM_PM) { for (int st : REST_OF_STYLES) {
for (int st : new int[] { SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE }) {
names.putAll(getDisplayNamesImpl(calendarType, field, st, locale)); names.putAll(getDisplayNamesImpl(calendarType, field, st, locale));
} }
}
} else { } else {
// specific style // specific style
names = getDisplayNamesImpl(calendarType, field, style, locale); names = getDisplayNamesImpl(calendarType, field, style, locale);
...@@ -94,12 +97,13 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av ...@@ -94,12 +97,13 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av
private Map<String, Integer> getDisplayNamesImpl(String calendarType, int field, private Map<String, Integer> getDisplayNamesImpl(String calendarType, int field,
int style, Locale locale) { int style, Locale locale) {
String key = getKey(calendarType, field, style); String key = getResourceKey(calendarType, field, style);
Map<String, Integer> map = new TreeMap<>(LengthBasedComparator.INSTANCE); Map<String, Integer> map = new TreeMap<>(LengthBasedComparator.INSTANCE);
if (key != null) { if (key != null) {
ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale); ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale);
if (rb.containsKey(key)) { if (rb.containsKey(key)) {
String[] strings = rb.getStringArray(key); String[] strings = rb.getStringArray(key);
if (!hasDuplicates(strings)) {
if (field == YEAR) { if (field == YEAR) {
if (strings.length > 0) { if (strings.length > 0) {
map.put(strings[0], 1); map.put(strings[0], 1);
...@@ -118,9 +122,14 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av ...@@ -118,9 +122,14 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av
} }
} }
} }
}
return map; return map;
} }
private int getBaseStyle(int style) {
return style & ~(SHORT_STANDALONE - SHORT_FORMAT);
}
/** /**
* Comparator implementation for TreeMap which iterates keys from longest * Comparator implementation for TreeMap which iterates keys from longest
* to shortest. * to shortest.
...@@ -180,55 +189,92 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av ...@@ -180,55 +189,92 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av
return langtags; return langtags;
} }
private int getIntData(String key, Locale locale) { private boolean hasDuplicates(String[] strings) {
ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getCalendarData(locale); int len = strings.length;
if (rb.containsKey(key)) { for (int i = 0; i < len - 1; i++) {
String firstday = rb.getString(key); String a = strings[i];
return Integer.parseInt(firstday); if (a != null) {
for (int j = i + 1; j < len; j++) {
if (a.equals(strings[j])) {
return true;
} }
// Note that the base bundle of CLDR doesn't have the Calendar week parameters. }
return 0; }
}
return false;
} }
private String getKey(String type, int field, int style) { private String getResourceKey(String type, int field, int style) {
boolean standalone = (style & 0x8000) != 0; int baseStyle = getBaseStyle(style);
style &= ~0x8000; boolean isStandalone = (style != baseStyle);
if ("gregory".equals(type)) { if ("gregory".equals(type)) {
type = null; type = null;
} }
boolean isNarrow = (baseStyle == NARROW_FORMAT);
StringBuilder key = new StringBuilder(); StringBuilder key = new StringBuilder();
switch (field) { switch (field) {
case ERA: case ERA:
if (type != null) { if (type != null) {
key.append(type).append('.'); key.append(type).append('.');
} }
if (style == SHORT) { if (isNarrow) {
key.append("narrow.");
} else {
// JRE and CLDR use different resource key conventions
// due to historical reasons. (JRE DateFormatSymbols.getEras returns
// abbreviations while other getShort*() return abbreviations.)
if (this.type == LocaleProviderAdapter.Type.JRE) {
if (baseStyle == SHORT) {
key.append("short."); key.append("short.");
} }
} else { // CLDR
if (baseStyle == LONG) {
key.append("long.");
}
}
}
key.append("Eras"); key.append("Eras");
break; break;
case YEAR: case YEAR:
if (!isNarrow) {
key.append(type).append(".FirstYear"); key.append(type).append(".FirstYear");
}
break; break;
case MONTH: case MONTH:
if (standalone) { if (isStandalone) {
key.append("standalone."); key.append("standalone.");
} }
key.append(style == SHORT ? "MonthAbbreviations" : "MonthNames"); key.append("Month").append(toStyleName(baseStyle));
break; break;
case DAY_OF_WEEK: case DAY_OF_WEEK:
key.append(style == SHORT ? "DayAbbreviations" : "DayNames"); // support standalone narrow day names
if (isStandalone && isNarrow) {
key.append("standalone.");
}
key.append("Day").append(toStyleName(baseStyle));
break; break;
case AM_PM: case AM_PM:
if (isNarrow) {
key.append("narrow.");
}
key.append("AmPmMarkers"); key.append("AmPmMarkers");
break; break;
} }
return key.length() > 0 ? key.toString() : null; return key.length() > 0 ? key.toString() : null;
} }
private String toStyleName(int baseStyle) {
switch (baseStyle) {
case SHORT:
return "Abbreviations";
case NARROW_FORMAT:
return "Narrows";
}
return "Names";
}
} }
...@@ -46,7 +46,7 @@ import java.util.Locale; ...@@ -46,7 +46,7 @@ import java.util.Locale;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import sun.util.resources.OpenListResourceBundle; import sun.util.resources.TimeZoneNamesBundle;
/** /**
* Central accessor to locale-dependent resources. * Central accessor to locale-dependent resources.
...@@ -67,13 +67,13 @@ public class LocaleResources { ...@@ -67,13 +67,13 @@ public class LocaleResources {
this.locale = locale; this.locale = locale;
} }
public OpenListResourceBundle getTimeZoneNames() { public TimeZoneNamesBundle getTimeZoneNames() {
OpenListResourceBundle tznames = (OpenListResourceBundle) cache.get("TimeZoneNames"); TimeZoneNamesBundle tznames = (TimeZoneNamesBundle) cache.get("TimeZoneNames");
if (tznames == null) { if (tznames == null) {
tznames = adapter.getLocaleData().getTimeZoneNames(locale); tznames = adapter.getLocaleData().getTimeZoneNames(locale);
OpenListResourceBundle olrb = (OpenListResourceBundle) cache.putIfAbsent("TimeZoneNames", tznames); TimeZoneNamesBundle tznb = (TimeZoneNamesBundle) cache.putIfAbsent("TimeZoneNames", tznames);
if (olrb != null) { if (tznb != null) {
tznames = olrb; tznames = tznb;
} }
} }
return tznames; return tznames;
......
...@@ -604,5 +604,12 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { ...@@ -604,5 +604,12 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter {
assert tznp != null; assert tznp != null;
return tznp.getDisplayName(ID, daylight, style, locale); return tznp.getDisplayName(ID, daylight, style, locale);
} }
@Override
public String getGenericDisplayName(String ID, int style, Locale locale) {
TimeZoneNameProvider tznp = getImpl(locale);
assert tznp != null;
return tznp.getGenericDisplayName(ID, style, locale);
}
} }
} }
...@@ -25,11 +25,14 @@ ...@@ -25,11 +25,14 @@
package sun.util.locale.provider; package sun.util.locale.provider;
import java.util.LinkedHashSet;
import java.util.Locale; import java.util.Locale;
import java.util.ResourceBundle; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.spi.TimeZoneNameProvider; import java.util.spi.TimeZoneNameProvider;
import sun.util.calendar.ZoneInfo;
import sun.util.resources.TimeZoneNamesBundle;
/** /**
* Concrete implementation of the * Concrete implementation of the
...@@ -96,21 +99,67 @@ public class TimeZoneNameProviderImpl extends TimeZoneNameProvider { ...@@ -96,21 +99,67 @@ public class TimeZoneNameProviderImpl extends TimeZoneNameProvider {
*/ */
@Override @Override
public String getDisplayName(String id, boolean daylight, int style, Locale locale) { public String getDisplayName(String id, boolean daylight, int style, Locale locale) {
if (id == null || locale == null) { String[] names = getDisplayNameArray(id, 5, locale);
throw new NullPointerException(); if (names != null) {
}
LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
ResourceBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames();
if (rb.containsKey(id)) {
String[] names = rb.getStringArray(id);
int index = daylight ? 3 : 1; int index = daylight ? 3 : 1;
if (style == TimeZone.SHORT) { if (style == TimeZone.SHORT) {
index++; index++;
} }
return names[index]; return names[index];
} }
return null;
}
@Override
public String getGenericDisplayName(String id, int style, Locale locale) {
String[] names = getDisplayNameArray(id, 7, locale);
if (names != null && names.length >= 7) {
return names[(style == TimeZone.LONG) ? 5 : 6];
}
return null; return null;
} }
private String[] getDisplayNameArray(String id, int n, Locale locale) {
if (id == null || locale == null) {
throw new NullPointerException();
}
LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
TimeZoneNamesBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames();
return rb.containsKey(id) ? rb.getStringArray(id, n) : null;
}
/**
* Returns a String[][] as the DateFormatSymbols.getZoneStrings() value for
* the given locale. This method is package private.
*
* @param locale a Locale for time zone names
* @return an array of time zone names arrays
*/
String[][] getZoneStrings(Locale locale) {
LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
TimeZoneNamesBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames();
Set<String> keyset = rb.keySet();
// Use a LinkedHashSet to preseve the order
Set<String[]> value = new LinkedHashSet<>();
for (String key : keyset) {
value.add(rb.getStringArray(key));
}
// Add aliases data for CLDR
if (type == LocaleProviderAdapter.Type.CLDR) {
// Note: TimeZoneNamesBundle creates a String[] on each getStringArray call.
Map<String, String> aliases = ZoneInfo.getAliasTable();
for (String alias : aliases.keySet()) {
if (!keyset.contains(alias)) {
String tzid = aliases.get(alias);
if (keyset.contains(tzid)) {
String[] val = rb.getStringArray(tzid);
val[0] = alias;
value.add(val);
}
}
}
}
return value.toArray(new String[0][]);
}
} }
...@@ -26,28 +26,28 @@ ...@@ -26,28 +26,28 @@
package sun.util.locale.provider; package sun.util.locale.provider;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
import java.util.Enumeration;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.spi.TimeZoneNameProvider; import java.util.spi.TimeZoneNameProvider;
import sun.util.calendar.ZoneInfo; import sun.util.calendar.ZoneInfo;
import sun.util.resources.OpenListResourceBundle; import sun.util.resources.OpenListResourceBundle;
import sun.util.resources.TimeZoneNamesBundle;
/** /**
* Utility class that deals with the localized time zone names * Utility class that deals with the localized time zone names
* *
* @author Naoto Sato * @author Naoto Sato
* @author Masayoshi Okutsu
*/ */
public final class TimeZoneNameUtility { public final class TimeZoneNameUtility {
/** /**
* cache to hold time zone resource bundles. Keyed by Locale * cache to hold time zone resource bundles. Keyed by Locale
*/ */
private static ConcurrentHashMap<Locale, SoftReference<OpenListResourceBundle>> cachedBundles = private static ConcurrentHashMap<Locale, SoftReference<TimeZoneNamesBundle>> cachedBundles =
new ConcurrentHashMap<>(); new ConcurrentHashMap<>();
/** /**
...@@ -73,15 +73,19 @@ public final class TimeZoneNameUtility { ...@@ -73,15 +73,19 @@ public final class TimeZoneNameUtility {
} }
private static String[][] loadZoneStrings(Locale locale) { private static String[][] loadZoneStrings(Locale locale) {
// If the provider is a TimeZoneNameProviderImpl, call its getZoneStrings
// in order to avoid per-ID retrieval.
LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(TimeZoneNameProvider.class, locale);
TimeZoneNameProvider provider = adapter.getTimeZoneNameProvider();
if (provider instanceof TimeZoneNameProviderImpl) {
return ((TimeZoneNameProviderImpl)provider).getZoneStrings(locale);
}
// Performs per-ID retrieval.
List<String[]> zones = new LinkedList<>(); List<String[]> zones = new LinkedList<>();
OpenListResourceBundle rb = getBundle(locale); OpenListResourceBundle rb = getBundle(locale);
Enumeration<String> keys = rb.getKeys(); for (String key : rb.keySet()) {
String[] names; String[] names = retrieveDisplayNamesImpl(key, locale);
while(keys.hasMoreElements()) {
String key = keys.nextElement();
names = retrieveDisplayNames(rb, key, locale);
if (names != null) { if (names != null) {
zones.add(names); zones.add(names);
} }
...@@ -95,24 +99,50 @@ public final class TimeZoneNameUtility { ...@@ -95,24 +99,50 @@ public final class TimeZoneNameUtility {
* Retrieve display names for a time zone ID. * Retrieve display names for a time zone ID.
*/ */
public static String[] retrieveDisplayNames(String id, Locale locale) { public static String[] retrieveDisplayNames(String id, Locale locale) {
OpenListResourceBundle rb = getBundle(locale);
return retrieveDisplayNames(rb, id, locale);
}
private static String[] retrieveDisplayNames(OpenListResourceBundle rb,
String id, Locale locale) {
if (id == null || locale == null) { if (id == null || locale == null) {
throw new NullPointerException(); throw new NullPointerException();
} }
return retrieveDisplayNamesImpl(id, locale);
}
/**
* Retrieves a generic time zone display name for a time zone ID.
*
* @param id time zone ID
* @param style TimeZone.LONG or TimeZone.SHORT
* @param locale desired Locale
* @return the requested generic time zone display name, or null if not found.
*/
public static String retrieveGenericDisplayName(String id, int style, Locale locale) {
LocaleServiceProviderPool pool = LocaleServiceProviderPool pool =
LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class); LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class);
return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, id); return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, "generic", style, id);
} }
private static OpenListResourceBundle getBundle(Locale locale) { /**
OpenListResourceBundle rb; * Retrieves a standard or daylight-saving time name for the given time zone ID.
SoftReference<OpenListResourceBundle> data = cachedBundles.get(locale); *
* @param id time zone ID
* @param daylight true for a daylight saving time name, or false for a standard time name
* @param style TimeZone.LONG or TimeZone.SHORT
* @param locale desired Locale
* @return the requested time zone name, or null if not found.
*/
public static String retrieveDisplayName(String id, boolean daylight, int style, Locale locale) {
LocaleServiceProviderPool pool =
LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class);
return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, daylight ? "dst" : "std", style, id);
}
private static String[] retrieveDisplayNamesImpl(String id, Locale locale) {
LocaleServiceProviderPool pool =
LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class);
return pool.getLocalizedObject(TimeZoneNameArrayGetter.INSTANCE, locale, id);
}
private static TimeZoneNamesBundle getBundle(Locale locale) {
TimeZoneNamesBundle rb;
SoftReference<TimeZoneNamesBundle> data = cachedBundles.get(locale);
if (data == null || ((rb = data.get()) == null)) { if (data == null || ((rb = data.get()) == null)) {
rb = LocaleProviderAdapter.forJRE().getLocaleData().getTimeZoneNames(locale); rb = LocaleProviderAdapter.forJRE().getLocaleData().getTimeZoneNames(locale);
...@@ -127,11 +157,11 @@ public final class TimeZoneNameUtility { ...@@ -127,11 +157,11 @@ public final class TimeZoneNameUtility {
* Obtains a localized time zone strings from a TimeZoneNameProvider * Obtains a localized time zone strings from a TimeZoneNameProvider
* implementation. * implementation.
*/ */
private static class TimeZoneNameGetter private static class TimeZoneNameArrayGetter
implements LocaleServiceProviderPool.LocalizedObjectGetter<TimeZoneNameProvider, implements LocaleServiceProviderPool.LocalizedObjectGetter<TimeZoneNameProvider,
String[]>{ String[]>{
private static final TimeZoneNameGetter INSTANCE = private static final TimeZoneNameArrayGetter INSTANCE =
new TimeZoneNameGetter(); new TimeZoneNameArrayGetter();
@Override @Override
public String[] getObject(TimeZoneNameProvider timeZoneNameProvider, public String[] getObject(TimeZoneNameProvider timeZoneNameProvider,
...@@ -139,7 +169,6 @@ public final class TimeZoneNameUtility { ...@@ -139,7 +169,6 @@ public final class TimeZoneNameUtility {
String requestID, String requestID,
Object... params) { Object... params) {
assert params.length == 0; assert params.length == 0;
String queryID = requestID;
// First, try to get names with the request ID // First, try to get names with the request ID
String[] names = buildZoneStrings(timeZoneNameProvider, locale, requestID); String[] names = buildZoneStrings(timeZoneNameProvider, locale, requestID);
...@@ -150,21 +179,15 @@ public final class TimeZoneNameUtility { ...@@ -150,21 +179,15 @@ public final class TimeZoneNameUtility {
if (aliases != null) { if (aliases != null) {
// Check whether this id is an alias, if so, // Check whether this id is an alias, if so,
// look for the standard id. // look for the standard id.
if (aliases.containsKey(queryID)) { String canonicalID = aliases.get(requestID);
String prevID = queryID; if (canonicalID != null) {
while ((queryID = aliases.get(queryID)) != null) { names = buildZoneStrings(timeZoneNameProvider, locale, canonicalID);
prevID = queryID;
}
queryID = prevID;
} }
names = buildZoneStrings(timeZoneNameProvider, locale, queryID);
if (names == null) { if (names == null) {
// There may be a case that a standard id has become an // There may be a case that a standard id has become an
// alias. so, check the aliases backward. // alias. so, check the aliases backward.
names = examineAliases(timeZoneNameProvider, locale, names = examineAliases(timeZoneNameProvider, locale,
queryID, aliases, aliases.entrySet()); canonicalID == null ? requestID : canonicalID, aliases);
} }
} }
} }
...@@ -178,24 +201,22 @@ public final class TimeZoneNameUtility { ...@@ -178,24 +201,22 @@ public final class TimeZoneNameUtility {
private static String[] examineAliases(TimeZoneNameProvider tznp, Locale locale, private static String[] examineAliases(TimeZoneNameProvider tznp, Locale locale,
String id, String id,
Map<String, String> aliases, Map<String, String> aliases) {
Set<Map.Entry<String, String>> aliasesSet) {
if (aliases.containsValue(id)) { if (aliases.containsValue(id)) {
for (Map.Entry<String, String> entry : aliasesSet) { for (Map.Entry<String, String> entry : aliases.entrySet()) {
if (entry.getValue().equals(id)) { if (entry.getValue().equals(id)) {
String alias = entry.getKey(); String alias = entry.getKey();
String[] names = buildZoneStrings(tznp, locale, alias); String[] names = buildZoneStrings(tznp, locale, alias);
if (names != null) { if (names != null) {
return names; return names;
} else { }
names = examineAliases(tznp, locale, alias, aliases, aliasesSet); names = examineAliases(tznp, locale, alias, aliases);
if (names != null) { if (names != null) {
return names; return names;
} }
} }
} }
} }
}
return null; return null;
} }
...@@ -220,6 +241,77 @@ public final class TimeZoneNameUtility { ...@@ -220,6 +241,77 @@ public final class TimeZoneNameUtility {
} }
} }
private static class TimeZoneNameGetter
implements LocaleServiceProviderPool.LocalizedObjectGetter<TimeZoneNameProvider,
String> {
private static final TimeZoneNameGetter INSTANCE =
new TimeZoneNameGetter();
@Override
public String getObject(TimeZoneNameProvider timeZoneNameProvider,
Locale locale,
String requestID,
Object... params) {
assert params.length == 2;
int style = (int) params[0];
String tzid = (String) params[1];
String value = getName(timeZoneNameProvider, locale, requestID, style, tzid);
if (value == null) {
Map<String, String> aliases = ZoneInfo.getAliasTable();
if (aliases != null) {
String canonicalID = aliases.get(tzid);
if (canonicalID != null) {
value = getName(timeZoneNameProvider, locale, requestID, style, canonicalID);
}
if (value == null) {
value = examineAliases(timeZoneNameProvider, locale, requestID,
canonicalID != null ? canonicalID : tzid, style, aliases);
}
}
}
return value;
}
private static String examineAliases(TimeZoneNameProvider tznp, Locale locale,
String requestID, String tzid, int style,
Map<String, String> aliases) {
if (aliases.containsValue(tzid)) {
for (Map.Entry<String, String> entry : aliases.entrySet()) {
if (entry.getValue().equals(tzid)) {
String alias = entry.getKey();
String name = getName(tznp, locale, requestID, style, alias);
if (name != null) {
return name;
}
name = examineAliases(tznp, locale, requestID, alias, style, aliases);
if (name != null) {
return name;
}
}
}
}
return null;
}
private static String getName(TimeZoneNameProvider timeZoneNameProvider,
Locale locale, String requestID, int style, String tzid) {
String value = null;
switch (requestID) {
case "std":
value = timeZoneNameProvider.getDisplayName(tzid, false, style, locale);
break;
case "dst":
value = timeZoneNameProvider.getDisplayName(tzid, true, style, locale);
break;
case "generic":
value = timeZoneNameProvider.getGenericDisplayName(tzid, style, locale);
break;
}
return value;
}
}
// No instantiation // No instantiation
private TimeZoneNameUtility() { private TimeZoneNameUtility() {
} }
......
...@@ -46,9 +46,9 @@ import java.util.Iterator; ...@@ -46,9 +46,9 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import sun.util.locale.provider.LocaleDataMetaInfo;
import sun.util.locale.provider.LocaleProviderAdapter; import sun.util.locale.provider.LocaleProviderAdapter;
import static sun.util.locale.provider.LocaleProviderAdapter.Type.JRE; import static sun.util.locale.provider.LocaleProviderAdapter.Type.JRE;
import sun.util.locale.provider.LocaleDataMetaInfo;
/** /**
* Provides information about and access to resource bundles in the * Provides information about and access to resource bundles in the
...@@ -94,8 +94,8 @@ public class LocaleData { ...@@ -94,8 +94,8 @@ public class LocaleData {
* Gets a time zone names resource bundle, using privileges * Gets a time zone names resource bundle, using privileges
* to allow accessing a sun.* package. * to allow accessing a sun.* package.
*/ */
public OpenListResourceBundle getTimeZoneNames(Locale locale) { public TimeZoneNamesBundle getTimeZoneNames(Locale locale) {
return (OpenListResourceBundle) getBundle(type.getUtilResourcesPackage() + ".TimeZoneNames", locale); return (TimeZoneNamesBundle) getBundle(type.getUtilResourcesPackage() + ".TimeZoneNames", locale);
} }
/** /**
...@@ -158,11 +158,8 @@ public class LocaleData { ...@@ -158,11 +158,8 @@ public class LocaleData {
/* Get the locale string list from LocaleDataMetaInfo class. */ /* Get the locale string list from LocaleDataMetaInfo class. */
String localeString = LocaleDataMetaInfo.getSupportedLocaleString(baseName); String localeString = LocaleDataMetaInfo.getSupportedLocaleString(baseName);
if (localeString == null || localeString.length() == 0) { if (localeString != null && localeString.length() != 0) {
return candidates; for (Iterator<Locale> l = candidates.iterator(); l.hasNext();) {
}
for (Iterator<Locale> l = candidates.iterator(); l.hasNext(); ) {
Locale loc = l.next(); Locale loc = l.next();
String lstr; String lstr;
if (loc.getScript().length() > 0) { if (loc.getScript().length() > 0) {
...@@ -183,6 +180,12 @@ public class LocaleData { ...@@ -183,6 +180,12 @@ public class LocaleData {
l.remove(); l.remove();
} }
} }
}
// Force fallback to Locale.ENGLISH for CLDR time zone names support
if (locale.getLanguage() != "en"
&& baseName.contains(CLDR) && baseName.endsWith("TimeZoneNames")) {
candidates.add(candidates.size() - 1, Locale.ENGLISH);
}
return candidates; return candidates;
} }
......
...@@ -67,6 +67,7 @@ public abstract class OpenListResourceBundle extends ResourceBundle { ...@@ -67,6 +67,7 @@ public abstract class OpenListResourceBundle extends ResourceBundle {
} }
// Implements java.util.ResourceBundle.handleGetObject; inherits javadoc specification. // Implements java.util.ResourceBundle.handleGetObject; inherits javadoc specification.
@Override
public Object handleGetObject(String key) { public Object handleGetObject(String key) {
if (key == null) { if (key == null) {
throw new NullPointerException(); throw new NullPointerException();
...@@ -79,6 +80,7 @@ public abstract class OpenListResourceBundle extends ResourceBundle { ...@@ -79,6 +80,7 @@ public abstract class OpenListResourceBundle extends ResourceBundle {
/** /**
* Implementation of ResourceBundle.getKeys. * Implementation of ResourceBundle.getKeys.
*/ */
@Override
public Enumeration<String> getKeys() { public Enumeration<String> getKeys() {
ResourceBundle parent = this.parent; ResourceBundle parent = this.parent;
return new ResourceBundleEnumeration(handleGetKeys(), return new ResourceBundleEnumeration(handleGetKeys(),
...@@ -86,7 +88,8 @@ public abstract class OpenListResourceBundle extends ResourceBundle { ...@@ -86,7 +88,8 @@ public abstract class OpenListResourceBundle extends ResourceBundle {
} }
/** /**
* Returns a set of keys provided in this resource bundle * Returns a set of keys provided in this resource bundle,
* including no parents.
*/ */
public Set<String> handleGetKeys() { public Set<String> handleGetKeys() {
loadLookupTablesIfNecessary(); loadLookupTablesIfNecessary();
...@@ -99,7 +102,7 @@ public abstract class OpenListResourceBundle extends ResourceBundle { ...@@ -99,7 +102,7 @@ public abstract class OpenListResourceBundle extends ResourceBundle {
if (keyset != null) { if (keyset != null) {
return keyset; return keyset;
} }
Set<String> ks = new HashSet<>(); Set<String> ks = createSet();
ks.addAll(handleGetKeys()); ks.addAll(handleGetKeys());
if (parent != null) { if (parent != null) {
ks.addAll(parent.keySet()); ks.addAll(parent.keySet());
...@@ -112,13 +115,6 @@ public abstract class OpenListResourceBundle extends ResourceBundle { ...@@ -112,13 +115,6 @@ public abstract class OpenListResourceBundle extends ResourceBundle {
return keyset; return keyset;
} }
/**
* Returns the parent bundle
*/
public OpenListResourceBundle getParent() {
return (OpenListResourceBundle)parent;
}
/** /**
* See ListResourceBundle class description. * See ListResourceBundle class description.
*/ */
...@@ -160,10 +156,14 @@ public abstract class OpenListResourceBundle extends ResourceBundle { ...@@ -160,10 +156,14 @@ public abstract class OpenListResourceBundle extends ResourceBundle {
* Lets subclasses provide specialized Map implementations. * Lets subclasses provide specialized Map implementations.
* Default uses HashMap. * Default uses HashMap.
*/ */
protected Map<String, Object> createMap(int size) { protected <K, V> Map<K, V> createMap(int size) {
return new HashMap<>(size); return new HashMap<>(size);
} }
protected <E> Set<E> createSet() {
return new HashSet<>();
}
private volatile Map<String, Object> lookup = null; private volatile Map<String, Object> lookup = null;
private volatile Set<String> keyset; private volatile Set<String> keyset;
} }
...@@ -43,160 +43,238 @@ package sun.util.resources; ...@@ -43,160 +43,238 @@ package sun.util.resources;
public final class TimeZoneNames extends TimeZoneNamesBundle { public final class TimeZoneNames extends TimeZoneNamesBundle {
protected final Object[][] getContents() { protected final Object[][] getContents() {
// Note: generic names came from CLDR with some adjustments.
String ACT[] = new String[] {"Acre Time", "ACT", String ACT[] = new String[] {"Acre Time", "ACT",
"Acre Summer Time", "ACST"}; "Acre Summer Time", "ACST",
"Acre Time", "ACT"};
String ADELAIDE[] = new String[] {"Central Standard Time (South Australia)", "CST", String ADELAIDE[] = new String[] {"Central Standard Time (South Australia)", "CST",
"Central Summer Time (South Australia)", "CST"}; "Central Summer Time (South Australia)", "CST",
"Central Time (South Australia)", "CT"};
String AGT[] = new String[] {"Argentine Time", "ART", String AGT[] = new String[] {"Argentine Time", "ART",
"Argentine Summer Time", "ARST"}; "Argentine Summer Time", "ARST",
"Argentine Time", "ART"};
String AKST[] = new String[] {"Alaska Standard Time", "AKST", String AKST[] = new String[] {"Alaska Standard Time", "AKST",
"Alaska Daylight Time", "AKDT"}; "Alaska Daylight Time", "AKDT",
"Alaska Time", "AKT"};
String AMT[] = new String[] {"Amazon Time", "AMT", String AMT[] = new String[] {"Amazon Time", "AMT",
"Amazon Summer Time", "AMST"}; "Amazon Summer Time", "AMST",
"Amazon Time", "AMT"};
String ARAST[] = new String[] {"Arabia Standard Time", "AST", String ARAST[] = new String[] {"Arabia Standard Time", "AST",
"Arabia Daylight Time", "ADT"}; "Arabia Daylight Time", "ADT",
"Arabia Time", "AT"};
String ARMT[] = new String[] {"Armenia Time", "AMT", String ARMT[] = new String[] {"Armenia Time", "AMT",
"Armenia Summer Time", "AMST"}; "Armenia Summer Time", "AMST",
"Armenia Time", "AMT"};
String AST[] = new String[] {"Atlantic Standard Time", "AST", String AST[] = new String[] {"Atlantic Standard Time", "AST",
"Atlantic Daylight Time", "ADT"}; "Atlantic Daylight Time", "ADT",
"Atlantic Time", "AT"};
String BDT[] = new String[] {"Bangladesh Time", "BDT", String BDT[] = new String[] {"Bangladesh Time", "BDT",
"Bangladesh Summer Time", "BDST"}; "Bangladesh Summer Time", "BDST",
"Bangladesh Time", "BDT"};
String BRISBANE[] = new String[] {"Eastern Standard Time (Queensland)", "EST", String BRISBANE[] = new String[] {"Eastern Standard Time (Queensland)", "EST",
"Eastern Summer Time (Queensland)", "EST"}; "Eastern Summer Time (Queensland)", "EST",
"Eastern Time (Queensland)", "ET"};
String BROKEN_HILL[] = new String[] {"Central Standard Time (South Australia/New South Wales)", "CST", String BROKEN_HILL[] = new String[] {"Central Standard Time (South Australia/New South Wales)", "CST",
"Central Summer Time (South Australia/New South Wales)", "CST"}; "Central Summer Time (South Australia/New South Wales)", "CST",
"Central Time (South Australia/New South Wales)", "CT"};
String BRT[] = new String[] {"Brasilia Time", "BRT", String BRT[] = new String[] {"Brasilia Time", "BRT",
"Brasilia Summer Time", "BRST"}; "Brasilia Summer Time", "BRST",
"Brasilia Time", "BRT"};
String BTT[] = new String[] {"Bhutan Time", "BTT", String BTT[] = new String[] {"Bhutan Time", "BTT",
"Bhutan Summer Time", "BTST"}; "Bhutan Summer Time", "BTST",
"Bhutan Time", "BTT"};
String CAT[] = new String[] {"Central African Time", "CAT", String CAT[] = new String[] {"Central African Time", "CAT",
"Central African Summer Time", "CAST"}; "Central African Summer Time", "CAST",
"Central Africa Time", "CAT"};
String CET[] = new String[] {"Central European Time", "CET", String CET[] = new String[] {"Central European Time", "CET",
"Central European Summer Time", "CEST"}; "Central European Summer Time", "CEST",
"Central European Time", "CET"};
String CHAST[] = new String[] {"Chatham Standard Time", "CHAST", String CHAST[] = new String[] {"Chatham Standard Time", "CHAST",
"Chatham Daylight Time", "CHADT"}; "Chatham Daylight Time", "CHADT",
"Chatham Time", "CHAT"};
String CHUT[] = new String[] {"Chuuk Time", "CHUT", String CHUT[] = new String[] {"Chuuk Time", "CHUT",
"Chuuk Summer Time", "CHUST"}; "Chuuk Summer Time", "CHUST",
"Chuuk Time", "CHUT"};
String CIT[] = new String[] {"Central Indonesia Time", "CIT", String CIT[] = new String[] {"Central Indonesia Time", "CIT",
"Central Indonesia Summer Time", "CIST"}; "Central Indonesia Summer Time", "CIST",
"Central Indonesia Time", "CIT"};
String CLT[] = new String[] {"Chile Time", "CLT", String CLT[] = new String[] {"Chile Time", "CLT",
"Chile Summer Time", "CLST"}; "Chile Summer Time", "CLST",
"Chile Time", "CLT"};
String CST[] = new String[] {"Central Standard Time", "CST", String CST[] = new String[] {"Central Standard Time", "CST",
"Central Daylight Time", "CDT"}; "Central Daylight Time", "CDT",
"Central Time", "CT"};
String CTT[] = new String[] {"China Standard Time", "CST", String CTT[] = new String[] {"China Standard Time", "CST",
"China Daylight Time", "CDT"}; "China Daylight Time", "CDT",
"China Time", "CT"};
String CUBA[] = new String[] {"Cuba Standard Time", "CST", String CUBA[] = new String[] {"Cuba Standard Time", "CST",
"Cuba Daylight Time", "CDT"}; "Cuba Daylight Time", "CDT",
"Cuba Time", "CT"};
String DARWIN[] = new String[] {"Central Standard Time (Northern Territory)", "CST", String DARWIN[] = new String[] {"Central Standard Time (Northern Territory)", "CST",
"Central Summer Time (Northern Territory)", "CST"}; "Central Summer Time (Northern Territory)", "CST",
"Central Time (Northern Territory)", "CT"};
String DUBLIN[] = new String[] {"Greenwich Mean Time", "GMT", String DUBLIN[] = new String[] {"Greenwich Mean Time", "GMT",
"Irish Summer Time", "IST"}; "Irish Summer Time", "IST",
"Irish Time", "IT"};
String EAT[] = new String[] {"Eastern African Time", "EAT", String EAT[] = new String[] {"Eastern African Time", "EAT",
"Eastern African Summer Time", "EAST"}; "Eastern African Summer Time", "EAST",
"Eastern Africa Time", "EAT"};
String EASTER[] = new String[] {"Easter Is. Time", "EAST", String EASTER[] = new String[] {"Easter Is. Time", "EAST",
"Easter Is. Summer Time", "EASST"}; "Easter Is. Summer Time", "EASST",
"Easter Is. Time", "EAST"};
String EET[] = new String[] {"Eastern European Time", "EET", String EET[] = new String[] {"Eastern European Time", "EET",
"Eastern European Summer Time", "EEST"}; "Eastern European Summer Time", "EEST",
"Eastern European Time", "EET"};
String EGT[] = new String[] {"Eastern Greenland Time", "EGT", String EGT[] = new String[] {"Eastern Greenland Time", "EGT",
"Eastern Greenland Summer Time", "EGST"}; "Eastern Greenland Summer Time", "EGST",
"Eastern Greenland Time", "EGT"};
String EST[] = new String[] {"Eastern Standard Time", "EST", String EST[] = new String[] {"Eastern Standard Time", "EST",
"Eastern Daylight Time", "EDT"}; "Eastern Daylight Time", "EDT",
"Eastern Time", "ET"};
String EST_NSW[] = new String[] {"Eastern Standard Time (New South Wales)", "EST", String EST_NSW[] = new String[] {"Eastern Standard Time (New South Wales)", "EST",
"Eastern Summer Time (New South Wales)", "EST"}; "Eastern Summer Time (New South Wales)", "EST",
"Eastern Time (New South Wales)", "ET"};
String FET[] = new String[] {"Further-eastern European Time", "FET", String FET[] = new String[] {"Further-eastern European Time", "FET",
"Further-eastern European Summer Time", "FEST"}; "Further-eastern European Summer Time", "FEST",
"Further-eastern European Time", "FET"};
String GHMT[] = new String[] {"Ghana Mean Time", "GMT", String GHMT[] = new String[] {"Ghana Mean Time", "GMT",
"Ghana Summer Time", "GHST"}; "Ghana Summer Time", "GHST",
"Ghana Mean Time", "GMT"};
String GAMBIER[] = new String[] {"Gambier Time", "GAMT", String GAMBIER[] = new String[] {"Gambier Time", "GAMT",
"Gambier Summer Time", "GAMST"}; "Gambier Summer Time", "GAMST",
"Gambier Time", "GAMT"};
String GMT[] = new String[] {"Greenwich Mean Time", "GMT", String GMT[] = new String[] {"Greenwich Mean Time", "GMT",
"Greenwich Mean Time", "GMT",
"Greenwich Mean Time", "GMT"}; "Greenwich Mean Time", "GMT"};
String GMTBST[] = new String[] {"Greenwich Mean Time", "GMT", String GMTBST[] = new String[] {"Greenwich Mean Time", "GMT",
"British Summer Time", "BST"}; "British Summer Time", "BST",
"British Time", "BT"};
String GST[] = new String[] {"Gulf Standard Time", "GST", String GST[] = new String[] {"Gulf Standard Time", "GST",
"Gulf Daylight Time", "GDT"}; "Gulf Daylight Time", "GDT",
"Gulf Time", "GT"};
String HAST[] = new String[] {"Hawaii-Aleutian Standard Time", "HAST", String HAST[] = new String[] {"Hawaii-Aleutian Standard Time", "HAST",
"Hawaii-Aleutian Daylight Time", "HADT"}; "Hawaii-Aleutian Daylight Time", "HADT",
"Hawaii-Aleutian Time", "HAT"};
String HKT[] = new String[] {"Hong Kong Time", "HKT", String HKT[] = new String[] {"Hong Kong Time", "HKT",
"Hong Kong Summer Time", "HKST"}; "Hong Kong Summer Time", "HKST",
"Hong Kong Time", "HKT"};
String HST[] = new String[] {"Hawaii Standard Time", "HST", String HST[] = new String[] {"Hawaii Standard Time", "HST",
"Hawaii Daylight Time", "HDT"}; "Hawaii Daylight Time", "HDT",
"Hawaii Time", "HT"};
String ICT[] = new String[] {"Indochina Time", "ICT", String ICT[] = new String[] {"Indochina Time", "ICT",
"Indochina Summer Time", "ICST"}; "Indochina Summer Time", "ICST",
"Indochina Time", "ICT"};
String IRT[] = new String[] {"Iran Standard Time", "IRST", String IRT[] = new String[] {"Iran Standard Time", "IRST",
"Iran Daylight Time", "IRDT"}; "Iran Daylight Time", "IRDT",
"Iran Time", "IRT"};
String ISRAEL[] = new String[] {"Israel Standard Time", "IST", String ISRAEL[] = new String[] {"Israel Standard Time", "IST",
"Israel Daylight Time", "IDT"}; "Israel Daylight Time", "IDT",
"Israel Time", "IT"};
String IST[] = new String[] {"India Standard Time", "IST", String IST[] = new String[] {"India Standard Time", "IST",
"India Daylight Time", "IDT"}; "India Daylight Time", "IDT",
"India Time", "IT"};
String JST[] = new String[] {"Japan Standard Time", "JST", String JST[] = new String[] {"Japan Standard Time", "JST",
"Japan Daylight Time", "JDT"}; "Japan Daylight Time", "JDT",
"Japan Time", "JT"};
String KST[] = new String[] {"Korea Standard Time", "KST", String KST[] = new String[] {"Korea Standard Time", "KST",
"Korea Daylight Time", "KDT"}; "Korea Daylight Time", "KDT",
"Korea Time", "KT"};
String LORD_HOWE[] = new String[] {"Lord Howe Standard Time", "LHST", String LORD_HOWE[] = new String[] {"Lord Howe Standard Time", "LHST",
"Lord Howe Summer Time", "LHST"}; "Lord Howe Summer Time", "LHST",
"Lord Howe Time", "LHT"};
String MHT[] = new String[] {"Marshall Islands Time", "MHT", String MHT[] = new String[] {"Marshall Islands Time", "MHT",
"Marshall Islands Summer Time", "MHST"}; "Marshall Islands Summer Time", "MHST",
"Marshall Islands Time", "MHT"};
String MSK[] = new String[] {"Moscow Standard Time", "MSK", String MSK[] = new String[] {"Moscow Standard Time", "MSK",
"Moscow Daylight Time", "MSD"}; "Moscow Daylight Time", "MSD",
"Moscow Time", "MT"};
String MST[] = new String[] {"Mountain Standard Time", "MST", String MST[] = new String[] {"Mountain Standard Time", "MST",
"Mountain Daylight Time", "MDT"}; "Mountain Daylight Time", "MDT",
"Mountain Time", "MT"};
String MYT[] = new String[] {"Malaysia Time", "MYT", String MYT[] = new String[] {"Malaysia Time", "MYT",
"Malaysia Summer Time", "MYST"}; "Malaysia Summer Time", "MYST",
"Malaysia Time", "MYT"};
String NORONHA[] = new String[] {"Fernando de Noronha Time", "FNT", String NORONHA[] = new String[] {"Fernando de Noronha Time", "FNT",
"Fernando de Noronha Summer Time", "FNST"}; "Fernando de Noronha Summer Time", "FNST",
"Fernando de Noronha Time", "FNT"};
String NOVT[] = new String[] {"Novosibirsk Time", "NOVT", String NOVT[] = new String[] {"Novosibirsk Time", "NOVT",
"Novosibirsk Summer Time", "NOVST"}; "Novosibirsk Summer Time", "NOVST",
"Novosibirsk Time", "NOVT"};
String NPT[] = new String[] {"Nepal Time", "NPT", String NPT[] = new String[] {"Nepal Time", "NPT",
"Nepal Summer Time", "NPST"}; "Nepal Summer Time", "NPST",
"Nepal Time", "NPT"};
String NST[] = new String[] {"Newfoundland Standard Time", "NST", String NST[] = new String[] {"Newfoundland Standard Time", "NST",
"Newfoundland Daylight Time", "NDT"}; "Newfoundland Daylight Time", "NDT",
"Newfoundland Time", "NT"};
String NZST[] = new String[] {"New Zealand Standard Time", "NZST", String NZST[] = new String[] {"New Zealand Standard Time", "NZST",
"New Zealand Daylight Time", "NZDT"}; "New Zealand Daylight Time", "NZDT",
"New Zealand Time", "NZT"};
String PITCAIRN[] = new String[] {"Pitcairn Standard Time", "PST", String PITCAIRN[] = new String[] {"Pitcairn Standard Time", "PST",
"Pitcairn Daylight Time", "PDT"}; "Pitcairn Daylight Time", "PDT",
"Pitcairn Time", "PT"};
String PKT[] = new String[] {"Pakistan Time", "PKT", String PKT[] = new String[] {"Pakistan Time", "PKT",
"Pakistan Summer Time", "PKST"}; "Pakistan Summer Time", "PKST",
"Pakistan Time", "PKT"};
String PONT[] = new String[] {"Pohnpei Time", "PONT", String PONT[] = new String[] {"Pohnpei Time", "PONT",
"Pohnpei Summer Time", "PONST"}; "Pohnpei Summer Time", "PONST",
"Ponape Time", "PONT"};
String PST[] = new String[] {"Pacific Standard Time", "PST", String PST[] = new String[] {"Pacific Standard Time", "PST",
"Pacific Daylight Time", "PDT"}; "Pacific Daylight Time", "PDT",
"Pacific Time", "PT"};
String SAST[] = new String[] {"South Africa Standard Time", "SAST", String SAST[] = new String[] {"South Africa Standard Time", "SAST",
"South Africa Summer Time", "SAST"}; "South Africa Summer Time", "SAST",
"South Africa Time", "SAT"};
String SBT[] = new String[] {"Solomon Is. Time", "SBT", String SBT[] = new String[] {"Solomon Is. Time", "SBT",
"Solomon Is. Summer Time", "SBST"}; "Solomon Is. Summer Time", "SBST",
"Solomon Is. Time", "SBT"};
String SGT[] = new String[] {"Singapore Time", "SGT", String SGT[] = new String[] {"Singapore Time", "SGT",
"Singapore Summer Time", "SGST"}; "Singapore Summer Time", "SGST",
"Singapore Time", "SGT"};
String SLST[] = new String[] {"Greenwich Mean Time", "GMT", String SLST[] = new String[] {"Greenwich Mean Time", "GMT",
"Sierra Leone Summer Time", "SLST"}; "Sierra Leone Summer Time", "SLST",
"Sierra Leone Time", "SLT"};
String TASMANIA[] = new String[] {"Eastern Standard Time (Tasmania)", "EST", String TASMANIA[] = new String[] {"Eastern Standard Time (Tasmania)", "EST",
"Eastern Summer Time (Tasmania)", "EST"}; "Eastern Summer Time (Tasmania)", "EST",
"Eastern Time (Tasmania)", "ET"};
String TMT[] = new String[] {"Turkmenistan Time", "TMT", String TMT[] = new String[] {"Turkmenistan Time", "TMT",
"Turkmenistan Summer Time", "TMST"}; "Turkmenistan Summer Time", "TMST",
"Turkmenistan Time", "TMT"};
String ULAT[]= new String[] {"Ulaanbaatar Time", "ULAT", String ULAT[]= new String[] {"Ulaanbaatar Time", "ULAT",
"Ulaanbaatar Summer Time", "ULAST"}; "Ulaanbaatar Summer Time", "ULAST",
"Ulaanbaatar Time", "ULAT"};
String WART[] = new String[] {"Western Argentine Time", "WART", String WART[] = new String[] {"Western Argentine Time", "WART",
"Western Argentine Summer Time", "WARST"}; "Western Argentine Summer Time", "WARST",
"Western Argentine Time", "WART"};
String WAT[] = new String[] {"Western African Time", "WAT", String WAT[] = new String[] {"Western African Time", "WAT",
"Western African Summer Time", "WAST"}; "Western African Summer Time", "WAST",
"Western African Time", "WAT"};
String WET[] = new String[] {"Western European Time", "WET", String WET[] = new String[] {"Western European Time", "WET",
"Western European Summer Time", "WEST"}; "Western European Summer Time", "WEST",
"Western European Time", "WET"};
String WIT[] = new String[] {"West Indonesia Time", "WIT", String WIT[] = new String[] {"West Indonesia Time", "WIT",
"West Indonesia Summer Time", "WIST"}; "West Indonesia Summer Time", "WIST",
"West Indonesia Time", "WIT"};
String WST_AUS[] = new String[] {"Western Standard Time (Australia)", "WST", String WST_AUS[] = new String[] {"Western Standard Time (Australia)", "WST",
"Western Summer Time (Australia)", "WST"}; "Western Summer Time (Australia)", "WST",
"Western Time (Australia)", "WT"};
String SAMOA[] = new String[] {"Samoa Standard Time", "SST", String SAMOA[] = new String[] {"Samoa Standard Time", "SST",
"Samoa Daylight Time", "SDT"}; "Samoa Daylight Time", "SDT",
"Samoa Time", "ST"};
String WST_SAMOA[] = new String[] {"West Samoa Time", "WST", String WST_SAMOA[] = new String[] {"West Samoa Time", "WST",
"West Samoa Daylight Time", "WSDT"}; "West Samoa Daylight Time", "WSDT",
"West Samoa Time", "WST"};
String ChST[] = new String[] {"Chamorro Standard Time", "ChST", String ChST[] = new String[] {"Chamorro Standard Time", "ChST",
"Chamorro Daylight Time", "ChDT"}; "Chamorro Daylight Time", "ChDT",
"Chamorro Time", "ChT"};
String VICTORIA[] = new String[] {"Eastern Standard Time (Victoria)", "EST", String VICTORIA[] = new String[] {"Eastern Standard Time (Victoria)", "EST",
"Eastern Summer Time (Victoria)", "EST"}; "Eastern Summer Time (Victoria)", "EST",
"Eastern Time (Victoria)", "ET"};
String UTC[] = new String[] {"Coordinated Universal Time", "UTC", String UTC[] = new String[] {"Coordinated Universal Time", "UTC",
"Coordinated Universal Time", "UTC",
"Coordinated Universal Time", "UTC"}; "Coordinated Universal Time", "UTC"};
String UZT[] = new String[] {"Uzbekistan Time", "UZT", String UZT[] = new String[] {"Uzbekistan Time", "UZT",
"Uzbekistan Summer Time", "UZST"}; "Uzbekistan Summer Time", "UZST",
"Uzbekistan Time", "UZT"};
return new Object[][] { return new Object[][] {
{"America/Los_Angeles", PST}, {"America/Los_Angeles", PST},
...@@ -309,7 +387,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -309,7 +387,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"America/Argentina/Ushuaia", AGT}, {"America/Argentina/Ushuaia", AGT},
{"America/Aruba", AST}, {"America/Aruba", AST},
{"America/Asuncion", new String[] {"Paraguay Time", "PYT", {"America/Asuncion", new String[] {"Paraguay Time", "PYT",
"Paraguay Summer Time", "PYST"}}, "Paraguay Summer Time", "PYST",
"Paraguay Time", "PYT"}},
{"America/Atikokan", EST}, {"America/Atikokan", EST},
{"America/Atka", HAST}, {"America/Atka", HAST},
{"America/Bahia", BRT}, {"America/Bahia", BRT},
...@@ -320,17 +399,20 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -320,17 +399,20 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"America/Blanc-Sablon", AST}, {"America/Blanc-Sablon", AST},
{"America/Boa_Vista", AMT}, {"America/Boa_Vista", AMT},
{"America/Bogota", new String[] {"Colombia Time", "COT", {"America/Bogota", new String[] {"Colombia Time", "COT",
"Colombia Summer Time", "COST"}}, "Colombia Summer Time", "COST",
"Colombia Time", "COT"}},
{"America/Boise", MST}, {"America/Boise", MST},
{"America/Buenos_Aires", AGT}, {"America/Buenos_Aires", AGT},
{"America/Cambridge_Bay", MST}, {"America/Cambridge_Bay", MST},
{"America/Campo_Grande", AMT}, {"America/Campo_Grande", AMT},
{"America/Cancun", CST}, {"America/Cancun", CST},
{"America/Caracas", new String[] {"Venezuela Time", "VET", {"America/Caracas", new String[] {"Venezuela Time", "VET",
"Venezuela Summer Time", "VEST"}}, "Venezuela Summer Time", "VEST",
"Venezuela Time", "VET"}},
{"America/Catamarca", AGT}, {"America/Catamarca", AGT},
{"America/Cayenne", new String[] {"French Guiana Time", "GFT", {"America/Cayenne", new String[] {"French Guiana Time", "GFT",
"French Guiana Summer Time", "GFST"}}, "French Guiana Summer Time", "GFST",
"French Guiana Time", "GFT"}},
{"America/Cayman", EST}, {"America/Cayman", EST},
{"America/Chihuahua", MST}, {"America/Chihuahua", MST},
{"America/Creston", MST}, {"America/Creston", MST},
...@@ -352,16 +434,19 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -352,16 +434,19 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"America/Fortaleza", BRT}, {"America/Fortaleza", BRT},
{"America/Glace_Bay", AST}, {"America/Glace_Bay", AST},
{"America/Godthab", new String[] {"Western Greenland Time", "WGT", {"America/Godthab", new String[] {"Western Greenland Time", "WGT",
"Western Greenland Summer Time", "WGST"}}, "Western Greenland Summer Time", "WGST",
"Western Greenland Time", "WGT"}},
{"America/Goose_Bay", AST}, {"America/Goose_Bay", AST},
{"America/Grand_Turk", EST}, {"America/Grand_Turk", EST},
{"America/Grenada", AST}, {"America/Grenada", AST},
{"America/Guadeloupe", AST}, {"America/Guadeloupe", AST},
{"America/Guatemala", CST}, {"America/Guatemala", CST},
{"America/Guayaquil", new String[] {"Ecuador Time", "ECT", {"America/Guayaquil", new String[] {"Ecuador Time", "ECT",
"Ecuador Summer Time", "ECST"}}, "Ecuador Summer Time", "ECST",
"Ecuador Time", "ECT"}},
{"America/Guyana", new String[] {"Guyana Time", "GYT", {"America/Guyana", new String[] {"Guyana Time", "GYT",
"Guyana Summer Time", "GYST"}}, "Guyana Summer Time", "GYST",
"Guyana Time", "GYT"}},
{"America/Havana", CUBA}, {"America/Havana", CUBA},
{"America/Hermosillo", MST}, {"America/Hermosillo", MST},
{"America/Indiana/Indianapolis", EST}, {"America/Indiana/Indianapolis", EST},
...@@ -382,9 +467,11 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -382,9 +467,11 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"America/Knox_IN", CST}, {"America/Knox_IN", CST},
{"America/Kralendijk", AST}, {"America/Kralendijk", AST},
{"America/La_Paz", new String[] {"Bolivia Time", "BOT", {"America/La_Paz", new String[] {"Bolivia Time", "BOT",
"Bolivia Summer Time", "BOST"}}, "Bolivia Summer Time", "BOST",
"Bolivia Time", "BOT"}},
{"America/Lima", new String[] {"Peru Time", "PET", {"America/Lima", new String[] {"Peru Time", "PET",
"Peru Summer Time", "PEST"}}, "Peru Summer Time", "PEST",
"Peru Time", "PET"}},
{"America/Louisville", EST}, {"America/Louisville", EST},
{"America/Lower_Princes", AST}, {"America/Lower_Princes", AST},
{"America/Maceio", BRT}, {"America/Maceio", BRT},
...@@ -398,13 +485,16 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -398,13 +485,16 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"America/Menominee", CST}, {"America/Menominee", CST},
{"America/Merida", CST}, {"America/Merida", CST},
{"America/Metlakatla", new String[] {"Metlakatla Standard Time", "MeST", {"America/Metlakatla", new String[] {"Metlakatla Standard Time", "MeST",
"Metlakatla Daylight Time", "MeDT"}}, "Metlakatla Daylight Time", "MeDT",
"Metlakatla Time", "MeT"}},
{"America/Mexico_City", CST}, {"America/Mexico_City", CST},
{"America/Miquelon", new String[] {"Pierre & Miquelon Standard Time", "PMST", {"America/Miquelon", new String[] {"Pierre & Miquelon Standard Time", "PMST",
"Pierre & Miquelon Daylight Time", "PMDT"}}, "Pierre & Miquelon Daylight Time", "PMDT",
"Pierre & Miquelon Time", "PMT"}},
{"America/Moncton", AST}, {"America/Moncton", AST},
{"America/Montevideo", new String[] {"Uruguay Time", "UYT", {"America/Montevideo", new String[] {"Uruguay Time", "UYT",
"Uruguay Summer Time", "UYST"}}, "Uruguay Summer Time", "UYST",
"Uruguay Time", "UYT"}},
{"America/Monterrey", CST}, {"America/Monterrey", CST},
{"America/Montreal", EST}, {"America/Montreal", EST},
{"America/Montserrat", AST}, {"America/Montserrat", AST},
...@@ -419,7 +509,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -419,7 +509,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"America/Panama", EST}, {"America/Panama", EST},
{"America/Pangnirtung", EST}, {"America/Pangnirtung", EST},
{"America/Paramaribo", new String[] {"Suriname Time", "SRT", {"America/Paramaribo", new String[] {"Suriname Time", "SRT",
"Suriname Summer Time", "SRST"}}, "Suriname Summer Time", "SRST",
"Suriname Time", "SRT"}},
{"America/Port-au-Prince", EST}, {"America/Port-au-Prince", EST},
{"America/Port_of_Spain", AST}, {"America/Port_of_Spain", AST},
{"America/Porto_Acre", AMT}, {"America/Porto_Acre", AMT},
...@@ -459,113 +550,143 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -459,113 +550,143 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS}, {"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"Davis Time", "DAVT", {"Antarctica/Davis", new String[] {"Davis Time", "DAVT",
"Davis Summer Time", "DAVST"}}, "Davis Summer Time", "DAVST",
"Davis Time", "DAVT"}},
{"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Time", "DDUT", {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Time", "DDUT",
"Dumont-d'Urville Summer Time", "DDUST"}}, "Dumont-d'Urville Summer Time", "DDUST",
"Dumont-d'Urville Time", "DDUT"}},
{"Antarctica/Macquarie", new String[] {"Macquarie Island Time", "MIST", {"Antarctica/Macquarie", new String[] {"Macquarie Island Time", "MIST",
"Macquarie Island Summer Time", "MIST"}}, "Macquarie Island Summer Time", "MIST",
"Macquarie Island Time", "MIST"}},
{"Antarctica/Mawson", new String[] {"Mawson Time", "MAWT", {"Antarctica/Mawson", new String[] {"Mawson Time", "MAWT",
"Mawson Summer Time", "MAWST"}}, "Mawson Summer Time", "MAWST",
"Mawson Time", "MAWT"}},
{"Antarctica/McMurdo", NZST}, {"Antarctica/McMurdo", NZST},
{"Antarctica/Palmer", CLT}, {"Antarctica/Palmer", CLT},
{"Antarctica/Rothera", new String[] {"Rothera Time", "ROTT", {"Antarctica/Rothera", new String[] {"Rothera Time", "ROTT",
"Rothera Summer Time", "ROTST"}}, "Rothera Summer Time", "ROTST",
"Rothera Time", "ROTT"}},
{"Antarctica/South_Pole", NZST}, {"Antarctica/South_Pole", NZST},
{"Antarctica/Syowa", new String[] {"Syowa Time", "SYOT", {"Antarctica/Syowa", new String[] {"Syowa Time", "SYOT",
"Syowa Summer Time", "SYOST"}}, "Syowa Summer Time", "SYOST",
"Syowa Time", "SYOT"}},
{"Antarctica/Vostok", new String[] {"Vostok Time", "VOST", {"Antarctica/Vostok", new String[] {"Vostok Time", "VOST",
"Vostok Summer Time", "VOSST"}}, "Vostok Summer Time", "VOSST",
"Vostok Time", "VOST"}},
{"Arctic/Longyearbyen", CET}, {"Arctic/Longyearbyen", CET},
{"Asia/Aden", ARAST}, {"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Alma-Ata Time", "ALMT", {"Asia/Almaty", new String[] {"Alma-Ata Time", "ALMT",
"Alma-Ata Summer Time", "ALMST"}}, "Alma-Ata Summer Time", "ALMST",
"Alma-Ata Time", "ALMT"}},
{"Asia/Amman", EET}, {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"Anadyr Time", "ANAT", {"Asia/Anadyr", new String[] {"Anadyr Time", "ANAT",
"Anadyr Summer Time", "ANAST"}}, "Anadyr Summer Time", "ANAST",
"Anadyr Time", "ANAT"}},
{"Asia/Aqtau", new String[] {"Aqtau Time", "AQTT", {"Asia/Aqtau", new String[] {"Aqtau Time", "AQTT",
"Aqtau Summer Time", "AQTST"}}, "Aqtau Summer Time", "AQTST",
"Aqtau Time", "AQTT"}},
{"Asia/Aqtobe", new String[] {"Aqtobe Time", "AQTT", {"Asia/Aqtobe", new String[] {"Aqtobe Time", "AQTT",
"Aqtobe Summer Time", "AQTST"}}, "Aqtobe Summer Time", "AQTST",
"Aqtobe Time", "AQTT"}},
{"Asia/Ashgabat", TMT}, {"Asia/Ashgabat", TMT},
{"Asia/Ashkhabad", TMT}, {"Asia/Ashkhabad", TMT},
{"Asia/Baghdad", ARAST}, {"Asia/Baghdad", ARAST},
{"Asia/Bahrain", ARAST}, {"Asia/Bahrain", ARAST},
{"Asia/Baku", new String[] {"Azerbaijan Time", "AZT", {"Asia/Baku", new String[] {"Azerbaijan Time", "AZT",
"Azerbaijan Summer Time", "AZST"}}, "Azerbaijan Summer Time", "AZST",
"Azerbaijan Time", "AZT"}},
{"Asia/Bangkok", ICT}, {"Asia/Bangkok", ICT},
{"Asia/Beirut", EET}, {"Asia/Beirut", EET},
{"Asia/Bishkek", new String[] {"Kirgizstan Time", "KGT", {"Asia/Bishkek", new String[] {"Kirgizstan Time", "KGT",
"Kirgizstan Summer Time", "KGST"}}, "Kirgizstan Summer Time", "KGST",
"Kirgizstan Time", "KGT"}},
{"Asia/Brunei", new String[] {"Brunei Time", "BNT", {"Asia/Brunei", new String[] {"Brunei Time", "BNT",
"Brunei Summer Time", "BNST"}}, "Brunei Summer Time", "BNST",
"Brunei Time", "BNT"}},
{"Asia/Calcutta", IST}, {"Asia/Calcutta", IST},
{"Asia/Choibalsan", new String[] {"Choibalsan Time", "CHOT", {"Asia/Choibalsan", new String[] {"Choibalsan Time", "CHOT",
"Choibalsan Summer Time", "CHOST"}}, "Choibalsan Summer Time", "CHOST",
"Choibalsan Time", "CHOT"}},
{"Asia/Chongqing", CTT}, {"Asia/Chongqing", CTT},
{"Asia/Chungking", CTT}, {"Asia/Chungking", CTT},
{"Asia/Colombo", IST}, {"Asia/Colombo", IST},
{"Asia/Dacca", BDT}, {"Asia/Dacca", BDT},
{"Asia/Dhaka", BDT}, {"Asia/Dhaka", BDT},
{"Asia/Dili", new String[] {"Timor-Leste Time", "TLT", {"Asia/Dili", new String[] {"Timor-Leste Time", "TLT",
"Timor-Leste Summer Time", "TLST"}}, "Timor-Leste Summer Time", "TLST",
"Timor-Leste Time", "TLT"}},
{"Asia/Damascus", EET}, {"Asia/Damascus", EET},
{"Asia/Dubai", GST}, {"Asia/Dubai", GST},
{"Asia/Dushanbe", new String[] {"Tajikistan Time", "TJT", {"Asia/Dushanbe", new String[] {"Tajikistan Time", "TJT",
"Tajikistan Summer Time", "TJST"}}, "Tajikistan Summer Time", "TJST",
"Tajikistan Time", "TJT"}},
{"Asia/Gaza", EET}, {"Asia/Gaza", EET},
{"Asia/Harbin", CTT}, {"Asia/Harbin", CTT},
{"Asia/Hebron", EET}, {"Asia/Hebron", EET},
{"Asia/Ho_Chi_Minh", ICT}, {"Asia/Ho_Chi_Minh", ICT},
{"Asia/Hong_Kong", HKT}, {"Asia/Hong_Kong", HKT},
{"Asia/Hovd", new String[] {"Hovd Time", "HOVT", {"Asia/Hovd", new String[] {"Hovd Time", "HOVT",
"Hovd Summer Time", "HOVST"}}, "Hovd Summer Time", "HOVST",
"Hovd Time", "HOVT"}},
{"Asia/Irkutsk", new String[] {"Irkutsk Time", "IRKT", {"Asia/Irkutsk", new String[] {"Irkutsk Time", "IRKT",
"Irkutsk Summer Time", "IRKST"}}, "Irkutsk Summer Time", "IRKST",
"Irkutsk Time", "IRKT"}},
{"Asia/Istanbul", EET}, {"Asia/Istanbul", EET},
{"Asia/Jakarta", WIT}, {"Asia/Jakarta", WIT},
{"Asia/Jayapura", new String[] {"East Indonesia Time", "EIT", {"Asia/Jayapura", new String[] {"East Indonesia Time", "EIT",
"East Indonesia Summer Time", "EIST"}}, "East Indonesia Summer Time", "EIST",
"East Indonesia Time", "EIT"}},
{"Asia/Kabul", new String[] {"Afghanistan Time", "AFT", {"Asia/Kabul", new String[] {"Afghanistan Time", "AFT",
"Afghanistan Summer Time", "AFST"}}, "Afghanistan Summer Time", "AFST",
"Afghanistan Time", "AFT"}},
{"Asia/Kamchatka", new String[] {"Petropavlovsk-Kamchatski Time", "PETT", {"Asia/Kamchatka", new String[] {"Petropavlovsk-Kamchatski Time", "PETT",
"Petropavlovsk-Kamchatski Summer Time", "PETST"}}, "Petropavlovsk-Kamchatski Summer Time", "PETST",
"Petropavlovsk-Kamchatski Time", "PETT"}},
{"Asia/Karachi", PKT}, {"Asia/Karachi", PKT},
{"Asia/Kashgar", CTT}, {"Asia/Kashgar", CTT},
{"Asia/Kathmandu", NPT}, {"Asia/Kathmandu", NPT},
{"Asia/Katmandu", NPT}, {"Asia/Katmandu", NPT},
{"Asia/Kolkata", IST}, {"Asia/Kolkata", IST},
{"Asia/Krasnoyarsk", new String[] {"Krasnoyarsk Time", "KRAT", {"Asia/Krasnoyarsk", new String[] {"Krasnoyarsk Time", "KRAT",
"Krasnoyarsk Summer Time", "KRAST"}}, "Krasnoyarsk Summer Time", "KRAST",
"Krasnoyarsk Time", "KRAT"}},
{"Asia/Kuala_Lumpur", MYT}, {"Asia/Kuala_Lumpur", MYT},
{"Asia/Kuching", MYT}, {"Asia/Kuching", MYT},
{"Asia/Kuwait", ARAST}, {"Asia/Kuwait", ARAST},
{"Asia/Macao", CTT}, {"Asia/Macao", CTT},
{"Asia/Macau", CTT}, {"Asia/Macau", CTT},
{"Asia/Magadan", new String[] {"Magadan Time", "MAGT", {"Asia/Magadan", new String[] {"Magadan Time", "MAGT",
"Magadan Summer Time", "MAGST"}}, "Magadan Summer Time", "MAGST",
"Magadan Time", "MAGT"}},
{"Asia/Makassar", CIT}, {"Asia/Makassar", CIT},
{"Asia/Manila", new String[] {"Philippines Time", "PHT", {"Asia/Manila", new String[] {"Philippines Time", "PHT",
"Philippines Summer Time", "PHST"}}, "Philippines Summer Time", "PHST",
"Philippines Time", "PHT"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novokuznetsk", NOVT}, {"Asia/Novokuznetsk", NOVT},
{"Asia/Novosibirsk", NOVT}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Oral Time", "ORAT", {"Asia/Oral", new String[] {"Oral Time", "ORAT",
"Oral Summer Time", "ORAST"}}, "Oral Summer Time", "ORAST",
"Oral Time", "ORAT"}},
{"Asia/Omsk", new String[] {"Omsk Time", "OMST", {"Asia/Omsk", new String[] {"Omsk Time", "OMST",
"Omsk Summer Time", "OMSST"}}, "Omsk Summer Time", "OMSST",
"Omsk Time", "OMST"}},
{"Asia/Phnom_Penh", ICT}, {"Asia/Phnom_Penh", ICT},
{"Asia/Pontianak", WIT}, {"Asia/Pontianak", WIT},
{"Asia/Pyongyang", KST}, {"Asia/Pyongyang", KST},
{"Asia/Qatar", ARAST}, {"Asia/Qatar", ARAST},
{"Asia/Qyzylorda", new String[] {"Qyzylorda Time", "QYZT", {"Asia/Qyzylorda", new String[] {"Qyzylorda Time", "QYZT",
"Qyzylorda Summer Time", "QYZST"}}, "Qyzylorda Summer Time", "QYZST",
"Qyzylorda Time", "QYZT"}},
{"Asia/Rangoon", new String[] {"Myanmar Time", "MMT", {"Asia/Rangoon", new String[] {"Myanmar Time", "MMT",
"Myanmar Summer Time", "MMST"}}, "Myanmar Summer Time", "MMST",
"Myanmar Time", "MMT"}},
{"Asia/Riyadh", ARAST}, {"Asia/Riyadh", ARAST},
{"Asia/Saigon", ICT}, {"Asia/Saigon", ICT},
{"Asia/Sakhalin", new String[] {"Sakhalin Time", "SAKT", {"Asia/Sakhalin", new String[] {"Sakhalin Time", "SAKT",
"Sakhalin Summer Time", "SAKST"}}, "Sakhalin Summer Time", "SAKST",
"Sakhalin Time", "SAKT"}},
{"Asia/Samarkand", UZT}, {"Asia/Samarkand", UZT},
{"Asia/Seoul", KST}, {"Asia/Seoul", KST},
{"Asia/Singapore", SGT}, {"Asia/Singapore", SGT},
...@@ -573,7 +694,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -573,7 +694,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"Asia/Tel_Aviv", ISRAEL}, {"Asia/Tel_Aviv", ISRAEL},
{"Asia/Tashkent", UZT}, {"Asia/Tashkent", UZT},
{"Asia/Tbilisi", new String[] {"Georgia Time", "GET", {"Asia/Tbilisi", new String[] {"Georgia Time", "GET",
"Georgia Summer Time", "GEST"}}, "Georgia Summer Time", "GEST",
"Georgia Time", "GET"}},
{"Asia/Tehran", IRT}, {"Asia/Tehran", IRT},
{"Asia/Thimbu", BTT}, {"Asia/Thimbu", BTT},
{"Asia/Thimphu", BTT}, {"Asia/Thimphu", BTT},
...@@ -583,28 +705,35 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -583,28 +705,35 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"Asia/Urumqi", CTT}, {"Asia/Urumqi", CTT},
{"Asia/Vientiane", ICT}, {"Asia/Vientiane", ICT},
{"Asia/Vladivostok", new String[] {"Vladivostok Time", "VLAT", {"Asia/Vladivostok", new String[] {"Vladivostok Time", "VLAT",
"Vladivostok Summer Time", "VLAST"}}, "Vladivostok Summer Time", "VLAST",
"Vladivostok Time", "VLAT"}},
{"Asia/Yakutsk", new String[] {"Yakutsk Time", "YAKT", {"Asia/Yakutsk", new String[] {"Yakutsk Time", "YAKT",
"Yakutsk Summer Time", "YAKST"}}, "Yakutsk Summer Time", "YAKST",
"Yakutsk Time", "YAKT"}},
{"Asia/Yekaterinburg", new String[] {"Yekaterinburg Time", "YEKT", {"Asia/Yekaterinburg", new String[] {"Yekaterinburg Time", "YEKT",
"Yekaterinburg Summer Time", "YEKST"}}, "Yekaterinburg Summer Time", "YEKST",
"Yekaterinburg Time", "YEKT"}},
{"Asia/Yerevan", ARMT}, {"Asia/Yerevan", ARMT},
{"Atlantic/Azores", new String[] {"Azores Time", "AZOT", {"Atlantic/Azores", new String[] {"Azores Time", "AZOT",
"Azores Summer Time", "AZOST"}}, "Azores Summer Time", "AZOST",
"Azores Time", "AZOT"}},
{"Atlantic/Bermuda", AST}, {"Atlantic/Bermuda", AST},
{"Atlantic/Canary", WET}, {"Atlantic/Canary", WET},
{"Atlantic/Cape_Verde", new String[] {"Cape Verde Time", "CVT", {"Atlantic/Cape_Verde", new String[] {"Cape Verde Time", "CVT",
"Cape Verde Summer Time", "CVST"}}, "Cape Verde Summer Time", "CVST",
"Cape Verde Time", "CVT"}},
{"Atlantic/Faeroe", WET}, {"Atlantic/Faeroe", WET},
{"Atlantic/Faroe", WET}, {"Atlantic/Faroe", WET},
{"Atlantic/Jan_Mayen", CET}, {"Atlantic/Jan_Mayen", CET},
{"Atlantic/Madeira", WET}, {"Atlantic/Madeira", WET},
{"Atlantic/Reykjavik", GMT}, {"Atlantic/Reykjavik", GMT},
{"Atlantic/South_Georgia", new String[] {"South Georgia Standard Time", "GST", {"Atlantic/South_Georgia", new String[] {"South Georgia Standard Time", "GST",
"South Georgia Daylight Time", "GDT"}}, "South Georgia Daylight Time", "GDT",
"South Georgia Time", "GT"}},
{"Atlantic/St_Helena", GMT}, {"Atlantic/St_Helena", GMT},
{"Atlantic/Stanley", new String[] {"Falkland Is. Time", "FKT", {"Atlantic/Stanley", new String[] {"Falkland Is. Time", "FKT",
"Falkland Is. Summer Time", "FKST"}}, "Falkland Is. Summer Time", "FKST",
"Falkland Is. Time", "FKT"}},
{"Australia/ACT", EST_NSW}, {"Australia/ACT", EST_NSW},
{"Australia/Adelaide", ADELAIDE}, {"Australia/Adelaide", ADELAIDE},
{"Australia/Brisbane", BRISBANE}, {"Australia/Brisbane", BRISBANE},
...@@ -613,7 +742,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -613,7 +742,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"Australia/Currie", EST_NSW}, {"Australia/Currie", EST_NSW},
{"Australia/Darwin", DARWIN}, {"Australia/Darwin", DARWIN},
{"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST", {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
"Central Western Summer Time (Australia)", "CWST"}}, "Central Western Summer Time (Australia)", "CWST",
"Central Western Time (Australia)", "CWT"}},
{"Australia/Hobart", TASMANIA}, {"Australia/Hobart", TASMANIA},
{"Australia/LHI", LORD_HOWE}, {"Australia/LHI", LORD_HOWE},
{"Australia/Lindeman", BRISBANE}, {"Australia/Lindeman", BRISBANE},
...@@ -697,7 +827,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -697,7 +827,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"Europe/Riga", EET}, {"Europe/Riga", EET},
{"Europe/Rome", CET}, {"Europe/Rome", CET},
{"Europe/Samara", new String[] {"Samara Time", "SAMT", {"Europe/Samara", new String[] {"Samara Time", "SAMT",
"Samara Summer Time", "SAMST"}}, "Samara Summer Time", "SAMST",
"Samara Time", "SAMT"}},
{"Europe/San_Marino", CET}, {"Europe/San_Marino", CET},
{"Europe/Sarajevo", CET}, {"Europe/Sarajevo", CET},
{"Europe/Simferopol", EET}, {"Europe/Simferopol", EET},
...@@ -713,7 +844,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -713,7 +844,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"Europe/Vienna", CET}, {"Europe/Vienna", CET},
{"Europe/Vilnius", EET}, {"Europe/Vilnius", EET},
{"Europe/Volgograd", new String[] {"Volgograd Time", "VOLT", {"Europe/Volgograd", new String[] {"Volgograd Time", "VOLT",
"Volgograd Summer Time", "VOLST"}}, "Volgograd Summer Time", "VOLST",
"Volgograd Time", "VOLT"}},
{"Europe/Warsaw", CET}, {"Europe/Warsaw", CET},
{"Europe/Zagreb", CET}, {"Europe/Zagreb", CET},
{"Europe/Zaporozhye", EET}, {"Europe/Zaporozhye", EET},
...@@ -727,30 +859,39 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -727,30 +859,39 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"IST", IST}, {"IST", IST},
{"Indian/Antananarivo", EAT}, {"Indian/Antananarivo", EAT},
{"Indian/Chagos", new String[] {"Indian Ocean Territory Time", "IOT", {"Indian/Chagos", new String[] {"Indian Ocean Territory Time", "IOT",
"Indian Ocean Territory Summer Time", "IOST"}}, "Indian Ocean Territory Summer Time", "IOST",
"Indian Ocean Territory Time", "IOT"}},
{"Indian/Christmas", new String[] {"Christmas Island Time", "CXT", {"Indian/Christmas", new String[] {"Christmas Island Time", "CXT",
"Christmas Island Summer Time", "CXST"}}, "Christmas Island Summer Time", "CXST",
"Christmas Island Time", "CIT"}},
{"Indian/Cocos", new String[] {"Cocos Islands Time", "CCT", {"Indian/Cocos", new String[] {"Cocos Islands Time", "CCT",
"Cocos Islands Summer Time", "CCST"}}, "Cocos Islands Summer Time", "CCST",
"Cocos Islands Time", "CCT"}},
{"Indian/Comoro", EAT}, {"Indian/Comoro", EAT},
{"Indian/Kerguelen", new String[] {"French Southern & Antarctic Lands Time", "TFT", {"Indian/Kerguelen", new String[] {"French Southern & Antarctic Lands Time", "TFT",
"French Southern & Antarctic Lands Summer Time", "TFST"}}, "French Southern & Antarctic Lands Summer Time", "TFST",
"French Southern & Antarctic Lands Time", "TFT"}},
{"Indian/Mahe", new String[] {"Seychelles Time", "SCT", {"Indian/Mahe", new String[] {"Seychelles Time", "SCT",
"Seychelles Summer Time", "SCST"}}, "Seychelles Summer Time", "SCST",
"Seychelles Time", "SCT"}},
{"Indian/Maldives", new String[] {"Maldives Time", "MVT", {"Indian/Maldives", new String[] {"Maldives Time", "MVT",
"Maldives Summer Time", "MVST"}}, "Maldives Summer Time", "MVST",
"Maldives Time", "MVT"}},
{"Indian/Mauritius", new String[] {"Mauritius Time", "MUT", {"Indian/Mauritius", new String[] {"Mauritius Time", "MUT",
"Mauritius Summer Time", "MUST"}}, "Mauritius Summer Time", "MUST",
"Mauritius Time", "MUT"}},
{"Indian/Mayotte", EAT}, {"Indian/Mayotte", EAT},
{"Indian/Reunion", new String[] {"Reunion Time", "RET", {"Indian/Reunion", new String[] {"Reunion Time", "RET",
"Reunion Summer Time", "REST"}}, "Reunion Summer Time", "REST",
"Reunion Time", "RET"}},
{"Israel", ISRAEL}, {"Israel", ISRAEL},
{"Jamaica", EST}, {"Jamaica", EST},
{"Japan", JST}, {"Japan", JST},
{"Kwajalein", MHT}, {"Kwajalein", MHT},
{"Libya", EET}, {"Libya", EET},
{"MET", new String[] {"Middle Europe Time", "MET", {"MET", new String[] {"Middle Europe Time", "MET",
"Middle Europe Summer Time", "MEST"}}, "Middle Europe Summer Time", "MEST",
"Middle Europe Time", "MET"}},
{"Mexico/BajaNorte", PST}, {"Mexico/BajaNorte", PST},
{"Mexico/BajaSur", MST}, {"Mexico/BajaSur", MST},
{"Mexico/General", CST}, {"Mexico/General", CST},
...@@ -770,61 +911,82 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { ...@@ -770,61 +911,82 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"Pacific/Chuuk", CHUT}, {"Pacific/Chuuk", CHUT},
{"Pacific/Easter", EASTER}, {"Pacific/Easter", EASTER},
{"Pacific/Efate", new String[] {"Vanuatu Time", "VUT", {"Pacific/Efate", new String[] {"Vanuatu Time", "VUT",
"Vanuatu Summer Time", "VUST"}}, "Vanuatu Summer Time", "VUST",
"Vanuatu Time", "VUT"}},
{"Pacific/Enderbury", new String[] {"Phoenix Is. Time", "PHOT", {"Pacific/Enderbury", new String[] {"Phoenix Is. Time", "PHOT",
"Phoenix Is. Summer Time", "PHOST"}}, "Phoenix Is. Summer Time", "PHOST",
"Phoenix Is. Time", "PHOT"}},
{"Pacific/Fakaofo", new String[] {"Tokelau Time", "TKT", {"Pacific/Fakaofo", new String[] {"Tokelau Time", "TKT",
"Tokelau Summer Time", "TKST"}}, "Tokelau Summer Time", "TKST",
"Tokelau Time", "TKT"}},
{"Pacific/Fiji", new String[] {"Fiji Time", "FJT", {"Pacific/Fiji", new String[] {"Fiji Time", "FJT",
"Fiji Summer Time", "FJST"}}, "Fiji Summer Time", "FJST",
"Fiji Time", "FJT"}},
{"Pacific/Funafuti", new String[] {"Tuvalu Time", "TVT", {"Pacific/Funafuti", new String[] {"Tuvalu Time", "TVT",
"Tuvalu Summer Time", "TVST"}}, "Tuvalu Summer Time", "TVST",
"Tuvalu Time", "TVT"}},
{"Pacific/Galapagos", new String[] {"Galapagos Time", "GALT", {"Pacific/Galapagos", new String[] {"Galapagos Time", "GALT",
"Galapagos Summer Time", "GALST"}}, "Galapagos Summer Time", "GALST",
"Galapagos Time", "GALT"}},
{"Pacific/Gambier", GAMBIER}, {"Pacific/Gambier", GAMBIER},
{"Pacific/Guadalcanal", SBT}, {"Pacific/Guadalcanal", SBT},
{"Pacific/Guam", ChST}, {"Pacific/Guam", ChST},
{"Pacific/Johnston", HST}, {"Pacific/Johnston", HST},
{"Pacific/Kiritimati", new String[] {"Line Is. Time", "LINT", {"Pacific/Kiritimati", new String[] {"Line Is. Time", "LINT",
"Line Is. Summer Time", "LINST"}}, "Line Is. Summer Time", "LINST",
"Line Is. Time", "LINT"}},
{"Pacific/Kosrae", new String[] {"Kosrae Time", "KOST", {"Pacific/Kosrae", new String[] {"Kosrae Time", "KOST",
"Kosrae Summer Time", "KOSST"}}, "Kosrae Summer Time", "KOSST",
"Kosrae Time", "KOST"}},
{"Pacific/Kwajalein", MHT}, {"Pacific/Kwajalein", MHT},
{"Pacific/Majuro", MHT}, {"Pacific/Majuro", MHT},
{"Pacific/Marquesas", new String[] {"Marquesas Time", "MART", {"Pacific/Marquesas", new String[] {"Marquesas Time", "MART",
"Marquesas Summer Time", "MARST"}}, "Marquesas Summer Time", "MARST",
"Marquesas Time", "MART"}},
{"Pacific/Midway", SAMOA}, {"Pacific/Midway", SAMOA},
{"Pacific/Nauru", new String[] {"Nauru Time", "NRT", {"Pacific/Nauru", new String[] {"Nauru Time", "NRT",
"Nauru Summer Time", "NRST"}}, "Nauru Summer Time", "NRST",
"Nauru Time", "NRT"}},
{"Pacific/Niue", new String[] {"Niue Time", "NUT", {"Pacific/Niue", new String[] {"Niue Time", "NUT",
"Niue Summer Time", "NUST"}}, "Niue Summer Time", "NUST",
"Niue Time", "NUT"}},
{"Pacific/Norfolk", new String[] {"Norfolk Time", "NFT", {"Pacific/Norfolk", new String[] {"Norfolk Time", "NFT",
"Norfolk Summer Time", "NFST"}}, "Norfolk Summer Time", "NFST",
"Norfolk Time", "NFT"}},
{"Pacific/Noumea", new String[] {"New Caledonia Time", "NCT", {"Pacific/Noumea", new String[] {"New Caledonia Time", "NCT",
"New Caledonia Summer Time", "NCST"}}, "New Caledonia Summer Time", "NCST",
"New Caledonia Time", "NCT"}},
{"Pacific/Pago_Pago", SAMOA}, {"Pacific/Pago_Pago", SAMOA},
{"Pacific/Palau", new String[] {"Palau Time", "PWT", {"Pacific/Palau", new String[] {"Palau Time", "PWT",
"Palau Summer Time", "PWST"}}, "Palau Summer Time", "PWST",
"Palau Time", "PWT"}},
{"Pacific/Pitcairn", PITCAIRN}, {"Pacific/Pitcairn", PITCAIRN},
{"Pacific/Pohnpei", PONT}, {"Pacific/Pohnpei", PONT},
{"Pacific/Ponape", PONT}, {"Pacific/Ponape", PONT},
{"Pacific/Port_Moresby", new String[] {"Papua New Guinea Time", "PGT", {"Pacific/Port_Moresby", new String[] {"Papua New Guinea Time", "PGT",
"Papua New Guinea Summer Time", "PGST"}}, "Papua New Guinea Summer Time", "PGST",
"Papua New Guinea Time", "PGT"}},
{"Pacific/Rarotonga", new String[] {"Cook Is. Time", "CKT", {"Pacific/Rarotonga", new String[] {"Cook Is. Time", "CKT",
"Cook Is. Summer Time", "CKHST"}}, "Cook Is. Summer Time", "CKHST",
"Cook Is. Time", "CKT"}},
{"Pacific/Saipan", ChST}, {"Pacific/Saipan", ChST},
{"Pacific/Samoa", SAMOA}, {"Pacific/Samoa", SAMOA},
{"Pacific/Tahiti", new String[] {"Tahiti Time", "TAHT", {"Pacific/Tahiti", new String[] {"Tahiti Time", "TAHT",
"Tahiti Summer Time", "TAHST"}}, "Tahiti Summer Time", "TAHST",
"Tahiti Time", "TAHT"}},
{"Pacific/Tarawa", new String[] {"Gilbert Is. Time", "GILT", {"Pacific/Tarawa", new String[] {"Gilbert Is. Time", "GILT",
"Gilbert Is. Summer Time", "GILST"}}, "Gilbert Is. Summer Time", "GILST",
"Gilbert Is. Time", "GILT"}},
{"Pacific/Tongatapu", new String[] {"Tonga Time", "TOT", {"Pacific/Tongatapu", new String[] {"Tonga Time", "TOT",
"Tonga Summer Time", "TOST"}}, "Tonga Summer Time", "TOST",
"Tonga Time", "TOT"}},
{"Pacific/Truk", CHUT}, {"Pacific/Truk", CHUT},
{"Pacific/Wake", new String[] {"Wake Time", "WAKT", {"Pacific/Wake", new String[] {"Wake Time", "WAKT",
"Wake Summer Time", "WAKST"}}, "Wake Summer Time", "WAKST",
"Wake Time", "WAKT"}},
{"Pacific/Wallis", new String[] {"Wallis & Futuna Time", "WFT", {"Pacific/Wallis", new String[] {"Wallis & Futuna Time", "WFT",
"Wallis & Futuna Summer Time", "WFST"}}, "Wallis & Futuna Summer Time", "WFST",
"Wallis & Futuna Time", "WFT"}},
{"Pacific/Yap", CHUT}, {"Pacific/Yap", CHUT},
{"Poland", CET}, {"Poland", CET},
{"PRC", CTT}, {"PRC", CTT},
......
...@@ -42,6 +42,9 @@ package sun.util.resources; ...@@ -42,6 +42,9 @@ package sun.util.resources;
import java.util.Map; import java.util.Map;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.MissingResourceException;
import java.util.Set;
/** /**
* Subclass of <code>ResourceBundle</code> with special * Subclass of <code>ResourceBundle</code> with special
...@@ -57,6 +60,26 @@ import java.util.LinkedHashMap; ...@@ -57,6 +60,26 @@ import java.util.LinkedHashMap;
*/ */
public abstract class TimeZoneNamesBundle extends OpenListResourceBundle { public abstract class TimeZoneNamesBundle extends OpenListResourceBundle {
/**
* Returns a String array containing time zone names. The String array has
* at most size elements.
*
* @param key the time zone ID for which names are obtained
* @param size the requested size of array for names
* @return a String array containing names
*/
public String[] getStringArray(String key, int size) {
String[] names = handleGetObject(key, size);
if ((names == null || names.length != size) && parent != null) {
names = ((TimeZoneNamesBundle)parent).getStringArray(key, size);
}
if (names == null) {
throw new MissingResourceException("no time zone names", getClass().getName(), key);
}
return names;
}
/** /**
* Maps time zone IDs to locale-specific names. * Maps time zone IDs to locale-specific names.
* The value returned is an array of five strings: * The value returned is an array of five strings:
...@@ -71,13 +94,17 @@ public abstract class TimeZoneNamesBundle extends OpenListResourceBundle { ...@@ -71,13 +94,17 @@ public abstract class TimeZoneNamesBundle extends OpenListResourceBundle {
* <code>getContents</code> implementations, while the time zone * <code>getContents</code> implementations, while the time zone
* ID is inserted into the returned array by this method. * ID is inserted into the returned array by this method.
*/ */
@Override
public Object handleGetObject(String key) { public Object handleGetObject(String key) {
return handleGetObject(key, 5);
}
private String[] handleGetObject(String key, int n) {
String[] contents = (String[]) super.handleGetObject(key); String[] contents = (String[]) super.handleGetObject(key);
if (contents == null) { if (contents == null) {
return null; return null;
} }
int clen = Math.min(n, contents.length);
int clen = contents.length;
String[] tmpobj = new String[clen+1]; String[] tmpobj = new String[clen+1];
tmpobj[0] = key; tmpobj[0] = key;
System.arraycopy(contents, 0, tmpobj, 1, clen); System.arraycopy(contents, 0, tmpobj, 1, clen);
...@@ -85,13 +112,23 @@ public abstract class TimeZoneNamesBundle extends OpenListResourceBundle { ...@@ -85,13 +112,23 @@ public abstract class TimeZoneNamesBundle extends OpenListResourceBundle {
} }
/** /**
* Use LinkedHashMap to preserve order of bundle entries. * Use LinkedHashMap to preserve the order of bundle entries.
*/ */
@Override @Override
protected Map<String, Object> createMap(int size) { protected <K, V> Map<K, V> createMap(int size) {
return new LinkedHashMap<>(size); return new LinkedHashMap<>(size);
} }
/**
* Use LinkedHashSet to preserve the key order.
* @param <E> the type of elements
* @return a Set
*/
@Override
protected <E> Set<E> createSet() {
return new LinkedHashSet<>();
}
/** /**
* Provides key/value mappings for a specific * Provides key/value mappings for a specific
* resource bundle. Each entry of the array * resource bundle. Each entry of the array
......
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -65,6 +65,7 @@ ...@@ -65,6 +65,7 @@
#include "jni.h" #include "jni.h"
#include "jvmti.h" #include "jvmti.h"
#include "classfile_constants.h" #include "classfile_constants.h"
#include "jvm_md.h"
#ifndef SKIP_NPT #ifndef SKIP_NPT
#include "npt.h" /* To get NptEnv for doing character conversions */ #include "npt.h" /* To get NptEnv for doing character conversions */
......
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -1899,6 +1899,7 @@ load_library(char *name) ...@@ -1899,6 +1899,7 @@ load_library(char *name)
*/ */
getSystemProperty("sun.boot.library.path", &boot_path); getSystemProperty("sun.boot.library.path", &boot_path);
md_build_library_name(lname, FILENAME_MAX, boot_path, name); md_build_library_name(lname, FILENAME_MAX, boot_path, name);
jvmtiDeallocate(boot_path);
handle = md_load_library(lname, err_buf, (int)sizeof(err_buf)); handle = md_load_library(lname, err_buf, (int)sizeof(err_buf));
if ( handle == NULL ) { if ( handle == NULL ) {
/* This may be necessary on Windows. */ /* This may be necessary on Windows. */
...@@ -1941,6 +1942,9 @@ lookup_library_symbol(void *library, char **symbols, int nsymbols) ...@@ -1941,6 +1942,9 @@ lookup_library_symbol(void *library, char **symbols, int nsymbols)
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM *vm, char *options, void *reserved) Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
{ {
char *boot_path = NULL;
char npt_lib[JVM_MAXPATHLEN];
/* See if it's already loaded */ /* See if it's already loaded */
if ( gdata!=NULL && gdata->isLoaded==JNI_TRUE ) { if ( gdata!=NULL && gdata->isLoaded==JNI_TRUE ) {
HPROF_ERROR(JNI_TRUE, "Cannot load this JVM TI agent twice, check your java command line for duplicate hprof options."); HPROF_ERROR(JNI_TRUE, "Cannot load this JVM TI agent twice, check your java command line for duplicate hprof options.");
...@@ -1957,9 +1961,15 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved) ...@@ -1957,9 +1961,15 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
gdata->jvm = vm; gdata->jvm = vm;
/* Get the JVMTI environment */
getJvmti();
#ifndef SKIP_NPT #ifndef SKIP_NPT
getSystemProperty("sun.boot.library.path", &boot_path);
/* Load in NPT library for character conversions */ /* Load in NPT library for character conversions */
NPT_INITIALIZE(&(gdata->npt), NPT_VERSION, NULL); md_build_library_name(npt_lib, sizeof(npt_lib), boot_path, NPT_LIBNAME);
jvmtiDeallocate(boot_path);
NPT_INITIALIZE(npt_lib, &(gdata->npt), NPT_VERSION, NULL);
if ( gdata->npt == NULL ) { if ( gdata->npt == NULL ) {
HPROF_ERROR(JNI_TRUE, "Cannot load npt library"); HPROF_ERROR(JNI_TRUE, "Cannot load npt library");
} }
...@@ -1969,9 +1979,6 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved) ...@@ -1969,9 +1979,6 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
} }
#endif #endif
/* Get the JVMTI environment */
getJvmti();
/* Lock needed to protect debug_malloc() code, which is not MT safe */ /* Lock needed to protect debug_malloc() code, which is not MT safe */
#ifdef DEBUG #ifdef DEBUG
gdata->debug_malloc_lock = createRawMonitor("HPROF debug_malloc lock"); gdata->debug_malloc_lock = createRawMonitor("HPROF debug_malloc lock");
......
...@@ -54,6 +54,32 @@ ...@@ -54,6 +54,32 @@
#define LIB_SUFFIX "so" #define LIB_SUFFIX "so"
#endif #endif
static void dll_build_name(char* buffer, size_t buflen,
const char* pname, const char* fname) {
// Based on os_solaris.cpp
char *path_sep = PATH_SEPARATOR;
char *pathname = (char *)pname;
while (strlen(pathname) > 0) {
char *p = strchr(pathname, *path_sep);
if (p == NULL) {
p = pathname + strlen(pathname);
}
/* check for NULL path */
if (p == pathname) {
continue;
}
(void)snprintf(buffer, buflen, "%.*s/lib%s." LIB_SUFFIX, (p - pathname),
pathname, fname);
if (access(buffer, F_OK) == 0) {
break;
}
pathname = p + 1;
*buffer = '\0';
}
}
/* /*
* create a string for the JNI native function name by adding the * create a string for the JNI native function name by adding the
* appropriate decorations. * appropriate decorations.
...@@ -76,16 +102,16 @@ dbgsysBuildLibName(char *holder, int holderlen, char *pname, char *fname) ...@@ -76,16 +102,16 @@ dbgsysBuildLibName(char *holder, int holderlen, char *pname, char *fname)
{ {
const int pnamelen = pname ? strlen(pname) : 0; const int pnamelen = pname ? strlen(pname) : 0;
*holder = '\0';
/* Quietly truncate on buffer overflow. Should be an error. */ /* Quietly truncate on buffer overflow. Should be an error. */
if (pnamelen + (int)strlen(fname) + 10 > holderlen) { if (pnamelen + (int)strlen(fname) + 10 > holderlen) {
*holder = '\0';
return; return;
} }
if (pnamelen == 0) { if (pnamelen == 0) {
(void)snprintf(holder, holderlen, "lib%s." LIB_SUFFIX, fname); (void)snprintf(holder, holderlen, "lib%s." LIB_SUFFIX, fname);
} else { } else {
(void)snprintf(holder, holderlen, "%s/lib%s." LIB_SUFFIX, pname, fname); dll_build_name(holder, holderlen, pname, fname);
} }
} }
......
...@@ -811,7 +811,6 @@ GetJREPath(char *path, jint pathsize, const char * arch, jboolean speculative) ...@@ -811,7 +811,6 @@ GetJREPath(char *path, jint pathsize, const char * arch, jboolean speculative)
jboolean jboolean
LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn) LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn)
{ {
Dl_info dlinfo;
void *libjvm; void *libjvm;
JLI_TraceLauncher("JVM path is %s\n", jvmpath); JLI_TraceLauncher("JVM path is %s\n", jvmpath);
......
/* /*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -415,6 +415,10 @@ public abstract class X11InputMethod extends InputMethodAdapter { ...@@ -415,6 +415,10 @@ public abstract class X11InputMethod extends InputMethodAdapter {
setXICFocus(getPeer(lastXICFocussedComponent), false, isLastXICActive); setXICFocus(getPeer(lastXICFocussedComponent), false, isLastXICActive);
lastXICFocussedComponent = null; lastXICFocussedComponent = null;
isLastXICActive = false; isLastXICActive = false;
resetXIC();
needResetXICClient = null;
needResetXIC = false;
} }
} }
......
...@@ -27,7 +27,6 @@ package sun.java2d.xr; ...@@ -27,7 +27,6 @@ package sun.java2d.xr;
import java.awt.*; import java.awt.*;
import java.awt.geom.*; import java.awt.geom.*;
import sun.awt.SunToolkit; import sun.awt.SunToolkit;
import sun.java2d.SunGraphics2D; import sun.java2d.SunGraphics2D;
import sun.java2d.loops.*; import sun.java2d.loops.*;
...@@ -39,6 +38,9 @@ import sun.java2d.pipe.SpanIterator; ...@@ -39,6 +38,9 @@ import sun.java2d.pipe.SpanIterator;
import sun.java2d.pipe.ShapeSpanIterator; import sun.java2d.pipe.ShapeSpanIterator;
import sun.java2d.pipe.LoopPipe; import sun.java2d.pipe.LoopPipe;
import static sun.java2d.xr.XRUtils.clampToShort;
import static sun.java2d.xr.XRUtils.clampToUShort;
/** /**
* XRender provides only accalerated rectangles. To emulate higher "order" * XRender provides only accalerated rectangles. To emulate higher "order"
* geometry we have to pass everything else to DoPath/FillSpans. * geometry we have to pass everything else to DoPath/FillSpans.
...@@ -70,17 +72,16 @@ public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe { ...@@ -70,17 +72,16 @@ public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe {
public void drawLine(SunGraphics2D sg2d, int x1, int y1, int x2, int y2) { public void drawLine(SunGraphics2D sg2d, int x1, int y1, int x2, int y2) {
Region compClip = sg2d.getCompClip(); Region compClip = sg2d.getCompClip();
int transX1 = x1 + sg2d.transX; int transX1 = Region.clipAdd(x1, sg2d.transX);
int transY1 = y1 + sg2d.transY; int transY1 = Region.clipAdd(y1, sg2d.transY);
int transX2 = x2 + sg2d.transX; int transX2 = Region.clipAdd(x2, sg2d.transX);
int transY2 = y2 + sg2d.transY; int transY2 = Region.clipAdd(y2, sg2d.transY);
// Non clipped fast path // Non clipped fast path
if (compClip.contains(transX1, transY1) if (compClip.contains(transX1, transY1)
&& compClip.contains(transX2, transY2)) { && compClip.contains(transX2, transY2)) {
try {
SunToolkit.awtLock(); SunToolkit.awtLock();
try {
validateSurface(sg2d); validateSurface(sg2d);
tileManager.addLine(transX1, transY1, transX2, transY2); tileManager.addLine(transX1, transY1, transX2, transY2);
tileManager.fillMask((XRSurfaceData) sg2d.surfaceData); tileManager.fillMask((XRSurfaceData) sg2d.surfaceData);
...@@ -115,20 +116,40 @@ public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe { ...@@ -115,20 +116,40 @@ public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe {
draw(sg2d, new Polygon(xpoints, ypoints, npoints)); draw(sg2d, new Polygon(xpoints, ypoints, npoints));
} }
public synchronized void fillRect(SunGraphics2D sg2d, public void fillRect(SunGraphics2D sg2d, int x, int y, int width, int height) {
int x, int y, int width, int height) { x = Region.clipAdd(x, sg2d.transX);
SunToolkit.awtLock(); y = Region.clipAdd(y, sg2d.transY);
try {
validateSurface(sg2d);
XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData; /*
* Limit x/y to signed short, width/height to unsigned short,
* to match the X11 coordinate limits for rectangles.
* Correct width/height in case x/y have been modified by clipping.
*/
if (x > Short.MAX_VALUE || y > Short.MAX_VALUE) {
return;
}
x += sg2d.transform.getTranslateX(); int x2 = Region.dimAdd(x, width);
y += sg2d.transform.getTranslateY(); int y2 = Region.dimAdd(y, height);
tileManager.addRect(x, y, width, height); if (x2 < Short.MIN_VALUE || y2 < Short.MIN_VALUE) {
tileManager.fillMask(xrsd); return;
}
x = clampToShort(x);
y = clampToShort(y);
width = clampToUShort(x2 - x);
height = clampToUShort(y2 - y);
if (width == 0 || height == 0) {
return;
}
SunToolkit.awtLock();
try {
validateSurface(sg2d);
tileManager.addRect(x, y, width, height);
tileManager.fillMask((XRSurfaceData) sg2d.surfaceData);
} finally { } finally {
SunToolkit.awtUnlock(); SunToolkit.awtUnlock();
} }
......
...@@ -255,7 +255,7 @@ public class XRUtils { ...@@ -255,7 +255,7 @@ public class XRUtils {
: (x < Short.MIN_VALUE ? Short.MIN_VALUE : x)); : (x < Short.MIN_VALUE ? Short.MIN_VALUE : x));
} }
public static short clampToUShort(int x) { public static int clampToUShort(int x) {
return (short) (x > 65535 ? 65535 : (x < 0) ? 0 : x); return (x > 65535 ? 65535 : (x < 0) ? 0 : x);
} }
} }
...@@ -25,8 +25,6 @@ ...@@ -25,8 +25,6 @@
package sun.nio.fs; package sun.nio.fs;
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException; import java.io.IOException;
/** /**
......
...@@ -29,6 +29,8 @@ import java.nio.file.*; ...@@ -29,6 +29,8 @@ import java.nio.file.*;
import java.nio.file.attribute.*; import java.nio.file.attribute.*;
import java.nio.file.spi.FileTypeDetector; import java.nio.file.spi.FileTypeDetector;
import java.io.IOException; import java.io.IOException;
import java.security.AccessController;
import sun.security.action.GetPropertyAction;
/** /**
* Linux implementation of FileSystemProvider * Linux implementation of FileSystemProvider
...@@ -100,6 +102,13 @@ public class LinuxFileSystemProvider extends UnixFileSystemProvider { ...@@ -100,6 +102,13 @@ public class LinuxFileSystemProvider extends UnixFileSystemProvider {
@Override @Override
FileTypeDetector getFileTypeDetector() { FileTypeDetector getFileTypeDetector() {
return new GnomeFileTypeDetector(); Path userMimeTypes = Paths.get(AccessController.doPrivileged(
new GetPropertyAction("user.home")), ".mime.types");
Path etcMimeTypes = Paths.get("/etc/mime.types");
return chain(new GnomeFileTypeDetector(),
new MimeTypesFileTypeDetector(userMimeTypes),
new MimeTypesFileTypeDetector(etcMimeTypes),
new MagicFileTypeDetector());
} }
} }
...@@ -25,9 +25,11 @@ ...@@ -25,9 +25,11 @@
package sun.nio.fs; package sun.nio.fs;
import java.nio.file.*; import java.nio.file.Path;
import java.nio.file.attribute.*; import java.nio.file.Paths;
import java.io.IOException; import java.nio.file.spi.FileTypeDetector;
import java.security.AccessController;
import sun.security.action.GetPropertyAction;
/** /**
* MacOSX implementation of FileSystemProvider * MacOSX implementation of FileSystemProvider
...@@ -42,4 +44,11 @@ public class MacOSXFileSystemProvider extends BsdFileSystemProvider { ...@@ -42,4 +44,11 @@ public class MacOSXFileSystemProvider extends BsdFileSystemProvider {
MacOSXFileSystem newFileSystem(String dir) { MacOSXFileSystem newFileSystem(String dir) {
return new MacOSXFileSystem(this, dir); return new MacOSXFileSystem(this, dir);
} }
@Override
FileTypeDetector getFileTypeDetector() {
Path userMimeTypes = Paths.get(AccessController.doPrivileged(
new GetPropertyAction("user.home")), ".mime.types");
return new MimeTypesFileTypeDetector(userMimeTypes);
}
} }
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. 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.nio.fs;
import java.io.IOException;
import java.nio.file.Path;
import java.security.AccessController;
import java.security.PrivilegedAction;
/**
* File type detector that uses the libmagic to guess the MIME type of a file.
*/
class MagicFileTypeDetector extends AbstractFileTypeDetector {
private static final String UNKNOW_MIME_TYPE = "application/octet-stream";
// true if libmagic is available and successfully loaded
private final boolean libmagicAvailable;
public MagicFileTypeDetector() {
libmagicAvailable = initialize0();
}
@Override
protected String implProbeContentType(Path obj) throws IOException {
if (!libmagicAvailable || !(obj instanceof UnixPath))
return null;
UnixPath path = (UnixPath) obj;
path.checkRead();
NativeBuffer buffer = NativeBuffers.asNativeBuffer(path.getByteArrayForSysCalls());
try {
byte[] type = probe0(buffer.address());
String mimeType = (type == null) ? null : new String(type);
return UNKNOW_MIME_TYPE.equals(mimeType) ? null : mimeType;
} finally {
buffer.release();
}
}
private static native boolean initialize0();
private static native byte[] probe0(long pathAddress);
static {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
@Override
public Void run() {
System.loadLibrary("nio");
return null;
}
});
}
}
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. 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.nio.fs;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* File type detector that uses a file extension to look up its MIME type
* based on a mime.types file.
*/
class MimeTypesFileTypeDetector extends AbstractFileTypeDetector {
// path to mime.types file
private final Path mimeTypesFile;
// map of extension to MIME type
private Map<String,String> mimeTypeMap;
// set to true when file loaded
private volatile boolean loaded = false;
public MimeTypesFileTypeDetector(Path filePath) {
mimeTypesFile = filePath;
}
@Override
protected String implProbeContentType(Path path) {
Path fn = path.getFileName();
if (fn == null)
return null; // no file name
String ext = getExtension(fn.toString());
if (ext.isEmpty())
return null; // no extension
loadMimeTypes();
if (mimeTypeMap == null || mimeTypeMap.isEmpty())
return null;
// Case-sensitive search
String mimeType;
do {
mimeType = mimeTypeMap.get(ext);
if (mimeType == null)
ext = getExtension(ext);
} while (mimeType == null && !ext.isEmpty());
return mimeType;
}
// Get the extension of a file name.
private static String getExtension(String name) {
String ext = "";
if (name != null && !name.isEmpty()) {
int dot = name.indexOf('.');
if ((dot >= 0) && (dot < name.length() - 1)) {
ext = name.substring(dot + 1);
}
}
return ext;
}
/**
* Parse the mime types file, and store the type-extension mappings into
* mimeTypeMap. The mime types file is not loaded until the first probe
* to achieve the lazy initialization. It adopts double-checked locking
* optimization to reduce the locking overhead.
*/
private void loadMimeTypes() {
if (!loaded) {
synchronized (this) {
if (!loaded) {
List<String> lines = AccessController.doPrivileged(
new PrivilegedAction<List<String>>() {
@Override
public List<String> run() {
try {
return Files.readAllLines(mimeTypesFile,
Charset.defaultCharset());
} catch (IOException ignore) {
return Collections.emptyList();
}
}
});
mimeTypeMap = new HashMap<>(lines.size());
String entry = "";
for (String line : lines) {
entry += line;
if (entry.endsWith("\\")) {
entry = entry.substring(0, entry.length() - 1);
continue;
}
parseMimeEntry(entry);
entry = "";
}
if (!entry.isEmpty()) {
parseMimeEntry(entry);
}
loaded = true;
}
}
}
}
/**
* Parse a mime-types entry, which can have the following formats.
* 1) Simple space-delimited format
* image/jpeg jpeg jpg jpe JPG
*
* 2) Netscape key-value pair format
* type=application/x-java-jnlp-file desc="Java Web Start" exts="jnlp"
* or
* type=text/html exts=htm,html
*/
private void parseMimeEntry(String entry) {
entry = entry.trim();
if (entry.isEmpty() || entry.charAt(0) == '#')
return;
entry = entry.replaceAll("\\s*#.*", "");
int equalIdx = entry.indexOf('=');
if (equalIdx > 0) {
// Parse a mime-types command having the key-value pair format
final String TYPEEQUAL = "type=";
String typeRegex = "\\b" + TYPEEQUAL +
"(\"\\p{Graph}+?/\\p{Graph}+?\"|\\p{Graph}+/\\p{Graph}+\\b)";
Pattern typePattern = Pattern.compile(typeRegex);
Matcher typeMatcher = typePattern.matcher(entry);
if (typeMatcher.find()) {
String type = typeMatcher.group().substring(TYPEEQUAL.length());
if (type.charAt(0) == '"') {
type = type.substring(1, type.length() - 1);
}
final String EXTEQUAL = "exts=";
String extRegex = "\\b" + EXTEQUAL +
"(\"[\\p{Graph}|\\p{Blank}]+?\"|\\p{Graph}+\\b)";
Pattern extPattern = Pattern.compile(extRegex);
Matcher extMatcher = extPattern.matcher(entry);
if (extMatcher.find()) {
String exts =
extMatcher.group().substring(EXTEQUAL.length());
if (exts.charAt(0) == '"') {
exts = exts.substring(1, exts.length() - 1);
}
String[] extList = exts.split("[\\p{Blank}|\\p{Punct}]+");
for (String ext : extList) {
putIfAbsent(ext, type);
}
}
}
} else {
// Parse a mime-types command having the space-delimited format
String[] elements = entry.split("\\s+");
int i = 1;
while (i < elements.length) {
putIfAbsent(elements[i++], elements[0]);
}
}
}
private void putIfAbsent(String key, String value) {
if (key != null && !key.isEmpty() &&
value != null && !value.isEmpty() &&
!mimeTypeMap.containsKey(key))
{
mimeTypeMap.put(key, value);
}
}
}
...@@ -29,6 +29,8 @@ import java.nio.file.*; ...@@ -29,6 +29,8 @@ import java.nio.file.*;
import java.nio.file.attribute.*; import java.nio.file.attribute.*;
import java.nio.file.spi.FileTypeDetector; import java.nio.file.spi.FileTypeDetector;
import java.io.IOException; import java.io.IOException;
import java.security.AccessController;
import sun.security.action.GetPropertyAction;
/** /**
* Solaris implementation of FileSystemProvider * Solaris implementation of FileSystemProvider
...@@ -83,6 +85,12 @@ public class SolarisFileSystemProvider extends UnixFileSystemProvider { ...@@ -83,6 +85,12 @@ public class SolarisFileSystemProvider extends UnixFileSystemProvider {
@Override @Override
FileTypeDetector getFileTypeDetector() { FileTypeDetector getFileTypeDetector() {
return new GnomeFileTypeDetector(); Path userMimeTypes = Paths.get(AccessController.doPrivileged(
new GetPropertyAction("user.home")), ".mime.types");
Path etcMimeTypes = Paths.get("/etc/mime.types");
return chain(new GnomeFileTypeDetector(),
new MimeTypesFileTypeDetector(userMimeTypes),
new MimeTypesFileTypeDetector(etcMimeTypes));
} }
} }
...@@ -509,4 +509,24 @@ public abstract class UnixFileSystemProvider ...@@ -509,4 +509,24 @@ public abstract class UnixFileSystemProvider
}; };
} }
/**
* Returns a {@code FileTypeDetector} that chains the given array of file
* type detectors. When the {@code implProbeContentType} method is invoked
* then each of the detectors is invoked in turn, the result from the
* first to detect the file type is returned.
*/
final FileTypeDetector chain(final AbstractFileTypeDetector... detectors) {
return new AbstractFileTypeDetector() {
@Override
protected String implProbeContentType(Path file) throws IOException {
for (AbstractFileTypeDetector detector : detectors) {
String result = detector.implProbeContentType(file);
if (result != null && !result.isEmpty()) {
return result;
}
}
return null;
}
};
}
} }
...@@ -380,6 +380,31 @@ md_ntohl(unsigned l) ...@@ -380,6 +380,31 @@ md_ntohl(unsigned l)
return ntohl(l); return ntohl(l);
} }
static void dll_build_name(char* buffer, size_t buflen,
const char* pname, const char* fname) {
// Loosely based on os_solaris.cpp
char *pathname = (char *)pname;
while (strlen(pathname) > 0) {
char *p = strchr(pathname, ':');
if (p == NULL) {
p = pathname + strlen(pathname);
}
/* check for NULL path */
if (p == pathname) {
continue;
}
(void)snprintf(buffer, buflen, "%.*s/lib%s" JNI_LIB_SUFFIX,
(p - pathname), pathname, fname);
if (access(buffer, F_OK) == 0) {
break;
}
pathname = p + 1;
*buffer = '\0';
}
}
/* Create the actual fill filename for a dynamic library. */ /* Create the actual fill filename for a dynamic library. */
void void
md_build_library_name(char *holder, int holderlen, char *pname, char *fname) md_build_library_name(char *holder, int holderlen, char *pname, char *fname)
...@@ -389,9 +414,9 @@ md_build_library_name(char *holder, int holderlen, char *pname, char *fname) ...@@ -389,9 +414,9 @@ md_build_library_name(char *holder, int holderlen, char *pname, char *fname)
/* Length of options directory location. */ /* Length of options directory location. */
pnamelen = pname ? strlen(pname) : 0; pnamelen = pname ? strlen(pname) : 0;
*holder = '\0';
/* Quietly truncate on buffer overflow. Should be an error. */ /* Quietly truncate on buffer overflow. Should be an error. */
if (pnamelen + (int)strlen(fname) + 10 > holderlen) { if (pnamelen + (int)strlen(fname) + 10 > holderlen) {
*holder = '\0';
return; return;
} }
...@@ -399,7 +424,7 @@ md_build_library_name(char *holder, int holderlen, char *pname, char *fname) ...@@ -399,7 +424,7 @@ md_build_library_name(char *holder, int holderlen, char *pname, char *fname)
if (pnamelen == 0) { if (pnamelen == 0) {
(void)snprintf(holder, holderlen, "lib%s" JNI_LIB_SUFFIX, fname); (void)snprintf(holder, holderlen, "lib%s" JNI_LIB_SUFFIX, fname);
} else { } else {
(void)snprintf(holder, holderlen, "%s/lib%s" JNI_LIB_SUFFIX, pname, fname); dll_build_name(holder, holderlen, pname, fname);
} }
} }
......
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. 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.
*/
#include "jni.h"
#include "jni_util.h"
#include "jvm.h"
#include "jlong.h"
#include <dlfcn.h>
#include <string.h>
#define MAGIC_MIME_TYPE 0x000010 /* Return the MIME type */
typedef struct magic_set magic_t;
typedef magic_t* (*magic_open_func)(int flags);
typedef int (*magic_load_func)(magic_t* cookie, const char* filename);
typedef const char* (*magic_file_func)(magic_t* cookie, const char* filename);
typedef void (*magic_close_func)(magic_t* cookie);
static void* magic_handle;
static magic_open_func magic_open;
static magic_load_func magic_load;
static magic_file_func magic_file;
static magic_close_func magic_close;
#include "sun_nio_fs_MagicFileTypeDetector.h"
JNIEXPORT jboolean JNICALL
Java_sun_nio_fs_MagicFileTypeDetector_initialize0
(JNIEnv* env, jclass this)
{
magic_handle = dlopen("libmagic.so", RTLD_LAZY);
if (magic_handle == NULL) {
magic_handle = dlopen("libmagic.so.1", RTLD_LAZY);
if (magic_handle == NULL) {
return JNI_FALSE;
}
}
magic_open = (magic_open_func)dlsym(magic_handle, "magic_open");
magic_load = (magic_load_func)dlsym(magic_handle, "magic_load");
magic_file = (magic_file_func)dlsym(magic_handle, "magic_file");
magic_close = (magic_close_func)dlsym(magic_handle, "magic_close");
if (magic_open == NULL ||
magic_load == NULL ||
magic_file == NULL ||
magic_close == NULL)
{
dlclose(magic_handle);
return JNI_FALSE;
}
return JNI_TRUE;
}
JNIEXPORT jbyteArray JNICALL
Java_sun_nio_fs_MagicFileTypeDetector_probe0
(JNIEnv* env, jclass this, jlong pathAddress)
{
char* path = (char*)jlong_to_ptr(pathAddress);
magic_t* cookie;
jbyteArray result = NULL;
cookie = (*magic_open)(MAGIC_MIME_TYPE);
if (cookie != NULL) {
if ((*magic_load)(cookie, NULL) != -1) {
const char* type = (*magic_file)(cookie, path);
if (type != NULL) {
jsize len = strlen(type);
result = (*env)->NewByteArray(env, len);
if (result != NULL) {
(*env)->SetByteArrayRegion(env, result, 0, len, (jbyte*)type);
}
}
}
(*magic_close)(cookie);
}
return result;
}
...@@ -36,14 +36,14 @@ ...@@ -36,14 +36,14 @@
#define NPT_LIBNAME "npt" #define NPT_LIBNAME "npt"
#define NPT_INITIALIZE(pnpt,version,options) \ #define NPT_INITIALIZE(path,pnpt,version,options) \
{ \ { \
void *_handle; \ void *_handle; \
void *_sym; \ void *_sym; \
\ \
if ( (pnpt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \ if ( (pnpt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \
*(pnpt) = NULL; \ *(pnpt) = NULL; \
_handle = dlopen(JNI_LIB_NAME(NPT_LIBNAME), RTLD_LAZY); \ _handle = dlopen(path, RTLD_LAZY); \
if ( _handle == NULL ) NPT_ERROR("Cannot open library"); \ if ( _handle == NULL ) NPT_ERROR("Cannot open library"); \
_sym = dlsym(_handle, "nptInitialize"); \ _sym = dlsym(_handle, "nptInitialize"); \
if ( _sym == NULL ) NPT_ERROR("Cannot find nptInitialize"); \ if ( _sym == NULL ) NPT_ERROR("Cannot find nptInitialize"); \
......
/* /*
* Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -32,11 +32,42 @@ ...@@ -32,11 +32,42 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <io.h>
#include "sys.h" #include "sys.h"
#include "path_md.h" #include "path_md.h"
static void dll_build_name(char* buffer, size_t buflen,
const char* pname, const char* fname) {
// Based on os_windows.cpp
char *path_sep = PATH_SEPARATOR;
char *pathname = (char *)pname;
while (strlen(pathname) > 0) {
char *p = strchr(pathname, *path_sep);
if (p == NULL) {
p = pathname + strlen(pathname);
}
/* check for NULL path */
if (p == pathname) {
continue;
}
if (*(p-1) == ':' || *(p-1) == '\\') {
(void)_snprintf(buffer, buflen, "%.*s%s.dll", (p - pathname),
pathname, fname);
} else {
(void)_snprintf(buffer, buflen, "%.*s\\%s.dll", (p - pathname),
pathname, fname);
}
if (_access(buffer, 0) == 0) {
break;
}
pathname = p + 1;
*buffer = '\0';
}
}
/* /*
* From system_md.c v1.54 * From system_md.c v1.54
*/ */
...@@ -80,20 +111,17 @@ void ...@@ -80,20 +111,17 @@ void
dbgsysBuildLibName(char *holder, int holderlen, char *pname, char *fname) dbgsysBuildLibName(char *holder, int holderlen, char *pname, char *fname)
{ {
const int pnamelen = pname ? (int)strlen(pname) : 0; const int pnamelen = pname ? (int)strlen(pname) : 0;
const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0;
*holder = '\0';
/* Quietly truncates on buffer overflow. Should be an error. */ /* Quietly truncates on buffer overflow. Should be an error. */
if (pnamelen + (int)strlen(fname) + 10 > holderlen) { if (pnamelen + (int)strlen(fname) + 10 > holderlen) {
*holder = '\0';
return; return;
} }
if (pnamelen == 0) { if (pnamelen == 0) {
sprintf(holder, "%s.dll", fname); sprintf(holder, "%s.dll", fname);
} else if (c == ':' || c == '\\') {
sprintf(holder, "%s%s.dll", pname, fname);
} else { } else {
sprintf(holder, "%s\\%s.dll", pname, fname); dll_build_name(holder, holderlen, pname, fname);
} }
} }
......
/* /*
* Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -383,20 +383,14 @@ class WindowsFileAttributes ...@@ -383,20 +383,14 @@ class WindowsFileAttributes
} }
int volSerialNumber() { int volSerialNumber() {
if (volSerialNumber == 0)
throw new AssertionError("Should not get here");
return volSerialNumber; return volSerialNumber;
} }
int fileIndexHigh() { int fileIndexHigh() {
if (volSerialNumber == 0)
throw new AssertionError("Should not get here");
return fileIndexHigh; return fileIndexHigh;
} }
int fileIndexLow() { int fileIndexLow() {
if (volSerialNumber == 0)
throw new AssertionError("Should not get here");
return fileIndexLow; return fileIndexLow;
} }
......
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -367,28 +367,53 @@ get_last_error_string(char *buf, int len) ...@@ -367,28 +367,53 @@ get_last_error_string(char *buf, int len)
return 0; return 0;
} }
static void dll_build_name(char* buffer, size_t buflen,
const char* pname, const char* fname) {
// Loosley based on os_windows.cpp
char *pathname = (char *)pname;
while (strlen(pathname) > 0) {
char *p = strchr(pathname, ';');
if (p == NULL) {
p = pathname + strlen(pathname);
}
/* check for NULL path */
if (p == pathname) {
continue;
}
if (*(p-1) == ':' || *(p-1) == '\\') {
(void)_snprintf(buffer, buflen, "%.*s%s.dll", (p - pathname),
pathname, fname);
} else {
(void)_snprintf(buffer, buflen, "%.*s\\%s.dll", (p - pathname),
pathname, fname);
}
if (_access(buffer, 0) == 0) {
break;
}
pathname = p + 1;
*buffer = '\0';
}
}
/* Build a machine dependent library name out of a path and file name. */ /* Build a machine dependent library name out of a path and file name. */
void void
md_build_library_name(char *holder, int holderlen, char *pname, char *fname) md_build_library_name(char *holder, int holderlen, char *pname, char *fname)
{ {
int pnamelen; int pnamelen;
char c;
pnamelen = pname ? (int)strlen(pname) : 0; pnamelen = pname ? (int)strlen(pname) : 0;
c = (pnamelen > 0) ? pname[pnamelen-1] : 0;
*holder = '\0';
/* Quietly truncates on buffer overflow. Should be an error. */ /* Quietly truncates on buffer overflow. Should be an error. */
if (pnamelen + strlen(fname) + 10 > (unsigned int)holderlen) { if (pnamelen + strlen(fname) + 10 > (unsigned int)holderlen) {
*holder = '\0';
return; return;
} }
if (pnamelen == 0) { if (pnamelen == 0) {
sprintf(holder, "%s.dll", fname); sprintf(holder, "%s.dll", fname);
} else if (c == ':' || c == '\\') {
sprintf(holder, "%s%s.dll", pname, fname);
} else { } else {
sprintf(holder, "%s\\%s.dll", pname, fname); dll_build_name(holder, holderlen, pname, fname);
} }
} }
......
...@@ -178,7 +178,7 @@ int enumInterfaces(JNIEnv *env, netif **netifPP) ...@@ -178,7 +178,7 @@ int enumInterfaces(JNIEnv *env, netif **netifPP)
int count; int count;
netif *netifP; netif *netifP;
DWORD i; DWORD i;
int lo=0, eth=0, tr=0, fddi=0, ppp=0, sl=0, wlan=0, net=0; int lo=0, eth=0, tr=0, fddi=0, ppp=0, sl=0, wlan=0, net=0, wlen=0;
/* /*
* Ask the IP Helper library to enumerate the adapters * Ask the IP Helper library to enumerate the adapters
...@@ -260,8 +260,17 @@ int enumInterfaces(JNIEnv *env, netif **netifPP) ...@@ -260,8 +260,17 @@ int enumInterfaces(JNIEnv *env, netif **netifPP)
*/ */
curr = (netif *)calloc(1, sizeof(netif)); curr = (netif *)calloc(1, sizeof(netif));
if (curr != NULL) { if (curr != NULL) {
curr->name = (char *)malloc(strlen(dev_name) + 1); wlen = MultiByteToWideChar(CP_OEMCP, 0, ifrowP->bDescr,
ifrowP->dwDescrLen, NULL, 0);
if(wlen == 0) {
// MultiByteToWideChar should not fail
// But in rare case it fails, we allow 'char' to be displayed
curr->displayName = (char *)malloc(ifrowP->dwDescrLen + 1); curr->displayName = (char *)malloc(ifrowP->dwDescrLen + 1);
} else {
curr->displayName = (wchar_t *)malloc(wlen*(sizeof(wchar_t))+1);
}
curr->name = (char *)malloc(strlen(dev_name) + 1);
if (curr->name == NULL || curr->displayName == NULL) { if (curr->name == NULL || curr->displayName == NULL) {
if (curr->name) free(curr->name); if (curr->name) free(curr->name);
...@@ -282,8 +291,29 @@ int enumInterfaces(JNIEnv *env, netif **netifPP) ...@@ -282,8 +291,29 @@ int enumInterfaces(JNIEnv *env, netif **netifPP)
* 32-bit numbers as index values. * 32-bit numbers as index values.
*/ */
strcpy(curr->name, dev_name); strcpy(curr->name, dev_name);
if (wlen == 0) {
// display char type in case of MultiByteToWideChar failure
strncpy(curr->displayName, ifrowP->bDescr, ifrowP->dwDescrLen); strncpy(curr->displayName, ifrowP->bDescr, ifrowP->dwDescrLen);
curr->displayName[ifrowP->dwDescrLen] = '\0'; curr->displayName[ifrowP->dwDescrLen] = '\0';
} else {
// call MultiByteToWideChar again to fill curr->displayName
// it should not fail, because we have called it once before
if (MultiByteToWideChar(CP_OEMCP, 0, ifrowP->bDescr,
ifrowP->dwDescrLen, curr->displayName, wlen) == 0) {
JNU_ThrowByName(env, "java/lang/Error",
"Cannot get multibyte char for interface display name");
free_netif(netifP);
free(tableP);
free(curr->name);
free(curr->displayName);
free(curr);
return -1;
} else {
curr->displayName[wlen*(sizeof(wchar_t))] = '\0';
curr->dNameIsUnicode = TRUE;
}
}
curr->dwIndex = ifrowP->dwIndex; curr->dwIndex = ifrowP->dwIndex;
curr->ifType = ifrowP->dwType; curr->ifType = ifrowP->dwType;
curr->index = GetFriendlyIfIndex(ifrowP->dwIndex); curr->index = GetFriendlyIfIndex(ifrowP->dwIndex);
......
/* /*
* Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -33,30 +33,16 @@ ...@@ -33,30 +33,16 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#define NPT_LIBNAME "npt.dll" #define NPT_LIBNAME "npt"
#define NPT_INITIALIZE(pnpt,version,options) \ #define NPT_INITIALIZE(path,pnpt,version,options) \
{ \ { \
HINSTANCE jvm; \
void *_handle; \ void *_handle; \
void *_sym; \ void *_sym; \
char buf[FILENAME_MAX+32]; \
char *lastSlash; \
\ \
if ( (pnpt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \ if ( (pnpt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \
_handle = NULL; \
*(pnpt) = NULL; \ *(pnpt) = NULL; \
buf[0] = 0; \ _handle = LoadLibrary(path); \
jvm = GetModuleHandle("jvm.dll"); \
if ( jvm == NULL ) NPT_ERROR("Cannot find jvm.dll"); \
GetModuleFileName(jvm, buf, FILENAME_MAX); \
lastSlash = strrchr(buf, '\\'); \
if ( lastSlash != NULL ) { \
*lastSlash = '\0'; \
(void)strcat(buf, "\\..\\"); \
(void)strcat(buf, NPT_LIBNAME); \
_handle = LoadLibrary(buf); \
} \
if ( _handle == NULL ) NPT_ERROR("Cannot open library"); \ if ( _handle == NULL ) NPT_ERROR("Cannot open library"); \
_sym = GetProcAddress(_handle, "nptInitialize"); \ _sym = GetProcAddress(_handle, "nptInitialize"); \
if ( _sym == NULL ) NPT_ERROR("Cannot find nptInitialize"); \ if ( _sym == NULL ) NPT_ERROR("Cannot find nptInitialize"); \
......
...@@ -141,6 +141,9 @@ java/lang/management/MemoryMXBean/LowMemoryTest2.sh generic-all ...@@ -141,6 +141,9 @@ java/lang/management/MemoryMXBean/LowMemoryTest2.sh generic-all
# jdk_management # jdk_management
# 7158614
sun/management/jmxremote/startstop/JMXStartStopTest.sh linux-all
############################################################################ ############################################################################
# jdk_jmx # jdk_jmx
...@@ -162,6 +165,9 @@ javax/management/remote/mandatory/notif/DiffHBTest.java generic-all ...@@ -162,6 +165,9 @@ javax/management/remote/mandatory/notif/DiffHBTest.java generic-all
# 6988950 # 6988950
demo/jvmti/compiledMethodLoad/CompiledMethodLoadTest.java generic-all demo/jvmti/compiledMethodLoad/CompiledMethodLoadTest.java generic-all
# 7027502
demo/jvmti/hprof/MonitorTest.java generic-all
############################################################################ ############################################################################
# jdk_net # jdk_net
...@@ -204,6 +210,9 @@ java/net/CookieHandler/CookieManagerTest.java macosx-all ...@@ -204,6 +210,9 @@ java/net/CookieHandler/CookieManagerTest.java macosx-all
# jdk_io # jdk_io
# 7160013
java/io/File/MaxPathLength.java windows-all
############################################################################ ############################################################################
# jdk_nio # jdk_nio
...@@ -225,6 +234,9 @@ java/nio/channels/DatagramChannel/ChangingAddress.java macosx-all ...@@ -225,6 +234,9 @@ java/nio/channels/DatagramChannel/ChangingAddress.java macosx-all
# 7132677 # 7132677
java/nio/channels/Selector/OutOfBand.java macosx-all java/nio/channels/Selector/OutOfBand.java macosx-all
# 8003895
java/nio/channels/AsynchronousChannelGroup/Unbounded.java windows-amd64
############################################################################ ############################################################################
# jdk_rmi # jdk_rmi
...@@ -242,7 +254,7 @@ java/rmi/reliability/benchmark/runRmiBench.sh generic-all ...@@ -242,7 +254,7 @@ java/rmi/reliability/benchmark/runRmiBench.sh generic-all
java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java generic-all java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java generic-all
# 7195095 # 7195095
sun/rmi/transport/proxy/EagerHttpFallback.java linux-all sun/rmi/transport/proxy/EagerHttpFallback.java generic-all
############################################################################ ############################################################################
...@@ -283,6 +295,12 @@ sun/security/tools/keytool/standard.sh solaris-all ...@@ -283,6 +295,12 @@ sun/security/tools/keytool/standard.sh solaris-all
# 8000439: NPG: REGRESSION : sun/security/krb5/auto/MaxRetries.java fails with timeout # 8000439: NPG: REGRESSION : sun/security/krb5/auto/MaxRetries.java fails with timeout
sun/security/krb5/auto/MaxRetries.java solaris-sparcv9 sun/security/krb5/auto/MaxRetries.java solaris-sparcv9
# 7194428
sun/security/mscapi/ShortRSAKey1024.sh windows-all
# 8000897, vm crash
sun/security/provider/DSA/TestAlgParameterGenerator.java generic-all
############################################################################ ############################################################################
# jdk_sound # jdk_sound
...@@ -345,9 +363,6 @@ java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java generic-all ...@@ -345,9 +363,6 @@ java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java generic-all
# Filed 6772009 # Filed 6772009
java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java generic-all java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java generic-all
# 8003596
java/util/logging/CheckLockLocationTest.java windows-all
# 7041639, Solaris DSA keypair generation bug # 7041639, Solaris DSA keypair generation bug
java/util/TimeZone/TimeZoneDatePermissionCheck.sh solaris-all java/util/TimeZone/TimeZoneDatePermissionCheck.sh solaris-all
......
...@@ -51,9 +51,11 @@ public class Test6277266 { ...@@ -51,9 +51,11 @@ public class Test6277266 {
) )
); );
throw new Error("SecurityException expected"); throw new Error("SecurityException expected");
} catch (SecurityException exception) {
return; // expected security exception in JDK 7
} catch (InvocationTargetException exception) { } catch (InvocationTargetException exception) {
if (exception.getCause() instanceof SecurityException){ if (exception.getCause() instanceof SecurityException){
return; // expected security exception return; // expected security exception in JDK 8
} }
throw new Error("unexpected exception", exception); throw new Error("unexpected exception", exception);
} catch (InterruptedException exception) { } catch (InterruptedException exception) {
......
...@@ -65,7 +65,7 @@ public class DivModTests { ...@@ -65,7 +65,7 @@ public class DivModTests {
* Math and StrictMath tested and the same results are expected for both. * Math and StrictMath tested and the same results are expected for both.
*/ */
static void testIntFloorDivMod() { static void testIntFloorDivMod() {
testIntFloorDivMod(4, 0, new ArithmeticException("/ by zero"), new ArithmeticException("/ by zero")); // Should throw ArithmeticException testIntFloorDivMod(4, 0, new ArithmeticException(), new ArithmeticException()); // Should throw ArithmeticException
testIntFloorDivMod(4, 3, 1, 1); testIntFloorDivMod(4, 3, 1, 1);
testIntFloorDivMod(3, 3, 1, 0); testIntFloorDivMod(3, 3, 1, 0);
testIntFloorDivMod(2, 3, 0, 2); testIntFloorDivMod(2, 3, 0, 2);
...@@ -151,7 +151,7 @@ public class DivModTests { ...@@ -151,7 +151,7 @@ public class DivModTests {
* Test the floorDiv and floorMod methods for primitive long. * Test the floorDiv and floorMod methods for primitive long.
*/ */
static void testLongFloorDivMod() { static void testLongFloorDivMod() {
testLongFloorDivMod(4L, 0L, new ArithmeticException("/ by zero"), new ArithmeticException("/ by zero")); // Should throw ArithmeticException testLongFloorDivMod(4L, 0L, new ArithmeticException(), new ArithmeticException()); // Should throw ArithmeticException
testLongFloorDivMod(4L, 3L, 1L, 1L); testLongFloorDivMod(4L, 3L, 1L, 1L);
testLongFloorDivMod(3L, 3L, 1L, 0L); testLongFloorDivMod(3L, 3L, 1L, 0L);
testLongFloorDivMod(2L, 3L, 0L, 2L); testLongFloorDivMod(2L, 3L, 0L, 2L);
...@@ -385,9 +385,7 @@ public class DivModTests { ...@@ -385,9 +385,7 @@ public class DivModTests {
} }
// Handle special case to compare ArithmeticExceptions // Handle special case to compare ArithmeticExceptions
if (result instanceof ArithmeticException && expected instanceof ArithmeticException) { if (result instanceof ArithmeticException && expected instanceof ArithmeticException) {
ArithmeticException ae1 = (ArithmeticException)result; return true;
ArithmeticException ae2 = (ArithmeticException)expected;
return ae1.getMessage().equals(ae2.getMessage());
} }
return false; return false;
} }
......
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
/**
* @test
* @run testng ThreadLocalSupplierTest
* @summary tests ThreadLocal.withInitial(<Supplier>).
* Adapted from java.lang.Basic functional test of ThreadLocal
*
* @author Jim Gish <jim.gish@oracle.com>
*/
@Test
public class ThreadLocalSupplierTest {
static final class IntegerSupplier implements Supplier<Integer> {
private final AtomicInteger supply = new AtomicInteger(0);
@Override
public Integer get() {
return supply.getAndIncrement();
}
public int numCalls() {
return supply.intValue();
}
}
static IntegerSupplier theSupply = new IntegerSupplier();
static final class MyThreadLocal extends ThreadLocal<Integer> {
private final ThreadLocal<Integer> delegate;
public volatile boolean everCalled;
public MyThreadLocal(Supplier<Integer> supplier) {
delegate = ThreadLocal.<Integer>withInitial(supplier);
}
@Override
public Integer get() {
return delegate.get();
}
@Override
protected synchronized Integer initialValue() {
// this should never be called since we are using the factory instead
everCalled = true;
return null;
}
}
/**
* Our one and only ThreadLocal from which we get thread ids using a
* supplier which simply increments a counter on each call of get().
*/
static MyThreadLocal threadLocal = new MyThreadLocal(theSupply);
public void testMultiThread() throws Exception {
final int threadCount = 500;
final Thread th[] = new Thread[threadCount];
final boolean visited[] = new boolean[threadCount];
// Create and start the threads
for (int i = 0; i < threadCount; i++) {
th[i] = new Thread() {
@Override
public void run() {
final int threadId = threadLocal.get();
assertFalse(visited[threadId], "visited[" + threadId + "]=" + visited[threadId]);
visited[threadId] = true;
// check the get() again
final int secondCheckThreadId = threadLocal.get();
assertEquals(secondCheckThreadId, threadId);
}
};
th[i].start();
}
// Wait for the threads to finish
for (int i = 0; i < threadCount; i++) {
th[i].join();
}
assertEquals(theSupply.numCalls(), threadCount);
// make sure the provided initialValue() has not been called
assertFalse(threadLocal.everCalled);
// Check results
for (int i = 0; i < threadCount; i++) {
assertTrue(visited[i], "visited[" + i + "]=" + visited[i]);
}
}
public void testSimple() {
final String expected = "OneWithEverything";
final ThreadLocal<String> threadLocal = ThreadLocal.<String>withInitial(() -> expected);
assertEquals(expected, threadLocal.get());
}
}
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8003881
* @summary tests DoPrivileged action (implemented as lambda expressions) by
* inserting them into the BootClassPath.
* @compile -XDignore.symbol.file LambdaAccessControlDoPrivilegedTest.java
* @run main/othervm LambdaAccessControlDoPrivilegedTest
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class LambdaAccessControlDoPrivilegedTest extends LUtils {
public static void main(String... args) {
final List<String> scratch = new ArrayList();
scratch.clear();
scratch.add("import java.security.*;");
scratch.add("public class DoPriv {");
scratch.add("public static void main(String... args) {");
scratch.add("String prop = AccessController.doPrivileged((PrivilegedAction<String>) () -> {");
scratch.add("return System.getProperty(\"user.home\");");
scratch.add("});");
scratch.add("}");
scratch.add("}");
File doprivJava = new File("DoPriv.java");
File doprivClass = getClassFile(doprivJava);
createFile(doprivJava, scratch);
scratch.clear();
scratch.add("public class Bar {");
scratch.add("public static void main(String... args) {");
scratch.add("System.out.println(\"sun.boot.class.path\" + \"=\" +");
scratch.add(" System.getProperty(\"sun.boot.class.path\", \"\"));");
scratch.add("System.setSecurityManager(new SecurityManager());");
scratch.add("DoPriv.main();");
scratch.add("}");
scratch.add("}");
File barJava = new File("Bar.java");
File barClass = getClassFile(barJava);
createFile(barJava, scratch);
String[] javacArgs = {barJava.getName(), doprivJava.getName()};
compile(javacArgs);
File jarFile = new File("foo.jar");
String[] jargs = {"cvf", jarFile.getName(), doprivClass.getName()};
jarTool.run(jargs);
doprivJava.delete();
doprivClass.delete();
TestResult tr = doExec(JAVA_CMD.getAbsolutePath(),
"-Xbootclasspath/p:foo.jar",
"-cp", ".", "Bar");
tr.assertZero("testDoPrivileged fails");
barJava.delete();
barClass.delete();
jarFile.delete();
}
}
/*
* support infrastructure to invoke a java class from the command line
*/
class LUtils {
static final sun.tools.jar.Main jarTool =
new sun.tools.jar.Main(System.out, System.err, "jar-tool");
static final com.sun.tools.javac.Main javac =
new com.sun.tools.javac.Main();
static final File cwd = new File(".").getAbsoluteFile();
static final String JAVAHOME = System.getProperty("java.home");
static final boolean isWindows =
System.getProperty("os.name", "unknown").startsWith("Windows");
//static final boolean isSDK = JAVAHOME.endsWith("jre");
static final File JAVA_BIN_FILE = new File(JAVAHOME, "bin");
static final File JAVA_CMD = new File(JAVA_BIN_FILE,
isWindows ? "java.exe" : "java");
protected LUtils() {
}
public static void compile(String... args) {
if (javac.compile(args) != 0) {
throw new RuntimeException("compilation fails");
}
}
static void createFile(File outFile, List<String> content) {
try {
Files.write(outFile.getAbsoluteFile().toPath(), content,
Charset.defaultCharset());
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
static File getClassFile(File javaFile) {
return javaFile.getName().endsWith(".java")
? new File(javaFile.getName().replace(".java", ".class"))
: null;
}
static String getSimpleName(File inFile) {
String fname = inFile.getName();
return fname.substring(0, fname.indexOf("."));
}
static TestResult doExec(String... cmds) {
return doExec(null, null, cmds);
}
/*
* A method which executes a java cmd and returns the results in a container
*/
static TestResult doExec(Map<String, String> envToSet,
java.util.Set<String> envToRemove, String... cmds) {
String cmdStr = "";
for (String x : cmds) {
cmdStr = cmdStr.concat(x + " ");
}
ProcessBuilder pb = new ProcessBuilder(cmds);
Map<String, String> env = pb.environment();
if (envToRemove != null) {
for (String key : envToRemove) {
env.remove(key);
}
}
if (envToSet != null) {
env.putAll(envToSet);
}
BufferedReader rdr = null;
try {
List<String> outputList = new ArrayList<>();
pb.redirectErrorStream(true);
Process p = pb.start();
rdr = new BufferedReader(new InputStreamReader(p.getInputStream()));
String in = rdr.readLine();
while (in != null) {
outputList.add(in);
in = rdr.readLine();
}
p.waitFor();
p.destroy();
return new TestResult(cmdStr, p.exitValue(), outputList,
env, new Throwable("current stack of the test"));
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex.getMessage());
}
}
static class TestResult {
String cmd;
int exitValue;
List<String> testOutput;
Map<String, String> env;
Throwable t;
public TestResult(String str, int rv, List<String> oList,
Map<String, String> env, Throwable t) {
cmd = str;
exitValue = rv;
testOutput = oList;
this.env = env;
this.t = t;
}
void assertZero(String message) {
if (exitValue != 0) {
System.err.println(this);
throw new RuntimeException(message);
}
}
@Override
public String toString() {
StringWriter sw = new StringWriter();
PrintWriter status = new PrintWriter(sw);
status.println("Cmd: " + cmd);
status.println("Return code: " + exitValue);
status.println("Environment variable:");
for (String x : env.keySet()) {
status.println("\t" + x + "=" + env.get(x));
}
status.println("Output:");
for (String x : testOutput) {
status.println("\t" + x);
}
status.println("Exception:");
status.println(t.getMessage());
t.printStackTrace(status);
return sw.getBuffer().toString();
}
}
}
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8003881
* @summary tests Lambda expression with a a security manager at top level
* @compile -XDignore.symbol.file LambdaAccessControlTest.java
*
* @run main/othervm LambdaAccessControlTest
*/
public class LambdaAccessControlTest extends LUtils {
public static void main(String... args) {
System.setSecurityManager(new SecurityManager());
JJ<Integer> iii = (new CC())::impl;
System.out.printf(">>> %s\n", iii.foo(44));
iii = DD::impl;
System.out.printf(">>> %s\n", iii.foo(44));
return;
}
}
/*
* support classes for the test
*/
interface II<T> { Object foo(T x); }
interface JJ<R extends Number> extends II<R> { }
class CC { String impl(int i) { return "impl:"+i; }}
class DD { static String impl(int i) { return "impl:"+i; }}
...@@ -54,6 +54,7 @@ import java.rmi.server.RemoteRef; ...@@ -54,6 +54,7 @@ import java.rmi.server.RemoteRef;
import java.rmi.server.UnicastRemoteObject; import java.rmi.server.UnicastRemoteObject;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Properties; import java.util.Properties;
import sun.rmi.registry.RegistryImpl; import sun.rmi.registry.RegistryImpl;
import sun.rmi.server.UnicastServerRef; import sun.rmi.server.UnicastServerRef;
import sun.rmi.transport.Endpoint; import sun.rmi.transport.Endpoint;
...@@ -92,6 +93,7 @@ public class TestLibrary { ...@@ -92,6 +93,7 @@ public class TestLibrary {
public final static int INHERITEDCHANNELNOTSERVERSOCKET_ACTIVATION_PORT = 64003; public final static int INHERITEDCHANNELNOTSERVERSOCKET_ACTIVATION_PORT = 64003;
public final static int INHERITEDCHANNELNOTSERVERSOCKET_REGISTRY_PORT = 64004; public final static int INHERITEDCHANNELNOTSERVERSOCKET_REGISTRY_PORT = 64004;
public final static int READTEST_REGISTRY_PORT = 64005; public final static int READTEST_REGISTRY_PORT = 64005;
private final static int MAX_SERVER_SOCKET_TRIES = 10;
static void mesg(Object mesg) { static void mesg(Object mesg) {
System.err.println("TEST_LIBRARY: " + mesg.toString()); System.err.println("TEST_LIBRARY: " + mesg.toString());
...@@ -125,36 +127,15 @@ public class TestLibrary { ...@@ -125,36 +127,15 @@ public class TestLibrary {
bomb(null, e); bomb(null, e);
} }
/**
* Property accessors
*/
private static boolean getBoolean(String name) {
return (new Boolean(getProperty(name, "false")).booleanValue());
}
private static Integer getInteger(String name) {
int val = 0;
Integer value = null;
String propVal = getProperty(name, null);
if (propVal == null) {
return null;
}
try {
value = new Integer(Integer.parseInt(propVal));
} catch (NumberFormatException nfe) {
}
return value;
}
public static String getProperty(String property, String defaultVal) { public static String getProperty(String property, String defaultVal) {
final String prop = property; final String prop = property;
final String def = defaultVal; final String def = defaultVal;
return ((String) java.security.AccessController.doPrivileged return java.security.AccessController.doPrivileged(
(new java.security.PrivilegedAction() { new java.security.PrivilegedAction<String>() {
public Object run() { public String run() {
return System.getProperty(prop, def); return System.getProperty(prop, def);
} }
})); });
} }
/** /**
...@@ -169,9 +150,9 @@ public class TestLibrary { ...@@ -169,9 +150,9 @@ public class TestLibrary {
public static void setProperty(String property, String value) { public static void setProperty(String property, String value) {
final String prop = property; final String prop = property;
final String val = value; final String val = value;
java.security.AccessController.doPrivileged java.security.AccessController.doPrivileged(
(new java.security.PrivilegedAction() { new java.security.PrivilegedAction<Void>() {
public Object run() { public Void run() {
System.setProperty(prop, val); System.setProperty(prop, val);
return null; return null;
} }
...@@ -188,7 +169,7 @@ public class TestLibrary { ...@@ -188,7 +169,7 @@ public class TestLibrary {
out.println("-------------------Test environment----------" + out.println("-------------------Test environment----------" +
"---------"); "---------");
for(Enumeration keys = System.getProperties().keys(); for(Enumeration<?> keys = System.getProperties().keys();
keys.hasMoreElements();) { keys.hasMoreElements();) {
String property = (String) keys.nextElement(); String property = (String) keys.nextElement();
...@@ -252,7 +233,7 @@ public class TestLibrary { ...@@ -252,7 +233,7 @@ public class TestLibrary {
/* /*
* Obtain the URL for the codebase. * Obtain the URL for the codebase.
*/ */
URL codebaseURL = dstDir.toURL(); URL codebaseURL = dstDir.toURI().toURL();
/* /*
* Specify where we will copy the class definition from, if * Specify where we will copy the class definition from, if
...@@ -407,27 +388,47 @@ public class TestLibrary { ...@@ -407,27 +388,47 @@ public class TestLibrary {
*/ */
public static int getUnusedRandomPort() { public static int getUnusedRandomPort() {
int numTries = 0; int numTries = 0;
int unusedRandomPort = FIXED_PORT_MIN; IOException ex = null;
Exception ex = null;
while (numTries++ < 10) { while (numTries++ < MAX_SERVER_SOCKET_TRIES) {
int unusedRandomPort = -1;
ex = null; //reset ex = null; //reset
try (ServerSocket ss = new ServerSocket(0)) { try (ServerSocket ss = new ServerSocket(0)) {
unusedRandomPort = ss.getLocalPort(); unusedRandomPort = ss.getLocalPort();
} catch (Exception e) { } catch (IOException e) {
ex = e; ex = e;
} // temporarily print stack trace here until we find out why
// tests are failing.
if (!isReservedPort(unusedRandomPort)) { System.err.println("TestLibrary.getUnusedRandomPort() caught "
+ "exception on iteration " + numTries
+ (numTries==MAX_SERVER_SOCKET_TRIES ? " (the final try)."
: "."));
ex.printStackTrace();
}
if (unusedRandomPort >= 0) {
if (isReservedPort(unusedRandomPort)) {
System.out.println("INFO: On try # " + numTries
+ (numTries==MAX_SERVER_SOCKET_TRIES ? ", the final try, ": ",")
+ " ServerSocket(0) returned the reserved port "
+ unusedRandomPort
+ " in TestLibrary.getUnusedRandomPort() ");
} else {
return unusedRandomPort; return unusedRandomPort;
} }
} }
}
// If we're here, then either an exception was thrown or the port is // If we're here, then either an exception was thrown or the port is
// a reserved port. // a reserved port.
if (ex==null) {
throw new RuntimeException("Error getting unused random port. The"
+" last port returned by ServerSocket(0) was a reserved port");
} else {
throw new RuntimeException("Error getting unused random port.", ex); throw new RuntimeException("Error getting unused random port.", ex);
} }
}
/** /**
* Determines if a port is one of the reserved port numbers. * Determines if a port is one of the reserved port numbers.
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
*/ */
/** /**
* @test 4235519 * @test 4235519 8004212
* @summary tests java.util.Base64 * @summary tests java.util.Base64
*/ */
...@@ -106,6 +106,9 @@ public class TestBase64 { ...@@ -106,6 +106,9 @@ public class TestBase64 {
Base64.getDecoder().decode(ByteBuffer.wrap(decoded), ByteBuffer.allocate(1024)); }}); Base64.getDecoder().decode(ByteBuffer.wrap(decoded), ByteBuffer.allocate(1024)); }});
checkIAE(new Runnable() { public void run() { checkIAE(new Runnable() { public void run() {
Base64.getDecoder().decode(ByteBuffer.wrap(decoded), ByteBuffer.allocateDirect(1024)); }}); Base64.getDecoder().decode(ByteBuffer.wrap(decoded), ByteBuffer.allocateDirect(1024)); }});
// test return value from decode(ByteBuffer, ByteBuffer)
testDecBufRet();
} }
private static sun.misc.BASE64Encoder sunmisc = new sun.misc.BASE64Encoder(); private static sun.misc.BASE64Encoder sunmisc = new sun.misc.BASE64Encoder();
...@@ -351,6 +354,52 @@ public class TestBase64 { ...@@ -351,6 +354,52 @@ public class TestBase64 {
} catch (IllegalArgumentException iae) {} } catch (IllegalArgumentException iae) {}
} }
private static void testDecBufRet() throws Throwable {
Random rnd = new java.util.Random();
Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();
// src pos, len expected
int[][] tests = { { 6, 3, 3, 3}, // xxx xxx -> yyyy yyyy
{ 6, 3, 4, 3},
{ 6, 3, 5, 3},
{ 6, 3, 6, 6},
{ 6, 11, 4, 3},
{ 6, 11, 4, 3},
{ 6, 11, 5, 3},
{ 6, 11, 6, 6},
{ 7, 3, 6, 6}, // xxx xxx x -> yyyy yyyy yy==
{ 7, 3, 7, 7},
{ 7, 11, 6, 6},
{ 7, 11, 7, 7},
{ 8, 3, 6, 6}, // xxx xxx xx -> yyyy yyyy yyy=
{ 8, 3, 7, 6},
{ 8, 3, 8, 8},
{ 8, 13, 6, 6},
{ 8, 13, 7, 6},
{ 8, 13, 8, 8},
};
ByteBuffer dstBuf = ByteBuffer.allocate(100);
for (boolean direct : new boolean[] { false, true}) {
for (int[] test : tests) {
byte[] src = new byte[test[0]];
rnd.nextBytes(src);
ByteBuffer srcBuf = direct ? ByteBuffer.allocate(100)
: ByteBuffer.allocateDirect(100);
srcBuf.put(encoder.encode(src)).flip();
dstBuf.clear().position(test[1]).limit(test[1]+ test[2]);
int ret = decoder.decode(srcBuf, dstBuf);
if (ret != test[3]) {
System.out.printf(" [%6s] src=%d, pos=%d, len=%d, expected=%d, ret=%d%n",
direct?"direct":"",
test[0], test[1], test[2], test[3], ret);
throw new RuntimeException("ret != expected");
}
}
}
}
private static final void testEncode(Base64.Encoder enc, ByteBuffer bin, byte[] expected) private static final void testEncode(Base64.Encoder enc, ByteBuffer bin, byte[] expected)
throws Throwable { throws Throwable {
......
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.*;
import sun.util.locale.provider.TimeZoneNameUtility;
public class GenericTimeZoneNamesTest {
private static final String[] PT = {
"America/Los_Angeles", "US/Pacific", "PST"
};
private static int errors = 0;
public static void main(String[] args) {
for (String tag : args) {
Locale locale = Locale.forLanguageTag(tag);
for (String tzid : PT) {
test(tzid, TimeZone.LONG, locale, "Pacific Time");
test(tzid, TimeZone.SHORT, locale, "PT");
}
}
if (errors != 0) {
throw new RuntimeException("test failed");
}
}
private static void test(String tzid, int style, Locale locale, String expected) {
// No public API to get generic time zone names (JDK 8)
String got = TimeZoneNameUtility.retrieveGenericDisplayName(tzid, style, locale);
if (!expected.equals(got)) {
System.err.printf("test: tzid=%s, locale=%s, style=%d, got=\"%s\", expected=\"%s\"%n",
tzid, locale, style, got, expected);
errors++;
}
}
}
#
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# @test
# @bug 8003267
# @summary Unit test for generic time zone names support
# @compile -XDignore.symbol.file GenericTimeZoneNamesTest.java
# @run shell GenericTimeZoneNamesTest.sh
# This test is locale data-dependent and assumes that both JRE and CLDR
# have the same geneic time zone names in English.
STATUS=0
echo "Locale providers: default"
# TODO: The purpose of ja-JP is to make sure the fallback for generic
# names works. Remove ja-JP when adding generic names to localized
# resources.
if ! ${TESTJAVA}/bin/java -esa -cp "${TESTCLASSES}" GenericTimeZoneNamesTest en-US ja-JP; then
STATUS=1
fi
echo "Locale providers: CLDR"
if ! ${TESTJAVA}/bin/java -esa -cp "${TESTCLASSES}" -Djava.locale.providers=CLDR GenericTimeZoneNamesTest en-US; then
STATUS=1
fi
exit ${STATUS}
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.*;
import static java.util.GregorianCalendar.*;
public class NarrowNamesTest {
private static final Locale US = Locale.US;
private static final Locale JAJPJP = new Locale("ja", "JP", "JP");
private static final Locale THTH = new Locale("th", "TH");
private static final String RESET_INDEX = "RESET_INDEX";
private static int errors = 0;
// This test is locale data-dependent.
public static void main(String[] args) {
test(US, ERA, "B",
ERA, BC, YEAR, 1);
test(US, ERA, "A",
ERA, AD, YEAR, 2012);
test(US, DAY_OF_WEEK, "S",
YEAR, 2012, MONTH, DECEMBER, DAY_OF_MONTH, 23);
test(US, AM_PM, "a",
HOUR_OF_DAY, 10);
test(US, AM_PM, "p",
HOUR_OF_DAY, 23);
test(JAJPJP, DAY_OF_WEEK, "\u65e5",
YEAR, 24, MONTH, DECEMBER, DAY_OF_MONTH, 23);
test(THTH, MONTH, NARROW_STANDALONE, "\u0e18.\u0e04.",
YEAR, 2555, MONTH, DECEMBER, DAY_OF_MONTH, 5);
test(THTH, DAY_OF_WEEK, "\u0e1e",
YEAR, 2555, MONTH, DECEMBER, DAY_OF_MONTH, 5);
testMap(US, DAY_OF_WEEK, ALL_STYLES, // shouldn't include any narrow names
"", // 1-based indexing for DAY_OF_WEEK
"Sunday", // Sunday
"Monday", // Monday
"Tuesday", // Tuesday
"Wednesday", // Wednesday
"Thursday", // Thursday
"Friday", // Friday
"Saturday", // Saturday
RESET_INDEX,
"", // 1-based indexing for DAY_OF_WEEK
"Sun", // abb Sunday
"Mon", // abb Monday
"Tue", // abb Tuesday
"Wed", // abb Wednesday
"Thu", // abb Thursday
"Fri", // abb Friday
"Sat" // abb Saturday
);
testMap(US, DAY_OF_WEEK, NARROW_FORMAT); // expect null
testMap(US, AM_PM, ALL_STYLES,
"AM", "PM",
RESET_INDEX,
"a", "p");
testMap(JAJPJP, DAY_OF_WEEK, NARROW_STANDALONE); // expect null
testMap(JAJPJP, DAY_OF_WEEK, NARROW_FORMAT,
"", // 1-based indexing for DAY_OF_WEEK
"\u65e5",
"\u6708",
"\u706b",
"\u6c34",
"\u6728",
"\u91d1",
"\u571f");
testMap(THTH, MONTH, NARROW_FORMAT); // expect null
testMap(THTH, MONTH, NARROW_STANDALONE,
"\u0e21.\u0e04.",
"\u0e01.\u0e1e.",
"\u0e21\u0e35.\u0e04.",
"\u0e40\u0e21.\u0e22.",
"\u0e1e.\u0e04.",
"\u0e21\u0e34.\u0e22.",
"\u0e01.\u0e04.",
"\u0e2a.\u0e04.",
"\u0e01.\u0e22.",
"\u0e15.\u0e04.",
"\u0e1e.\u0e22.",
"\u0e18.\u0e04.");
if (errors != 0) {
throw new RuntimeException("test failed");
}
}
private static void test(Locale locale, int field, String expected, int... data) {
test(locale, field, NARROW_FORMAT, expected, data);
}
private static void test(Locale locale, int field, int style, String expected, int... fieldValuePairs) {
Calendar cal = Calendar.getInstance(locale);
cal.clear();
for (int i = 0; i < fieldValuePairs.length;) {
int f = fieldValuePairs[i++];
int v = fieldValuePairs[i++];
cal.set(f, v);
}
String got = cal.getDisplayName(field, style, locale);
if (!expected.equals(got)) {
System.err.printf("test: locale=%s, field=%d, value=%d, style=%d, got=\"%s\", expected=\"%s\"%n",
locale, field, cal.get(field), style, got, expected);
errors++;
}
}
private static void testMap(Locale locale, int field, int style, String... expected) {
Map<String, Integer> expectedMap = null;
if (expected.length > 0) {
expectedMap = new TreeMap<>(LengthBasedComparator.INSTANCE);
int index = 0;
for (int i = 0; i < expected.length; i++) {
if (expected[i].isEmpty()) {
index++;
continue;
}
if (expected[i] == RESET_INDEX) {
index = 0;
continue;
}
expectedMap.put(expected[i], index++);
}
}
Calendar cal = Calendar.getInstance(locale);
Map<String, Integer> got = cal.getDisplayNames(field, style, locale);
if (!(expectedMap == null && got == null)
&& !expectedMap.equals(got)) {
System.err.printf("testMap: locale=%s, field=%d, style=%d, expected=%s, got=%s%n",
locale, field, style, expectedMap, got);
errors++;
}
}
/**
* Comparator implementation for TreeMap which iterates keys from longest
* to shortest.
*/
private static class LengthBasedComparator implements Comparator<String> {
private static final LengthBasedComparator INSTANCE = new LengthBasedComparator();
private LengthBasedComparator() {
}
@Override
public int compare(String o1, String o2) {
int n = o2.length() - o1.length();
return (n == 0) ? o1.compareTo(o2) : n;
}
}
}
#
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# @test
# @bug 8000983
# @summary Unit test for narrow names support
# @build NarrowNamesTest
# @run shell NarrowNamesTest.sh
# This test is locale data-dependent and assumes that both JRE and CLDR
# have the same narrow names.
STATUS=0
for P in "JRE,SPI" "CLDR"
do
echo "Locale providers: $P"
if ! ${TESTJAVA}/bin/java -esa -cp "${TESTCLASSES}" -Djava.locale.providers="${P}" NarrowNamesTest; then
STATUS=1
fi
done
exit ${STATUS}
...@@ -27,22 +27,15 @@ import java.util.*; ...@@ -27,22 +27,15 @@ import java.util.*;
import java.util.regex.*; import java.util.regex.*;
public class PropertiesTest { public class PropertiesTest {
public static void main(String[] s) throws Exception { public static void main(String[] args) throws Exception {
for (int i = 0; i < s.length; i ++) { if (args.length == 2 && args[0].equals("-d")) {
if ("-d".equals(s[i])) { dump(args[1]);
i++; } else if (args.length == 4 && args[0].equals("-c")) {
if (i == s.length) { compare(args[1], args[2], args[3]);
throw new RuntimeException("-d needs output file name");
} else { } else {
dump(s[i]); System.err.println("Usage: java PropertiesTest -d <dumpfile>");
} System.err.println(" java PropertiesTest -c <beforedump> <afterdump> <propsfile>");
} else if ("-c".equals(s[i])) { System.exit(-1);
if (i+2 == s.length) {
throw new RuntimeException("-d needs two file name arguments, before and after respectively");
} else {
compare(s[++i], s[++i]);
}
}
} }
} }
...@@ -77,15 +70,17 @@ public class PropertiesTest { ...@@ -77,15 +70,17 @@ public class PropertiesTest {
pw.close(); pw.close();
} }
private static void compare(String beforeFile, String afterFile) throws Exception { private static void compare(String beforeFile, String afterFile, String propsFile)
throws IOException
{
// load file contents // load file contents
Properties before = new Properties(); Properties before = new Properties();
try (Reader reader = new FileReader(beforeFile)) {
before.load(reader);
}
Properties after = new Properties(); Properties after = new Properties();
try { try (Reader reader = new FileReader(afterFile)) {
before.load(new FileReader(beforeFile)); after.load(reader);
after.load(new FileReader(afterFile));
} catch (IOException ioe) {
throw new RuntimeException(ioe);
} }
// remove the same contents from the 'after' properties // remove the same contents from the 'after' properties
...@@ -103,13 +98,9 @@ public class PropertiesTest { ...@@ -103,13 +98,9 @@ public class PropertiesTest {
} }
// now look at the currency.properties // now look at the currency.properties
String propFileName = System.getProperty("java.home") + File.separator +
"lib" + File.separator + "currency.properties";
Properties p = new Properties(); Properties p = new Properties();
try { try (Reader reader = new FileReader(propsFile)) {
p.load(new FileReader(propFileName)); p.load(reader);
} catch (IOException ioe) {
throw new RuntimeException(ioe);
} }
// test each replacements // test each replacements
......
#!/bin/sh #!/bin/sh
# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
# #
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# @test # @test
# @bug 6332666 7180362 # @bug 6332666 7180362 8003846
# @summary tests the capability of replacing the currency data with user # @summary tests the capability of replacing the currency data with user
# specified currency properties file # specified currency properties file
# @build PropertiesTest # @build PropertiesTest
...@@ -36,7 +58,7 @@ case "$OS" in ...@@ -36,7 +58,7 @@ case "$OS" in
;; ;;
Windows* | CYGWIN* ) Windows* | CYGWIN* )
PS=";" PS=";"
FS="\\" FS="/"
;; ;;
* ) * )
echo "Unrecognized system!" echo "Unrecognized system!"
...@@ -44,23 +66,31 @@ case "$OS" in ...@@ -44,23 +66,31 @@ case "$OS" in
;; ;;
esac esac
# Currency dump path #1. Just dump currencies with the bare JRE failures=0
# run run() {
RUNCMD="${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} PropertiesTest -d dump1" echo ''
sh -xc "${TESTJAVA}${FS}bin${FS}java -cp ${TESTCLASSES} $*" 2>&1
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
}
echo ${RUNCMD} PROPS=${TESTSRC}${FS}currency.properties
${RUNCMD}
result=$?
if [ $result -eq 0 ]
then
echo "Execution successful"
else
echo "Execution of the test case failed."
fi
# Currency dump path #2. Dump currencies using the JRE with replacement currencies # Dump built-in currency data
run PropertiesTest -d dump1
# Dump built-in currency data + overrides in properties file specified
# by system property.
run -Djava.util.currency.data=${PROPS} PropertiesTest -d dump2
run PropertiesTest -c dump1 dump2 ${PROPS}
# Dump built-in currency data + overrides in properties file copied into
# JRE image.
# copy the test properties file # copy the test properties file
COPIED=0 COPIED=0
...@@ -79,44 +109,27 @@ then ...@@ -79,44 +109,27 @@ then
else else
PROPLOCATION=${WRITABLEJDK}${FS}lib PROPLOCATION=${WRITABLEJDK}${FS}lib
fi fi
cp ${TESTSRC}${FS}currency.properties $PROPLOCATION cp ${PROPS} $PROPLOCATION
# run # run
RUNCMD="${WRITABLEJDK}${FS}bin${FS}java -classpath ${TESTCLASSES} PropertiesTest -d dump2" echo ''
sh -xc "${WRITABLEJDK}${FS}bin${FS}java -cp ${TESTCLASSES} PropertiesTest -d dump3"
echo ${RUNCMD} if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
${RUNCMD}
result=$?
if [ $result -eq 0 ]
then
echo "Execution successful"
else
echo "Execution of the test case failed."
fi
# Now compare the two dump files
RUNCMD="${WRITABLEJDK}${FS}bin${FS}java -classpath ${TESTCLASSES} PropertiesTest -c dump1 dump2"
echo ${RUNCMD}
${RUNCMD}
result=$?
if [ $result -eq 0 ]
then
echo "Execution successful"
else
echo "Execution of the test case failed."
fi
# Cleanup # Cleanup
rm -f dump1
rm -f dump2
rm -f ${PROPLOCATION}${FS}currency.properties rm -f ${PROPLOCATION}${FS}currency.properties
if [ $COPIED -eq 1 ] if [ $COPIED -eq 1 ]
then then
rm -rf $WRITABLEJDK rm -rf $WRITABLEJDK
fi fi
exit $result # compare the two dump files
run PropertiesTest -c dump1 dump3 ${PROPS}
# Results
echo ''
if [ $failures -gt 0 ];
then echo "$failures tests failed";
else echo "All tests passed"; fi
exit $failures
...@@ -41,6 +41,7 @@ public class GenericTest { ...@@ -41,6 +41,7 @@ public class GenericTest {
com.bar.CurrencyNameProviderImpl2 currencyNP2 = new com.bar.CurrencyNameProviderImpl2(); com.bar.CurrencyNameProviderImpl2 currencyNP2 = new com.bar.CurrencyNameProviderImpl2();
com.bar.LocaleNameProviderImpl localeNP = new com.bar.LocaleNameProviderImpl(); com.bar.LocaleNameProviderImpl localeNP = new com.bar.LocaleNameProviderImpl();
com.bar.TimeZoneNameProviderImpl tzNP = new com.bar.TimeZoneNameProviderImpl(); com.bar.TimeZoneNameProviderImpl tzNP = new com.bar.TimeZoneNameProviderImpl();
com.bar.GenericTimeZoneNameProviderImpl tzGenNP = new com.bar.GenericTimeZoneNameProviderImpl();
com.bar.CalendarDataProviderImpl calDataP = new com.bar.CalendarDataProviderImpl(); com.bar.CalendarDataProviderImpl calDataP = new com.bar.CalendarDataProviderImpl();
com.bar.CalendarNameProviderImpl calNameP = new com.bar.CalendarNameProviderImpl(); com.bar.CalendarNameProviderImpl calNameP = new com.bar.CalendarNameProviderImpl();
...@@ -73,6 +74,7 @@ public class GenericTest { ...@@ -73,6 +74,7 @@ public class GenericTest {
expected.addAll(Arrays.asList(currencyNP2.getAvailableLocales())); expected.addAll(Arrays.asList(currencyNP2.getAvailableLocales()));
expected.addAll(Arrays.asList(localeNP.getAvailableLocales())); expected.addAll(Arrays.asList(localeNP.getAvailableLocales()));
expected.addAll(Arrays.asList(tzNP.getAvailableLocales())); expected.addAll(Arrays.asList(tzNP.getAvailableLocales()));
expected.addAll(Arrays.asList(tzGenNP.getAvailableLocales()));
expected.addAll(Arrays.asList(calDataP.getAvailableLocales())); expected.addAll(Arrays.asList(calDataP.getAvailableLocales()));
expected.addAll(Arrays.asList(calNameP.getAvailableLocales())); expected.addAll(Arrays.asList(calNameP.getAvailableLocales()));
if (!result.equals(expected)) { if (!result.equals(expected)) {
......
...@@ -40,6 +40,7 @@ public class TimeZoneNameProviderTest extends ProviderTest { ...@@ -40,6 +40,7 @@ public class TimeZoneNameProviderTest extends ProviderTest {
TimeZoneNameProviderTest() { TimeZoneNameProviderTest() {
test1(); test1();
test2(); test2();
test3();
aliasTest(); aliasTest();
} }
...@@ -92,6 +93,7 @@ public class TimeZoneNameProviderTest extends ProviderTest { ...@@ -92,6 +93,7 @@ public class TimeZoneNameProviderTest extends ProviderTest {
final String pattern = "z"; final String pattern = "z";
final Locale OSAKA = new Locale("ja", "JP", "osaka"); final Locale OSAKA = new Locale("ja", "JP", "osaka");
final Locale KYOTO = new Locale("ja", "JP", "kyoto"); final Locale KYOTO = new Locale("ja", "JP", "kyoto");
final Locale GENERIC = new Locale("ja", "JP", "generic");
final String[] TIMEZONES = { final String[] TIMEZONES = {
"GMT", "America/Los_Angeles", "SystemV/PST8", "GMT", "America/Los_Angeles", "SystemV/PST8",
...@@ -157,6 +159,29 @@ public class TimeZoneNameProviderTest extends ProviderTest { ...@@ -157,6 +159,29 @@ public class TimeZoneNameProviderTest extends ProviderTest {
} }
} }
void test3() {
final String[] TZNAMES = {
LATIME, PST, PST8PDT, US_PACIFIC,
TOKYOTIME, JST, JAPAN,
};
for (String tzname : TZNAMES) {
TimeZone tz = TimeZone.getTimeZone(tzname);
for (int style : new int[] { TimeZone.LONG, TimeZone.SHORT }) {
String osakaStd = tz.getDisplayName(false, style, OSAKA);
if (osakaStd != null) {
// No API for getting generic time zone names
String generic = TimeZoneNameUtility.retrieveGenericDisplayName(tzname,
style, GENERIC);
String expected = "Generic " + osakaStd;
if (!expected.equals(generic)) {
throw new RuntimeException("Wrong generic name: got=\"" + generic
+ "\", expected=\"" + expected + "\"");
}
}
}
}
}
final String LATIME = "America/Los_Angeles"; final String LATIME = "America/Los_Angeles";
final String PST = "PST"; final String PST = "PST";
final String PST8PDT = "PST8PDT"; final String PST8PDT = "PST8PDT";
......
# #
# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
...@@ -23,6 +23,6 @@ ...@@ -23,6 +23,6 @@
#!/bin/sh #!/bin/sh
# #
# @test # @test
# @bug 4052440 # @bug 4052440 8003267
# @summary TimeZoneNameProvider tests # @summary TimeZoneNameProvider tests
# @run shell ExecTest.sh bar TimeZoneNameProviderTest true # @run shell ExecTest.sh bar TimeZoneNameProviderTest true
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
*
*/
package com.bar;
import java.util.*;
import java.util.spi.*;
import com.foobar.Utils;
/**
* Implementation class for getGenericTimeZoneName which returns "Generic "+<standard name in OSAKA>.
*/
public class GenericTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
static final Locale jaJPGeneric = new Locale("ja", "JP", "generic");
static final Locale OSAKA = new Locale("ja", "JP", "osaka");
static Locale[] avail = {
jaJPGeneric
};
@Override
public Locale[] getAvailableLocales() {
return avail;
}
@Override
public String getGenericDisplayName(String id, int style, Locale locale) {
if (!jaJPGeneric.equals(locale)) {
return null;
}
String std = super.getDisplayName(id, false, style, OSAKA);
return (std != null) ? "Generic " + std : null;
}
}
...@@ -38,6 +38,7 @@ BARFILES_JAVA = \ ...@@ -38,6 +38,7 @@ BARFILES_JAVA = \
CurrencyNameProviderImpl.java \ CurrencyNameProviderImpl.java \
CurrencyNameProviderImpl2.java \ CurrencyNameProviderImpl2.java \
TimeZoneNameProviderImpl.java \ TimeZoneNameProviderImpl.java \
GenericTimeZoneNameProviderImpl.java \
LocaleNameProviderImpl.java \ LocaleNameProviderImpl.java \
CalendarDataProviderImpl.java \ CalendarDataProviderImpl.java \
CalendarNameProviderImpl.java \ CalendarNameProviderImpl.java \
......
...@@ -5,3 +5,4 @@ ...@@ -5,3 +5,4 @@
# implementation class # implementation class
# #
com.bar.TimeZoneNameProviderImpl com.bar.TimeZoneNameProviderImpl
com.bar.GenericTimeZoneNameProviderImpl
...@@ -40,6 +40,9 @@ public class Bug6912560 { ...@@ -40,6 +40,9 @@ public class Bug6912560 {
// set the user.timezone property // set the user.timezone property
String tzname = "Asia/Tokyo"; String tzname = "Asia/Tokyo";
System.setProperty("user.timezone", tzname); System.setProperty("user.timezone", tzname);
// make sure the timezone will be initialized by
// the next call to TimeZone.getDefault()
TimeZone.setDefault(null);
System.setSecurityManager(new SecurityManager()); System.setSecurityManager(new SecurityManager());
TimeZone tz = TimeZone.getDefault(); TimeZone tz = TimeZone.getDefault();
......
...@@ -42,17 +42,22 @@ public class CheckLockLocationTest { ...@@ -42,17 +42,22 @@ public class CheckLockLocationTest {
private static final String NOT_A_DIR = "not-a-dir"; private static final String NOT_A_DIR = "not-a-dir";
private static final String WRITABLE_DIR = "writable-dir"; private static final String WRITABLE_DIR = "writable-dir";
private static final String NON_EXISTENT_DIR = "non-existent-dir"; private static final String NON_EXISTENT_DIR = "non-existent-dir";
private static boolean runNonWritableDirTest;
public static void main(String... args) throws IOException { public static void main(String... args) throws IOException {
// we'll base all file creation attempts on the system temp directory, // we'll base all file creation attempts on the system temp directory,
// %t and also try specifying non-existent directories and plain files // %t and also try specifying non-existent directories and plain files
// that should be directories, and non-writable directories, // that should be directories, and non-writable directories,
// to exercise all code paths of checking the lock location // to exercise all code paths of checking the lock location
// Note that on platforms like Windows that don't support
// setWritable() on a directory, we'll skip the non-writable
// directory test if setWritable(false) returns false.
//
File writableDir = setup(); File writableDir = setup();
// we now have three files/directories to work with: // we now have three files/directories to work with:
// writableDir // writableDir
// notAdir // notAdir
// nonWritableDir // nonWritableDir (may not be possible on some platforms)
// nonExistentDir (which doesn't exist) // nonExistentDir (which doesn't exist)
runTests(writableDir); runTests(writableDir);
} }
...@@ -79,6 +84,7 @@ public class CheckLockLocationTest { ...@@ -79,6 +84,7 @@ public class CheckLockLocationTest {
} }
// Test 2: creating FileHandler in non-writable directory should fail // Test 2: creating FileHandler in non-writable directory should fail
if (runNonWritableDirTest) {
try { try {
new FileHandler("%t/" + NON_WRITABLE_DIR + "/log.log"); new FileHandler("%t/" + NON_WRITABLE_DIR + "/log.log");
throw new RuntimeException("Test failed: should not have been able" throw new RuntimeException("Test failed: should not have been able"
...@@ -87,7 +93,10 @@ public class CheckLockLocationTest { ...@@ -87,7 +93,10 @@ public class CheckLockLocationTest {
} catch (IOException ex) { } catch (IOException ex) {
// check for the right exception // check for the right exception
if (!(ex instanceof AccessDeniedException)) { if (!(ex instanceof AccessDeniedException)) {
throw new RuntimeException("Test failed: Expected exception was not an AccessDeniedException", ex); throw new RuntimeException(
"Test failed: Expected exception was not an "
+ "AccessDeniedException", ex);
}
} }
} }
...@@ -99,8 +108,11 @@ public class CheckLockLocationTest { ...@@ -99,8 +108,11 @@ public class CheckLockLocationTest {
+ "/log.log in non-directory."); + "/log.log in non-directory.");
} catch (IOException ex) { } catch (IOException ex) {
// check for the right exception // check for the right exception
if (!(ex instanceof FileSystemException && ex.getMessage().contains("Not a directory"))) { if (!(ex instanceof FileSystemException
throw new RuntimeException("Test failed: Expected exception was not a FileSystemException", ex); && ex.getMessage().contains("Not a directory"))) {
throw new RuntimeException(
"Test failed: Expected exception was not a "
+ "FileSystemException", ex);
} }
} }
...@@ -113,7 +125,8 @@ public class CheckLockLocationTest { ...@@ -113,7 +125,8 @@ public class CheckLockLocationTest {
} catch (IOException ex) { } catch (IOException ex) {
// check for the right exception // check for the right exception
if (!(ex instanceof NoSuchFileException)) { if (!(ex instanceof NoSuchFileException)) {
throw new RuntimeException("Test failed: Expected exception was not a NoSuchFileException", ex); throw new RuntimeException("Test failed: Expected exception "
+ "was not a NoSuchFileException", ex);
} }
} }
} }
...@@ -162,10 +175,14 @@ public class CheckLockLocationTest { ...@@ -162,10 +175,14 @@ public class CheckLockLocationTest {
nonWritableDir.deleteOnExit(); nonWritableDir.deleteOnExit();
// make it non-writable // make it non-writable
if (!nonWritableDir.setWritable(false)) { if (nonWritableDir.setWritable(false)) {
throw new RuntimeException("Test setup failed: unable to make" runNonWritableDirTest = true;
} else {
runNonWritableDirTest = false;
System.out.println( "Test Setup WARNING: unable to make"
+ " working directory " + nonWritableDir.getAbsolutePath() + " working directory " + nonWritableDir.getAbsolutePath()
+ " non-writable."); + " non-writable on platform " + System.getProperty("os.name"));
} }
// make sure non-existent directory really doesn't exist // make sure non-existent directory really doesn't exist
......
...@@ -24,9 +24,10 @@ ...@@ -24,9 +24,10 @@
*/ */
/* @test /* @test
* @bug 7160252 * @bug 7160252 7197662
* @summary Checks if events are delivered to a listener * @summary Checks if events are delivered to a listener
* when a child node is added or removed * when a child node is added or removed
* @run main/othervm -Djava.util.prefs.userRoot=. AddNodeChangeListener
*/ */
import java.util.prefs.*; import java.util.prefs.*;
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
# #
# @test # @test
# @bug 7198073 # @bug 7198073 7197662
# @build CheckUserPrefFirst CheckUserPrefLater # @build CheckUserPrefFirst CheckUserPrefLater
# @run shell CheckUserPrefsStorage.sh # @run shell CheckUserPrefsStorage.sh
# @summary Tests that user preferences are stored in the # @summary Tests that user preferences are stored in the
...@@ -50,14 +50,14 @@ case "$OS" in ...@@ -50,14 +50,14 @@ case "$OS" in
esac esac
# run CheckUserPrefFirst - creates and stores a user pref # run CheckUserPrefFirst - creates and stores a user pref
${TESTJAVA}${FS}bin${FS}java -cp ${TESTCLASSES} CheckUserPrefFirst ${TESTJAVA}${FS}bin${FS}java -cp ${TESTCLASSES} -Djava.util.prefs.userRoot=. CheckUserPrefFirst
result=$? result=$?
if [ "$result" -ne "0" ]; then if [ "$result" -ne "0" ]; then
exit 1 exit 1
fi fi
# run CheckUserPrefLater - Looks for the stored pref # run CheckUserPrefLater - Looks for the stored pref
${TESTJAVA}${FS}bin${FS}java -cp ${TESTCLASSES} CheckUserPrefLater ${TESTJAVA}${FS}bin${FS}java -cp ${TESTCLASSES} -Djava.util.prefs.userRoot=. CheckUserPrefLater
result=$? result=$?
if [ "$result" -ne "0" ]; then if [ "$result" -ne "0" ]; then
exit 1 exit 1
......
...@@ -23,8 +23,9 @@ ...@@ -23,8 +23,9 @@
/* /*
* @test * @test
* @bug 4619564 * @bug 4619564 7197662
* @summary XMl Comments in Preferences File lead to ClassCastException * @summary XMl Comments in Preferences File lead to ClassCastException
* @run main/othervm -Djava.util.prefs.userRoot=. CommentsInXml
* @author kladko * @author kladko
*/ */
......
...@@ -23,8 +23,9 @@ ...@@ -23,8 +23,9 @@
/* /*
* @test * @test
* @bug 4703132 * @bug 4703132 7197662
* @summary flush() throws an IllegalStateException on a removed node * @summary flush() throws an IllegalStateException on a removed node
* @run main/othervm -Djava.util.prefs.userRoot=. ConflictInFlush
* @author Sucheta Dambalkar * @author Sucheta Dambalkar
*/ */
......
...@@ -24,9 +24,10 @@ ...@@ -24,9 +24,10 @@
/* /*
* @test * @test
* @bug 4387136 4947349 * @bug 4387136 4947349 7197662
* @summary Due to a bug in XMLSupport.putPreferencesInXml(...), * @summary Due to a bug in XMLSupport.putPreferencesInXml(...),
* node's keys would not get exported. * node's keys would not get exported.
* @run main/othervm -Djava.util.prefs.userRoot=. ExportNode
* @author Konstantin Kladko * @author Konstantin Kladko
*/ */
import java.util.prefs.*; import java.util.prefs.*;
......
...@@ -23,9 +23,10 @@ ...@@ -23,9 +23,10 @@
/* @test /* @test
@bug 6203576 4700020 * @bug 6203576 4700020 7197662
@summary checks if the output of exportSubtree() is identical to * @summary checks if the output of exportSubtree() is identical to
the output from previous release. * the output from previous release.
* @run main/othervm -Djava.util.prefs.userRoot=. ExportSubtree
*/ */
import java.io.*; import java.io.*;
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
# #
# @test # @test
# @bug 4991526 6514993 # @bug 4991526 6514993 7197662
# @summary Unit test for Preferences jar providers # @summary Unit test for Preferences jar providers
# #
# @build PrefsSpi # @build PrefsSpi
...@@ -89,12 +89,16 @@ case "`uname`" in Windows*|CYGWIN* ) CPS=';';; *) CPS=':';; esac ...@@ -89,12 +89,16 @@ case "`uname`" in Windows*|CYGWIN* ) CPS=';';; *) CPS=':';; esac
Sys "$java" "-cp" "$TESTCLASSES${CPS}extDir/PrefsSpi.jar" \ Sys "$java" "-cp" "$TESTCLASSES${CPS}extDir/PrefsSpi.jar" \
-Djava.util.prefs.PreferencesFactory=StubPreferencesFactory \ -Djava.util.prefs.PreferencesFactory=StubPreferencesFactory \
-Djava.util.prefs.userRoot=. \
PrefsSpi "StubPreferences" PrefsSpi "StubPreferences"
Sys "$java" "-cp" "$TESTCLASSES" \ Sys "$java" "-cp" "$TESTCLASSES" \
-Djava.util.prefs.userRoot=. \
PrefsSpi "java.util.prefs.*" PrefsSpi "java.util.prefs.*"
Sys "$java" "-cp" "$TESTCLASSES${CPS}extDir/PrefsSpi.jar" \ Sys "$java" "-cp" "$TESTCLASSES${CPS}extDir/PrefsSpi.jar" \
-Djava.util.prefs.userRoot=. \
PrefsSpi "StubPreferences" PrefsSpi "StubPreferences"
Sys "$java" "-cp" "$TESTCLASSES" "-Djava.ext.dirs=extDir" \ Sys "$java" "-cp" "$TESTCLASSES" "-Djava.ext.dirs=extDir" \
-Djava.util.prefs.userRoot=. \
PrefsSpi "StubPreferences" PrefsSpi "StubPreferences"
rm -rf jarDir extDir rm -rf jarDir extDir
...@@ -22,9 +22,10 @@ ...@@ -22,9 +22,10 @@
*/ */
/* @test /* @test
* @bug 7160242 7165118 * @bug 7160242 7165118 7197662
* @summary Check if NullPointerException is thrown if the key passed * @summary Check if NullPointerException is thrown if the key passed
* to remove() is null. * to remove() is null.
* @run main/othervm -Djava.util.prefs.userRoot=. RemoveNullKeyCheck
*/ */
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
......
...@@ -23,10 +23,11 @@ ...@@ -23,10 +23,11 @@
/* @test /* @test
@bug 6178148 * @bug 6178148 7197662
@summary check if wrong exception gets thrown if one of the child * @summary check if wrong exception gets thrown if one of the child
nodes is readonly on underlying filesystem when node is * nodes is readonly on underlying filesystem when node is
being removed. * being removed.
* @run main/othervm -Djava.util.prefs.userRoot=. RemoveReadOnlyNode
*/ */
import java.io.*; import java.io.*;
......
...@@ -23,9 +23,10 @@ ...@@ -23,9 +23,10 @@
/* @test /* @test
* @bug 4705094 * @bug 4705094 7197662
* @summary Checks if correct exception gets thrown when removing an * @summary Checks if correct exception gets thrown when removing an
* unregistered NodeChangeListener . * unregistered NodeChangeListener .
* @run main/othervm -Djava.util.prefs.userRoot=. RemoveUnregedListener
*/ */
import java.util.prefs.*; import java.util.prefs.*;
......
<!--
Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 only, as
published by the Free Software Foundation.
This code is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
version 2 for more details (a copy is included in the LICENSE file that
accompanied this code).
You should have received a copy of the GNU General Public License version
2 along with this work; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
or visit www.oracle.com if you need additional information or have any
questions.
-->
<Html>
<Body>
<APPLET code="bug4506788.class" WIDTH = 600 HEIGHT = 400></APPLET>
</Body>
</Html>
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
@bug 4506788 7147408
@summary Tests if cursor gets stuck after insertion a character
@author Denis Sharypov
@run applet bug4506788.html
*/
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import sun.awt.SunToolkit;
public class bug4506788 extends JApplet {
private volatile boolean passed = false;
private JEditorPane jep;
private SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
@Override
public void init() {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
} catch (InterruptedException | InvocationTargetException ex) {
ex.printStackTrace();
throw new RuntimeException("FAILED: SwingUtilities.invokeAndWait method failed then creating and showing GUI");
}
}
@Override
public void start() {
Robot robot;
try {
robot = new Robot();
} catch (AWTException e) {
throw new RuntimeException("Robot could not be created");
}
toolkit.realSync();
Point p;
try {
p = getJEPLocOnScreen();
} catch (Exception e) {
throw new RuntimeException("Could not get JEditorPane location on screen");
}
robot.setAutoDelay(50);
robot.mouseMove(p.x, p.y);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.keyPress(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_RIGHT);
robot.keyPress(KeyEvent.VK_X);
robot.keyRelease(KeyEvent.VK_X);
robot.keyPress(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_RIGHT);
toolkit.realSync();
if (!passed) {
throw new RuntimeException("Test failed.");
}
}
private Point getJEPLocOnScreen() throws Exception {
final Point[] result = new Point[1];
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
result[0] = jep.getLocationOnScreen();
}
});
return result[0];
}
private void createAndShowGUI() {
jep = new JEditorPane();
String text = "abc";
JFrame f = new JFrame();
jep.setEditorKit(new StyledEditorKit());
jep.setText(text);
jep.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(CaretEvent e) {
passed = (e.getDot() == 3);
}
});
DefaultStyledDocument doc = (DefaultStyledDocument) jep.getDocument();
MutableAttributeSet atr = new SimpleAttributeSet();
StyleConstants.setBold(atr, true);
doc.setCharacterAttributes(1, 1, atr, false);
f.getContentPane().add(jep);
f.setSize(100, 100);
f.setVisible(true);
}
}
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8003948
* @run main MessageHeaderTest
*/
import java.io.*;
import sun.net.www.MessageHeader;
public class MessageHeaderTest {
public static void main (String[] args) throws Exception {
for (int i=0; i<7; i++) {
ByteArrayInputStream bis = new ByteArrayInputStream(headers[i].getBytes());
MessageHeader h = new MessageHeader(bis);
String before = h.toString();
before = before.substring(before.indexOf('{'));
boolean result = h.filterNTLMResponses("WWW-Authenticate");
String after = h.toString();
after = after.substring(after.indexOf('{'));
if (!expected[i].equals(after)) {
throw new RuntimeException(Integer.toString(i) + " expected != after");
}
if (result != expectedResult[i]) {
throw new RuntimeException(Integer.toString(i) + " result != expectedResult");
}
}
}
static String expected[] = {
"{null: HTTP/1.1 200 Ok}{Foo: bar}{Bar: foo}{WWW-Authenticate: NTLM sdsds}",
"{null: HTTP/1.1 200 Ok}{Foo: bar}{Bar: foo}{WWW-Authenticate: }",
"{null: HTTP/1.1 200 Ok}{Foo: bar}{Bar: foo}{WWW-Authenticate: NTLM sdsds}",
"{null: HTTP/1.1 200 Ok}{Foo: bar}{Bar: foo}{WWW-Authenticate: NTLM sdsds}",
"{null: HTTP/1.1 200 Ok}{Foo: bar}{Bar: foo}{WWW-Authenticate: NTLM sdsds}{Bar: foo}",
"{null: HTTP/1.1 200 Ok}{WWW-Authenticate: Negotiate}{Foo: bar}{Bar: foo}{WWW-Authenticate: NTLM}{Bar: foo}{WWW-Authenticate: Kerberos}",
"{null: HTTP/1.1 200 Ok}{Foo: foo}{Bar: }{WWW-Authenticate: NTLM blob}{Bar: foo blob}"
};
static boolean[] expectedResult = {
false, false, true, true, true, false, false
};
static String[] headers = {
"HTTP/1.1 200 Ok\r\nFoo: bar\r\nBar: foo\r\nWWW-Authenticate: NTLM sdsds",
"HTTP/1.1 200 Ok\r\nFoo: bar\r\nBar: foo\r\nWWW-Authenticate:",
"HTTP/1.1 200 Ok\r\nFoo: bar\r\nBar: foo\r\nWWW-Authenticate: NTLM sdsds\r\nWWW-Authenticate: Negotiate",
"HTTP/1.1 200 Ok\r\nFoo: bar\r\nBar: foo\r\nWWW-Authenticate: NTLM sdsds\r\nWWW-Authenticate: Negotiate\r\nWWW-Authenticate: Kerberos",
"HTTP/1.1 200 Ok\r\nWWW-Authenticate: Negotiate\r\nFoo: bar\r\nBar: foo\r\nWWW-Authenticate: NTLM sdsds\r\nBar: foo\r\nWWW-Authenticate: Kerberos",
"HTTP/1.1 200 Ok\r\nWWW-Authenticate: Negotiate\r\nFoo: bar\r\nBar: foo\r\nWWW-Authenticate: NTLM\r\nBar: foo\r\nWWW-Authenticate: Kerberos",
"HTTP/1.1 200 Ok\r\nFoo: foo\r\nBar:\r\nWWW-Authenticate: NTLM blob\r\nBar: foo blob"
};
}
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8004488
* @summary wrong permissions checked in krb5
* @compile -XDignore.symbol.file KeyPermissions.java
* @run main/othervm KeyPermissions
*/
import java.security.AccessControlException;
import java.security.Permission;
import javax.security.auth.PrivateCredentialPermission;
import sun.security.jgss.GSSUtil;
public class KeyPermissions extends SecurityManager {
@Override
public void checkPermission(Permission perm) {
if (perm instanceof PrivateCredentialPermission) {
if (!perm.getName().startsWith("javax.security.auth.kerberos.")) {
throw new AccessControlException(
"I don't like this", perm);
}
}
}
public static void main(String[] args) throws Exception {
System.setSecurityManager(new KeyPermissions());
new OneKDC(null).writeJAASConf();
Context s = Context.fromJAAS("server");
s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID);
}
}
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
/* /*
* @test * @test
* @bug 6894072 * @bug 6894072
* @bug 8004488
* @compile -XDignore.symbol.file KeyTabCompat.java * @compile -XDignore.symbol.file KeyTabCompat.java
* @run main/othervm KeyTabCompat * @run main/othervm KeyTabCompat
* @summary always refresh keytab * @summary always refresh keytab
...@@ -70,21 +71,8 @@ public class KeyTabCompat { ...@@ -70,21 +71,8 @@ public class KeyTabCompat {
s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID); s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID);
s.status(); s.status();
if (s.s().getPrivateCredentials(KerberosKey.class).size() != 1) { if (s.s().getPrivateCredentials(KerberosKey.class).size() != 0) {
throw new Exception("There should be one KerberosKey"); throw new Exception("There should be no KerberosKey");
} }
Thread.sleep(2000); // make sure ktab timestamp is different
kdc.addPrincipal(OneKDC.SERVER, "pass2".toCharArray());
kdc.writeKtab(OneKDC.KTAB);
Context.handshake(c, s);
s.status();
if (s.s().getPrivateCredentials(KerberosKey.class).size() != 1) {
throw new Exception("There should be only one KerberosKey");
}
} }
} }
/* /*
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -21,6 +21,11 @@ ...@@ -21,6 +21,11 @@
* questions. * questions.
*/ */
//
// SunJSSE does not support dynamic system properties, no way to re-use
// system properties in samevm/agentvm mode.
//
/* /*
* @test * @test
* @bug 6405536 * @bug 6405536
...@@ -28,6 +33,7 @@ ...@@ -28,6 +33,7 @@
* @author Andreas Sterbenz * @author Andreas Sterbenz
* @library .. * @library ..
* @library ../../../../java/security/testlibrary * @library ../../../../java/security/testlibrary
* @run main/othervm ClientJSSEServerJSSE
*/ */
import java.security.*; import java.security.*;
......
...@@ -31,62 +31,101 @@ ...@@ -31,62 +31,101 @@
# @run shell/manual console.sh # @run shell/manual console.sh
if [ "$ALT_PASS" = "" ]; then if [ "$ALT_PASS" = "" ]; then
export PASS=äöäöäöäö PASSW=äöäöäö
else else
export PASS=$ALT_PASS PASSW=$ALT_PASS
fi fi
echo "ATTENTION" KS=/tmp/kkk.$$
echo "==============================================================="
cat <<____
ATTENTION
===============================================================
This test is about non-ASCII password input compatibility between
JDK 5.0 and later versions. Before running the test, make sure that --
\$J5 points to a JDK 5.0 installation
\$JM points to the current installation
The password string used in this test is $PASSW. If you find difficulty
entering it in in your system, feel free to change it to something else
by providing \$ALT_PASS. It should be no less than 6 characters and include
some non-ASCII characters.
For each test, type into the characters as described in the test header.
<R> means the RETURN (or ENTER key). Please wait for a little while
after <R> is pressed each time.
\$J5 is now $J5
\$JM is now $JM
____
if [ "$J5" = "" -o "$JM" = "" ]; then
echo "Define \$J5 and \$JM first"
exit 1
fi
echo "Press ENTER to start the test, or Ctrl-C to stop it"
read x
echo echo
echo "This test is about console password input compatibility between" echo "=========================================="
echo "Tiger and Mustang. Before running the test, make sure that --" echo "Test #1: 5->6, non-prompt. Please type <R>"
echo "\$J5 points to a JDK 5.0 installation" echo "=========================================="
echo "\$JM points to a JDK 6 installation".
echo echo
echo "The password string used in this test is $PASS. If you find difficulty" rm $KS 2> /dev/null
echo "entering it in in your system, feel free to change it to something else" $J5/bin/keytool -keystore $KS -genkey -dname CN=olala -storepass $PASSW || exit 1
echo "by providing \$ALT_PASS (should be not less than 6 characters)" $JM/bin/keytool -keystore $KS -list -storepass $PASSW || exit 2
echo "=========================================="
echo "Test #2: 6->5, non-prompt. Please type <R>"
echo "=========================================="
echo echo
echo "For all prompt of \"Enter keystore password\", type $PASS and press ENTER"
echo "For all prompt of \"Enter key password for <mykey> (RETURN if same as keystore password)\", press ENTER" rm $KS 2> /dev/null
echo "If you see both the prompts appear, say --" $JM/bin/keytool -keystore $KS -genkey -dname CN=olala -storepass $PASSW || exit 3
echo " Enter key password for <mykey>" $J5/bin/keytool -keystore $KS -list -storepass $PASSW || exit 4
echo " (RETURN if same as keystore password): Enter keystore password:"
echo "only response to the last prompt by typing $PASS and press ENTER" echo "============================================================"
echo "Test #3: 5->6, prompt. Please type $PASSW <R> <R> $PASSW <R>"
echo "============================================================"
echo echo
echo "Only if all the command run correctly without showing any error "
echo "or warning, this test passes." rm $KS 2> /dev/null
$J5/bin/keytool -keystore $KS -genkey -dname CN=olala || exit 5
$JM/bin/keytool -keystore $KS -list || exit 6
echo $PASSW| $J5/bin/keytool -keystore $KS -list || exit 7
echo $PASSW| $JM/bin/keytool -keystore $KS -list || exit 8
echo "======================================================================="
echo "Test #4: 6->5, prompt. Please type $PASSW <R> $PASSW <R> <R> $PASSW <R>"
echo "======================================================================="
echo echo
echo "Press ENTER to start the test, or Ctrl-C to stop it"
read rm $KS 2> /dev/null
$JM/bin/keytool -keystore $KS -genkey -dname CN=olala || exit 9
$J5/bin/keytool -keystore $KS -list || exit 10
echo $PASSW| $JM/bin/keytool -keystore $KS -list || exit 11
echo $PASSW| $J5/bin/keytool -keystore $KS -list || exit 12
echo "==========================================="
echo "Test #5: 5->6, pipe. Please type $PASSW <R>"
echo "==========================================="
echo
rm $KS 2> /dev/null
echo $PASSW| $J5/bin/keytool -keystore $KS -genkey -dname CN=olala || exit 13
$JM/bin/keytool -keystore $KS -list || exit 14
echo $PASSW| $J5/bin/keytool -keystore $KS -list || exit 15
echo $PASSW| $JM/bin/keytool -keystore $KS -list || exit 16
rm $KS 2> /dev/null
echo echo
echo "Test #1: 5->6, non-prompt" echo "Success"
rm kkk
$J5/bin/keytool -keystore kkk -genkey -dname CN=olala -storepass $PASS
$JM/bin/keytool -keystore kkk -list -storepass $PASS
echo "Test #2: 6->5, non-prompt"
rm kkk
$JM/bin/keytool -keystore kkk -genkey -dname CN=olala -storepass $PASS
$J5/bin/keytool -keystore kkk -list -storepass $PASS
echo "Test #3: 5->6, prompt"
rm kkk
$J5/bin/keytool -keystore kkk -genkey -dname CN=olala
$JM/bin/keytool -keystore kkk -list
echo $PASS| $J5/bin/keytool -keystore kkk -list
echo $PASS| $JM/bin/keytool -keystore kkk -list
echo "Test #4: 6->5, prompt"
rm kkk
$JM/bin/keytool -keystore kkk -genkey -dname CN=olala
$J5/bin/keytool -keystore kkk -list
echo $PASS| $JM/bin/keytool -keystore kkk -list
echo $PASS| $J5/bin/keytool -keystore kkk -list
echo "Test #5: 5->6, pipe"
rm kkk
echo $PASS| $J5/bin/keytool -keystore kkk -genkey -dname CN=olala
$JM/bin/keytool -keystore kkk -list
echo $PASS| $J5/bin/keytool -keystore kkk -list
echo $PASS| $JM/bin/keytool -keystore kkk -list
rm kkk
exit 0 exit 0
...@@ -7074,3 +7074,586 @@ FormatData/sl/DatePatterns/1=dd. MMMM y ...@@ -7074,3 +7074,586 @@ FormatData/sl/DatePatterns/1=dd. MMMM y
# bug 7189611 # bug 7189611
CurrencyNames/es_VE/VEF=Bs.F. CurrencyNames/es_VE/VEF=Bs.F.
# rfe 8000983 (narrow names support)
FormatData//DayNarrows/0=S
FormatData//DayNarrows/1=M
FormatData//DayNarrows/2=T
FormatData//DayNarrows/3=W
FormatData//DayNarrows/4=T
FormatData//DayNarrows/5=F
FormatData//DayNarrows/6=S
FormatData//narrow.AmPmMarkers/0=a
FormatData//narrow.AmPmMarkers/1=p
FormatData//narrow.Eras/0=B
FormatData//narrow.Eras/1=A
FormatData//buddhist.narrow.Eras/0=BC
FormatData//buddhist.narrow.Eras/1=B.E.
FormatData//japanese.narrow.Eras/0=
FormatData//japanese.narrow.Eras/1=M
FormatData//japanese.narrow.Eras/2=T
FormatData//japanese.narrow.Eras/3=S
FormatData//japanese.narrow.Eras/4=H
FormatData/ar/DayNarrows/0=\u062d
FormatData/ar/DayNarrows/1=\u0646
FormatData/ar/DayNarrows/2=\u062b
FormatData/ar/DayNarrows/3=\u0631
FormatData/ar/DayNarrows/4=\u062e
FormatData/ar/DayNarrows/5=\u062c
FormatData/ar/DayNarrows/6=\u0633
FormatData/be/standalone.MonthNarrows/0=\u0441
FormatData/be/standalone.MonthNarrows/1=\u043b
FormatData/be/standalone.MonthNarrows/2=\u0441
FormatData/be/standalone.MonthNarrows/3=\u043a
FormatData/be/standalone.MonthNarrows/4=\u043c
FormatData/be/standalone.MonthNarrows/5=\u0447
FormatData/be/standalone.MonthNarrows/6=\u043b
FormatData/be/standalone.MonthNarrows/7=\u0436
FormatData/be/standalone.MonthNarrows/8=\u0432
FormatData/be/standalone.MonthNarrows/9=\u043a
FormatData/be/standalone.MonthNarrows/10=\u043b
FormatData/be/standalone.MonthNarrows/11=\u0441
FormatData/be/standalone.MonthNarrows/12=
FormatData/be/DayNarrows/0=\u043d
FormatData/be/DayNarrows/1=\u043f
FormatData/be/DayNarrows/2=\u0430
FormatData/be/DayNarrows/3=\u0441
FormatData/be/DayNarrows/4=\u0447
FormatData/be/DayNarrows/5=\u043f
FormatData/be/DayNarrows/6=\u0441
FormatData/bg/DayNarrows/0=\u043d
FormatData/bg/DayNarrows/1=\u043f
FormatData/bg/DayNarrows/2=\u0432
FormatData/bg/DayNarrows/3=\u0441
FormatData/bg/DayNarrows/4=\u0447
FormatData/bg/DayNarrows/5=\u043f
FormatData/bg/DayNarrows/6=\u0441
FormatData/ca/standalone.MonthNarrows/0=g
FormatData/ca/standalone.MonthNarrows/1=f
FormatData/ca/standalone.MonthNarrows/2=m
FormatData/ca/standalone.MonthNarrows/3=a
FormatData/ca/standalone.MonthNarrows/4=m
FormatData/ca/standalone.MonthNarrows/5=j
FormatData/ca/standalone.MonthNarrows/6=j
FormatData/ca/standalone.MonthNarrows/7=a
FormatData/ca/standalone.MonthNarrows/8=s
FormatData/ca/standalone.MonthNarrows/9=o
FormatData/ca/standalone.MonthNarrows/10=n
FormatData/ca/standalone.MonthNarrows/11=d
FormatData/ca/standalone.MonthNarrows/12=
FormatData/ca/DayNarrows/0=G
# Note: "L" is a contribued item in CLDR
FormatData/ca/DayNarrows/1=L
FormatData/ca/DayNarrows/2=T
FormatData/ca/DayNarrows/3=C
FormatData/ca/DayNarrows/4=J
FormatData/ca/DayNarrows/5=V
FormatData/ca/DayNarrows/6=S
FormatData/ca/standalone.DayNarrows/0=g
FormatData/ca/standalone.DayNarrows/1=l
FormatData/ca/standalone.DayNarrows/2=t
FormatData/ca/standalone.DayNarrows/3=c
FormatData/ca/standalone.DayNarrows/4=j
FormatData/ca/standalone.DayNarrows/5=v
FormatData/ca/standalone.DayNarrows/6=s
FormatData/cs/DayNarrows/0=N
FormatData/cs/DayNarrows/1=P
FormatData/cs/DayNarrows/2=\u00da
FormatData/cs/DayNarrows/3=S
FormatData/cs/DayNarrows/4=\u010c
FormatData/cs/DayNarrows/5=P
FormatData/cs/DayNarrows/6=S
FormatData/da/DayNarrows/0=S
FormatData/da/DayNarrows/1=M
FormatData/da/DayNarrows/2=T
FormatData/da/DayNarrows/3=O
FormatData/da/DayNarrows/4=T
FormatData/da/DayNarrows/5=F
FormatData/da/DayNarrows/6=L
FormatData/de/DayNarrows/0=S
FormatData/de/DayNarrows/1=M
FormatData/de/DayNarrows/2=D
FormatData/de/DayNarrows/3=M
FormatData/de/DayNarrows/4=D
FormatData/de/DayNarrows/5=F
FormatData/de/DayNarrows/6=S
FormatData/el/DayNarrows/0=\u039a
FormatData/el/DayNarrows/1=\u0394
FormatData/el/DayNarrows/2=\u03a4
FormatData/el/DayNarrows/3=\u03a4
FormatData/el/DayNarrows/4=\u03a0
FormatData/el/DayNarrows/5=\u03a0
FormatData/el/DayNarrows/6=\u03a3
FormatData/es/DayNarrows/0=D
FormatData/es/DayNarrows/1=L
FormatData/es/DayNarrows/2=M
FormatData/es/DayNarrows/3=X
FormatData/es/DayNarrows/4=J
FormatData/es/DayNarrows/5=V
FormatData/es/DayNarrows/6=S
FormatData/et/DayNarrows/0=P
FormatData/et/DayNarrows/1=E
FormatData/et/DayNarrows/2=T
FormatData/et/DayNarrows/3=K
FormatData/et/DayNarrows/4=N
FormatData/et/DayNarrows/5=R
FormatData/et/DayNarrows/6=L
FormatData/fi/standalone.MonthNarrows/0=T
FormatData/fi/standalone.MonthNarrows/1=H
FormatData/fi/standalone.MonthNarrows/2=M
FormatData/fi/standalone.MonthNarrows/3=H
FormatData/fi/standalone.MonthNarrows/4=T
FormatData/fi/standalone.MonthNarrows/5=K
FormatData/fi/standalone.MonthNarrows/6=H
FormatData/fi/standalone.MonthNarrows/7=E
FormatData/fi/standalone.MonthNarrows/8=S
FormatData/fi/standalone.MonthNarrows/9=L
FormatData/fi/standalone.MonthNarrows/10=M
FormatData/fi/standalone.MonthNarrows/11=J
FormatData/fi/standalone.MonthNarrows/12=
FormatData/fi/DayNarrows/0=S
FormatData/fi/DayNarrows/1=M
FormatData/fi/DayNarrows/2=T
FormatData/fi/DayNarrows/3=K
FormatData/fi/DayNarrows/4=T
FormatData/fi/DayNarrows/5=P
FormatData/fi/DayNarrows/6=L
FormatData/fi/standalone.DayNarrows/0=S
FormatData/fi/standalone.DayNarrows/1=M
FormatData/fi/standalone.DayNarrows/2=T
FormatData/fi/standalone.DayNarrows/3=K
FormatData/fi/standalone.DayNarrows/4=T
FormatData/fi/standalone.DayNarrows/5=P
FormatData/fi/standalone.DayNarrows/6=L
FormatData/fi/narrow.AmPmMarkers/0=ap.
FormatData/fi/narrow.AmPmMarkers/1=ip.
FormatData/fr/DayNarrows/0=D
FormatData/fr/DayNarrows/1=L
FormatData/fr/DayNarrows/2=M
FormatData/fr/DayNarrows/3=M
FormatData/fr/DayNarrows/4=J
FormatData/fr/DayNarrows/5=V
FormatData/fr/DayNarrows/6=S
FormatData/hi_IN/DayNarrows/0=\u0930
FormatData/hi_IN/DayNarrows/1=\u0938\u094b
FormatData/hi_IN/DayNarrows/2=\u092e\u0902
FormatData/hi_IN/DayNarrows/3=\u092c\u0941
FormatData/hi_IN/DayNarrows/4=\u0917\u0941
FormatData/hi_IN/DayNarrows/5=\u0936\u0941
FormatData/hi_IN/DayNarrows/6=\u0936
FormatData/hr/standalone.MonthNarrows/0=1.
FormatData/hr/standalone.MonthNarrows/1=2.
FormatData/hr/standalone.MonthNarrows/2=3.
FormatData/hr/standalone.MonthNarrows/3=4.
FormatData/hr/standalone.MonthNarrows/4=5.
FormatData/hr/standalone.MonthNarrows/5=6.
FormatData/hr/standalone.MonthNarrows/6=7.
FormatData/hr/standalone.MonthNarrows/7=8.
FormatData/hr/standalone.MonthNarrows/8=9.
FormatData/hr/standalone.MonthNarrows/9=10.
FormatData/hr/standalone.MonthNarrows/10=11.
FormatData/hr/standalone.MonthNarrows/11=12.
FormatData/hr/standalone.MonthNarrows/12=
FormatData/hr/DayNarrows/0=N
FormatData/hr/DayNarrows/1=P
FormatData/hr/DayNarrows/2=U
FormatData/hr/DayNarrows/3=S
FormatData/hr/DayNarrows/4=\u010c
FormatData/hr/DayNarrows/5=P
FormatData/hr/DayNarrows/6=S
FormatData/hr/standalone.DayNarrows/0=n
FormatData/hr/standalone.DayNarrows/1=p
FormatData/hr/standalone.DayNarrows/2=u
FormatData/hr/standalone.DayNarrows/3=s
FormatData/hr/standalone.DayNarrows/4=\u010d
FormatData/hr/standalone.DayNarrows/5=p
FormatData/hr/standalone.DayNarrows/6=s
FormatData/hu/DayNarrows/0=V
FormatData/hu/DayNarrows/1=H
FormatData/hu/DayNarrows/2=K
FormatData/hu/DayNarrows/3=Sz
FormatData/hu/DayNarrows/4=Cs
FormatData/hu/DayNarrows/5=P
FormatData/hu/DayNarrows/6=Sz
FormatData/is/standalone.MonthNarrows/0=j
FormatData/is/standalone.MonthNarrows/1=f
FormatData/is/standalone.MonthNarrows/2=m
FormatData/is/standalone.MonthNarrows/3=a
FormatData/is/standalone.MonthNarrows/4=m
FormatData/is/standalone.MonthNarrows/5=j
FormatData/is/standalone.MonthNarrows/6=j
FormatData/is/standalone.MonthNarrows/7=\u00e1
FormatData/is/standalone.MonthNarrows/8=s
FormatData/is/standalone.MonthNarrows/9=o
FormatData/is/standalone.MonthNarrows/10=n
FormatData/is/standalone.MonthNarrows/11=d
FormatData/is/standalone.MonthNarrows/12=
FormatData/is/DayNarrows/0=S
FormatData/is/DayNarrows/1=M
FormatData/is/DayNarrows/2=\u00de
FormatData/is/DayNarrows/3=M
FormatData/is/DayNarrows/4=F
FormatData/is/DayNarrows/5=F
FormatData/is/DayNarrows/6=L
FormatData/is/standalone.DayNarrows/0=s
FormatData/is/standalone.DayNarrows/1=m
FormatData/is/standalone.DayNarrows/2=\u00fe
FormatData/is/standalone.DayNarrows/3=m
FormatData/is/standalone.DayNarrows/4=f
FormatData/is/standalone.DayNarrows/5=f
FormatData/is/standalone.DayNarrows/6=l
FormatData/it/DayNarrows/0=D
FormatData/it/DayNarrows/1=L
FormatData/it/DayNarrows/2=M
FormatData/it/DayNarrows/3=M
FormatData/it/DayNarrows/4=G
FormatData/it/DayNarrows/5=V
FormatData/it/DayNarrows/6=S
FormatData/iw/DayNarrows/0=\u05d0
FormatData/iw/DayNarrows/1=\u05d1
FormatData/iw/DayNarrows/2=\u05d2
FormatData/iw/DayNarrows/3=\u05d3
FormatData/iw/DayNarrows/4=\u05d4
FormatData/iw/DayNarrows/5=\u05d5
FormatData/iw/DayNarrows/6=\u05e9
FormatData/iw/standalone.DayNarrows/0=\u05d0
FormatData/iw/standalone.DayNarrows/1=\u05d1
FormatData/iw/standalone.DayNarrows/2=\u05d2
FormatData/iw/standalone.DayNarrows/3=\u05d3
FormatData/iw/standalone.DayNarrows/4=\u05d4
FormatData/iw/standalone.DayNarrows/5=\u05d5
FormatData/iw/standalone.DayNarrows/6=\u05e9
FormatData/ja/DayNarrows/0=\u65e5
FormatData/ja/DayNarrows/1=\u6708
FormatData/ja/DayNarrows/2=\u706b
FormatData/ja/DayNarrows/3=\u6c34
FormatData/ja/DayNarrows/4=\u6728
FormatData/ja/DayNarrows/5=\u91d1
FormatData/ja/DayNarrows/6=\u571f
FormatData/ko/DayNarrows/0=\uc77c
FormatData/ko/DayNarrows/1=\uc6d4
FormatData/ko/DayNarrows/2=\ud654
FormatData/ko/DayNarrows/3=\uc218
FormatData/ko/DayNarrows/4=\ubaa9
FormatData/ko/DayNarrows/5=\uae08
FormatData/ko/DayNarrows/6=\ud1a0
FormatData/lt/standalone.MonthNarrows/0=S
FormatData/lt/standalone.MonthNarrows/1=V
FormatData/lt/standalone.MonthNarrows/2=K
FormatData/lt/standalone.MonthNarrows/3=B
FormatData/lt/standalone.MonthNarrows/4=G
FormatData/lt/standalone.MonthNarrows/5=B
FormatData/lt/standalone.MonthNarrows/6=L
FormatData/lt/standalone.MonthNarrows/7=R
FormatData/lt/standalone.MonthNarrows/8=R
FormatData/lt/standalone.MonthNarrows/9=S
FormatData/lt/standalone.MonthNarrows/10=L
FormatData/lt/standalone.MonthNarrows/11=G
FormatData/lt/standalone.MonthNarrows/12=
FormatData/lt/DayNarrows/0=S
FormatData/lt/DayNarrows/1=P
FormatData/lt/DayNarrows/2=A
FormatData/lt/DayNarrows/3=T
FormatData/lt/DayNarrows/4=K
FormatData/lt/DayNarrows/5=P
FormatData/lt/DayNarrows/6=\u0160
FormatData/lt/standalone.DayNarrows/0=S
FormatData/lt/standalone.DayNarrows/1=P
FormatData/lt/standalone.DayNarrows/2=A
FormatData/lt/standalone.DayNarrows/3=T
FormatData/lt/standalone.DayNarrows/4=K
FormatData/lt/standalone.DayNarrows/5=P
FormatData/lt/standalone.DayNarrows/6=\u0160
FormatData/lv/DayNarrows/0=S
FormatData/lv/DayNarrows/1=P
FormatData/lv/DayNarrows/2=O
FormatData/lv/DayNarrows/3=T
FormatData/lv/DayNarrows/4=C
FormatData/lv/DayNarrows/5=P
FormatData/lv/DayNarrows/6=S
FormatData/mk/DayNarrows/0=\u043d
FormatData/mk/DayNarrows/1=\u043f
FormatData/mk/DayNarrows/2=\u0432
FormatData/mk/DayNarrows/3=\u0441
FormatData/mk/DayNarrows/4=\u0447
FormatData/mk/DayNarrows/5=\u043f
FormatData/mk/DayNarrows/6=\u0441
FormatData/ms/standalone.MonthNarrows/0=J
FormatData/ms/standalone.MonthNarrows/1=F
FormatData/ms/standalone.MonthNarrows/2=M
FormatData/ms/standalone.MonthNarrows/3=A
FormatData/ms/standalone.MonthNarrows/4=M
FormatData/ms/standalone.MonthNarrows/5=J
FormatData/ms/standalone.MonthNarrows/6=J
FormatData/ms/standalone.MonthNarrows/7=O
FormatData/ms/standalone.MonthNarrows/8=S
FormatData/ms/standalone.MonthNarrows/9=O
FormatData/ms/standalone.MonthNarrows/10=N
FormatData/ms/standalone.MonthNarrows/11=D
FormatData/ms/standalone.MonthNarrows/12=
FormatData/ms/DayNarrows/0=A
FormatData/ms/DayNarrows/1=I
FormatData/ms/DayNarrows/2=S
FormatData/ms/DayNarrows/3=R
FormatData/ms/DayNarrows/4=K
FormatData/ms/DayNarrows/5=J
FormatData/ms/DayNarrows/6=S
FormatData/ms/standalone.DayNarrows/0=A
FormatData/ms/standalone.DayNarrows/1=I
FormatData/ms/standalone.DayNarrows/2=S
FormatData/ms/standalone.DayNarrows/3=R
FormatData/ms/standalone.DayNarrows/4=K
FormatData/ms/standalone.DayNarrows/5=J
FormatData/ms/standalone.DayNarrows/6=S
FormatData/mt/DayNarrows/0=\u0126
FormatData/mt/DayNarrows/1=T
FormatData/mt/DayNarrows/2=T
FormatData/mt/DayNarrows/3=E
FormatData/mt/DayNarrows/4=\u0126
FormatData/mt/DayNarrows/5=\u0120
FormatData/mt/DayNarrows/6=S
FormatData/nl/DayNarrows/0=Z
FormatData/nl/DayNarrows/1=M
FormatData/nl/DayNarrows/2=D
FormatData/nl/DayNarrows/3=W
FormatData/nl/DayNarrows/4=D
FormatData/nl/DayNarrows/5=V
FormatData/nl/DayNarrows/6=Z
FormatData/pl/DayNarrows/0=N
FormatData/pl/DayNarrows/1=P
FormatData/pl/DayNarrows/2=W
FormatData/pl/DayNarrows/3=\u015a
FormatData/pl/DayNarrows/4=C
FormatData/pl/DayNarrows/5=P
FormatData/pl/DayNarrows/6=S
FormatData/pt/DayNarrows/0=D
FormatData/pt/DayNarrows/1=S
FormatData/pt/DayNarrows/2=T
FormatData/pt/DayNarrows/3=Q
FormatData/pt/DayNarrows/4=Q
FormatData/pt/DayNarrows/5=S
FormatData/pt/DayNarrows/6=S
FormatData/ro/standalone.MonthNarrows/0=I
FormatData/ro/standalone.MonthNarrows/1=F
FormatData/ro/standalone.MonthNarrows/2=M
FormatData/ro/standalone.MonthNarrows/3=A
FormatData/ro/standalone.MonthNarrows/4=M
FormatData/ro/standalone.MonthNarrows/5=I
FormatData/ro/standalone.MonthNarrows/6=I
FormatData/ro/standalone.MonthNarrows/7=A
FormatData/ro/standalone.MonthNarrows/8=S
FormatData/ro/standalone.MonthNarrows/9=O
FormatData/ro/standalone.MonthNarrows/10=N
FormatData/ro/standalone.MonthNarrows/11=D
FormatData/ro/standalone.MonthNarrows/12=
# commented out DayNarrows due to mostly undefined
#FormatData/ro/DayNarrows/0=D
#FormatData/ro/DayNarrows/1=
#FormatData/ro/DayNarrows/2=
#FormatData/ro/DayNarrows/3=
#FormatData/ro/DayNarrows/4=
#FormatData/ro/DayNarrows/5=
#FormatData/ro/DayNarrows/6=
FormatData/ro/standalone.DayNarrows/0=D
FormatData/ro/standalone.DayNarrows/1=L
FormatData/ro/standalone.DayNarrows/2=M
FormatData/ro/standalone.DayNarrows/3=M
FormatData/ro/standalone.DayNarrows/4=J
FormatData/ro/standalone.DayNarrows/5=V
FormatData/ro/standalone.DayNarrows/6=S
FormatData/ru/DayNarrows/0=\u0412
FormatData/ru/DayNarrows/1=\u041f\u043d
FormatData/ru/DayNarrows/2=\u0412\u0442
FormatData/ru/DayNarrows/3=\u0421
FormatData/ru/DayNarrows/4=\u0427
FormatData/ru/DayNarrows/5=\u041f
# Note: "sat" is an contributed item in CLDR.
FormatData/ru/DayNarrows/6=\u0421
FormatData/ru/standalone.DayNarrows/0=\u0412
FormatData/ru/standalone.DayNarrows/1=\u041f
FormatData/ru/standalone.DayNarrows/2=\u0412
FormatData/ru/standalone.DayNarrows/3=\u0421
FormatData/ru/standalone.DayNarrows/4=\u0427
FormatData/ru/standalone.DayNarrows/5=\u041f
FormatData/ru/standalone.DayNarrows/6=\u0421
FormatData/sk/DayNarrows/0=N
FormatData/sk/DayNarrows/1=P
FormatData/sk/DayNarrows/2=U
FormatData/sk/DayNarrows/3=S
FormatData/sk/DayNarrows/4=\u0160
FormatData/sk/DayNarrows/5=P
FormatData/sk/DayNarrows/6=S
FormatData/sl/DayNarrows/0=n
FormatData/sl/DayNarrows/1=p
FormatData/sl/DayNarrows/2=t
FormatData/sl/DayNarrows/3=s
FormatData/sl/DayNarrows/4=\u010d
FormatData/sl/DayNarrows/5=p
FormatData/sl/DayNarrows/6=s
FormatData/sq/DayNarrows/0=D
FormatData/sq/DayNarrows/1=H
FormatData/sq/DayNarrows/2=M
FormatData/sq/DayNarrows/3=M
FormatData/sq/DayNarrows/4=E
FormatData/sq/DayNarrows/5=P
FormatData/sq/DayNarrows/6=S
FormatData/sr/DayNarrows/0=\u043d
FormatData/sr/DayNarrows/1=\u043f
FormatData/sr/DayNarrows/2=\u0443
FormatData/sr/DayNarrows/3=\u0441
FormatData/sr/DayNarrows/4=\u0447
FormatData/sr/DayNarrows/5=\u043f
FormatData/sr/DayNarrows/6=\u0441
FormatData/sr/short.Eras/0=\u043f. \u043d. \u0435.
FormatData/sr/short.Eras/1=\u043d. \u0435.
FormatData/sr/narrow.Eras/0=\u043f.\u043d.\u0435.
FormatData/sr/narrow.Eras/1=\u043d.\u0435.
FormatData/sv/standalone.MonthNarrows/0=J
FormatData/sv/standalone.MonthNarrows/1=F
FormatData/sv/standalone.MonthNarrows/2=M
FormatData/sv/standalone.MonthNarrows/3=A
FormatData/sv/standalone.MonthNarrows/4=M
FormatData/sv/standalone.MonthNarrows/5=J
FormatData/sv/standalone.MonthNarrows/6=J
FormatData/sv/standalone.MonthNarrows/7=A
FormatData/sv/standalone.MonthNarrows/8=S
FormatData/sv/standalone.MonthNarrows/9=O
FormatData/sv/standalone.MonthNarrows/10=N
FormatData/sv/standalone.MonthNarrows/11=D
FormatData/sv/standalone.MonthNarrows/12=
FormatData/sv/DayNarrows/0=S
FormatData/sv/DayNarrows/1=M
FormatData/sv/DayNarrows/2=T
FormatData/sv/DayNarrows/3=O
FormatData/sv/DayNarrows/4=T
FormatData/sv/DayNarrows/5=F
FormatData/sv/DayNarrows/6=L
FormatData/sv/standalone.DayNarrows/0=S
FormatData/sv/standalone.DayNarrows/1=M
FormatData/sv/standalone.DayNarrows/2=T
FormatData/sv/standalone.DayNarrows/3=O
FormatData/sv/standalone.DayNarrows/4=T
FormatData/sv/standalone.DayNarrows/5=F
FormatData/sv/standalone.DayNarrows/6=L
FormatData/sv/narrow.Eras/0=f.Kr.
FormatData/sv/narrow.Eras/1=e.Kr.
FormatData/sv/narrow.AmPmMarkers/0=f
FormatData/sv/narrow.AmPmMarkers/1=e
FormatData/th/standalone.MonthNarrows/0=\u0e21.\u0e04.
FormatData/th/standalone.MonthNarrows/1=\u0e01.\u0e1e.
FormatData/th/standalone.MonthNarrows/2=\u0e21\u0e35.\u0e04.
FormatData/th/standalone.MonthNarrows/3=\u0e40\u0e21.\u0e22.
FormatData/th/standalone.MonthNarrows/4=\u0e1e.\u0e04.
FormatData/th/standalone.MonthNarrows/5=\u0e21\u0e34.\u0e22.
FormatData/th/standalone.MonthNarrows/6=\u0e01.\u0e04.
FormatData/th/standalone.MonthNarrows/7=\u0e2a.\u0e04.
FormatData/th/standalone.MonthNarrows/8=\u0e01.\u0e22.
FormatData/th/standalone.MonthNarrows/9=\u0e15.\u0e04.
FormatData/th/standalone.MonthNarrows/10=\u0e1e.\u0e22.
FormatData/th/standalone.MonthNarrows/11=\u0e18.\u0e04.
FormatData/th/standalone.MonthNarrows/12=
FormatData/th/DayNarrows/0=\u0e2d
FormatData/th/DayNarrows/1=\u0e08
FormatData/th/DayNarrows/2=\u0e2d
FormatData/th/DayNarrows/3=\u0e1e
FormatData/th/DayNarrows/4=\u0e1e
FormatData/th/DayNarrows/5=\u0e28
FormatData/th/DayNarrows/6=\u0e2a
FormatData/th/narrow.Eras/0=\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.
FormatData/th/narrow.Eras/1=\u0e04.\u0e28.
FormatData/tr/standalone.MonthNarrows/0=O
FormatData/tr/standalone.MonthNarrows/1=\u015e
FormatData/tr/standalone.MonthNarrows/2=M
FormatData/tr/standalone.MonthNarrows/3=N
FormatData/tr/standalone.MonthNarrows/4=M
FormatData/tr/standalone.MonthNarrows/5=H
FormatData/tr/standalone.MonthNarrows/6=T
FormatData/tr/standalone.MonthNarrows/7=A
FormatData/tr/standalone.MonthNarrows/8=E
FormatData/tr/standalone.MonthNarrows/9=E
FormatData/tr/standalone.MonthNarrows/10=K
FormatData/tr/standalone.MonthNarrows/11=A
FormatData/tr/standalone.MonthNarrows/12=
FormatData/tr/DayNarrows/0=P
FormatData/tr/DayNarrows/1=P
FormatData/tr/DayNarrows/2=S
FormatData/tr/DayNarrows/3=\u00c7
FormatData/tr/DayNarrows/4=P
FormatData/tr/DayNarrows/5=C
FormatData/tr/DayNarrows/6=C
FormatData/uk/DayNarrows/0=\u041d
FormatData/uk/DayNarrows/1=\u041f
FormatData/uk/DayNarrows/2=\u0412
FormatData/uk/DayNarrows/3=\u0421
FormatData/uk/DayNarrows/4=\u0427
FormatData/uk/DayNarrows/5=\u041f
FormatData/uk/DayNarrows/6=\u0421
FormatData/vi/DayNarrows/0=CN
FormatData/vi/DayNarrows/1=T2
FormatData/vi/DayNarrows/2=T3
FormatData/vi/DayNarrows/3=T4
FormatData/vi/DayNarrows/4=T5
FormatData/vi/DayNarrows/5=T6
FormatData/vi/DayNarrows/6=T7
FormatData/zh/standalone.MonthNarrows/0=1\u6708
FormatData/zh/standalone.MonthNarrows/1=2\u6708
FormatData/zh/standalone.MonthNarrows/2=3\u6708
FormatData/zh/standalone.MonthNarrows/3=4\u6708
FormatData/zh/standalone.MonthNarrows/4=5\u6708
FormatData/zh/standalone.MonthNarrows/5=6\u6708
FormatData/zh/standalone.MonthNarrows/6=7\u6708
FormatData/zh/standalone.MonthNarrows/7=8\u6708
FormatData/zh/standalone.MonthNarrows/8=9\u6708
FormatData/zh/standalone.MonthNarrows/9=10\u6708
FormatData/zh/standalone.MonthNarrows/10=11\u6708
FormatData/zh/standalone.MonthNarrows/11=12\u6708
FormatData/zh/standalone.MonthNarrows/12=
FormatData/zh/DayNarrows/0=\u65e5
FormatData/zh/DayNarrows/1=\u4e00
FormatData/zh/DayNarrows/2=\u4e8c
FormatData/zh/DayNarrows/3=\u4e09
FormatData/zh/DayNarrows/4=\u56db
FormatData/zh/DayNarrows/5=\u4e94
FormatData/zh/DayNarrows/6=\u516d
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
* 6509039 6609737 6610748 6645271 6507067 6873931 6450945 6645268 6646611 * 6509039 6609737 6610748 6645271 6507067 6873931 6450945 6645268 6646611
* 6645405 6650730 6910489 6573250 6870908 6585666 6716626 6914413 6916787 * 6645405 6650730 6910489 6573250 6870908 6585666 6716626 6914413 6916787
* 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495 * 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495
* 7003124 7085757 7028073 7171028 7189611 * 7003124 7085757 7028073 7171028 7189611 8000983
* @summary Verify locale data * @summary Verify locale data
* *
*/ */
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
* 6894719 6968053 7151434 7146424 * 6894719 6968053 7151434 7146424
* @summary Argument parsing validation. * @summary Argument parsing validation.
* @compile -XDignore.symbol.file Arrrghs.java * @compile -XDignore.symbol.file Arrrghs.java
* @run main Arrrghs * @run main/othervm Arrrghs
*/ */
import java.io.BufferedReader; import java.io.BufferedReader;
...@@ -204,8 +204,7 @@ public class Arrrghs extends TestHelper { ...@@ -204,8 +204,7 @@ public class Arrrghs extends TestHelper {
// exiting the process prematurely can terminate the stderr. // exiting the process prematurely can terminate the stderr.
scratchpad.add(javaCmd + " -version " + inArgs); scratchpad.add(javaCmd + " -version " + inArgs);
File batFile = new File("atest.bat"); File batFile = new File("atest.bat");
java.nio.file.Files.deleteIfExists(batFile.toPath()); createAFile(batFile, scratchpad);
createFile(batFile, scratchpad);
TestResult tr = doExec(batFile.getName()); TestResult tr = doExec(batFile.getName());
......
...@@ -358,6 +358,51 @@ public class TestHelper { ...@@ -358,6 +358,51 @@ public class TestHelper {
Files.copy(src.toPath(), dst.toPath(), COPY_ATTRIBUTES, REPLACE_EXISTING); Files.copy(src.toPath(), dst.toPath(), COPY_ATTRIBUTES, REPLACE_EXISTING);
} }
/**
* Attempt to create a file at the given location. If an IOException
* occurs then back off for a moment and try again. When a number of
* attempts fail, give up and throw an exception.
*/
void createAFile(File aFile, List<String> contents) throws IOException {
IOException cause = null;
for (int attempts = 0; attempts < 10; attempts++) {
try {
Files.write(aFile.getAbsoluteFile().toPath(), contents,
Charset.defaultCharset(), CREATE, TRUNCATE_EXISTING, WRITE);
if (cause != null) {
/*
* report attempts and errors that were encountered
* for diagnostic purposes
*/
System.err.println("Created batch file " +
aFile + " in " + (attempts + 1) +
" attempts");
System.err.println("Errors encountered: " + cause);
cause.printStackTrace();
}
return;
} catch (IOException ioe) {
if (cause != null) {
// chain the exceptions so they all get reported for diagnostics
cause.addSuppressed(ioe);
} else {
cause = ioe;
}
}
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
if (cause != null) {
// cause should alway be non-null here
ie.addSuppressed(cause);
}
throw new RuntimeException("Interrupted while creating batch file", ie);
}
}
throw new RuntimeException("Unable to create batch file", cause);
}
static void createFile(File outFile, List<String> content) throws IOException { static void createFile(File outFile, List<String> content) throws IOException {
Files.write(outFile.getAbsoluteFile().toPath(), content, Files.write(outFile.getAbsoluteFile().toPath(), content,
Charset.defaultCharset(), CREATE_NEW); Charset.defaultCharset(), CREATE_NEW);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册